From 07e3c9cb41c6997f59f8f307bbe34b0229fe647d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 8 Jun 2020 08:07:35 +0100 Subject: [PATCH 01/65] [Observability] Landing page for Observability (#67467) * creating overview page and menu * styling the home page * adjusting breadcrumb * renaming isnt working * renaming isnt working * renaming isnt working * fixing import * fixing scroll when resize window * fixing eslint errors * prepending links * adding target option * refactoring * adding dark mode support * fixing prettier format * fixing i18n * reverting some unnecessary changes * addressing PR comments * fixing functional tests * ordering observability menu * fixing tests * addressing PR comments * fixing test * fixing scroll * addressing pr comments * addressing pr comments Co-authored-by: Elastic Machine --- x-pack/.i18nrc.json | 3 +- x-pack/plugins/apm/public/plugin.ts | 2 +- x-pack/plugins/infra/public/plugin.ts | 4 +- .../public/application/index.tsx | 29 +++ .../public/assets/observability_overview.png | Bin 0 -> 98273 bytes .../public/context/plugin_context.tsx | 14 ++ .../public/hooks/use_plugin_context.tsx | 12 + .../observability/public/pages/home/index.tsx | 205 ++++++++++++++++++ .../public/pages/home/section.ts | 84 +++++++ x-pack/plugins/observability/public/plugin.ts | 32 ++- x-pack/plugins/uptime/public/apps/plugin.ts | 2 +- .../advanced_settings_security.ts | 6 +- .../apps/apm/feature_controls/apm_security.ts | 4 +- .../feature_controls/canvas_security.ts | 4 +- .../feature_controls/dev_tools_security.ts | 4 +- .../feature_controls/discover_security.ts | 6 +- .../graph/feature_controls/graph_security.ts | 4 +- .../index_patterns_security.ts | 6 +- .../infrastructure_security.ts | 4 +- .../infra/feature_controls/logs_security.ts | 4 +- .../maps/feature_controls/maps_security.ts | 4 +- .../feature_controls/timelion_security.ts | 4 +- .../feature_controls/uptime_security.ts | 4 +- .../feature_controls/visualize_security.ts | 6 +- 24 files changed, 408 insertions(+), 39 deletions(-) create mode 100644 x-pack/plugins/observability/public/application/index.tsx create mode 100644 x-pack/plugins/observability/public/assets/observability_overview.png create mode 100644 x-pack/plugins/observability/public/context/plugin_context.tsx create mode 100644 x-pack/plugins/observability/public/hooks/use_plugin_context.tsx create mode 100644 x-pack/plugins/observability/public/pages/home/index.tsx create mode 100644 x-pack/plugins/observability/public/pages/home/section.ts diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index d17e5d1a74a30..85b40d33c4089 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -48,7 +48,8 @@ "xpack.triggersActionsUI": "plugins/triggers_actions_ui", "xpack.upgradeAssistant": "plugins/upgrade_assistant", "xpack.uptime": ["plugins/uptime"], - "xpack.watcher": "plugins/watcher" + "xpack.watcher": "plugins/watcher", + "xpack.observability": "plugins/observability" }, "translations": [ "plugins/translations/translations/zh-CN.json", diff --git a/x-pack/plugins/apm/public/plugin.ts b/x-pack/plugins/apm/public/plugin.ts index 76320efe617ea..0939c51b16605 100644 --- a/x-pack/plugins/apm/public/plugin.ts +++ b/x-pack/plugins/apm/public/plugin.ts @@ -75,7 +75,7 @@ export class ApmPlugin implements Plugin { core.application.register({ id: 'apm', title: 'APM', - order: 8100, + order: 8300, euiIconType: 'apmApp', appRoute: '/app/apm', icon: 'plugins/apm/public/icon.svg', diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index ead5644d19fa2..deae78e22c6a1 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -64,7 +64,7 @@ export class Plugin defaultMessage: 'Logs', }), euiIconType: 'logsApp', - order: 8000, + order: 8100, appRoute: '/app/logs', category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { @@ -89,7 +89,7 @@ export class Plugin defaultMessage: 'Metrics', }), euiIconType: 'metricsApp', - order: 8001, + order: 8200, appRoute: '/app/metrics', category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { diff --git a/x-pack/plugins/observability/public/application/index.tsx b/x-pack/plugins/observability/public/application/index.tsx new file mode 100644 index 0000000000000..21a9fabf445f1 --- /dev/null +++ b/x-pack/plugins/observability/public/application/index.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { EuiThemeProvider } from '../../../../legacy/common/eui_styled_components'; +import { AppMountParameters, CoreStart } from '../../../../../src/core/public'; +import { Home } from '../pages/home'; +import { PluginContext } from '../context/plugin_context'; + +export const renderApp = (core: CoreStart, { element }: AppMountParameters) => { + const i18nCore = core.i18n; + const isDarkMode = core.uiSettings.get('theme:darkMode'); + ReactDOM.render( + + + + + + + , + element + ); + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; diff --git a/x-pack/plugins/observability/public/assets/observability_overview.png b/x-pack/plugins/observability/public/assets/observability_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..70be08af9745ad4d7ab427d9b3d4c1d2d2f1e75a GIT binary patch literal 98273 zcmc$`i93}4_XkY&u`eT$Jz<8j6Ghe}S!V`gCybr!L}9E&T1Jw+Y_k|U*>|!RV$EduTDl*_MHB& zJrx=Gabw)^%J_ZD+eKb!4a%4Trw@J!zql+SmPM1QStM+7+nsrdye;nCQ{6* zJvKo1lbQ5nId8ux_XyFKd*FUccunw~?0zzzh31orp_^X@OX!}wl(0-q$dk0-pd)AG zEkIKnlLX>*Yy-@k5zaat9XzaOy*>DNJiZqyw0rU*0pBaUgD*)`Y~DI{*U-|^`n0=y zeFFI5!L(uT_2zF;EUb(-tmFUhfg@1?7=G2 z_+|Hvay>lXo6knNbig+e!$60#KGfg}tnTW+3E%Ao0sEWxK@$Tf5i83jUu?j)+!b47 z(C2$4_R~BP*udBR#U3Z_Xv9YaY{kDVWJ80`4WYeDm%i$btiQC3>p|N29~Phfdtc5( zhTTy{)zas=>161H3j$kSVevW%r#M4QIKQdtKWq7{dpn=h|90eM=H;h1AA1B&-Qw^j z$o8BsVj}BUA3G~+(glVfe*2$~43cO4uF5pH#j?=9xl{DdprV0MuR>?X5T5r_^Pe(& zMu=pk=D%CN=1si!C!LKk9_|-G_AVmHtXF7>@kM{Fu2;jah5??zrA#U3#rS93Xrqdt zxrliw&>OXgtp=;JUN&gi`S_{z*@4IFWo4fRRqOM4-t=5c)g{rDnOu7D$uVgKo;c@o zz{<0oys$318E$z81EVE+H9U+Fqy71?bN#ruC`&{B+CXuS(JP|bPBeVE`^5l4{`@pSA~abpO3ug?7yATni4D|vkM&S z3V87)mO%w(8>8MyTE!^xv_U88${@Ht@9K#;W2OL6V4mD8|BmzBI3u?(_=oC>GpC@$ z!KM4&SI1a1htU|yce!w%jU@LMkC1+!j**i1ub(Lql7;}|(3*`Jrx(as3bJwGF(s}L(0E^8( z8rRWzuo%y-cVEG#z+``l3O>AKqpT%vOAQ+)Nl(+T{Z5<@spa|BbeI zSVk%N2}A_;2D;8z3bCAiXq4)zgRr;1-Qc`EBnI3(FJi&g2DspEOfOd7fXO4?67*TM zD30=MQ?kO}zGRpSHhKn?(e}=h!BZt_{zY|E3S!ubN|`ZYA2f^G1ni zDQ7cUhx@qf&hHYVu=$xi_M0BU=l*P!`M(8w@Ib2|`Kf;P!zjr8E3bmSymq}&x?bD! z=UGh>`rh-6Oqy5{jk^IEiLR10bxc8H$nk%V_nACj87>QCo$~nL((>cIwIo6$*N+IU ziP#sZ_AH!Nd7bxKr7(oNXK^sgVg-%q%X6)N&X?V{1z2{m$kf!-j9WivBE#Nb9XRBq znMu13p7wtdyd>^ehmdvo&LU?G{gHk-uafq_!jBIZSljJB?e|a@Ni#&sEikr^h5NSS z^4j{Lx4w_7AepKbt~D^>S|9|^yNa*NGG!N5oJ70w8=Az=A2_N4cug_RDaHqGo|F`+ z<_5a&Yi1BCk%{&wmk0bClvg&W1=H(!>j|YxrNTAxK{j6&G@co7_e=C~TB|(@{xTU{ z&~AOhm@z=5^Qbq9wm99AZv3kTe}-S(Zt76-C#f%t!jDejZy=?kZfJYWMc@CzYTlf~ z6YbZx32j-WPedWZ2_WCRsCNkafe68Y2(b996~%pT;T%^{BUd#!*YMW;=#=lwp9{$E zx@h-CJaLdaaSJlLB-cocLshjp+qbe^DDDcF?%ON{4>V)i`@rLilVFgi^&60#-L zA#>QcOEiik-B+>HR(y6_?6brQB`0ti(K;6|;C@aUYE{2AxU9Aqn*p3C-CtvMEI?Fi z1x^z8lfHXq7dxb~Zlgpv%}Rvwm?jF$obst0wsulqReOYiEdY;1rBfYrZrq&@QMX@w za>+lg(YY(Fpt6BB6V+@V5P+=?WZaN+yaOr^UAm9h0L~6?i_i5tS{$aW**5+2W$Il|fQ`x{{i4-xsR%0?B)Ea%HLc z^!g)BU%EQ8d@QL*PXZ~;V{KzT@CdP2JhY?jsQeyYjoEDfi<{lxY_Gu~)E{UMpngHH zUa#6)0-h@ijt!WVC~b|OBZ0hgRJO;3Epe+meP%v3d2*dVxS^8r#$!5kGO%fEYC^i^ zz+%?>t0hPM{3ExUlG3Bg27h%w*Kv&byN4As5u2|rRUNOajH8)0S8RjZCMh`Is{W)h z)KUKXkoMzmg~zkP3>6TYJw()p^0&7N_as^#M#UE0FfYO`c)b4{1;IwcY~(e!6Ij-c z%u=}`fT*znI5A`9#&Z7?kNa;{G8_9ee&=Tl_sXa(Jt_-6_39R8wV~Y*W zw5@qjrCjuuk)>aj$Tt(6(qH(Mma{XI>d-CQb=xXF9A;|TC6j(!0>zxzJXj=k?|U`8;jCoZP^v*FuYGdzp-Fmtz*eFv;#@$u6|QYtv~uO@P_$IEcB z*?ep-klc6?wrpt4CX{EO&-*;f6O)Z)b|k)TY;k*35D^htixBm&i7Z8~Z`@wbB3MKKj6n{#)w&;;eB4T=b?+U`!MaK(Fn?VT z0J>RN12n4^t60+u4#Jhc#US4)X4*lG$k9^tU<*x%2UQ!AAK}+7a3JMD&J#g!wk24H znC?e&j#n-H=(~S8+a3x50vzpW;FVP&>+x)qDx+t#d|&AI)5Ak~L7~;u^|W!Fw0&qw zIeVH_G8@Z_o!DoIrC?h3&N+mgIt*h5bLV1=d&X|01Gmks@^`^CPCm@v8|Xp6D#aZ5 z&ZD$E;F?E8ikd*~yjs%&P-1-1+ORT8ZbMhNzgLM|FTy`Cq8%Y12Ztk>wW-W$`SUI? z=`|rLh}9*;9(6ke;&quY)%h{hIbVS*_#-`uke3T!);%rh551u1X=(f|#Rkdf0XfI5 zM?_?Cjpj`5R9-KXmkn#YBbe5)8f`CiyqeQ~Y)k;dV`B7FtKS1h=--&Ah}W!D#;w9* z##-xF46Rs%@@#ZnmWKPWx*?Xa>Y;dP2`on#zfGh?v36Fs`eu7EJPd_%!y>9JVV+J` zyJG;`T{Y1tD-Yc~3pdaw)CYWf_tC|LQ;iFEcn`O7I(|diNxkk<%F8xB{0=0EdwL2FR;o<`_d}{?w##1kAfVo*dDSN%d4JG&6>TkcUHQ&0 zZh=i8(JHtlV*O!qr_!%djKXgEVaY-m%yu?nQC3516iS=>`*jVQAhuYl<5s5YR-O4< zmN+y$&%74`^5r^8n1Q~u9G`JXIXLq@QuChsJFm15E?SMJHDem>(lb}5XqkDEft_XK zsb*md__6ba6tg_yKVZWFtYEpmsAP>+;+job42FgkwIDa0YMcUcCE<8wbd{bJO>1oD zT>8uIo>qx%g3KY`7`z_Ob8#t4N&%pE@?&e(fSyUX6-sqL!4qN2YV4i=cUAa4j{n<} zZ3zBW=~VWl(Fq6Q1SYw^<*P%`qP0r!sr^pB01e}F4i1wg>2SqH&j6{>D&VjKdZd0I zryC&a!%j!@fE8zpg5Z^v0@~;+e4e@Cfq;fbQ$gF!Fc>=5pR3~x5~wORd*^3RR;H)^ zsyvr;5!H3F8w{Rkdnu(X(j#D<`A&7Ntfolb*F5mtcnRDueZ$P-N33qd7h+Sn5$E@T zcDGc%rrVudKJ@lD4DI`65#ya_13E;)i0g5ViL3Mqr2PP}yBALZ*BvJ}okbtvJw4V3 z?1VclPLF499GmI$s0-J@&1x_BVzQg;9zlyMRubJ#0XMQAR-GV_uc^HIJpD<#@;Y#n zByIpq@|NfOl5{QCg9(3hwc0=79hmEWRU)fY*>Sv>@}A}UTT1qA7xMJV&itD4rf4TM zlrAF)z>W6RZ*y_Wn|$etFh`2(@oSj~eF96bXT7B*38Jj3HM z^UNBl(l9Zp?UaMvAe@g36#P@ML`!Mr;m86xC#0Z`q*|oa_{P6I1(pRQeyptjON2% zbod{zmr3IPg%E)CTF!ycok>ToMb##|gqbI6sbkK@>Ce*b(<-40#!YX4+x*L^8ROP#$3bb#l{euTnd{~JD8btFkDg*}P^of3@-c%m z3Opj0!jkrtBsQEyZ*7*?64mSc$L>#mM=gM*l9bPvwZQ2M4%pu7`HbG2sS9Wk_KLYO znUGOS49jjga&nSQJTOQgfEWY+z>pWilIQGQwgH{YgOnPDldu7m?8aLQFa-c3X}wPd z45kK-{WL{?B@aE4w_+2SHPyU|t@~ERe^pD_A*bp_4jB}ilma&Y6f=Hpb#D#62d?D) zK6r4R_$xj1UA3D@t{|yKLfh~%SWtQn@>F~K&GB^8FEwq&gA5hB`1*KL2pEknz!=I zcpZ`JDX&%0=ZOq6pdo3mmIgoW(9}(*nl)C9oM1+e1o0RMb`Q&sl|%?V_>rP-3^qRr z&ek4;Jw;`n2SqRt65``uqCBSDd9>gdY*t$tkHIX*WUUQz*^cR;lj)p#nUBrGDeCAp zY&t#?VW(|YE$y$%*KhtbT@h}xHv1PU;#Po!WMBL@&rAP~Lm2?~8)K{0(eSnL1|lm; z+znN~d6s@>SUw;xqNzYJB3mldZEMAwL_XM}5gc26eRd+OIabhrIHNn}Hce~phT2#! zLI!s*^}?$x^t%B+Ul8o6keSdGU?sc1qJaaK_z5_0M-=KDZ8-nxUzML6=X`xiz-`wE z18we=0uDxXd_!vNZIDvx8x-`z`}uJ**M%`N4hQ`mY5JMU%hbvP3zwbc?dSh=k$5x} z&2OsRx)iFsY`gcZOlOuFA*7Xty3>D7|8NH~lsa@xHU|$L&Obud_1N@vUN&<8QGHpMRFnp`@eHT3ytn$^v2CZ z@f*R>U*G5Gxj*W1S9z8TQ>a*xtK4Q(7H|VYu88}mDMe^qHRPrDjAMxI4*WY;^J#VG zor#sjn-A{tXCSc4$uPE;9_k|lkOO(for0Ud2=2aq=Yjt)WwVR8I#Vm?aNIuGXK5o3 zZo?ISn>_alL4 ze{TY=arG9=n9%t1!}6&WAA?`E>SS%5fV2I=Z)cj4k}or7-I31gnOopE!9{10I*`O> zuBKuev?ay2e^9SneW=;Q?FHBz0PRBD@c&Ls4?fiMiORdZ5f*b-8vXRZ>Wp?(g7L&= z@J;HvI4XuJE=qHh;4{z{lf#A%()Z%`o-t-B@1{31pqGu3IH)vdyPfOnIPZV$us_9^ zB$>Y!z&KHzkN6ssFF=Ut38D4UJTYFNJ9_Wt1omfwzx{M0wap)>hydX6;MNplRoZI{ z?b|IZ3faYo%j+OCNJBz%pPHfALxM zkOX81>!QpVC@)I|SndDUH)+(*_j}GggLdMBBVqZ)vvgpDc@>LiT<;hmG?--d(TS-k zPh8*pSRhT3y6C`EL`YZD-Fha9W`>`^!#h9N-P+5lsa&){J%4fvqiE?B=20zhm;KG5 znbF-p`trbYZ0ybn_}5xRIS|ian!fC2fXKO;tQ0rd)i-r|SPi!gms%n&zv*3Xe57wC z@C-RXL`=OPaC(G}-GB3ax#ZJ+b4tA*U;lPsiRg-3!(gX8xI z7i0(Kv$p_8nf`|-rRb^L3nu`4$L*y0P5fr!QCx+aqQted;Q@tw9!muccJvf;@O+Ya zD{emhCg*eu)*{fsW5^ZbaI+1H0xNS#r(2_YaR~TLNW;`n7wMft6)J!}tZ@-^ptyPi zU`%@jv<6|{1cCsAFwQt2rBs?W?0m`YZ+seDUg-re-i5Eqam2hi2=-&yhAGe4Lw52d;j>DhkFK`kVNr`jv zE(%kXnx?V8=xlEfZ}r#hgH=UkiEpLobz_yG_)Z)$v70OiWf2K}#n~q8S13HBY4>pV zN#w}>9$b{=9V2hab0gXfue)5!S(#kSw|E6-bC581OyUD4@6s+HC}_!Hf#~((FX_wp z5b5`C)AR|7>^e)8`K9Z&AFt9B5^jY3>Pr{AxK(%3;er+`mZ}FyMiy0S45PO}3mk2d z8Oe?eZbSD+Eopowf0}-VGS%h6d+Reev-O_$fN7z>xRsu>Kqc&YD$N&4YyrRKc_{+O zGJWUmmuQ0%YsQ3dbyEF}Bs{)W_qmg%;n&Iat<`At&ywi#ql}U(qkfC(kd!2FGThp` zo1h*{QrmRA<^FExH_og?Qc}`7lO3R!htYaaxCr?27e4&(RPAzjbH&m?Zz6~|<5|#X zVS&0eN+B6Grv7bdQ_rb=<#aUhS8+>}TgQpIk6h2fbnQtILT%!qM!{n50`juuKzt%{ z^18wHOt55Dm^`s%!qAu;G3u59c-i)Iv~tnH%gL~O^uwdENkZl;)|hS^*=L1lv4s8t zBRU+50UuaA17JWbyjd&ty`4F)d29DS12KhrSDXHZ)c3c-Rq}Thz%m%FDi#e~qEz^k zR!!VCh!72MRXz5C-xIJf6Hm177*^RUh1?ak=5!f*2tWYp$nyugR$sZ+B2**ggvJh` zQ2N=llrZ`0589+5y=^g<$+5B$=TgIp-&-rjRst)3@c7#@kG7{gxBlG(gUcII!U%P z9@XLM?(m5wM$B~-5=C3WqALEe_-HsVXpZ#hhi9#1TxyME|43p3p|wULhR}eJWOA+z zgpxROqhIjqlTBccK)bj))-OQS<~+=34DqO#_zXSA6@h7KPEHfu1TW_cZWhh;DU%B$ zPHX*jSCv&gns4RPM+F4#8R(wJMRNrw2nr6%UhN(&MP8?NMP( z#f$mN>$GdgTfa?)Ipb5@SA+2g9*@|}vC`FiCBp5ZG|UeR`?rq})%ndvAz*NDFd#u+DN5hc@j~zpNQljD|{<$*^=|l2pl&r53zzttlWyZj>T4Bb=PP^>+X!ZB4xDYTWg zkP8}j(Io^ra7k%3*5s7m_;dX9;1zq>#*JH>ew|G8Ta#~P3lA7eIPm&dF0x|OtaQXWz*QvW&+6aJ$oR;&(R(~7%!rhHuvcKI7&$9z=f${M_J9`!mVGi;-J1um3X|(FW}z1$eFc9#0d{xWo(f1iJ*aPK z$%*N7P423!(&(QiXM-wwErmpy+X~jvR}1*D^T85A`nq>2YZ-&%!zQ+O^?XHBWifWm z7~12{iws@92eT6m25mh_DHQ|@w41cc3u0Ki(isFcDtEMAq^;MKADeJR2et*pU3OChiY zf1wQ2&nYUj<-bY+$nc6xgN9GlX_ut|Q}ZQmL>N5wPUb=ApW6F>8SHvgsy~DC?_XJ& z8<(vC%D8*{|I0dq;k!6gsVV7Zjox1$5RN_>JnX$f1+T?BDcJajk$5Pd->^U__E#(3 z{>Z;*BgkGr(nFsVWw^oz$^*jl3&C~-gs>JB;--V3;mnGyx~J&PB2t`Pyh;RTUfW>i zfak}(DIQ6j#4lBw#)l-v2k)ty4KHWENM{f9R@n;6GfOSW>Rz3`^rG-%8ndyCFEuA? zOu3e$`xWDi$yS!$eMnJMfBN{5V!&ng?8a(!2ET4{&p2d{(0kerDN`t|Uj_ch?SgR` z<6WYI%zH5gjf|ovgjo`aiJs&J)DO94nn-cHhna+p;gMex-zr0G&W8x&n%V+O)-x`U z%EAWGS#gl2cW-RH>$SPm#|HY$glKBs>$#^Pul@A7X8UpfWx<-^&$?5s`{Qp;-F~jE zpyS!%&K>UCf^h9vw6kCJMPt0vj*V0d2nuubv^hXp89Bua)7g*0Oat0e*=@`Nza^rJ z`g;vS$j3WauWy@_T2mtPTS)_2F$})E^Cd8$DcZ1GJ>kp!#XY;F(O;h*S`yki*E?!E z)NzMq#^f^s0t{7cQ!8w$9lY=;do>zbB9lrD2xD%KK?D=x+=}Wg?^*_~Ty`UQO5@p* z`TN8FKIb1e*?qH&-Zw{ve#83#i5Bcz1B>xuX$(L$i6uzs2k)d+bk`uVec^Mr594*c zdU2IlyE|3~$O~m7(Qx{AH09swbU>dpdOUxtu1^@6_pq#xZ|V^`Q~YmUT`vmafe^nq zE=2NU0ls#&c|Z!)toeg&Y(HbArkBrE%77=p*Ln|oRvAb?Ze9E$P`3tJe=KK(he^C~+` zPxWtqhLM={dK9q4{}pA0QP>`^4!Nabyvm4-?W5nCVu6F^imM89aFyTH_G#{!vgx zBbfYwIdmZc=hwxAE!h_A7#nD$_pS^GKW;ETTDjzqyVUdDoFPxJ6>#^!R*(7w^lSK1 z;8Jqei@s=(VcbBaKDS^_RTSiD(rGP%#pkJ9@7sR!Y8**+LONSXl_w;k24cyS2WNTB z;{!&REZd43w;B*3hoMwkBc%{^*jj*!UFS`FDcMIj#sM$TFx8Nt_`x5QC78OK8wcoK z;$tcQ=U3bXR5QOe1#DZuH*ex0s<{VEcXFyuQ-j3f)?2>)RjpysiDBS!n{{h~WmKl` zjSko^Pl%5TUyw#qoN&#|F%V5*@tABrk0&HIkshTIuY?tuXIZ7{o4~22eOJdgG�s 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

{^Fs1wC!ys~qb#haBPfuxcrj$rVVBk_t#x* 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 NE2St|D{dJ4{{R5buN43Q literal 0 HcmV?d00001 diff --git a/x-pack/plugins/observability/public/context/plugin_context.tsx b/x-pack/plugins/observability/public/context/plugin_context.tsx new file mode 100644 index 0000000000000..7d705e7a6cc05 --- /dev/null +++ b/x-pack/plugins/observability/public/context/plugin_context.tsx @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { createContext } from 'react'; +import { AppMountContext } from 'kibana/public'; + +export interface PluginContextValue { + core: AppMountContext['core']; +} + +export const PluginContext = createContext({} as PluginContextValue); diff --git a/x-pack/plugins/observability/public/hooks/use_plugin_context.tsx b/x-pack/plugins/observability/public/hooks/use_plugin_context.tsx new file mode 100644 index 0000000000000..eeec115f0d286 --- /dev/null +++ b/x-pack/plugins/observability/public/hooks/use_plugin_context.tsx @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useContext } from 'react'; +import { PluginContext } from '../context/plugin_context'; + +export function usePluginContext() { + return useContext(PluginContext); +} diff --git a/x-pack/plugins/observability/public/pages/home/index.tsx b/x-pack/plugins/observability/public/pages/home/index.tsx new file mode 100644 index 0000000000000..b9b567bef4ab4 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/home/index.tsx @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + EuiButton, + EuiCard, + EuiFlexGrid, + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiIcon, + EuiImage, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useEffect } from 'react'; +import styled from 'styled-components'; +import { usePluginContext } from '../../hooks/use_plugin_context'; +import { appsSection, tryItOutItemsSection } from './section'; + +const Container = styled.div` + min-height: calc(100vh - 48px); + background: ${(props) => props.theme.eui.euiColorEmptyShade}; +`; + +const Title = styled.div` + background-color: ${(props) => props.theme.eui.euiPageBackgroundColor}; + border-bottom: ${(props) => props.theme.eui.euiBorderThin}; +`; + +const Page = styled.div` + width: 100%; + max-width: 1200px; + margin: 0 auto; + overflow: hidden; +} +`; + +const EuiCardWithoutPadding = styled(EuiCard)` + padding: 0; +`; + +export const Home = () => { + const { core } = usePluginContext(); + + useEffect(() => { + core.chrome.setBreadcrumbs([ + { + text: i18n.translate('xpack.observability.home.breadcrumb.observability', { + defaultMessage: 'Observability', + }), + }, + { + text: i18n.translate('xpack.observability.home.breadcrumb.gettingStarted', { + defaultMessage: 'Getting started', + }), + }, + ]); + }, [core]); + + return ( + + + <Page> + <EuiSpacer size="xxl" /> + <EuiFlexGroup> + <EuiFlexItem grow={false}> + <EuiIcon type="logoObservability" size="xxl" /> + </EuiFlexItem> + <EuiFlexItem> + <EuiTitle size="m"> + <h1> + {i18n.translate('xpack.observability.home.title', { + defaultMessage: 'Observability', + })} + </h1> + </EuiTitle> + </EuiFlexItem> + </EuiFlexGroup> + <EuiSpacer size="xxl" /> + </Page> + + + + + {/* title and description */} + + +

+ {i18n.translate('xpack.observability.home.sectionTitle', { + defaultMessage: 'Observability built on the Elastic Stack', + })} +

+ + + + {i18n.translate('xpack.observability.home.sectionsubtitle', { + defaultMessage: + 'Bring your logs, metrics, and APM traces together at scale in a single stack so you can monitor and react to events happening anywhere in your environment.', + })} + + + + {/* Apps sections */} + + + + + + {appsSection.map((app) => ( + + } + title={ + +

{app.title}

+
+ } + description={app.description} + /> +
+ ))} +
+
+ + + +
+
+ + {/* Get started button */} + + + + + {i18n.translate('xpack.observability.home.getStatedButton', { + defaultMessage: 'Get started', + })} + + + + + + + + {/* Try it out */} + + + + +

+ {i18n.translate('xpack.observability.home.tryItOut', { + defaultMessage: 'Try it out', + })} +

+
+
+
+
+ + {/* Try it out sections */} + + + {tryItOutItemsSection.map((item) => ( + + } + title={ + +

{item.title}

+
+ } + description={item.description} + target={item.target} + href={item.href} + /> +
+ ))} +
+ +
+ + + + ); +}; diff --git a/x-pack/plugins/observability/public/pages/home/section.ts b/x-pack/plugins/observability/public/pages/home/section.ts new file mode 100644 index 0000000000000..f8bbfbfa30548 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/home/section.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { i18n } from '@kbn/i18n'; + +interface ISection { + id: string; + title: string; + icon: string; + description: string; + href?: string; + target?: '_blank'; +} + +export const appsSection: ISection[] = [ + { + id: 'logs', + title: i18n.translate('xpack.observability.section.apps.logs.title', { + defaultMessage: 'Logs', + }), + icon: 'logoLogging', + description: i18n.translate('xpack.observability.section.apps.logs.description', { + defaultMessage: + 'The Elastic Stack (sometimes known as the ELK Stack) is the most popular open source logging platform.', + }), + }, + { + id: 'apm', + title: i18n.translate('xpack.observability.section.apps.apm.title', { + defaultMessage: 'APM', + }), + icon: 'logoAPM', + description: i18n.translate('xpack.observability.section.apps.apm.description', { + defaultMessage: + 'See exactly where your application is spending time so you can quickly fix issues and feel good about the code you push.', + }), + }, + { + id: 'metrics', + title: i18n.translate('xpack.observability.section.apps.metrics.title', { + defaultMessage: 'Metrics', + }), + icon: 'logoMetrics', + description: i18n.translate('xpack.observability.section.apps.metrics.description', { + defaultMessage: + 'Already using the Elastic Stack for logs? Add metrics in just a few steps and correlate metrics and logs in one place.', + }), + }, + { + id: 'uptime', + title: i18n.translate('xpack.observability.section.apps.uptime.title', { + defaultMessage: 'Uptime', + }), + icon: 'logoUptime', + description: i18n.translate('xpack.observability.section.apps.uptime.description', { + defaultMessage: + 'React to availability issues across your apps and services before they affect users.', + }), + }, +]; + +export const tryItOutItemsSection: ISection[] = [ + { + id: 'demo', + title: i18n.translate('xpack.observability.section.tryItOut.demo.title', { + defaultMessage: 'Demo Playground', + }), + icon: 'play', + description: '', + href: 'https://demo.elastic.co/', + target: '_blank', + }, + { + id: 'sampleData', + title: i18n.translate('xpack.observability.section.tryItOut.sampleData.title', { + defaultMessage: 'Add sample data', + }), + icon: 'documents', + description: '', + href: '/app/home#/tutorial_directory/sampleData', + }, +]; diff --git a/x-pack/plugins/observability/public/plugin.ts b/x-pack/plugins/observability/public/plugin.ts index a7eb1c50a0392..f2c88a7b1c056 100644 --- a/x-pack/plugins/observability/public/plugin.ts +++ b/x-pack/plugins/observability/public/plugin.ts @@ -3,13 +3,37 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { Plugin as PluginClass, PluginInitializerContext } from 'kibana/public'; +import { + AppMountParameters, + CoreSetup, + DEFAULT_APP_CATEGORIES, + Plugin as PluginClass, + PluginInitializerContext, +} from '../../../../src/core/public'; export type ClientSetup = void; export type ClientStart = void; -export class Plugin implements PluginClass { +export class Plugin implements PluginClass { constructor(context: PluginInitializerContext) {} - start() {} - setup() {} + + public setup(core: CoreSetup) { + core.application.register({ + id: 'observability-overview', + title: 'Overview', + order: 8000, + appRoute: '/app/observability', + category: DEFAULT_APP_CATEGORIES.observability, + + async mount(params: AppMountParameters) { + // Load application bundle + const { renderApp } = await import('./application'); + // Get start services + const [coreStart] = await core.getStartServices(); + + return renderApp(coreStart, params); + }, + }); + } + public start() {} } diff --git a/x-pack/plugins/uptime/public/apps/plugin.ts b/x-pack/plugins/uptime/public/apps/plugin.ts index 5d9bbacb49006..d3a67f81004da 100644 --- a/x-pack/plugins/uptime/public/apps/plugin.ts +++ b/x-pack/plugins/uptime/public/apps/plugin.ts @@ -56,7 +56,7 @@ export class UptimePlugin appRoute: '/app/uptime#/', id: PLUGIN.ID, euiIconType: 'uptimeApp', - order: 8900, + order: 8400, title: PLUGIN.TITLE, category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { diff --git a/x-pack/test/functional/apps/advanced_settings/feature_controls/advanced_settings_security.ts b/x-pack/test/functional/apps/advanced_settings/feature_controls/advanced_settings_security.ts index cda41c4e60591..d1acbf436bbe7 100644 --- a/x-pack/test/functional/apps/advanced_settings/feature_controls/advanced_settings_security.ts +++ b/x-pack/test/functional/apps/advanced_settings/feature_controls/advanced_settings_security.ts @@ -69,7 +69,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows management navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Stack Management']); + expect(navLinks).to.contain('Stack Management'); }); it(`allows settings to be changed`, async () => { @@ -125,7 +125,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows Management navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Stack Management']); + expect(navLinks).to.contain('Stack Management'); }); it(`does not allow settings to be changed`, async () => { @@ -177,7 +177,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows Management navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Discover', 'Stack Management']); + expect(navLinks).to.contain('Stack Management'); }); it(`does not allow navigation to advanced settings; redirects to management home`, async () => { diff --git a/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts b/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts index aa12543004656..4c3c1556d621c 100644 --- a/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts +++ b/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts @@ -60,7 +60,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows apm navlink', async () => { const navLinks = await appsMenu.readLinks(); - expect(navLinks.map((link) => link.text)).to.eql(['APM', 'Stack Management']); + expect(navLinks.map((link) => link.text)).to.contain('APM'); }); it('can navigate to APM app', async () => { @@ -109,7 +109,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows apm navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['APM', 'Stack Management']); + expect(navLinks).to.contain('APM'); }); it('can navigate to APM app', async () => { diff --git a/x-pack/test/functional/apps/canvas/feature_controls/canvas_security.ts b/x-pack/test/functional/apps/canvas/feature_controls/canvas_security.ts index e9fa4ccf8e48b..b776d358b1673 100644 --- a/x-pack/test/functional/apps/canvas/feature_controls/canvas_security.ts +++ b/x-pack/test/functional/apps/canvas/feature_controls/canvas_security.ts @@ -66,7 +66,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows canvas navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Canvas', 'Stack Management']); + expect(navLinks).to.contain('Canvas'); }); it(`landing page shows "Create new workpad" button`, async () => { @@ -142,7 +142,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows canvas navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Canvas', 'Stack Management']); + expect(navLinks).to.contain('Canvas'); }); it(`landing page shows disabled "Create new workpad" button`, async () => { diff --git a/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts b/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts index 803ff6399a035..5d5f6b8aaa324 100644 --- a/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts +++ b/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts @@ -63,7 +63,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows Dev Tools navlink', async () => { const navLinks = await appsMenu.readLinks(); - expect(navLinks.map((link) => link.text)).to.eql(['Dev Tools', 'Stack Management']); + expect(navLinks.map((link) => link.text)).to.contain('Dev Tools'); }); describe('console', () => { @@ -144,7 +144,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it(`shows 'Dev Tools' navlink`, async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Dev Tools', 'Stack Management']); + expect(navLinks).to.contain('Dev Tools'); }); describe('console', () => { diff --git a/x-pack/test/functional/apps/discover/feature_controls/discover_security.ts b/x-pack/test/functional/apps/discover/feature_controls/discover_security.ts index 03a5cc6ac8fa0..6a11daa8d2c26 100644 --- a/x-pack/test/functional/apps/discover/feature_controls/discover_security.ts +++ b/x-pack/test/functional/apps/discover/feature_controls/discover_security.ts @@ -82,7 +82,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows discover navlink', async () => { const navLinks = await appsMenu.readLinks(); - expect(navLinks.map((link) => link.text)).to.eql(['Discover', 'Stack Management']); + expect(navLinks.map((link) => link.text)).to.contain('Discover'); }); it('shows save button', async () => { @@ -169,7 +169,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows discover navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Discover', 'Stack Management']); + expect(navLinks).to.contain('Discover'); }); it(`doesn't show save button`, async () => { @@ -260,7 +260,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows discover navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Discover', 'Stack Management']); + expect(navLinks).to.contain('Discover'); }); it(`doesn't show save button`, async () => { diff --git a/x-pack/test/functional/apps/graph/feature_controls/graph_security.ts b/x-pack/test/functional/apps/graph/feature_controls/graph_security.ts index 9121028c14404..f13d73bc95dbe 100644 --- a/x-pack/test/functional/apps/graph/feature_controls/graph_security.ts +++ b/x-pack/test/functional/apps/graph/feature_controls/graph_security.ts @@ -64,7 +64,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows graph navlink', async () => { const navLinks = await appsMenu.readLinks(); - expect(navLinks.map((link) => link.text)).to.eql(['Graph', 'Stack Management']); + expect(navLinks.map((link) => link.text)).to.contain('Graph'); }); it('landing page shows "Create new graph" button', async () => { @@ -127,7 +127,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows graph navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Graph', 'Stack Management']); + expect(navLinks).to.contain('Graph'); }); it('does not show a "Create new Workspace" button', async () => { diff --git a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts b/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts index cd892c4424290..a6d2c13cd2b31 100644 --- a/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts +++ b/x-pack/test/functional/apps/index_patterns/feature_controls/index_patterns_security.ts @@ -71,7 +71,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows management navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Stack Management']); + expect(navLinks).to.contain('Stack Management'); }); it(`index pattern listing shows create button`, async () => { @@ -125,7 +125,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows management navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Stack Management']); + expect(navLinks).to.contain('Stack Management'); }); it(`index pattern listing doesn't show create button`, async () => { @@ -177,7 +177,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows Management navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Discover', 'Stack Management']); + expect(navLinks).to.contain('Stack Management'); }); it(`doesn't show Index Patterns in management side-nav`, async () => { diff --git a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts index 6e186fc9ab9b2..a15b2b33b229c 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts @@ -61,7 +61,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows metrics navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Metrics', 'Stack Management']); + expect(navLinks).to.contain('Metrics'); }); describe('infrastructure landing page without data', () => { @@ -177,7 +177,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows metrics navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Metrics', 'Stack Management']); + expect(navLinks).to.contain('Metrics'); }); describe('infrastructure landing page without data', () => { diff --git a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts index fafc88287a6ab..ce83a22fb2e1f 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts @@ -58,7 +58,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows logs navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Logs', 'Stack Management']); + expect(navLinks).to.contain('Logs'); }); describe('logs landing page without data', () => { @@ -121,7 +121,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows logs navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Logs', 'Stack Management']); + expect(navLinks).to.contain('Logs'); }); describe('logs landing page without data', () => { diff --git a/x-pack/test/functional/apps/maps/feature_controls/maps_security.ts b/x-pack/test/functional/apps/maps/feature_controls/maps_security.ts index 2449430ac85c2..f1c5b3f82f7da 100644 --- a/x-pack/test/functional/apps/maps/feature_controls/maps_security.ts +++ b/x-pack/test/functional/apps/maps/feature_controls/maps_security.ts @@ -66,7 +66,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows maps navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Maps', 'Stack Management']); + expect(navLinks).to.contain('Maps'); }); it(`allows a map to be created`, async () => { @@ -153,7 +153,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows Maps navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Maps', 'Stack Management']); + expect(navLinks).to.contain('Maps'); }); it(`does not show create new button`, async () => { diff --git a/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts b/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts index a3ade23f5c178..5021bd8cce0fc 100644 --- a/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts +++ b/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts @@ -60,7 +60,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows timelion navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Timelion', 'Stack Management']); + expect(navLinks).to.contain('Timelion'); }); it(`allows a timelion sheet to be created`, async () => { @@ -112,7 +112,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows timelion navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Timelion', 'Stack Management']); + expect(navLinks).to.contain('Timelion'); }); it(`does not allow a timelion sheet to be created`, async () => { diff --git a/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts b/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts index ae13cf0742432..991cd07dce513 100644 --- a/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts +++ b/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts @@ -64,7 +64,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows uptime navlink', async () => { const navLinks = await appsMenu.readLinks(); - expect(navLinks.map((link) => link.text)).to.eql(['Uptime', 'Stack Management']); + expect(navLinks.map((link) => link.text)).to.contain('Uptime'); }); it('can navigate to Uptime app', async () => { @@ -115,7 +115,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows uptime navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Uptime', 'Stack Management']); + expect(navLinks).to.contain('Uptime'); }); it('can navigate to Uptime app', async () => { diff --git a/x-pack/test/functional/apps/visualize/feature_controls/visualize_security.ts b/x-pack/test/functional/apps/visualize/feature_controls/visualize_security.ts index 9410a6f9435f2..f74643939477c 100644 --- a/x-pack/test/functional/apps/visualize/feature_controls/visualize_security.ts +++ b/x-pack/test/functional/apps/visualize/feature_controls/visualize_security.ts @@ -77,7 +77,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows visualize navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Visualize', 'Stack Management']); + expect(navLinks).to.contain('Visualize'); }); it(`landing page shows "Create new Visualization" button`, async () => { @@ -201,7 +201,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows visualize navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Visualize', 'Stack Management']); + expect(navLinks).to.contain('Visualize'); }); it(`landing page shows "Create new Visualization" button`, async () => { @@ -316,7 +316,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows visualize navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Visualize', 'Stack Management']); + expect(navLinks).to.contain('Visualize'); }); it(`landing page shows "Create new Visualization" button`, async () => { From 09eaa1c57a951680b88f8db87af079d17fc3ef36 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Mon, 8 Jun 2020 11:37:44 +0200 Subject: [PATCH 02/65] Add app arch team as owner of datemath package (#66880) Co-authored-by: Elastic Machine --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4716346277029..48d70910f9bf1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -37,6 +37,7 @@ /examples/url_generators_examples/ @elastic/kibana-app-arch /examples/url_generators_explorer/ @elastic/kibana-app-arch /packages/kbn-interpreter/ @elastic/kibana-app-arch +/packages/elastic-datemath/ @elastic/kibana-app-arch /src/legacy/core_plugins/embeddable_api/ @elastic/kibana-app-arch /src/legacy/core_plugins/interpreter/ @elastic/kibana-app-arch /src/legacy/core_plugins/kibana_react/ @elastic/kibana-app-arch From 00cff3cd7e19770f66ae12ac694f0ed015a17821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 8 Jun 2020 12:03:05 +0100 Subject: [PATCH 03/65] Adding key to avoid react warning (#68491) --- x-pack/plugins/observability/public/pages/home/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/observability/public/pages/home/index.tsx b/x-pack/plugins/observability/public/pages/home/index.tsx index b9b567bef4ab4..072d3c47d3a55 100644 --- a/x-pack/plugins/observability/public/pages/home/index.tsx +++ b/x-pack/plugins/observability/public/pages/home/index.tsx @@ -113,7 +113,7 @@ export const Home = () => { {appsSection.map((app) => ( - + Date: Mon, 8 Jun 2020 13:12:03 +0100 Subject: [PATCH 04/65] Add embed mode options in the Share UI (#58435) --- .../ui/public/styles/_legacy/_base.scss | 4 - .../application/dashboard_app_controller.tsx | 143 +++++++++++- .../embeddable/dashboard_container.tsx | 2 + .../dashboard_container_factory.tsx | 1 + .../viewport/dashboard_viewport.tsx | 18 +- .../get_sample_dashboard_input.ts | 1 + src/plugins/dashboard/public/plugin.tsx | 23 +- .../ui/filter_bar/_global_filter_group.scss | 4 + .../public/angular/kbn_top_nav.js | 4 +- .../public/top_nav_menu/top_nav_menu.test.tsx | 23 +- .../public/top_nav_menu/top_nav_menu.tsx | 48 ++-- .../url_panel_content.test.tsx.snap | 207 +++++++++++++++++- .../public/components/share_context_menu.tsx | 4 +- .../components/url_panel_content.test.tsx | 10 + .../public/components/url_panel_content.tsx | 100 +++++++-- .../public/services/share_menu_manager.tsx | 2 + src/plugins/share/public/types.ts | 11 + test/functional/apps/dashboard/embed_mode.js | 29 ++- .../public/app/dashboard_input.ts | 1 + 19 files changed, 564 insertions(+), 71 deletions(-) diff --git a/src/legacy/ui/public/styles/_legacy/_base.scss b/src/legacy/ui/public/styles/_legacy/_base.scss index fd0a1335f9685..877ae033ae584 100644 --- a/src/legacy/ui/public/styles/_legacy/_base.scss +++ b/src/legacy/ui/public/styles/_legacy/_base.scss @@ -64,10 +64,6 @@ input[type='checkbox'], padding-bottom: $euiSizeS; } - .globalQueryBar { - padding: 0px $euiSizeS $euiSizeS $euiSizeS; - } - > nav, > navbar { z-index: 2 !important; diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index a59d1e8c546d4..206ef4f3d4313 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -19,8 +19,9 @@ import _, { uniq } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { EUI_MODAL_CANCEL_BUTTON } from '@elastic/eui'; -import React from 'react'; +import { EUI_MODAL_CANCEL_BUTTON, EuiCheckboxGroup } from '@elastic/eui'; +import { EuiCheckboxGroupIdToSelectedMap } from '@elastic/eui/src/components/form/checkbox/checkbox_group'; +import React, { useState, ReactElement } from 'react'; import ReactDOM from 'react-dom'; import angular from 'angular'; @@ -94,6 +95,25 @@ export interface DashboardAppControllerDependencies extends RenderDeps { navigation: NavigationStart; } +enum UrlParams { + SHOW_TOP_MENU = 'show-top-menu', + SHOW_QUERY_INPUT = 'show-query-input', + SHOW_TIME_FILTER = 'show-time-filter', + SHOW_FILTER_BAR = 'show-filter-bar', + HIDE_FILTER_BAR = 'hide-filter-bar', +} + +interface UrlParamsSelectedMap { + [UrlParams.SHOW_TOP_MENU]: boolean; + [UrlParams.SHOW_QUERY_INPUT]: boolean; + [UrlParams.SHOW_TIME_FILTER]: boolean; + [UrlParams.SHOW_FILTER_BAR]: boolean; +} + +interface UrlParamValues extends Omit { + [UrlParams.HIDE_FILTER_BAR]: boolean; +} + export class DashboardAppController { // Part of the exposed plugin API - do not remove without careful consideration. appStatus: { @@ -133,8 +153,16 @@ export class DashboardAppController { const filterManager = queryService.filterManager; const queryFilter = filterManager; const timefilter = queryService.timefilter.timefilter; - let showSearchBar = true; - let showQueryBar = true; + const isEmbeddedExternally = Boolean($routeParams.embed); + + // url param rules should only apply when embedded (e.g. url?embed=true) + const shouldForceDisplay = (param: string): boolean => + isEmbeddedExternally && Boolean($routeParams[param]); + + const forceShowTopNavMenu = shouldForceDisplay(UrlParams.SHOW_TOP_MENU); + const forceShowQueryInput = shouldForceDisplay(UrlParams.SHOW_QUERY_INPUT); + const forceShowDatePicker = shouldForceDisplay(UrlParams.SHOW_TIME_FILTER); + const forceHideFilterBar = shouldForceDisplay(UrlParams.HIDE_FILTER_BAR); let lastReloadRequestTime = 0; const dash = ($scope.dash = $route.current.locals.dash); @@ -251,9 +279,6 @@ export class DashboardAppController { } }; - const showFilterBar = () => - $scope.model.filters.length > 0 || !dashboardStateManager.getFullScreenMode(); - const getEmptyScreenProps = ( shouldShowEditHelp: boolean, isEmptyInReadOnlyMode: boolean @@ -299,6 +324,7 @@ export class DashboardAppController { viewMode: dashboardStateManager.getViewMode(), panels: embeddablesMap, isFullScreenMode: dashboardStateManager.getFullScreenMode(), + isEmbeddedExternally, isEmptyState: shouldShowEditHelp || shouldShowViewHelp || isEmptyInReadonlyMode, useMargins: dashboardStateManager.getUseMargins(), lastReloadRequestTime, @@ -590,17 +616,33 @@ export class DashboardAppController { dashboardStateManager.setSavedQueryId(savedQueryId); }; + const shouldShowFilterBar = (forceHide: boolean): boolean => + !forceHide && ($scope.model.filters.length > 0 || !dashboardStateManager.getFullScreenMode()); + + const shouldShowNavBarComponent = (forceShow: boolean): boolean => + (forceShow || $scope.isVisible) && !dashboardStateManager.getFullScreenMode(); + const getNavBarProps = () => { const isFullScreenMode = dashboardStateManager.getFullScreenMode(); const screenTitle = dashboardStateManager.getTitle(); + const showTopNavMenu = shouldShowNavBarComponent(forceShowTopNavMenu); + const showQueryInput = shouldShowNavBarComponent(forceShowQueryInput); + const showDatePicker = shouldShowNavBarComponent(forceShowDatePicker); + const showQueryBar = showQueryInput || showDatePicker; + const showFilterBar = shouldShowFilterBar(forceHideFilterBar); + const showSearchBar = showQueryBar || showFilterBar; + return { appName: 'dashboard', - config: $scope.isVisible ? $scope.topNavMenu : undefined, + config: showTopNavMenu ? $scope.topNavMenu : undefined, className: isFullScreenMode ? 'kbnTopNavMenu-isFullScreen' : undefined, screenTitle, + showTopNavMenu, showSearchBar, showQueryBar, - showFilterBar: showFilterBar(), + showQueryInput, + showDatePicker, + showFilterBar, indexPatterns: $scope.indexPatterns, showSaveQuery: $scope.showSaveQuery, query: $scope.model.query, @@ -798,7 +840,6 @@ export class DashboardAppController { } = {}; navActions[TopNavIds.FULL_SCREEN] = () => { dashboardStateManager.setFullScreenMode(true); - showQueryBar = false; updateNavBar(); }; navActions[TopNavIds.EXIT_EDIT_MODE] = () => onChangeViewMode(ViewMode.VIEW); @@ -923,6 +964,80 @@ export class DashboardAppController { if (share) { // the share button is only availabale if "share" plugin contract enabled navActions[TopNavIds.SHARE] = (anchorElement) => { + const EmbedUrlParamExtension = ({ + setParamValue, + }: { + setParamValue: (paramUpdate: UrlParamValues) => void; + }): ReactElement => { + const [urlParamsSelectedMap, setUrlParamsSelectedMap] = useState({ + [UrlParams.SHOW_TOP_MENU]: false, + [UrlParams.SHOW_QUERY_INPUT]: false, + [UrlParams.SHOW_TIME_FILTER]: false, + [UrlParams.SHOW_FILTER_BAR]: true, + }); + + const checkboxes = [ + { + id: UrlParams.SHOW_TOP_MENU, + label: i18n.translate('dashboard.embedUrlParamExtension.topMenu', { + defaultMessage: 'Top menu', + }), + }, + { + id: UrlParams.SHOW_QUERY_INPUT, + label: i18n.translate('dashboard.embedUrlParamExtension.query', { + defaultMessage: 'Query', + }), + }, + { + id: UrlParams.SHOW_TIME_FILTER, + label: i18n.translate('dashboard.embedUrlParamExtension.timeFilter', { + defaultMessage: 'Time filter', + }), + }, + { + id: UrlParams.SHOW_FILTER_BAR, + label: i18n.translate('dashboard.embedUrlParamExtension.filterBar', { + defaultMessage: 'Filter bar', + }), + }, + ]; + + const handleChange = (param: string): void => { + const urlParamsSelectedMapUpdate = { + ...urlParamsSelectedMap, + [param]: !urlParamsSelectedMap[param as keyof UrlParamsSelectedMap], + }; + setUrlParamsSelectedMap(urlParamsSelectedMapUpdate); + + const urlParamValues = { + [UrlParams.SHOW_TOP_MENU]: urlParamsSelectedMap[UrlParams.SHOW_TOP_MENU], + [UrlParams.SHOW_QUERY_INPUT]: urlParamsSelectedMap[UrlParams.SHOW_QUERY_INPUT], + [UrlParams.SHOW_TIME_FILTER]: urlParamsSelectedMap[UrlParams.SHOW_TIME_FILTER], + [UrlParams.HIDE_FILTER_BAR]: !urlParamsSelectedMap[UrlParams.SHOW_FILTER_BAR], + [param === UrlParams.SHOW_FILTER_BAR ? UrlParams.HIDE_FILTER_BAR : param]: + param === UrlParams.SHOW_FILTER_BAR + ? urlParamsSelectedMap[UrlParams.SHOW_FILTER_BAR] + : !urlParamsSelectedMap[param as keyof UrlParamsSelectedMap], + }; + setParamValue(urlParamValues); + }; + + return ( + + ); + }; + share.toggleShareContextMenu({ anchorElement, allowEmbed: true, @@ -935,6 +1050,12 @@ export class DashboardAppController { title: dash.title, }, isDirty: dashboardStateManager.getIsDirty(), + embedUrlParamExtensions: [ + { + paramName: 'embed', + component: EmbedUrlParamExtension, + }, + ], }); }; } @@ -955,8 +1076,6 @@ export class DashboardAppController { const visibleSubscription = chrome.getIsVisible$().subscribe((isVisible) => { $scope.$evalAsync(() => { $scope.isVisible = isVisible; - showSearchBar = isVisible || showFilterBar(); - showQueryBar = !dashboardStateManager.getFullScreenMode() && isVisible; updateNavBar(); }); }); diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx index 5d4cc851cf455..2121ca4c784bd 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx @@ -57,6 +57,7 @@ export interface DashboardContainerInput extends ContainerInput { useMargins: boolean; title: string; description?: string; + isEmbeddedExternally: boolean; isFullScreenMode: boolean; panels: { [panelId: string]: DashboardPanelState; @@ -105,6 +106,7 @@ export class DashboardContainer extends Container { return { panels: {}, + isEmbeddedExternally: false, isFullScreenMode: false, useMargins: true, }; diff --git a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx index 429837583b648..9ee50426b19bb 100644 --- a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx +++ b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx @@ -36,6 +36,7 @@ interface State { title: string; description?: string; panels: { [key: string]: PanelState }; + isEmbeddedExternally?: boolean; isEmptyState?: boolean; } @@ -52,6 +53,7 @@ export class DashboardViewport extends React.Component {isFullScreenMode && ( )} {renderEmpty && renderEmpty()} @@ -116,7 +122,14 @@ export class DashboardViewport extends React.Component )} diff --git a/src/plugins/dashboard/public/application/test_helpers/get_sample_dashboard_input.ts b/src/plugins/dashboard/public/application/test_helpers/get_sample_dashboard_input.ts index 4ceac90672cb3..825a69155ba22 100644 --- a/src/plugins/dashboard/public/application/test_helpers/get_sample_dashboard_input.ts +++ b/src/plugins/dashboard/public/application/test_helpers/get_sample_dashboard_input.ts @@ -27,6 +27,7 @@ export function getSampleDashboardInput( id: '123', filters: [], useMargins: false, + isEmbeddedExternally: false, isFullScreenMode: false, title: 'My Dashboard', query: { diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index 0de3982039928..a3338ab3bbcbb 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -167,15 +167,26 @@ export class DashboardPlugin const getStartServices = async () => { const [coreStart, deps] = await core.getStartServices(); - const useHideChrome = () => { + const useHideChrome = ({ toggleChrome } = { toggleChrome: true }) => { React.useEffect(() => { - coreStart.chrome.setIsVisible(false); - return () => coreStart.chrome.setIsVisible(true); - }, []); + if (toggleChrome) { + coreStart.chrome.setIsVisible(false); + } + + return () => { + if (toggleChrome) { + coreStart.chrome.setIsVisible(true); + } + }; + }, [toggleChrome]); }; - const ExitFullScreenButton: React.FC = (props) => { - useHideChrome(); + const ExitFullScreenButton: React.FC< + ExitFullScreenButtonProps & { + toggleChrome: boolean; + } + > = ({ toggleChrome, ...props }) => { + useHideChrome({ toggleChrome }); return ; }; return { diff --git a/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss b/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss index 1c47c28097454..731c9f4d7f18d 100644 --- a/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss +++ b/src/plugins/data/public/ui/filter_bar/_global_filter_group.scss @@ -3,6 +3,10 @@ padding: 0px $euiSizeS $euiSizeS $euiSizeS; } +.globalQueryBar:first-child { + padding-top: $euiSizeS; +} + .globalQueryBar:not(:empty) { padding-bottom: $euiSizeS; } diff --git a/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js b/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js index a0faf4a6a071c..b3fbe8baadec3 100644 --- a/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js +++ b/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js @@ -94,11 +94,11 @@ export const createTopNavHelper = ({ TopNavMenu }) => (reactDirective) => { // All modifiers default to true. // Set to false to hide subcomponents. 'showSearchBar', - 'showFilterBar', 'showQueryBar', 'showQueryInput', - 'showDatePicker', 'showSaveQuery', + 'showDatePicker', + 'showFilterBar', 'appName', 'screenTitle', diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx index 74cfd125c2e3a..46384fb3f27d5 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx @@ -29,6 +29,7 @@ const dataShim = { }; describe('TopNavMenu', () => { + const WRAPPER_SELECTOR = '.kbnTopNavMenu__wrapper'; const TOP_NAV_ITEM_SELECTOR = 'TopNavMenuItem'; const SEARCH_BAR_SELECTOR = 'SearchBar'; const menuItems: TopNavMenuData[] = [ @@ -51,18 +52,28 @@ describe('TopNavMenu', () => { it('Should render nothing when no config is provided', () => { const component = shallowWithIntl(); + expect(component.find(WRAPPER_SELECTOR).length).toBe(0); + expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(0); + expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(0); + }); + + it('Should not render menu items when config is empty', () => { + const component = shallowWithIntl(); + expect(component.find(WRAPPER_SELECTOR).length).toBe(0); expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(0); expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(0); }); it('Should render 1 menu item', () => { const component = shallowWithIntl(); + expect(component.find(WRAPPER_SELECTOR).length).toBe(1); expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(1); expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(0); }); it('Should render multiple menu items', () => { const component = shallowWithIntl(); + expect(component.find(WRAPPER_SELECTOR).length).toBe(1); expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(menuItems.length); expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(0); }); @@ -71,15 +82,25 @@ describe('TopNavMenu', () => { const component = shallowWithIntl( ); - + expect(component.find(WRAPPER_SELECTOR).length).toBe(1); expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(0); expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(1); }); + it('Should render menu items and search bar', () => { + const component = shallowWithIntl( + + ); + expect(component.find(WRAPPER_SELECTOR).length).toBe(1); + expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(menuItems.length); + expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(1); + }); + it('Should render with a class name', () => { const component = shallowWithIntl( { return ( + {renderItems()} + + ); + } + + function renderSearchBar(): ReactElement | null { // Validate presense of all required fields - if (!showSearchBar || !props.data) return; + if (!showSearchBar || !props.data) return null; const { SearchBar } = props.data.ui; return ; } @@ -70,16 +95,7 @@ export function TopNavMenu(props: TopNavMenuProps) { const className = classNames('kbnTopNavMenu', props.className); return ( - - {renderItems()} - + {renderMenu(className)} {renderSearchBar()} ); diff --git a/src/plugins/share/public/components/__snapshots__/url_panel_content.test.tsx.snap b/src/plugins/share/public/components/__snapshots__/url_panel_content.test.tsx.snap index 8787e0c027375..cae7aa96a7c0e 100644 --- a/src/plugins/share/public/components/__snapshots__/url_panel_content.test.tsx.snap +++ b/src/plugins/share/public/components/__snapshots__/url_panel_content.test.tsx.snap @@ -44,7 +44,9 @@ exports[`share url panel content render 1`] = ` gutterSize="none" responsive={false} > - + - + - + - + - + - + - + - + `; + +exports[`should show url param extensions 1`] = ` + + + + } + labelType="label" + > + + + + + + + } + position="bottom" + /> + + , + }, + Object { + "data-test-subj": "exportAsSavedObject", + "disabled": false, + "id": "savedObject", + "label": + + + + + + } + position="bottom" + /> + + , + }, + ] + } + /> + + + + + + + + + } + onChange={[Function]} + /> + + + + } + position="bottom" + /> + + + + + + + + + +`; diff --git a/src/plugins/share/public/components/share_context_menu.tsx b/src/plugins/share/public/components/share_context_menu.tsx index c12e9dabd1938..26426853ddabe 100644 --- a/src/plugins/share/public/components/share_context_menu.tsx +++ b/src/plugins/share/public/components/share_context_menu.tsx @@ -26,7 +26,7 @@ import { EuiContextMenu, EuiContextMenuPanelDescriptor } from '@elastic/eui'; import { HttpStart } from 'kibana/public'; import { UrlPanelContent } from './url_panel_content'; -import { ShareMenuItem, ShareContextMenuPanelItem } from '../types'; +import { ShareMenuItem, ShareContextMenuPanelItem, UrlParamExtension } from '../types'; interface Props { allowEmbed: boolean; @@ -39,6 +39,7 @@ interface Props { onClose: () => void; basePath: string; post: HttpStart['post']; + embedUrlParamExtensions?: UrlParamExtension[]; } export class ShareContextMenu extends Component { @@ -100,6 +101,7 @@ export class ShareContextMenu extends Component { basePath={this.props.basePath} post={this.props.post} shareableUrl={this.props.shareableUrl} + urlParamExtensions={this.props.embedUrlParamExtensions} /> ), }; diff --git a/src/plugins/share/public/components/url_panel_content.test.tsx b/src/plugins/share/public/components/url_panel_content.test.tsx index bd30dbf002df8..481f8312f4262 100644 --- a/src/plugins/share/public/components/url_panel_content.test.tsx +++ b/src/plugins/share/public/components/url_panel_content.test.tsx @@ -202,3 +202,13 @@ describe('share url panel content', () => { }); }); }); + +test('should show url param extensions', () => { + const TestExtension = () =>
; + const extensions = [{ paramName: 'testExtension', component: TestExtension }]; + const component = shallow( + + ); + expect(component.find('TestExtension').length).toBe(1); + expect(component).toMatchSnapshot(); +}); diff --git a/src/plugins/share/public/components/url_panel_content.tsx b/src/plugins/share/public/components/url_panel_content.tsx index 2ece2052c4b95..65a8538693a49 100644 --- a/src/plugins/share/public/components/url_panel_content.tsx +++ b/src/plugins/share/public/components/url_panel_content.tsx @@ -17,7 +17,7 @@ * under the License. */ -import React, { Component } from 'react'; +import React, { Component, ReactElement } from 'react'; import { EuiButton, @@ -41,6 +41,7 @@ import { HttpStart } from 'kibana/public'; import { i18n } from '@kbn/i18n'; import { shortenUrl } from '../lib/url_shortener'; +import { UrlParamExtension } from '../types'; interface Props { allowShortUrl: boolean; @@ -50,6 +51,7 @@ interface Props { shareableUrl?: string; basePath: string; post: HttpStart['post']; + urlParamExtensions?: UrlParamExtension[]; } export enum ExportUrlAsType { @@ -57,12 +59,19 @@ export enum ExportUrlAsType { EXPORT_URL_AS_SNAPSHOT = 'snapshot', } +interface UrlParams { + [extensionName: string]: { + [queryParam: string]: boolean; + }; +} + interface State { exportUrlAs: ExportUrlAsType; useShortUrl: boolean; isCreatingShortUrl: boolean; url?: string; shortUrlErrorMsg?: string; + urlParams?: UrlParams; } export class UrlPanelContent extends Component { @@ -100,7 +109,7 @@ export class UrlPanelContent extends Component { {this.renderExportAsRadioGroup()} - + {this.renderUrlParamExtensions()} {this.renderShortUrlSwitch()} @@ -151,6 +160,13 @@ export class UrlPanelContent extends Component { } }; + private updateUrlParams = (url: string) => { + const embedUrl = this.props.isEmbedded ? this.makeUrlEmbeddable(url) : url; + const extendUrl = this.state.urlParams ? this.getUrlParamExtensions(embedUrl) : embedUrl; + + return extendUrl; + }; + private getSavedObjectUrl = () => { if (this.isNotSaved()) { return; @@ -166,7 +182,7 @@ export class UrlPanelContent extends Component { // Get the application route, after the hash, and remove the #. const parsedAppUrl = parseUrl(parsedUrl.hash.slice(1), true); - let formattedUrl = formatUrl({ + const formattedUrl = formatUrl({ protocol: parsedUrl.protocol, auth: parsedUrl.auth, host: parsedUrl.host, @@ -180,28 +196,42 @@ export class UrlPanelContent extends Component { }, }), }); - if (this.props.isEmbedded) { - formattedUrl = this.makeUrlEmbeddable(formattedUrl); - } - return formattedUrl; + return this.updateUrlParams(formattedUrl); }; private getSnapshotUrl = () => { - let url = this.props.shareableUrl || window.location.href; - if (this.props.isEmbedded) { - url = this.makeUrlEmbeddable(url); - } - return url; + const url = this.props.shareableUrl || window.location.href; + + return this.updateUrlParams(url); }; - private makeUrlEmbeddable = (url: string) => { - const embedQueryParam = '?embed=true'; + private makeUrlEmbeddable = (url: string): string => { + const embedParam = '?embed=true'; const urlHasQueryString = url.indexOf('?') !== -1; + if (urlHasQueryString) { - return url.replace('?', `${embedQueryParam}&`); + return url.replace('?', `${embedParam}&`); } - return `${url}${embedQueryParam}`; + + return `${url}${embedParam}`; + }; + + private getUrlParamExtensions = (url: string): string => { + const { urlParams } = this.state; + return urlParams + ? Object.keys(urlParams).reduce((urlAccumulator, key) => { + const urlParam = urlParams[key]; + return urlParam + ? Object.keys(urlParam).reduce((queryAccumulator, queryParam) => { + const isQueryParamEnabled = urlParam[queryParam]; + return isQueryParamEnabled + ? queryAccumulator + `&${queryParam}=true` + : queryAccumulator; + }, urlAccumulator) + : urlAccumulator; + }, url) + : url; }; private makeIframeTag = (url?: string) => { @@ -247,6 +277,10 @@ export class UrlPanelContent extends Component { } // "Use short URL" is checked but shortUrl has not been generated yet so one needs to be created. + this.createShortUrl(); + }; + + private createShortUrl = async () => { this.setState({ isCreatingShortUrl: true, shortUrlErrorMsg: undefined, @@ -262,7 +296,7 @@ export class UrlPanelContent extends Component { this.setState( { isCreatingShortUrl: false, - useShortUrl: isChecked, + useShortUrl: true, }, this.setUrl ); @@ -321,7 +355,7 @@ export class UrlPanelContent extends Component { private renderWithIconTip = (child: React.ReactNode, tipContent: React.ReactNode) => { return ( - {child} + {child} @@ -397,4 +431,34 @@ export class UrlPanelContent extends Component { ); }; + + private renderUrlParamExtensions = (): ReactElement | void => { + if (!this.props.urlParamExtensions) { + return; + } + + const setParamValue = (paramName: string) => ( + values: { [queryParam: string]: boolean } = {} + ): void => { + const stateUpdate = { + urlParams: { + ...this.state.urlParams, + [paramName]: { + ...values, + }, + }, + }; + this.setState(stateUpdate, this.state.useShortUrl ? this.createShortUrl : this.setUrl); + }; + + return ( + + {this.props.urlParamExtensions.map(({ paramName, component: UrlParamComponent }) => ( + + + + ))} + + ); + }; } diff --git a/src/plugins/share/public/services/share_menu_manager.tsx b/src/plugins/share/public/services/share_menu_manager.tsx index 35116efa85961..3325c5503fe89 100644 --- a/src/plugins/share/public/services/share_menu_manager.tsx +++ b/src/plugins/share/public/services/share_menu_manager.tsx @@ -67,6 +67,7 @@ export class ShareMenuManager { shareableUrl, post, basePath, + embedUrlParamExtensions, }: ShowShareMenuOptions & { menuItems: ShareMenuItem[]; post: HttpStart['post']; @@ -102,6 +103,7 @@ export class ShareMenuManager { onClose={this.onClose} post={post} basePath={basePath} + embedUrlParamExtensions={embedUrlParamExtensions} /> diff --git a/src/plugins/share/public/types.ts b/src/plugins/share/public/types.ts index 6b20f1f53a28c..8dda9f1195a39 100644 --- a/src/plugins/share/public/types.ts +++ b/src/plugins/share/public/types.ts @@ -17,6 +17,7 @@ * under the License. */ +import { ComponentType } from 'react'; import { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor } from '@elastic/eui'; /** @@ -80,9 +81,19 @@ export interface ShareMenuProvider { getShareMenuItems: (context: ShareContext) => ShareMenuItem[]; } +interface UrlParamExtensionProps { + setParamValue: (values: {}) => void; +} + +export interface UrlParamExtension { + paramName: string; + component: ComponentType; +} + /** @public */ export interface ShowShareMenuOptions extends Omit { anchorElement: HTMLElement; allowEmbed: boolean; allowShortUrl: boolean; + embedUrlParamExtensions?: UrlParamExtension[]; } diff --git a/test/functional/apps/dashboard/embed_mode.js b/test/functional/apps/dashboard/embed_mode.js index 65ef75f3f65e1..a1828143555b0 100644 --- a/test/functional/apps/dashboard/embed_mode.js +++ b/test/functional/apps/dashboard/embed_mode.js @@ -20,6 +20,7 @@ import expect from '@kbn/expect'; export default function ({ getService, getPageObjects }) { + const testSubjects = getService('testSubjects'); const retry = getService('retry'); const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); @@ -28,6 +29,13 @@ export default function ({ getService, getPageObjects }) { const globalNav = getService('globalNav'); describe('embed mode', () => { + const urlParamExtensions = [ + 'show-top-menu=true', + 'show-query-input=true', + 'show-time-filter=true', + 'hide-filter-bar=true', + ]; + before(async () => { await esArchiver.load('dashboard/current/kibana'); await kibanaServer.uiSettings.replace({ @@ -54,9 +62,28 @@ export default function ({ getService, getPageObjects }) { }); }); + it('shows or hides elements based on URL params', async () => { + await testSubjects.missingOrFail('top-nav'); + await testSubjects.missingOrFail('queryInput'); + await testSubjects.missingOrFail('superDatePickerToggleQuickMenuButton'); + await testSubjects.existOrFail('showFilterActions'); + + const currentUrl = await browser.getCurrentUrl(); + const newUrl = [currentUrl].concat(urlParamExtensions).join('&'); + // Embed parameter only works on a hard refresh. + const useTimeStamp = true; + await browser.get(newUrl.toString(), useTimeStamp); + + await testSubjects.existOrFail('top-nav'); + await testSubjects.existOrFail('queryInput'); + await testSubjects.existOrFail('superDatePickerToggleQuickMenuButton'); + await testSubjects.missingOrFail('showFilterActions'); + }); + after(async function () { const currentUrl = await browser.getCurrentUrl(); - const newUrl = currentUrl.replace('&embed=true', ''); + const replaceParams = ['', 'embed=true'].concat(urlParamExtensions).join('&'); + const newUrl = currentUrl.replace(replaceParams, ''); // First use the timestamp to cause a hard refresh so the new embed parameter works correctly. let useTimeStamp = true; await browser.get(newUrl.toString(), useTimeStamp); diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/app/dashboard_input.ts b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/app/dashboard_input.ts index 6f4e1f052f5e0..21b12e2134767 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/app/dashboard_input.ts +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/app/dashboard_input.ts @@ -92,6 +92,7 @@ export const dashboardInput: DashboardContainerInput = { }, }, }, + isEmbeddedExternally: false, isFullScreenMode: false, filters: [], useMargins: true, From 49171516d7d110abe8cfa1f9f1fe0707262b1999 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 8 Jun 2020 15:01:55 +0200 Subject: [PATCH 05/65] Unskip embeddables/adding_children suite (#68111) Giving it another chance *cross fingers* Co-authored-by: Elastic Machine --- test/examples/embeddables/adding_children.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/examples/embeddables/adding_children.ts b/test/examples/embeddables/adding_children.ts index 25fe7ee607f72..a26ce4c40e2ea 100644 --- a/test/examples/embeddables/adding_children.ts +++ b/test/examples/embeddables/adding_children.ts @@ -25,8 +25,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { const testSubjects = getService('testSubjects'); const flyout = getService('flyout'); - // FLAKY: https://github.com/elastic/kibana/issues/58692 - describe.skip('creating and adding children', () => { + describe('creating and adding children', () => { before(async () => { await testSubjects.click('embeddablePanelExamplae'); }); From 77ab709976cf068bf5f602c5e7ad27e7c8384a95 Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:19:32 -0400 Subject: [PATCH 06/65] Bump pdfmake package version (#68395) --- x-pack/package.json | 2 +- yarn.lock | 268 +++++++++++++++++--------------------------- 2 files changed, 104 insertions(+), 166 deletions(-) diff --git a/x-pack/package.json b/x-pack/package.json index c46d364e0ac46..227547ce15fd1 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -299,7 +299,7 @@ "oppsy": "^2.0.0", "p-retry": "^4.2.0", "papaparse": "^5.2.0", - "pdfmake": "^0.1.63", + "pdfmake": "^0.1.65", "pluralize": "3.1.0", "pngjs": "3.4.0", "polished": "^1.9.2", diff --git a/yarn.lock b/yarn.lock index 678ddfb052cd3..f4d5409f755ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5629,17 +5629,12 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== -acorn-walk@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" - integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== - -acorn-walk@^7.1.1: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== -acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.1.2, acorn@^5.5.0: +acorn@5.X, acorn@^5.0.3, acorn@^5.1.2, acorn@^5.5.0: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== @@ -5659,7 +5654,12 @@ acorn@^6.0.1, acorn@^6.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.0.0, acorn@^7.1.0, acorn@^7.1.1: +acorn@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" + integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== + +acorn@^7.1.0, acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== @@ -7426,7 +7426,7 @@ babel-preset-react-app@^9.0.0: babel-plugin-macros "2.6.1" babel-plugin-transform-react-remove-prop-types "0.4.24" -babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -7555,12 +7555,12 @@ base64-js@0.0.8: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= -base64-js@^1.0.2, base64-js@^1.1.2: +base64-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" integrity sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw== -base64-js@^1.2.1, base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.2.1, base64-js@^1.3.0, base64-js@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -7973,17 +7973,7 @@ breadth-filter@^2.0.0: dependencies: object.entries "^1.0.4" -brfs@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" - integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== - dependencies: - quote-stream "^1.0.1" - resolve "^1.1.5" - static-module "^2.2.0" - through2 "^2.0.0" - -brfs@^2.0.2: +brfs@^2.0.0, brfs@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/brfs/-/brfs-2.0.2.tgz#44237878fa82aa479ce4f5fe2c1796ec69f07845" integrity sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ== @@ -8023,20 +8013,13 @@ browser-process-hrtime@^0.1.2: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= -browser-resolve@^1.11.3: +browser-resolve@^1.11.3, browser-resolve@^1.8.1: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" -browser-resolve@^1.8.1: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - integrity sha1-j/CbCixCFxihBRwmCzLkj0QpOM4= - dependencies: - resolve "1.1.7" - browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -8072,7 +8055,7 @@ browserify-des@^1.0.0: des.js "^1.0.0" inherits "^2.0.1" -browserify-optional@^1.0.0: +browserify-optional@^1.0.0, browserify-optional@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-optional/-/browserify-optional-1.0.1.tgz#1e13722cfde0d85f121676c2a72ced533a018869" integrity sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk= @@ -9269,7 +9252,7 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= -clone@^1.0.0, clone@^1.0.1, clone@^1.0.2: +clone@^1.0.0, clone@^1.0.2, clone@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= @@ -9864,7 +9847,7 @@ contour_plot@^0.0.1: resolved "https://registry.yarnpkg.com/contour_plot/-/contour_plot-0.0.1.tgz#475870f032b8e338412aa5fc507880f0bf495c77" integrity sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc= -convert-source-map@1.7.0, convert-source-map@^1.7.0: +convert-source-map@1.7.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -9881,13 +9864,6 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= -convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - convex-hull@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" @@ -10878,6 +10854,11 @@ dargs@^5.1.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" integrity sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk= +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -11085,12 +11066,7 @@ deep-eql@^0.1.3: dependencies: type-detect "0.1.1" -deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - -deep-equal@^1.1.1, deep-equal@~1.1.1: +deep-equal@^1.0.0, deep-equal@^1.1.1, deep-equal@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -11102,6 +11078,11 @@ deep-equal@^1.1.1, deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-equal@^1.0.1, deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + deep-extend@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -11462,12 +11443,10 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -dfa@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.1.0.tgz#d30218bd10d030fa421df3ebbc82285463a31781" - integrity sha1-0wIYvRDQMPpCHfPrvIIoVGOjF4E= - dependencies: - babel-runtime "^6.11.6" +dfa@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657" + integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== di@^0.0.1: version "0.0.1" @@ -12502,7 +12481,7 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.11.1, escodegen@^1.8.1: +escodegen@^1.11.1: version "1.12.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== @@ -12549,18 +12528,6 @@ escodegen@~1.2.0: optionalDependencies: source-map "~0.1.30" -escodegen@~1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" - integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" @@ -13422,16 +13389,6 @@ faker@1.1.0: resolved "https://registry.yarnpkg.com/faker/-/faker-1.1.0.tgz#230738ebd37edad9de4a421de12922bd8206a872" integrity sha1-Iwc469N+2tneSkId4SkivYIGqHI= -falafel@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" - integrity sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw= - dependencies: - acorn "^5.0.0" - foreach "^2.0.5" - isarray "0.0.1" - object-keys "^1.0.6" - fancy-log@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" @@ -14066,20 +14023,20 @@ font-awesome@4.7.0: integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= fontkit@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-1.8.0.tgz#deb9351619e90ddc91707b6156a9f14c8ab11554" - integrity sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ== + version "1.8.1" + resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-1.8.1.tgz#ae77485376f1096b45548bf6ced9a07af62a7846" + integrity sha512-BsNCjDoYRxmNWFdAuK1y9bQt+igIxGtTC9u/jSFjR9MKhmI00rP1fwSvERt+5ddE82544l0XH5mzXozQVUy2Tw== dependencies: - babel-runtime "^6.11.6" - brfs "^1.4.0" + babel-runtime "^6.26.0" + brfs "^2.0.0" brotli "^1.2.0" - browserify-optional "^1.0.0" - clone "^1.0.1" + browserify-optional "^1.0.1" + clone "^1.0.4" deep-equal "^1.0.0" - dfa "^1.0.0" + dfa "^1.2.0" restructure "^0.5.3" tiny-inflate "^1.0.2" - unicode-properties "^1.0.0" + unicode-properties "^1.2.2" unicode-trie "^0.3.0" for-each@^0.3.2: @@ -14120,11 +14077,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - foreachasync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" @@ -16476,6 +16428,13 @@ iconv-lite@^0.5.0: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.1.tgz#b2425d3c7b18f7219f2ca663d103bddb91718d64" + integrity sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-utils@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.0.0.tgz#d52cf4bcdcfa1c45c2dbefb4ffdf6b00ef608098" @@ -20094,12 +20053,12 @@ madge@3.4.4: rc "^1.2.7" walkdir "^0.0.12" -magic-string@^0.22.4: - version "0.22.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" - integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== +magic-string@0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e" + integrity sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg== dependencies: - vlq "^0.2.2" + sourcemap-codec "^1.4.1" majo@^0.4.1: version "0.4.1" @@ -21956,16 +21915,11 @@ object-identity-map@^1.0.2: dependencies: object.entries "^1.1.0" -object-inspect@^1.7.0, object-inspect@~1.7.0: +object-inspect@^1.6.0, object-inspect@^1.7.0, object-inspect@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-inspect@~1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" - integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== - object-inspect@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" @@ -21976,7 +21930,7 @@ object-is@^1.0.1, object-is@^1.0.2: resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -23049,12 +23003,12 @@ pdfkit@>=0.8.1, pdfkit@^0.11.0: linebreak "^1.0.2" png-js "^1.0.0" -pdfmake@^0.1.63: - version "0.1.63" - resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.1.63.tgz#0001ecffe4ab30843485ce08744393315721e3f1" - integrity sha512-TjchyLVDzaEmtaDNUrceNrm0QvNIFERYOeDwHwMUQ1twGy68Uhjd1MKsb9DGAh8SuB8MCWQXB7m4k7cUevLjoA== +pdfmake@^0.1.65: + version "0.1.65" + resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.1.65.tgz#09c4cf796809ec5fce789343560a36780ff47e37" + integrity sha512-MgzRyiKSP3IEUH7vm4oj3lpikmk5oCD9kYxiJM6Z2Xf6CP9EcikeSDey2rGd4WVvn79Y0TGqz2+to8FtWP8MrA== dependencies: - iconv-lite "^0.5.0" + iconv-lite "^0.5.1" linebreak "^1.0.2" pdfkit "^0.11.0" svg-to-pdfkit "^0.1.8" @@ -24096,7 +24050,7 @@ quickselect@^2.0.0: resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== -quote-stream@^1.0.1, quote-stream@~1.0.2: +quote-stream@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= @@ -25173,7 +25127,7 @@ read-pkg@^5.1.1, read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2": +"readable-stream@1 || 2", readable-stream@~2.3.3: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -25205,7 +25159,7 @@ readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -26166,7 +26120,14 @@ resolve@1.8.1, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.5" -resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7: +resolve@^1.1.5: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6, resolve@^1.1.7: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== @@ -26743,11 +26704,12 @@ schema-utils@^2.4.1, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6 ajv-keywords "^3.4.1" scope-analyzer@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/scope-analyzer/-/scope-analyzer-2.0.5.tgz#72c9c6770c3e66984f84c7d3c7045998a1a7db8a" - integrity sha512-+U5H0417mnTEstCD5VwOYO7V4vYuSqwqjFap40ythe67bhMFL5C3UgPwyBv7KDJsqUBIKafOD57xMlh1rN7eaw== + version "2.1.1" + resolved "https://registry.yarnpkg.com/scope-analyzer/-/scope-analyzer-2.1.1.tgz#5156c27de084d74bf75af9e9506aaf95c6e73dd6" + integrity sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg== dependencies: array-from "^2.1.1" + dash-ast "^1.0.0" es6-map "^0.1.5" es6-set "^0.1.5" es6-symbol "^3.1.1" @@ -27842,20 +27804,13 @@ statehood@6.x.x: iron "5.x.x" joi "13.x.x" -static-eval@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.3.tgz#cb62fc79946bd4d5f623a45ad428233adace4d72" - integrity sha512-zsxDGucfAh8T339sSKgpFbvg15Fms2IVaJGC+jqp0bVsxhcpM+iMeAI8weNo8dmf4OblgifTBUoyk1vGVtYw2w== +static-eval@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.5.tgz#f0782e66999c4b3651cda99d9ce59c507d188f71" + integrity sha512-nNbV6LbGtMBgv7e9LFkt5JV8RVlRsyJrphfAt9tOtBBW/SfnzZDf2KnS72an8e434A+9e/BmJuTxeGPvrAK7KA== dependencies: escodegen "^1.11.1" -static-eval@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" - integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== - dependencies: - escodegen "^1.8.1" - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -27864,44 +27819,24 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -static-module@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" - integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== - dependencies: - concat-stream "~1.6.0" - convert-source-map "^1.5.1" - duplexer2 "~0.1.4" - escodegen "~1.9.0" - falafel "^2.1.0" - has "^1.0.1" - magic-string "^0.22.4" - merge-source-map "1.0.4" - object-inspect "~1.4.0" - quote-stream "~1.0.2" - readable-stream "~2.3.3" - shallow-copy "~0.0.1" - static-eval "^2.0.0" - through2 "~2.0.3" - static-module@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/static-module/-/static-module-3.0.3.tgz#cc2301ed3fe353e2d2a2195137013853676f9960" - integrity sha512-RDaMYaI5o/ym0GkCqL/PlD1Pn216omp8fY81okxZ6f6JQxWW5tptOw9reXoZX85yt/scYvbWIt6uoszeyf+/MQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-3.0.4.tgz#bfbd1d1c38dd1fbbf0bb4af0c1b3ae18a93a2b68" + integrity sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw== dependencies: acorn-node "^1.3.0" concat-stream "~1.6.0" convert-source-map "^1.5.1" duplexer2 "~0.1.4" - escodegen "~1.9.0" + escodegen "^1.11.1" has "^1.0.1" - magic-string "^0.22.4" + magic-string "0.25.1" merge-source-map "1.0.4" - object-inspect "~1.4.0" + object-inspect "^1.6.0" readable-stream "~2.3.3" scope-analyzer "^2.0.1" shallow-copy "~0.0.1" - static-eval "^2.0.2" + static-eval "^2.0.5" through2 "~2.0.3" stats-lite@^2.2.0: @@ -29098,9 +29033,9 @@ tiny-emitter@^2.0.0: integrity sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow== tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7" - integrity sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c= + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== tiny-invariant@^1.0.2: version "1.0.4" @@ -30321,13 +30256,13 @@ unicode-match-property-value-ecmascript@^1.2.0: resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== -unicode-properties@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.1.0.tgz#7a96eef49f75682ea69d2315eec9ac43ffdf00c1" - integrity sha1-epbu9J91aC6mnSMV7smsQ//fAME= +unicode-properties@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.3.1.tgz#cc642b6314bde2c691d65dd94cece09ed84f1282" + integrity sha512-nIV3Tf3LcUEZttY/2g4ZJtGXhWwSkuLL+rCu0DIAMbjyVPj+8j5gNVz4T/sVbnQybIsd5SFGkPKg/756OY6jlA== dependencies: - brfs "^1.4.0" - unicode-trie "^0.3.0" + base64-js "^1.3.0" + unicode-trie "^2.0.0" unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" @@ -30355,6 +30290,14 @@ unicode-trie@^1.0.0: pako "^0.2.5" tiny-inflate "^1.0.0" +unicode-trie@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" + integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + unified@^6.1.5: version "6.1.6" resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1" @@ -31360,11 +31303,6 @@ vision@^5.3.3: items "2.x.x" joi "13.x.x" -vlq@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== - vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" From de4eaf9ae70cc225db8bb92a43661b8cfbd4ab85 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Mon, 8 Jun 2020 15:31:14 +0200 Subject: [PATCH 07/65] fix #66185 (#66186) --- ...-data-public.indexpattern._constructor_.md | 4 ++-- .../index_patterns/_pattern_cache.ts | 2 +- .../index_patterns/index_pattern.test.ts | 3 +++ .../index_patterns/index_pattern.ts | 19 +++++++++++-------- src/plugins/data/public/public.api.md | 3 ++- .../public/lib/resolve_saved_objects.ts | 5 +++-- .../apps/management/_import_objects.js | 1 - 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md index 4159247bb7c32..6256709e2ee36 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern._constructor_.md @@ -9,7 +9,7 @@ Constructs a new instance of the `IndexPattern` class Signature: ```typescript -constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: any); +constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: PatternCache); ``` ## Parameters @@ -20,5 +20,5 @@ constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObj | getConfig | any | | | savedObjectsClient | SavedObjectsClientContract | | | apiClient | IIndexPatternsApiClient | | -| patternCache | any | | +| patternCache | PatternCache | | diff --git a/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts index eb6c69b414316..a3653bb529fa3 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts @@ -19,7 +19,7 @@ import { IndexPattern } from './index_pattern'; -interface PatternCache { +export interface PatternCache { get: (id: string) => IndexPattern; set: (id: string, value: IndexPattern) => IndexPattern; clear: (id: string) => void; diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts index e4058007e0a57..84135bb5d1e2b 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts @@ -85,6 +85,9 @@ const savedObjectsClient = { const patternCache = { clear: jest.fn(), + get: jest.fn(), + set: jest.fn(), + clearAll: jest.fn(), }; const config = { diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts index 3d54009d0fdca..84ea12a1f684f 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -44,6 +44,7 @@ import { flattenHitWrapper } from './flatten_hit'; import { IIndexPatternsApiClient } from './index_patterns_api_client'; import { getNotifications, getFieldFormats } from '../../services'; import { TypeMeta } from './types'; +import { PatternCache } from './_pattern_cache'; const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; const type = 'index-pattern'; @@ -65,12 +66,13 @@ export class IndexPattern implements IIndexPattern { private version: string | undefined; private savedObjectsClient: SavedObjectsClientContract; - private patternCache: any; + private patternCache: PatternCache; private getConfig: any; private sourceFilters?: []; private originalBody: { [key: string]: any } = {}; public fieldsFetcher: any; // probably want to factor out any direct usage and change to private private shortDotsEnable: boolean = false; + private apiClient: IIndexPatternsApiClient; private mapping: MappingObject = expandShorthand({ title: ES_FIELD_TYPES.TEXT, @@ -99,7 +101,7 @@ export class IndexPattern implements IIndexPattern { getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, - patternCache: any + patternCache: PatternCache ) { this.id = id; this.savedObjectsClient = savedObjectsClient; @@ -117,6 +119,7 @@ export class IndexPattern implements IIndexPattern { }); this.fields = this.createFieldList(this, [], this.shortDotsEnable); + this.apiClient = apiClient; this.fieldsFetcher = createFieldsFetcher( this, apiClient, @@ -396,8 +399,8 @@ export class IndexPattern implements IIndexPattern { duplicateId, this.getConfig, this.savedObjectsClient, - this.patternCache, - this.fieldsFetcher + this.apiClient, + this.patternCache ); await duplicatePattern.destroy(); } @@ -445,8 +448,8 @@ export class IndexPattern implements IIndexPattern { this.id, this.getConfig, this.savedObjectsClient, - this.patternCache, - this.fieldsFetcher + this.apiClient, + this.patternCache ); return samePattern.init().then(() => { // What keys changed from now and what the server returned @@ -489,7 +492,7 @@ export class IndexPattern implements IIndexPattern { this.version = samePattern.version; // Clear cache - this.patternCache.clear(this.id); + this.patternCache.clear(this.id!); // Try the save again return this.save(saveAttempts); @@ -545,8 +548,8 @@ export class IndexPattern implements IIndexPattern { } destroy() { - this.patternCache.clear(this.id); if (this.id) { + this.patternCache.clear(this.id); return this.savedObjectsClient.delete(type, this.id); } } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index dcdb528ac8b7d..e6f6ba0c1bd12 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -842,7 +842,8 @@ export type IMetricAggType = MetricAggType; // @public (undocumented) export class IndexPattern implements IIndexPattern { // Warning: (ae-forgotten-export) The symbol "IIndexPatternsApiClient" needs to be exported by the entry point index.d.ts - constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: any); + // Warning: (ae-forgotten-export) The symbol "PatternCache" needs to be exported by the entry point index.d.ts + constructor(id: string | undefined, getConfig: any, savedObjectsClient: SavedObjectsClientContract, apiClient: IIndexPatternsApiClient, patternCache: PatternCache); // (undocumented) [key: string]: any; // (undocumented) diff --git a/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts b/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts index 952e9628d2846..79b8c33b84cfe 100644 --- a/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts +++ b/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts @@ -27,6 +27,7 @@ import { IIndexPattern, injectSearchSourceReferences, } from '../../../data/public'; +import { FailedImport } from './process_import_response'; type SavedObjectsRawDoc = Record; @@ -277,7 +278,7 @@ export async function resolveSavedObjects( // Keep track of how many we actually import because the user // can cancel an override let importedObjectCount = 0; - const failedImports: any[] = []; + const failedImports: FailedImport[] = []; // Start with the index patterns since everything is dependent on them await awaitEachItemInParallel(docTypes.indexPatterns, async (indexPatternDoc) => { try { @@ -291,7 +292,7 @@ export async function resolveSavedObjects( importedObjectCount++; } } catch (error) { - failedImports.push({ indexPatternDoc, error }); + failedImports.push({ obj: indexPatternDoc as any, error }); } }); diff --git a/test/functional/apps/management/_import_objects.js b/test/functional/apps/management/_import_objects.js index 6b40837808387..6306d11eadb65 100644 --- a/test/functional/apps/management/_import_objects.js +++ b/test/functional/apps/management/_import_objects.js @@ -356,7 +356,6 @@ export default function ({ getService, getPageObjects }) { await PageObjects.settings.importFile( path.join(__dirname, 'exports', '_import_objects_with_index_patterns.json') ); - await PageObjects.settings.checkImportFailedWarning(); await PageObjects.settings.clickImportDone(); const objects = await PageObjects.settings.getSavedObjectsInTable(); From c29fcbb46bfde68b437df790f011c3d745c8585c Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:45:06 -0400 Subject: [PATCH 08/65] Bump decompress package version (#68386) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f4d5409f755ce..e47af2c6fe284 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11041,9 +11041,9 @@ decompress-unzip@^4.0.1: yauzl "^2.4.2" decompress@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== dependencies: decompress-tar "^4.0.0" decompress-tarbz2 "^4.0.0" From f89e911f64a40744b8d88e3221ee8403a72c9e54 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Mon, 8 Jun 2020 09:47:51 -0400 Subject: [PATCH 09/65] Kibana developer examples landing page (#67049) * Kibana developer examples * Batch explorer tests should be run in examples config * Fix tests * add codeowner for new developer examples plugin & readme cleanup * Try to frame embeddable wording based on what a developer's goals are. * Add noopener noreferer, fix bad merge * Remove bfetch.png Co-authored-by: Elastic Machine --- .github/CODEOWNERS | 1 + examples/alerting_example/kibana.json | 2 +- examples/alerting_example/public/plugin.tsx | 22 +++- examples/bfetch_explorer/kibana.json | 2 +- examples/bfetch_explorer/public/plugin.tsx | 25 +++- examples/developer_examples/README.md | 36 ++++++ examples/developer_examples/kibana.json | 9 ++ examples/developer_examples/navigation.png | Bin 0 -> 28522 bytes examples/developer_examples/public/app.tsx | 117 ++++++++++++++++++ .../developer_examples}/public/index.ts | 6 +- examples/developer_examples/public/plugin.ts | 68 ++++++++++ .../developer_examples/public/types.ts | 16 ++- examples/developer_examples/tsconfig.json | 15 +++ examples/embeddable_explorer/kibana.json | 2 +- .../public/embeddables.png | Bin 0 -> 88399 bytes .../embeddable_explorer/public/plugin.tsx | 31 ++++- examples/search_explorer/kibana.json | 2 +- examples/search_explorer/public/plugin.tsx | 31 ++++- .../state_containers_examples/kibana.json | 2 +- .../public/plugin.ts | 68 +++++++++- .../public/with_data_services/application.tsx | 2 +- .../with_data_services/components/app.tsx | 9 +- examples/ui_actions_explorer/kibana.json | 2 +- .../ui_actions_explorer/public/plugin.tsx | 28 ++++- .../ui_actions_explorer/public/ui_actions.png | Bin 0 -> 108883 bytes .../url_generators_examples/public/plugin.tsx | 3 +- examples/url_generators_explorer/kibana.json | 2 +- .../url_generators_explorer/public/plugin.tsx | 35 +++++- .../bfetch_explorer/batched_function.ts | 5 +- .../bfetch_explorer/index.ts | 7 +- test/examples/config.js | 1 + test/examples/embeddables/index.ts | 4 +- test/examples/search/index.ts | 4 +- test/examples/state_sync/index.ts | 2 - test/examples/state_sync/todo_app.ts | 7 +- test/examples/ui_actions/index.ts | 4 +- test/plugin_functional/config.js | 1 - .../kbn_tp_bfetch_explorer/kibana.json | 10 -- .../kbn_tp_bfetch_explorer/package.json | 17 --- .../kbn_tp_bfetch_explorer/tsconfig.json | 21 ---- 40 files changed, 510 insertions(+), 109 deletions(-) create mode 100644 examples/developer_examples/README.md create mode 100644 examples/developer_examples/kibana.json create mode 100644 examples/developer_examples/navigation.png create mode 100644 examples/developer_examples/public/app.tsx rename {test/plugin_functional/plugins/kbn_tp_bfetch_explorer => examples/developer_examples}/public/index.ts (82%) create mode 100644 examples/developer_examples/public/plugin.ts rename test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts => examples/developer_examples/public/types.ts (68%) create mode 100644 examples/developer_examples/tsconfig.json create mode 100644 examples/embeddable_explorer/public/embeddables.png create mode 100644 examples/ui_actions_explorer/public/ui_actions.png rename test/{plugin_functional/test_suites => examples}/bfetch_explorer/batched_function.ts (93%) rename test/{plugin_functional/test_suites => examples}/bfetch_explorer/index.ts (83%) delete mode 100644 test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json delete mode 100644 test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json delete mode 100644 test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 48d70910f9bf1..472d29ed29413 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -34,6 +34,7 @@ /src/legacy/core_plugins/kibana/public/home/np_ready/ @elastic/kibana-core-ui # App Architecture +/examples/developer_examples/ @elastic/kibana-app-arch /examples/url_generators_examples/ @elastic/kibana-app-arch /examples/url_generators_explorer/ @elastic/kibana-app-arch /packages/kbn-interpreter/ @elastic/kibana-app-arch diff --git a/examples/alerting_example/kibana.json b/examples/alerting_example/kibana.json index 2b6389649cef9..6c04218ca45e2 100644 --- a/examples/alerting_example/kibana.json +++ b/examples/alerting_example/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "requiredPlugins": ["triggers_actions_ui", "charts", "data", "alerts", "actions"], + "requiredPlugins": ["triggers_actions_ui", "charts", "data", "alerts", "actions", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/alerting_example/public/plugin.tsx b/examples/alerting_example/public/plugin.tsx index 524ff18bd434e..f0635a1071f64 100644 --- a/examples/alerting_example/public/plugin.tsx +++ b/examples/alerting_example/public/plugin.tsx @@ -17,7 +17,7 @@ * under the License. */ -import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { PluginSetupContract as AlertingSetup } from '../../../x-pack/plugins/alerts/public'; import { ChartsPluginStart } from '../../../src/plugins/charts/public'; import { TriggersAndActionsUIPublicPluginSetup } from '../../../x-pack/plugins/triggers_actions_ui/public'; @@ -25,6 +25,7 @@ import { DataPublicPluginStart } from '../../../src/plugins/data/public'; import { getAlertType as getAlwaysFiringAlertType } from './alert_types/always_firing'; import { getAlertType as getPeopleInSpaceAlertType } from './alert_types/astros'; import { registerNavigation } from './alert_types'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; export type Setup = void; export type Start = void; @@ -32,6 +33,7 @@ export type Start = void; export interface AlertingExamplePublicSetupDeps { alerts: AlertingSetup; triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; + developerExamples: DeveloperExamplesSetup; } export interface AlertingExamplePublicStartDeps { @@ -44,11 +46,12 @@ export interface AlertingExamplePublicStartDeps { export class AlertingExamplePlugin implements Plugin { public setup( core: CoreSetup, - { alerts, triggers_actions_ui }: AlertingExamplePublicSetupDeps + { alerts, triggers_actions_ui, developerExamples }: AlertingExamplePublicSetupDeps ) { core.application.register({ id: 'AlertingExample', title: 'Alerting Example', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const [coreStart, depsStart] = await core.getStartServices(); const { renderApp } = await import('./application'); @@ -60,6 +63,21 @@ export class AlertingExamplePlugin implements Plugin Promise<{ num: number }>; @@ -27,6 +28,7 @@ export interface ExplorerService { export interface BfetchExplorerSetupPlugins { bfetch: BfetchPublicSetup; + developerExamples: DeveloperExamplesSetup; } export interface BfetchExplorerStartPlugins { @@ -36,9 +38,9 @@ export interface BfetchExplorerStartPlugins { export class BfetchExplorerPlugin implements Plugin { public setup( core: CoreSetup, - plugins: BfetchExplorerSetupPlugins + { bfetch, developerExamples }: BfetchExplorerSetupPlugins ) { - const double = plugins.bfetch.batchedFunction<{ num: number }, { num: number }>({ + const double = bfetch.batchedFunction<{ num: number }, { num: number }>({ url: '/bfetch_explorer/double', }); @@ -49,8 +51,25 @@ export class BfetchExplorerPlugin implements Plugin { core.application.register({ id: 'bfetch-explorer', title: 'bfetch explorer', + navLinkStatus: AppNavLinkStatus.hidden, mount: mount(core, explorer), }); + + developerExamples.register({ + appId: 'bfetch-explorer', + title: 'bfetch', + description: + 'bfetch is a service that allows to batch HTTP requests and streams responses back.', + links: [ + { + label: 'README', + href: 'https://github.com/elastic/kibana/blob/master/src/plugins/bfetch/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); } public start() {} diff --git a/examples/developer_examples/README.md b/examples/developer_examples/README.md new file mode 100644 index 0000000000000..1a57838c43d24 --- /dev/null +++ b/examples/developer_examples/README.md @@ -0,0 +1,36 @@ +## Developer examples + +Owner: Kibana application architecture team + +The developer examples app is a landing page where developers go to search for working, tested examples of various developer +services. Add your a link to your example using the developerExamples `register` function offered on the `setup` contract: + +```ts + setup(core, { developerExamples }) { + developerExamples.register({ + appId: 'myFooExampleApp', + title: 'Foo services', + description: `Foo services let you do bar and zed.`, + links: [ + { + label: 'README', + href: 'https://github.com/elastic/kibana/tree/master/src/plugins/foo/README.md', + iconType: 'logoGithub', + target: '_blank', + size: 's', + }, + ], + image: img, + }); + } +``` + +Run Kibana with developer examples via: + +``` +yarn start --run-examples +``` + +Then navigate to "Developer examples": + + diff --git a/examples/developer_examples/kibana.json b/examples/developer_examples/kibana.json new file mode 100644 index 0000000000000..8c9ec2e4dcbfc --- /dev/null +++ b/examples/developer_examples/kibana.json @@ -0,0 +1,9 @@ +{ + "id": "developerExamples", + "version": "0.0.1", + "kibanaVersion": "kibana", + "server": false, + "ui": true, + "requiredPlugins": [], + "optionalPlugins": [] +} diff --git a/examples/developer_examples/navigation.png b/examples/developer_examples/navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..ac72f697e5db08e792b6ab5308e087de037cad47 GIT binary patch literal 28522 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 void; + getUrlForApp: (appId: string) => string; +} + +function DeveloperExamples({ examples, navigateToApp, getUrlForApp }: Props) { + const [search, setSearch] = useState(''); + + const lcSearch = search.toLowerCase(); + const filteredExamples = !lcSearch + ? examples + : examples.filter((def) => { + if (def.description.toLowerCase().indexOf(lcSearch) >= 0) return true; + if (def.title.toLowerCase().indexOf(lcSearch) >= 0) return true; + return false; + }); + + return ( + + + +

Developer examples

+

+ The following examples showcase services and APIs that are available to developers. + setSearch(e.target.value)} + isClearable={true} + aria-label="Search developer examples" + /> +

+
+
+ + {filteredExamples.map((def) => ( + + + {def.description} + + } + title={ + + { + navigateToApp(def.appId); + }} + > + + {def.title} + + + + window.open(getUrlForApp(def.appId), '_blank', 'noopener, noreferrer') + } + > + Open in new tab + + + } + image={def.image} + footer={def.links ? : undefined} + /> + + ))} + +
+ ); +} + +export const renderApp = (props: Props, element: AppMountParameters['element']) => { + ReactDOM.render(, element); + + return () => ReactDOM.unmountComponentAtNode(element); +}; diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/public/index.ts b/examples/developer_examples/public/index.ts similarity index 82% rename from test/plugin_functional/plugins/kbn_tp_bfetch_explorer/public/index.ts rename to examples/developer_examples/public/index.ts index 547dfe2aa38d2..616fb011e3705 100644 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/public/index.ts +++ b/examples/developer_examples/public/index.ts @@ -17,4 +17,8 @@ * under the License. */ -export * from '../../../../../examples/bfetch_explorer/public'; +import { DeveloperExamplesPlugin } from './plugin'; + +export const plugin = () => new DeveloperExamplesPlugin(); + +export { DeveloperExamplesSetup } from './plugin'; diff --git a/examples/developer_examples/public/plugin.ts b/examples/developer_examples/public/plugin.ts new file mode 100644 index 0000000000000..a0aa601660f37 --- /dev/null +++ b/examples/developer_examples/public/plugin.ts @@ -0,0 +1,68 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import { + CoreSetup, + Plugin, + AppMountParameters, + DEFAULT_APP_CATEGORIES, +} from '../../../src/core/public'; + +import { ExampleDefinition } from './types'; + +export interface DeveloperExamplesSetup { + register: (def: ExampleDefinition) => void; +} + +export class DeveloperExamplesPlugin implements Plugin { + private examplesRegistry: ExampleDefinition[] = []; + + public setup(core: CoreSetup) { + const examples = this.examplesRegistry; + core.application.register({ + id: 'developerExamples', + title: 'Developer examples', + order: -2000, + category: DEFAULT_APP_CATEGORIES.kibana, + async mount(params: AppMountParameters) { + const { renderApp } = await import('./app'); + const [coreStart] = await core.getStartServices(); + return renderApp( + { + examples, + navigateToApp: (appId: string) => coreStart.application.navigateToApp(appId), + getUrlForApp: (appId: string) => coreStart.application.getUrlForApp(appId), + }, + params.element + ); + }, + }); + + const api: DeveloperExamplesSetup = { + register: (def) => { + this.examplesRegistry.push(def); + }, + }; + return api; + } + + public start() {} + + public stop() {} +} diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts b/examples/developer_examples/public/types.ts similarity index 68% rename from test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts rename to examples/developer_examples/public/types.ts index b4370eb53311e..0ef359ef64a23 100644 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/server/index.ts +++ b/examples/developer_examples/public/types.ts @@ -17,4 +17,18 @@ * under the License. */ -export * from '../../../../../examples/bfetch_explorer/server'; +import { EuiListGroupItemProps } from '@elastic/eui'; + +export interface ExampleDefinition { + /** + * The application id that is the landing page for the example. + */ + appId: string; + title: string; + description: string; + image?: string; + /** + * Any additional links you want to show, for example to the github README. + */ + links?: EuiListGroupItemProps[]; +} diff --git a/examples/developer_examples/tsconfig.json b/examples/developer_examples/tsconfig.json new file mode 100644 index 0000000000000..d508076b33199 --- /dev/null +++ b/examples/developer_examples/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./target", + "skipLibCheck": true + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../typings/**/*", + ], + "exclude": [] +} diff --git a/examples/embeddable_explorer/kibana.json b/examples/embeddable_explorer/kibana.json index 3e4b074fb6b12..aa14549d0460f 100644 --- a/examples/embeddable_explorer/kibana.json +++ b/examples/embeddable_explorer/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": false, "ui": true, - "requiredPlugins": ["uiActions", "inspector", "embeddable", "embeddableExamples"], + "requiredPlugins": ["uiActions", "inspector", "embeddable", "embeddableExamples", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/embeddable_explorer/public/embeddables.png b/examples/embeddable_explorer/public/embeddables.png new file mode 100644 index 0000000000000000000000000000000000000000..90b287962d24823c6717265bee595c9b746ba0e1 GIT binary patch literal 88399 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%0DD=Jqw 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

^U2q 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 literal 0 HcmV?d00001 diff --git a/examples/embeddable_explorer/public/plugin.tsx b/examples/embeddable_explorer/public/plugin.tsx index bba1b1748e207..2a5023d2dd63a 100644 --- a/examples/embeddable_explorer/public/plugin.tsx +++ b/examples/embeddable_explorer/public/plugin.tsx @@ -16,12 +16,13 @@ * specific language governing permissions and limitations * under the License. */ - -import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; import { EmbeddableExamplesStart } from 'examples/embeddable_examples/public/plugin'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { UiActionsService } from '../../../src/plugins/ui_actions/public'; import { EmbeddableStart } from '../../../src/plugins/embeddable/public'; import { Start as InspectorStart } from '../../../src/plugins/inspector/public'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; +import img from './embeddables.png'; interface StartDeps { uiActions: UiActionsService; @@ -30,11 +31,16 @@ interface StartDeps { embeddableExamples: EmbeddableExamplesStart; } +interface SetupDeps { + developerExamples: DeveloperExamplesSetup; +} + export class EmbeddableExplorerPlugin implements Plugin { - public setup(core: CoreSetup) { + public setup(core: CoreSetup, { developerExamples }: SetupDeps) { core.application.register({ id: 'embeddableExplorer', title: 'Embeddable explorer', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const [coreStart, depsStart] = await core.getStartServices(); const { renderApp } = await import('./app'); @@ -55,6 +61,25 @@ export class EmbeddableExplorerPlugin implements Plugin) { + public setup( + core: CoreSetup, + { developerExamples }: SetupDeps + ) { core.application.register({ id: 'searchExplorer', title: 'Search Explorer', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const [coreStart, depsStart] = await core.getStartServices(); const { renderApp } = await import('./application'); return renderApp(coreStart, depsStart, params); }, }); + + developerExamples.register({ + appId: 'searchExplorer', + title: 'Data search strategy services', + description: `Data search services can be used to query Elasticsearch in away that supports background search + and partial results, when available. It also automatically incorporates settings such as requestTimeout and includeFrozen. + Use the provided ES search strategy, or register your own. + `, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/blob/master/src/plugins/data/public/search/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); } public start() {} diff --git a/examples/state_containers_examples/kibana.json b/examples/state_containers_examples/kibana.json index 581b399e3ffba..66da207cb4e77 100644 --- a/examples/state_containers_examples/kibana.json +++ b/examples/state_containers_examples/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "requiredPlugins": ["navigation", "data"], + "requiredPlugins": ["navigation", "data", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/state_containers_examples/public/plugin.ts b/examples/state_containers_examples/public/plugin.ts index 38ebf315789c0..a4cf7dfd798f3 100644 --- a/examples/state_containers_examples/public/plugin.ts +++ b/examples/state_containers_examples/public/plugin.ts @@ -17,15 +17,21 @@ * under the License. */ -import { AppMountParameters, CoreSetup, Plugin } from 'kibana/public'; +import { AppMountParameters, CoreSetup, Plugin, AppNavLinkStatus } from '../../../src/core/public'; import { AppPluginDependencies } from './with_data_services/types'; import { PLUGIN_ID, PLUGIN_NAME } from '../common'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; + +interface SetupDeps { + developerExamples: DeveloperExamplesSetup; +} export class StateContainersExamplesPlugin implements Plugin { - public setup(core: CoreSetup) { + public setup(core: CoreSetup, { developerExamples }: SetupDeps) { core.application.register({ id: 'stateContainersExampleBrowserHistory', title: 'State containers example - browser history routing', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const { renderApp, History } = await import('./todo/app'); return renderApp(params, { @@ -38,6 +44,7 @@ export class StateContainersExamplesPlugin implements Plugin { core.application.register({ id: 'stateContainersExampleHashHistory', title: 'State containers example - hash history routing', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const { renderApp, History } = await import('./todo/app'); return renderApp(params, { @@ -51,6 +58,7 @@ export class StateContainersExamplesPlugin implements Plugin { core.application.register({ id: PLUGIN_ID, title: PLUGIN_NAME, + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { // Load application bundle const { renderApp } = await import('./with_data_services/application'); @@ -60,6 +68,62 @@ export class StateContainersExamplesPlugin implements Plugin { return renderApp(coreStart, depsStart as AppPluginDependencies, params); }, }); + + developerExamples.register({ + appId: 'stateContainersExampleBrowserHistory', + title: 'State containers using browser history', + description: `An example todo app that uses browser history and state container utilities like createStateContainerReactHelpers, + createStateContainer, createKbnUrlStateStorage, createSessionStorageStateStorage, + syncStates and getStateFromKbnUrl to keep state in sync with the URL. Change some parameters, navigate away and then back, and the + state should be preserved.`, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); + + developerExamples.register({ + appId: 'stateContainersExampleHashHistory', + title: 'State containers using hash history', + description: `An example todo app that uses hash history and state container utilities like createStateContainerReactHelpers, + createStateContainer, createKbnUrlStateStorage, createSessionStorageStateStorage, + syncStates and getStateFromKbnUrl to keep state in sync with the URL. Change some parameters, navigate away and then back, and the + state should be preserved.`, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); + + developerExamples.register({ + appId: PLUGIN_ID, + title: 'Sync state from a query bar with the url', + description: `Shows how to use data.syncQueryStateWitUrl in combination with state container utilities from kibana_utils to + show a query bar that stores state in the url and is kept in sync. + `, + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/blob/master/src/plugins/data/public/query/state_sync/README.md', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); } public start() {} diff --git a/examples/state_containers_examples/public/with_data_services/application.tsx b/examples/state_containers_examples/public/with_data_services/application.tsx index 67a2a8b791ae5..d09b77fbf25ee 100644 --- a/examples/state_containers_examples/public/with_data_services/application.tsx +++ b/examples/state_containers_examples/public/with_data_services/application.tsx @@ -27,7 +27,7 @@ import { createKbnUrlStateStorage } from '../../../../src/plugins/kibana_utils/p export const renderApp = ( { notifications, http }: CoreStart, { navigation, data }: AppPluginDependencies, - { appBasePath, element, history }: AppMountParameters + { element, history }: AppMountParameters ) => { const kbnUrlStateStorage = createKbnUrlStateStorage({ useHash: false, history }); diff --git a/examples/state_containers_examples/public/with_data_services/components/app.tsx b/examples/state_containers_examples/public/with_data_services/components/app.tsx index baf627fd62a32..04bdb53efa502 100644 --- a/examples/state_containers_examples/public/with_data_services/components/app.tsx +++ b/examples/state_containers_examples/public/with_data_services/components/app.tsx @@ -78,14 +78,7 @@ const { useContainer: useAppStateContainer, } = createStateContainerReactHelpers>(); -const App = ({ - notifications, - http, - navigation, - data, - history, - kbnUrlStateStorage, -}: StateDemoAppDeps) => { +const App = ({ navigation, data, history, kbnUrlStateStorage }: StateDemoAppDeps) => { const appStateContainer = useAppStateContainer(); const appState = useAppState(); diff --git a/examples/ui_actions_explorer/kibana.json b/examples/ui_actions_explorer/kibana.json index e88739a9e44d6..f57072e89b06d 100644 --- a/examples/ui_actions_explorer/kibana.json +++ b/examples/ui_actions_explorer/kibana.json @@ -4,6 +4,6 @@ "kibanaVersion": "kibana", "server": false, "ui": true, - "requiredPlugins": ["uiActions", "uiActionsExamples"], + "requiredPlugins": ["uiActions", "uiActionsExamples", "developerExamples"], "optionalPlugins": [] } diff --git a/examples/ui_actions_explorer/public/plugin.tsx b/examples/ui_actions_explorer/public/plugin.tsx index de86b51aee3a8..670138b43b9c4 100644 --- a/examples/ui_actions_explorer/public/plugin.tsx +++ b/examples/ui_actions_explorer/public/plugin.tsx @@ -17,8 +17,8 @@ * under the License. */ -import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; -import { UiActionsStart, UiActionsSetup } from 'src/plugins/ui_actions/public'; +import { UiActionsStart, UiActionsSetup } from '../../../src/plugins/ui_actions/public'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { PHONE_TRIGGER, USER_TRIGGER, @@ -39,6 +39,8 @@ import { ACTION_VIEW_IN_MAPS, ACTION_PHONE_USER, } from './actions/actions'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; +import image from './ui_actions.png'; interface StartDeps { uiActions: UiActionsStart; @@ -46,6 +48,7 @@ interface StartDeps { interface SetupDeps { uiActions: UiActionsSetup; + developerExamples: DeveloperExamplesSetup; } declare module '../../../src/plugins/ui_actions/public' { @@ -66,7 +69,7 @@ declare module '../../../src/plugins/ui_actions/public' { } export class UiActionsExplorerPlugin implements Plugin { - public setup(core: CoreSetup<{ uiActions: UiActionsStart }>, deps: SetupDeps) { + public setup(core: CoreSetup, deps: SetupDeps) { deps.uiActions.registerTrigger({ id: COUNTRY_TRIGGER, }); @@ -98,6 +101,7 @@ export class UiActionsExplorerPlugin implements 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%0A1oI=Hc7h?x?s1Q}vv~W7j#?*+P{x zaV#VP+zLt}Tr76C&&h)^IP9ETh{pK5$n`pdVHD}SIRS%yFqTAK9O@xRr=(}v92z?_ zU6IuET)WV3=8M)n#CuPgBQurmY1cg#__zy$!8oRPD5Rs#H!PYKv!9Y!8RXdlEdA1& zy?(O_SzVZE8Ig~3Z=^{eREn2yp@ZZo>dUQlw1aTONtHVBm6<1)r@TDv10;`TLyAJ( zKY^1^Kg*+B(n2#S4RBiswSJg3E?!8j`ht+u$n8Zg;12<62g?FHgHpV5*&ZMQDY_r~ zMwlw1deM`@H$g9V7RnsZ1n1J`JbW7YkBZ^5tqUekj_>9=3mc{R&+&qERML?S| zkNcJLA!w9K^X12~klh(K--@6^jI~)wJ+5ZIVvbj0be2=@;g_WO-qN3)-N)S4ix~3J zrRl+L{tg@vOhl?#@`N-(L+!NA?(N{h`o*6&=aK=}pD2BlGKAGg^wCMM=yi4idc}hb zz4&uM(u&f10p1O8r6TRrA-Wk#9)4Qp9svtqXG{)_w1OOT1yDm@Z|)NruCDe#%Orrn zk>D!C4=27-zdb1IcjZ{#=pO@A2erI*xWfa-#;GtqR$K*vabjUo1Zw%7)-@`T?Pf%W zGcb-L8NSZe^jC743Zhjn`*D9Q+S9c4miXC(kLurCXb5}PTjz238{YDEsWG=(*_ z$7g=E&fFuO*mhzRMMfeHNu9uoh^CjIZR6=ZN5~P$F$sA7n<-v!=R)4$e%cjqu=ZE0`(@8q3QEk12|Nj)M;;(4hB)6ehB z-_bkX&7asf>~o2|oHpehV|&4bI$l@=*WIkeo5H6I1V4*xdC|Hlqbua@=9Sb_{fZt6 zn5`*5l1Ev|LuD<5LG*VfgiLdf`l(7}Y)~?0i_bc4JE83>uHFw(5+~H5vLC>D0Iu$oi`O8>UFiwzzDQt_yV?A7BO}r#T;BTc4~UyMk@Ix*X-3U z?O%$HkDVk{We&8USq%|qnedtS+ZwO<57cATq znaMd1@tz~;O+TTI!R12EM&ZoA%f>^)&{4-%)kJSKuQO1=jTP`sT_S(sMyU6FvT_AW z1no8kB#i+{(?ni~F9e~DhD#V+UFQQKkRc*(CG7?a|Gx5@pDw(lg;xli<6WvTK&FDbwTTKqzl-C02VvQvyVzQG zq8Su-b*vaC=w5-Jv?kPIQX#4p7JJdJM&oM+C*2AxNvQDKiABI62?7xe7~p5w#nj^8 zY9)NiVyE3_(xgT>kWY*Txaqu~e+ugewzy$C_@j0^cDKJeJOHs|UpzqT#(to`c7p*r zOc}f%uBhbx?xe5-k)t@G`#PB9oi#r3si9_ny)avni-=J4>W;Q`Aq%a}U>pMjyp3qH zzFKMV>*q|U6(6RNiwk|U}T z5L6#{XhqW8Dw{j}!vB-GG#ns^SFlMqMR|)kNu)>p1CS*vNW_Xos>Fur*U%ONOcb7|M0z>qZ>y&}c zGJmcXLlo5tX^-tnqh4NF;g1#lb*gLQ(3*j3Msz~&Rm_mb&Spg=);0gsF}yDcRF z-(BK)XF4(0x*fyc`_Vay^>ntzO~7w4X{nM^4w;Np2bz0WUH#OIAiipDguHtdye4+V z2Aqtr!;uTrAVcp^Us`REv4|#Oje%fFc+!thZ-3^oV(ZK-Iv?s$x#U}6tQC2SIAn-7 zkjjmf8tCh;G0CtOv>6Ph+2)crv}HM#_|)9D3hD4QXu`GJ6j;IIi7zK^UTnUB@m;$2 zIqBShY_zAragEs``2~q$S+jLq+chtI#4faO`H|dsgRfs>Yk9o$3v9Kk&K2KId_Z%p z9f$&VUL8vb?6DJgRV`9~JI}v@X6l2JMC&js=IpkR=KK#Stk!>lX$+82r_6a$CpN|S ze>qShuY9T0*(+4&Ii!W3A3;8l!bFmq>Bga5$kayuXdA4^pl|c{U;RQM1TJZ zmPu;3>*9IZbF~ZuwUUf!oyi97;-kg$Ns)N7Kr@%d=bef4Lg7FU-kjk-rp#SX-kVb- zfj8u3<>mA(*Lg-NWg5TBb-KQ?k-kxlr*p*DO%moE$r)HqzMwKP>{|Web?GU>yUnpY zPfE?=YXAPL%Fk2Ci)(#l>yiNWbB^X)htcW%Pj>&0BK>&Nx4rBU;If@;?_2kg;YIqd zv9T83)8@@PQGD0Dk9QK0uqu~?_W&q0i&_`ck-6`BG$SJ;knM0LlIjR{(2UpwpKS_l zus2*b)5BBah@#*NeTU~Ago1H!g}fjY9>|AD)`O+TE~28UDvHY-0!K`{`S(RgE6z-9 z+xOW%uKnefPo=>EKB;3@*3^^|{+7Pwv{p9puh6f~OkXm|sF~6_vi5!o3h~Nz2)w#f zN^w||*8}{~pVIt17MoQnhu4RLPeIn(s+$tN7rDDaLL;*XO!y?K#R`d80-n@}+pA5s zL`+^c{QiRN!y#msx|r-3@Nev!wPut0dc~SeHhNZByfAK@8mX-88A49&?di-$d5Aa; zMW!5P6ZoKo%C)dDPIjw`%||reEUE;^(4I!T?}IX-_oj_>skYt`uiIu0eF~S32E9%> z8&Q$FY=xF==e<+JGxIB+6*C|8%`sP;@AF2!N~y|LsV0o)RzM5n=731{#D$=6!;ejU zT~Xp8MhsWJy*nN@!8iP`k>7!^7j~%isH=f5Wu0$2BbKgH%T)KMfZIg@-tz0>r#I5| zt*x(+r=)RKn=xwX@;LH?$Y#07&dt(aI3g^xozxg;hX!P6;KnWqo;I~s{EHnZIsh+N zlv{@LZU;l9ky9aP+y$HHRL=1-8LE#Q-^1}yLE7t;G)%Cn?liMminR)l4*0F6|5qJ} zOEQW#5041)`Dk3=3ELm2X&*HP3_4>;cu$M2I~zSdS=}>_nHu9P+|RMtPR0f!VL?)d zFn^4`q_<)wYw6j&GOzXZxW!IQ^SPXU_Vy0vf89lxDUzo<9OPiH)KlE+w9}Wu#`;b; z1kq+A#{5P|2|D-z!u-_)=dLg2c1>NuvHZ=){3O&2t(6IC`uaN4mTEkXbNoa$^0&H7 zK|8#l>liL#{Sob40B z9HR%}{{km^Lk+();%vP`^6&E#0q%JSo~=qC1)F6t*5G`F zP6u;D@rdkJK>BX}C7b=&?C$u5q5Y{n$jfRufe{68T^-@`CV;lpR*?lhi_rbkq@nrx zF$u@hVIMsGTG3@2i9jVm*MRo%SS9S{A;oL9!J$Tk!_L?c`B`i0fF|$2;wQx>c#3(A7q?V=(^!gtK*Vp{iVHX z;z9_Li*C^Z88-;Qe%tJUVKu#Oi)%4XUv)bXB(EfeW3hAO?>&ujS6;t@H~>eh1V_AG zH_CeiJZ}2vmG}}rd3s&h*wy#3`9!FC`6Bq5;l@Y1YgfO3IGWFw>U1PJZv+!$;cy)0 z?Ftjmey=TE);z&^Q>8y^VX*(k`}bWV|1MrQIa!};YKd1M7Hpn9A_HvqGrk#@xtG$q>eBa5jVthBI+IzvsAsD=WwPGzy9d7e@o8#{b9w6 z#vlueC@lb0Qx}6>zRSluIDfXyPwpn!k1=5F~hN=9d9UeCcVQ5q`nCQ=zm0fxccfj95)bE$P zU`x(gOh&%FSWMS8%+#B2d1*CzrQ#Adn$MIPQ$6gb+o~^m+@6*SqYJf>p+pdE%+BC~ z-(#eJ-_)O5z-4}l1oCi@O(zJ8jGrTYrcvb&ykuqG_Ia+p3;@Ze_#5A?v^W;8y3LM5 zUhZvcxN?z`5Upd1#zU$hzj23MB^WPV+De|ofxu-d$ z4aY|LAQr1AaCzO^aqzaZm-xQ<91jt}EPMgqr~h=xI4r)D-~8hB4JB#q_2sGhz_<{R z{|aBOVUT*Gvg4H#Urh;_Jw!Gb-abV`A~1~ib><}BDJck}(53^{VH)@yoSYpQ+hc|V zvmP8<=r#K}cZXQm9{;Eq5fXiq7)gW#*9)0fy1&x3-$=i4LEUZDsjCB-)EN-HsWfk(aE zjCY7}4R@&Nb~(&0o9n^DP!F=a^t=cOca&oVdt9?2xuV1sR+bD|DN*CvAHeq*MkY8z zPV*2h%iGXaTV@ava9gugZy2o@*tg0pvrEQXKcOj zI)vKeAbi@dX13(vjEq+x&>nW(@l9aV<2`vHIW=y7M0_N=wLYwDpIEu_FlZNErmB5g zZLq8wOKH=Ez2=A6*D^X_5wfznX&)RE!}L6gMWg4FZ7nDu*P9R#J1o(iVbE*UTzA`% zkLWd)R`29V4gEFrRl48i`8~z7;D4=-FXr6_RuxvTh>9oYEiszaLgxZ%(*`QVl|5mjdHrQi$boxdvwvWk&BGZ%z>2 z8f`Z!2jO<`vM$z+xY0xlgD$D$AEg7EY$sLtA1+UJX_zrXL`X^xgZsX2(QYz*GTG?t z80I4k8Fk?BFkfr5UXj=u&j?F>zwYkz1#8m2h|P@6u|>Dxm?Ob}ho|k2h<=+(h1C+I z%|^mvwzYvas;&kdgk@8=`!Ky*XunHxx&LQk96`3#{M#X zhh^YXI4Btit7)pvDd+RzT+42=Dkb~|IjM5k`uVk0_%RSgFwQ>^cKbS*Jf6Wcg>&?n z!_ukZ2LpYfY+tN{uC|$>?Q*>|r_E|XbAwfwtZR;%LKZ&;){$ELK1140O6w<&B~uJ~ zd(dKa=U4^@fn1jNsp^SUB;9y zp$DBh)87S#G+Wn4v+DbrrHb{&@+4X6W$MX8gsqZ4jDIxbZoxW1_MvVOYTDHvB-eiFp)S(@Tm!#II2wD5WTke4Y?aWM3gLcx>%N%sh?#jleT+%W! z^N*4bB%SR1E@z`jktYj3LX6w`^9ec3|EMJguuL>scY#NNvIPzz7$fVcG*<@`Gm%%I zn`7e<{fs6Sib%DYgNdxtLCH5^(VAVm;=iFRZhQ==`;$PeaIEnK-kExLI*uPwDwL+d z^Svo$O1XLLR;y}UH?!HW@{fZ^aS1Bw77Nm%1V(HgYMkW;WGD0Gapo5t!ugcu;PNHo zJt_#xeGR@wx#lmeVuBd^QKmiWWy@V`U1>h-g7zN|r;CjkUiF+v^R|ncTTjm4#3r1F zGGR2B99Mf4Yg2!YVTtH6x{hLJNHJy- z@S?O%^b%_mYp1VP@(42JybfiKR@fDuu)S(QQMN$%!{#PpX~mx8|H+;ZrXQYyzChWP znQKEfVNW&A0O2!+VC6~ifcSu4W{3UAi1csvbla!dA4Ls_LlOK6sjT85NPOS(?Lo+Q z%v0WxT7D}wZ*5tBubz_R9Uk_+3n|+$GIc=GObV*vUDw^Qz+IIPTDiHh;*xJ8-n42m zP1b8L)NOkmck4q^PrzDaaPjMH6Q0T5uN!Ou`B;KfEpEOCQqZ3go|*Ajeriiaz(ale z^^B#`Xaxl?jk@ZboyTj7ukoMuD%x)a$?#S+_(6WZ2KUEtAU6vJ7I9#vHYto#EQ4pJ z^2MfIBGz z{%+N=YSnG$29+@UO?Og~EMjot6IMnQ^Sbw)K+ExOI^t@y>W`-y)LRX^18=W7oiBg+ z9yarBQQ<%+=RGs^_9+zANw-SWVOI=I>x_>3V*`+Er(HdihlF@IqI%V59W9x-%wA;H1Y0u%lhhF!akjy7egwv^hJs8l(PLuDPUh0Ls+0EZVG>;H zcn7Un-)5Mg5kKF&bTvZtR#+!CW(I#7uj{h}^ixyLdbopOwO!}Oxx3WFVZFw8e<;K% zuuNtglVI#PmBEfe+IxFF2fXa>I}(D11SFkyKV4CbJzO0GhBkeUE+@-G$~CNI?Sw#l zJDy@W%Qtf1$eGWqn>J|RP)?JZ);)AaCDfBrRXg+VzBm`T*rR9vvX_&KK<|dy9AtqA zd|``{k$f5xcM7bnFgpMPB-t?cF1~~*>*Pg0% ze*$gGQOcXF4nacCPhp`Zl;)gK5|aXpp0n*hyxC`M;hfMTQnLJdLOYtZXtd5m*~(^2 z`wEIw*pTGdqnZ`;23QvO!2K7N*@u=!$dho8$LQJt;~4WCTr-|930bQ%tM#@vs=;yvw-{;I(xa>aes0n>#9? zr`F;Ix8*83dL+|zjSdFxny%okF5ATSb)-qPrjv#dbmP6PrT_F};~6Ad0}f;#iuu_2jaKkm9)zqaTFF2D9B@17)_>dc!*_9Go@U zV?_Vuw^DAvpTUUWJ(0}UABkh_?pJ%Kbs-`wQUNU0qVXMXuhib0mg_1d6ET==D-D)S z{E$O5i;Sr*hYy^;h~Sgys@ioYx+`Ka?55$(v}wrSi4<37Xe1wHuqqD%vcIbAD;JSw?A*4C`^zI zqq+5;l31*wOvbu|2wBTRQnJ44qc=|P1C-=)`vgv+Cd(%tJj?cGkLTY;=g};X6iSjB z+Mwz*+JiEZ>YI~=z}imv%C0TSF_S4Fe>xp;PMd1eD)TWrYm#JTE#m_#a(^!vp^Hecwrb5*QS5m|LD{R_1%SNtRx` ze&c(k{CsEio(_2ql)H!XLMA<5b3qS|fZO=~T(2XG1%-GbpA>SU2p`3+lWy}JIqbW0 z?zLYSbin%uETbTw23Yl~RLU|9#)Uh8w@2S_I;CEl%XF-p$9%c^_s+*-%cc71?SXCp zfgyQA9GYzawM>fmA_*B|r%EKk=*MK(>BSs=M;s^k z3d6BRBNz0`{cM`|6hMCpTEPH~xGAw2=SSIBP9YoDZ=f^Gt)DYEtdK@8{y>)egz<&hmPiE5@eLrlv^| z&eQ3zNCiC9LD#XZ#@7(lMdEQ)et)AJ*FK)9WHDY>-pO|m$yU<|BG1|r{wzWCQ{JKzw<;U+zaIAG~m=MwM zq+Yl^mCb87En+B^p50-X7jVf<|C6X}7#b0c=Mh8i!f8+bXpgz{gw@I@V6oxR#C)b) znMh_2s%ifRozpffLZ;|riDuT?pThVb>EC|8<LO< z_SMAtKJQ@bpPC(oV5L#vrQoIi`t@~Itb34^iji&4TKfxOP126s@%v-f`C6AQkNfG5 zaSr1~!6HO@iwSDIHs=zFx0?~7uHlh4Q$M=@SOCANXL2*?%nyF3uROV=gm1kDAdjy# zo&6HC_!w4xDVf;F2QTTVm_EPGepY@QO|j8p6hG+pxH9NJkW))eXVfL(_jwqSTU5th z%p)}ncxZdudPioiXfKgX*I^=*(CUm!O(NSGK$ybkKC2=zFwIa+G#L>7nY%~wt2`nDS>5=mGAo9 zjE~#nL7Qd1dWjym;yiNt@eM@uiK>56df`1|A6k(--qM-WdkX-EmX{ZJ1-Vb=b=HK% zQj`K3LT-2vW4>L^N-?;C+jN8`jr+yp{f?wlwz@-|s~UZqlKN(n&h(Bl zEMTb(Yt&p*pUEOt++=vz8z=sa>>3bM(vg;;oinuQEbBZzIl?xUt(@cv#n0R!P zKte($8uPq%g)8)1@;YBO0h6A3CBs`qif@v%pgorPzStuqUxf&jZ|{n)4$`I3_YZ%6 z6pj$3g!lAic)~z~&iaKZguLoZ3S_UW+}1-sIR5%wGp1=6o8k{1aSY`<4c0as(PE|W z93vX7;OXxG_0Ng;O&B1Ah)boHD&5=N%fs^Ao8b@g{vf8(VD};;X_#K)UAdU9TdCms z6~>jYT4F6B70310*K!YqTmjv+MjM*NN=EHqT2(|qU%Rn-9j9gj9`AAio^`pQOv__cZJw-CveT)8$}LlA~6 z?07EC3o5l6N0F zYwK&2-y@9p4ScV)HX!eg$`zk3_0>-fM+!jwjC^C$V7C<09iU-zyO|GX|@ z@xHH#lI;!;)AezRH7uuEZV-GK+~cXA@jS}&K}sXnHho^_5}oiq7+-`7ev(rAsevI| z>~0FKR*b8FAQgd@7v*-zUVQFsCgF(_QQylCqEL3TW4)g=p$RMwSGg-#B#d(l%bw>t z%aTZOXL#JdrZ#3f?fO!5J@fXeJ)^>033d%IY0q8dX0B~F@>&ygnNFi;(zmrZKR>EqU2-Ww0?hG#K{H*f6|r ztFc|njnb3cFp{4V4~({+w}I7(bVJNKOdA3hXZ@&e0$R7xrbq$=f#pW{ zFkAUEu7;m$&$6lOThlKcw*vYth7Knyh$k(_lezed-;Q77n&??fUD~I;os0N3XwRdb zcT-sA37{LAO!pA$`hy8#MwoRe&J21~C|#Y?80bJ-XT`^A9aM#DuA7OK*u!#bi)x}r@# z{q~1rGLQ9lkhD2<@qxUui&#q9%Y=~2T}qd|f7-8rooY3spq!aV?>x+SGbCvY~%&FooUNkK%l8&%~(HCvpZ?_x3jO(N+XI&#iN55yX@_@$bo#T zi&t_d$7{)J1-V&l)Ayn0G=Go#qaEr}sZfsb76I2cewF+K(s>=G$5s<5_LnPS_e1yu zxcGwnGmq-A^?574-EiX=Zi~eQ4`916D^2snoW`iR+7cDtF;Wh-Zo}xGXZQ~Ud}^;Q zOSn(94@0DC2*gG(zKuXK#y9igw*k)U0Gu|A>g zmMwqe_X8J%_K%Iqt$HRLRbERAZTbYqBAYYO%*I zxFdNfyKZuV8|`ib)Hkz%%;k<+DQu9S11Hjl?A97YWGV1-ZC4tQi5~8=PHhTGnv`o3 zTElfrh^*G5)C2VD?tGAaj+e4pUEUmUE_@au-I@pAKKN*C`=7Q>(FhE9tlDOyicsxcWe3qe^eFY%icxbb=$3v;+_R$!FNTl@Mat+f$aVnw7< zyHh?79Cbv*b7UIz+nBa%QIAbg&~G=j9;ftr z2wA32!f5TB6iO%GF0s4Itz z6;r&smT(Fn6sQQ$EGKCNyu7y<3RMKC8TelCUjr1XyInI}uU0h)J@0Y6ZtGsnXfMZ~ zZ(nJwTz|ZriWqZx*VaN86bjRs#&X?8la6V8$A1iz%fD?{_a4B=s+O$z==TAf7B7z2 zO+t7Pk^R}nTX3FPTwLC$B73{5eY1X?tYGy!t+`!SMLx6Ed=h;7lE$a=>K!YGZdD)* zH&qoXNbiALwhk->(^cdUitJ!vZ#S|oVUeJW{Zv`1(kYaMYMTi?F{zb{c9>0cN$lp@ zk8D-Wg9sPIv$ciAdFfXjJ8o4ZZ?dqzN|wPj-G~0I&$!5HkCtx8F>D8m*n}+E_48E} ziZq|k6)EUIy|3eM582;G02x5w@FzL%srsWHG%_x+$5xk)_ai=u$J;wv&TuBVY3ctbWp;(pAKuEHIo&yJ#tp*cPRV!N$f+yV;-wi@B@-P#=lup z+U!ulPe93Xg!R{T3h?Qum*s8`WTF`4Ne&fh)(|?gS@3zbDYg4^RCFol2R1=a+=6m%LPBYk5BK0)?h35f=o7cxvl<8;SR8&uPyu4tKGO znELw5fy9R_Q`cbjWw*~~)PZ{p-*Ch> zN|2Cq#XHuh z)+=EXX7{Z$dLfX+iG_!l3C)eA@{$)%ZNT?~Mwr{PIe8k`_wvr6k4uvLc<7w=z0S}c zXCDaRjcJpBqi)Gj-pMydn6+y0l<0ns&V*>^{kRF#bKE)brjjPNKnZyF`fiAsBfWQw zh;dO000fsw{M2pG0X7&?zPyZFVSEOK%q;Q2q{rV%9DIzT+J@v3^(qk&_tjkb?4kus zkKY`6wo41fjzsC5uzDUd^FL+}<7^CGb@vk{Vzd*LxNorU2WUM7Gsnt~S%o?_CxLVB zLt65Ws_u@|)p-_H64 zr2Eu*^=Ra_&lg+E+E!?c-p*I8=kN6fsc_PbkXT}c{==Loiw3WHD(&HI188wWpH_nH z^mYF}X7(-H4S3pUIYYa-a_qc}#;9~M7xFtET5x+wZCVWMDsK`D-KwZqEU~XF)rvDY z=}1aa7-wM#`iN)48?u1o5#DWJ^FeloTaSiX1dtl-WXx>|iKS1^NPbgxe=cSn5Ztru zYfjt8hL0s^cgg|Vr5B=_l-NJIoF`NMd>B-{ou8-~T~OpFQ{;buU~IZ$ATr?rr)n2z zrGD0QA2O5b^289TLPAgV_w{r2q( zIM4Nh29lnESPTA>$E^KYWRc}nkK%Cr3rzNJ$#EaDtwp@WuN@Z}c1s(P*xV?ksj;Ue zl3QJ9JCbq34WAitLg85cb^JtMCWNMUdrCZ2%K`l}T}-YiRG;)$-MlJ_AbS>9uU9>W zmeIHzHZZ=LR`_|5LY7}#E@=v7hg8y9HhsaVA`$2I;%a(6D6KczIhL53=dYm&J*BRo zcL>OaofP{l&Of&gpJyCR{n|!lG!pft0TNS_GUaT zd&Y}34~@ML<}(hfVjqi0EUxbhPA`kU#sp9D(!p2uM>?duU9D(EU)}0B*T6r$5r4kx z=KH?|T@D%NO-4{zJRGmc8T3hOT9`#M)AbQs{_dBhn2A7@e44*gJQ?=5UH(OZNPRj& z+xgw3ZRfvNUX(!a#}5u6=FS|JoUM2@aR^=$==XgY1VWDqb)56Bt4vDEcz{}>YS`xl zUp|X33J!ikamc3*=e$W*wax#wYBy2Mq{}DAlRU% zI{gxe5dDdG)<(KHz(VZ$^kx&mTcJbGmJ=3Ne*!v!MQv#_8X|xH?6deBGG<-@u#xq> z;(8v1XjijC=L&3Wv(3y;wfJ&H6XVEuIDRe7|88z*VYWU0yq%o?*?rv!Y)U6i5cm`M zaWP^y2u3}b$zc77Nj z{g1=Cv~$d#Ci~x**=1+juHO-F?-vwL^P#q>=*M-uN0MB526(%(OL)TZ+_NSN!DB6R zcEEcOnLNpv(^vdHUZ_?&?mgbwZeDzM+R9iKRKcHLFFQsh#RVs1&9t%lu4|JfB zdo5{OJ9T%%G&lR^dYcweT8};?jXNcaP@{V18jfUZ1i)D)Lb8?nc*nDNz(oYeF~Ryzclgn{b{+X$s0cOZd;MR87?DG}~0lCYsdxMtS%+!v1=HS}*m{^_0Q1 zM7+CeBd596il!0e7eH}^+$BFF-%}qEpkn-~!#tydG`4W>Y39VI(D1#G&*Kr{Kngks zNir)lT=MGU>L>F4VUIqo$GU53-tN!(bp_9e86UO$29gZ#XTRu8XBt4!0&bB&0hiZwRlN9V7W^rwL%1gwy zf>`1y4#D!ix}6|>#k~YRfey2HvB@7z>${1~O*$}xaRIo7aK<|ug1IvBxU6Q0U#e`{eq2P#K0QWbD7#A2I$tUdgta@2;u7Nl9S!e0k5x*cz4XG zXy>Lo+d5506C0dVy-OWfck>828rvU)^z=&hR)wa_RqcN_Eu;5LQgb>*_Nf&6ze67< zGdomMI>^mTfYGT}lcQ6~sTuD5j=^{))@A5d;eK3SH3zE z4`|amQ=mw9^g1EGLfLVqf@4XDd^KB_WOmLQs#3*FLron((4wMl&t+C+S7Acg_Xp!i zgZ3IwozT*7EzNVhbH3X2b6bT^_`_jbYP>^P?XV5YWqgwxKT!$PDu$hVO^m7A(Ev7h zKvDo7C!?X;0S0x)2X2A{iLq+XeqN&L&Zws8afGQh>X~i_8&4tQf%V=hOc@Ic64O?t z2ETghN{E(4d3YfbTp&6O(|Hx^9>W%&bDB&OZf9P3F+UNXsn?xJx57%%-Ej)js3i8r z=VP`a#Z#|v+d;g~{YSL&RX1p+yb_@c_dFh%;1WL)o|6r(V(>1k{yP*xY7A44L^`8( z5hrQ}WUCy~c5m>(1m;91cY{(l=B5}HsrqPLwR$Muf|FpZDiS^^4u=h(4jVsf8{&!YXz01-e}pl!!(^0kNF|< z)659owaR5Z=QdugsPpt1v6y2;VlL18`wqegEi(e@ZV%d?N*YAa*R9@8=2Hdk87=1+ zi%RHw%rX`el~R@4QS0H9;Ci(L3f{scojNF{4<@evEu!Jm&F zQQzD+<9E%hbc&}Y($mN7R*0tZLqTAy(G_CP#}V*iLXE@7a&x9xqe@}xV8@Lke|0&^ zgYHn70q7;Wp~zsxk<%Is-{i#t>y)-#%kA23bHcA?h`1DU^w$FXP z_fI<$6HPh|7S9omNH_4)6Orxmx|{vDO^u8e4O_|E94v93ib3EebwE(2THkx08ka4K zil=g^TQ@C~%MwLC{(8OV!~Enpg+2Dft`M}#m)xyMDui`5w^v2YVsz)JIz^<53J4T zgR*)D5}CFjsTXev9qq^QaW_l+IeVRflSSA>OY2US4~5kmD-o^>rC>}rD}cfwVd?0$ zHMSNIe{%5>CS!VQg71@M^bxKx-+Q2192AaYDM4L?aAbhWntN3o6!7|Zp)MN6H4Cgs zk3Fz5#?BD-DtI?HpcLdqlC$iFWm~CIB>toIEdq%ki8j@=L?KQr%=8xK%V*8LW{x*b zl(xw7KR1<*f1J0&rsd6`Ek;AycuSd*_9do*A+c_cs<<9bw*=WXG6bFI1FliBU9a=LJu5<#s?v0+Cv95%mv+O8M!h`tt@ z=tvhhkbaYPfA2aO-5KY@e!A@kE-}qeG~&8GG`8>sL{g~&hJsuxyC_q`e2k1(?b}6s zn4-AZ;iR_n!=k3OlCun=UGgKtQ60#N>buj{7?o#Dl?m`SU{y1^*hycCJx@N&_GDQFh+y|dW)-KYAb098W-&ipTkoURo=oY z)ilm80yYpQW)USKC%(MA1WBniEv=c+NNVhr*V_B?c)rM#x^^S>Eo|66Rt|P(_%gx0 z>qx_CA*be0X6`#{^UM5sY@AL_a5F2i@#n`|OSox17O?c#q|NWw>}_A5x4!Q}g$VN< zkNQkkQ@u2-|y6!Eb5lJr{J?)))HsB=ZdH zKwL18AXiV$@X;NsF6&9J{iD8b1+{h|lGPAr!??+OYEe*~?LU_>Wspy`V_zw4H^DAH zxe6hOMg7wd;w&T_TrtHgzdy!)W?1Mg5Y*3U^$8Kc(v3S z)d4qh#L`NfixO2JNYl?4Bt!QIz2sUimWl6v#201Vy4XW;P%lm+4pcJLp}2FE*MYq|v34 zh_`Uz?7^O1^{nMh2+G5rs(uM1U*}Tmw=ue^qy40;e=vI-a>F+&%ah&6mAuUJ=qq8h zQVPI-68Pf73jYiEz!Y^mFI#iEY0bF95ppZ1s%AJS{29H%Cc^FkeC3(0YEmNO2fZd| z?4&b0d!&D{n5SPSQ7HpJMIx&JIMK1f)R+%*5Gb-+lcXH-y6=-?LJGe-$;e776^KJH z1AzjTsMKwJ0a{443iWANTXi3G$~%VAIdlyaJ85`NYR-Z7pJUFGXJ&^U^~cV4PTbe& zyC7My$xEiwGLDL_W+65z_L~g1KEFSuKf>*mdfKRB{TdW483~z;$mv^;uc0L@nRb?2xu6&WS8FcL6CfMWVS`@#0f)AYf-w;z`zYl#Kkm}Cv zK@SgvUpeTt9tTzBQc%6uYt%#fmH}RB&*UV+74*-=Re%@Lm(4;YcGgZ3d>2g)z4Lv9ENX2BaK*yVJzi|dj;5+?`QgkyG&=a2fSS22|D61&9=9V0N;=m z@in4mnDZwu7@10q){Y;!O-!L}Y(&)#yT-zWNEya@JeIl>3>bR>Sz##+i)6hkR9a)m;tYUw-3e2uSfDlAO4e5RjDO zUuJ+c=J8n2)batLk8`Up1WbSQ0srn|YD8$yOvWpbn5u00u_vVTB9B~kDQPCg_4*Ym zeadwmR!Cx`y%41;|9lz28d>TJQ@oj}W61=a5l}j@=Q{n8YQ1@Z-o}yN%~xuK%w2y_ zISLY_lX|n@`Xd9#6=vZM@u4CiGoD2Bc&ZXE2or_y6oP|X-~TC#rRImOf+`cS`%+|n03uUZ`e4{d&OG2e+%3v>i-2=8=3q^4otre{t z!&IpMtbgk^O>jH2iXv%))kAs)pv1ei(nL9-8TPerjV%~HljaO^Egu7-CfytU0!g2p z0tp&VH%hc;%|!=X?>U){=;B}q^L5RBp~P`79PWISP3pe@L|UrIHDY1-bay7#uYT*q zBq4_cdjOj(_r`SNaNp}zM6bZGZ87#tN@POa3fqXJW+eZ4c5QnP$qX~59CVO|1l#`e zH^(voD7BF?>QI<`& zLqcaG;ZLSlZM-f%Z=XLIPfAtE&IB8Ft112{0Jfr+w7FXaZMNB+Mc!Yn8rX+y_#hiu zYmqGUrK8vhIIpx1`V5pZ)SDf6;|R27Gt#(Jmpcm;ZkU(@d-T0?Hgtc3$wY%?^L5K@ zaQz2ueV%aX%{_UZhzXnk0p3iLKvy}vETGhxid2Za+l zOMyKpCoBK0DZ7E((lF>(wZUp$vDQ_XLSwxgl%fuDz(Wvv5A$6e*6?`0`Pu$@Q0HLc za8dvcL}m&TSshCf2nzX1O783b~8wk%sK(gcT?%)oOR@_^=M&@fq)f7_M+QmjonYEA z<{GKHCdJ;)orXNLpLS&fj<(+KI-fI}>L3zs>^o5+jvgM%qzu!Bg$xWOmol;&T>)XZ zZl~|MKYjsOwr~sv#jPDawGgndPA^BoE4{UR}16z^6fJblb`G*K5j}Sdb$1MQitK_mqg%xsz2F zs=&Z}+aXZK7~`zwT9IspWA!sD(?B4tzmXQeP=iGa&53S%!V$Hln?ENGp}Lgu`)`3O zpnbHQ^7#K;O8yc=8Xm~6jI?wHNfr(*%ky)uu&H-6BRNYrd$se2UB#|iWme6#G0!oo zh^OYD1Zn7bnSC8}g~G!v>+lO4i3THCppauwqG?=Mw`pz3YVAI>D%P6%4>N=&D>dE% zaGqm5ut?U7nsklouB$xQz2U;A@@WlAYQ!+QZOQ6&O zsQ}%Qr+>!KLml0TQo2+v+|$X$ECq_JkQfA3tRzt>Q3Y3gd!Ix}ET9O-?hs<9=*z3U zXi89^mzaYiHVJu_M+57jR>vbjsg7MUhLn;}CQjz+w=vyoZ}4R!O|vQ8$+scz;7=*J zI%?YCfWGnjJJyjTvQg{~s=Rk074iN$a=foi-ev#jC=jTsFBlNLlOgY*;8YFB66v~~ z=#pHyG+Tqv-x0r99*5{}90W5e<*;pLIw<=HZae_2!ArOow8@A%TYv2j`a;4`xx{`^o^j2L?TnievuzdD*h6^ zkx%^l4i{GsabuOASLw)oikhDvypB|@fDx5zAABCXn?HWf(#j(Kno+CHXK%1=Lng^= zCPEgZPL0+PABV*o?jmx7D)c&j`LBWgT|75LMrLp!)GIi2nmA8))~iut-)>k8^wrn1z?~sQ>s9s3dp_6<6N&=sYM{u?f>*;IafC&fuJfE zCCmTF;ulbOQ>aG#1y*G7cu1Ow9 zt;o)VNkH*|zj}@iRsqsYYAm4`^yr8mifD2mC81F|ih`B95oQkO;vY#-mciKpfkJ*L zRjAL~d=F9t76}d4r3?WV+k2-Q{{>KEp$75601+GKQ2y{TuPY}7DAEtSrt%Fmy&=j# z{`FKJJgmF~u|@gVCZ&*%eH217uTFIhvp1_zFo6SvBj zxPOgS2_hO3>?L#XbzXW_X3DG9CVj|fjEa&F<4Ekh6{Zw}I*>v7LnsRO zuZI&t6#_|lEmnI>-yRc`DRJA_J6K%A-GN45zP+0t-LE35= zIlF_~puA#~1UBhOr7E`^#EH~at8c+%Y zj4c1UQceh8$mn&SBiS=d0RR&qZpz*z+sTRuJJoOvelZN=M!h;55-Gl*8>l+9t_mayJk|SOJryXCZPO|3Z>lr>MCB9H zC&?6ZF`mE-pX+6&OUhiSUU~mA_PVrOt(_{9PD}F<-nLv^@pl!}U{FCuxTY!od^Hj` zN~LNDJ51ja)6x`P_mJo3ipHGNwsVHgj$=9H2Yum7wN31YAcb{z(S#5>h`B`w;>rF~ z)|Vh57*9x4I`u)6vg^Ki7^~XUz2=LKKA&>wqINrlUR^eu|Gb16%ojS$DR{X>tE+C$ zM=}}(#M54A@|3COmGv|q8+sRG`-5cW&PpwuOzrP7G-{((mj5$|Hxx&BG=GSAm>A3~ zWXa+^Ogh*4Z;*W<@BAo86y(aZHL;6T2I8R!Z@-SHb-rT!L2}n_;*uPFvZOva}|NE^kK>-AyrtSyj8D3Bj zXk@;Du&@I=fKi&Us`!yhnu7@zwp}B&*V_W3|H&{63^euv`?K(Xall!u0&U2=Gr~4v z2yq)ZlAr-B!-&KbBHLiY@rAn+T|*jFOui0o$fq#(uRwZ{K^sgC(ou-PM8b)>M4yE) zi*@@W%>BdEnXG=1erHLp`hmV@}Bo!iC(syO(Lxe5GN|GFvhgd zRcH+HgrW?#>!?2)ez_?8C)o2tFn34b2E!65IR$1C3$1`)CHcUR*8k*XBhY?NwtD|h zC15ZxR7L`cL-0yTTE6vIm2%7a0>qePpheOO(&i(mRXR9JCiTba|2q0@S4m>Q{s=?E zKFn*&Ffo#MVOFU+(7s;$FvDDp4m zsS^LlI7lQcQ1UxUw~-gvErabagTM}&kQqY^!OTE~>hED+%*ZCh8lLZ1KRiTui~c6x zc`$*>&k(XF#JZY6Tg zHyWqTWNUMuHm>hWFR^M+)lkTG&ubPEod*+x(rd+2F0-jF53UKTCgCYy)IPg z(1b{a8kW5WR`iLZ0Zf_Loc?8@0}NQ=rj-B5k`v4b?y)+`8LJm!!YE92Hq{B6{r<;a zbtnta-ndw2H+L|#3OF(Zd zltx^bF#k=}g@8W+gEOyrh#rq9>)V0cH>gpW&FB2Uj6;Wm$F!>`j$-(HFa1|d--AJh z0|YQ+zTqkuY@-QvPUx?+iT!WUy(e*js3^CWVIFTD3sAHJ=+F@^7FcyvB0j0OxQp&z)L7FhejLl!rP={JQrT9)Ig(G!&3nm!d|5Ql@Jstl_^ZO zeJX>@${O+*opZS6U}6Y#ArELr61$Su0!4!Ve`gIGh){FD3)Iv4CqBv{Hfra)!|yai zNbGB5458>r-tPp!{4_`;G%!I)x!3`#*arhj~u8$7H(3!0*N5n+%O{zlF=s z0`z^Kf>L+n$(Q@{pDR5^LGj<#&qJF6uwe&)h9Wir^K9$gEqLpvZqL5HF-JH8<~5SP zfglk`TfUVhCkMG2#%Wh;6(_7>@zPux4($`zy#VU=Y4dxNUBuBr*Vpqygg% zIz>z$W6S~9!t{LIjjVqTr@+rS@{ocM8oi62^4%oq68^;^3$ zLqlXOwApw*FD*@C%kK%?exp5=<9&|M7}i_@E2dNigHAb}F}GYkn==mvpvn$Jn~<3#?;gXV7Ym{LXE7G@X0=J?4*W+q3{ak8eh) zLZ%FmpHU_nfgFWw@p6k%ZaG8vt5Q>uR{h5}HS=3D3yXP0!MI|#vn6R=D1=t6@$eH@ z!0Xqnvp*&E&PY`F zQ{3MYGY0&L`Ii3M3V;oiZCL6F*tSn|bMqt5kBqbyqjWxPZEbG8zK1t+Gqe3|rd%(u zkNNre111g*1}X{;4k~Vn)E7zTX<#p=3mSUDAvwPEIJf7u<8=4?4R@W-<587X6N%;6 zZPN&%$o)iUo$1JdTBX5=l!*Vb|B+!vgX;+^iR32=5*7LW{qgE@LRx02;(82Icg{d? z=)QJ~gP%gf;ZMK$jr+@^LQ%u?&IG}aVyZ24MS&?T3z^QB3_dRzg$9eCeC(IbzF{li_E`hW_hPQ9wZ1G|m%v6WM$&=W{N2-H*;!vC`24ww0!L z1|*&1nG>XBc(V4KMOuFS%GB2W=VqYMblHF~AyQL@S>QjxQcuDdl|;WtGwQou*&LLl zcAEGPIZd-Z3p}y9R4^tKC-uaB2d+7i0}b_8t+J}%sl}AeykS6m+2h6Uxq9;n{zC~X z+f`@ta@SRvU&Yq&J-(^5%LRv1x^pfw@9A2RiLO>0ySqp)b4y=mGftOmr8sPs9%Mt( zzzRKYOx$(IG3YEVf0o~%e-yh+b7!}735o%mmm5wx(}4h_*>i1|lgVm*>&ta7!Z?IK zNGvGR2B~Qgu%d~&PXHQ!`*I|Um z#T(|~Z|()mB@#)t1zN~5u8D8>Xd*IGBZgrJ(U__Rvn_xS10055kj6$+Ssbp5sV%DS zf8vTKr?Qt8QWW_`fk=^pxuSp)U5B=~sT2*>JItTtexr%$$0&-os7g>wC#pD{vTL>e zh+U6swvFz#WlqruIbW_k0HyK-bR{J@+%AXnaa;yW4_<<-Kilmanx?W_W(Sb@WfpCJl_pcj z&JV|(9T!Frl{oEv6tI~37x7-TM=aIoiUK$4Hfi*N>Us|l<1Xto58cO`I@OP)x<@$$ zc!$m6b}22sqb+XH={EfdGejhfdPh$VQWoOWp#?aT>b-n9ikRIUl3j_lXW_pYRBg0) zkg-|nq>#^h!;;Tn79KZw&(M1i{TuQ+Q9wMHg*yf9K0u(kq@Sfh0`}8DPZx$oE^1&w9i;#F-@UjmH83%O%4PU^AGj;xe#8QTX$Ap2$q%Y|9dsQk^upDi83A};@!#tzatezA=&t2{L{#`na4!?_G zuyYQ@ABDLN$iYKwvRVzNdZRlAqV|eytJ~H@VGNU&&SRWr_&t;-H0-U0W37RNNb>fb z@H2it5EjnpI!px9V{S}xiTB%vXD?5<`mgoLtgC{Q!7DlO8a3JzbtP6O^F#Nuq6xEX zGkg@?48-<}KPZNVMi!DwCde&;XK!aW_%gJLe@~eE!GYIc3S2q;iS6vfl-v>VrNyYf zCvbWG?_C5bgmWia=>7O8dbl>k<&VPKQWO6REV>j2rm35D(ciVq%>e=U40^Rv(fTv} zBS1{cHmZP7h#(*x8J9hB`q-7Sq_`O70%$e+xP83*BBDlrvNAI%ZZa~+s?8@bf7OZd za>mFcdIElu3B?$te!Y?4%MK(Uj~h#+!E1D|ON63w2Lv!_)hgB3==X%IYz0@hpUQYO zpN^6=-T`T8#dp&kLXG%Rq2XW`VMSe<6QE^J>^5sv0#naExPFhTj@ER?%4vEB=reDA zbs!OMV$u*UY=9p?F4Jl$F$=oSdz0qL>s7b0usNc>*8xUyxbMHgpBe>>?>XZJ=0zWv zB480Rdj(!?G;ydK;b}tfi#p9ZXFd%8Si`*pDG->o)U zE?4WbfBisv)VCs~5c(Yy=z2{z&@i6HFp%&dfV)J)dJC$L&W7Q z%$XcuPvl@LAK8FD-*y}8m9?6=B%r5Pvs`FsvI}oYAT1)*9<7Baw8IRomBqZG5sF*E zI?S}pE7fkWkoJRO^954Nzl%wU2$C3)u-j=RP{tBTdeqj80J$MDDU^yy-KJ$#m{Zvk zhEup4p`1zq>vzIIU^^i=Sxbty};Em8QlJVrx7Q1IPlGhOaP^qS%P=&yDIcLNNvTq-y zrKPnmi#D{{q!Q6Tfkm)}H-|oUqaRc-2cF7~KoBWCaUGLn21S)xxmMg>^W269avFm> zSDm2bl#bg;5Hu0Rwpq?5iJiHnmnQKH?-d`W9b?hU-C<-6^i{n0=ld0#>t@?~x#Y~| z{c%ykg74C72In(}0@=T59V93laTaLKhyesJ^Cu%I#x5L~g>U-r%t8&uDOyKahM5jC zN|%9j1Nwh>y2_|HlxB%*aCZX1gS)$HfFQx$T^DzPLxAA!!9BRUySwY+E^ogi_x;^- z_Uz6~Pft%(P4x^yKbn`^B*2mrPT$?sLr;8~wt z)8(=q823`K+$MfvKg(sI-vJ+8(6OT`D>v}5@bR`G*_-dB_?3*Kh%b;drUv!X|@b~CJ%B# zHariWeQj;|s$!cZEt%fL=`AI#kmKQEsa$<%xc%<$OkVY==C07N58>2WP=xTzYPL*N z&*zan!$Crlq2%*r`*Rt)aLKw|4aoiOH2IZXBZ~Ld~-*|PQjoac( zklIx;Y`Xv39pK`dHzK5yzlo_Clqx?M!6#5U+#%o`meBx|h9M|A8}qzF6`X_E@!>{( zYPPUz@+trT*mWQJLB6mHu6J(5c8@aOVf>N6x+5a4Ib3s&*V}Mh&X(mXAYsx)?*%VN z5{{cbkKy9pan6hqpGWeavf(go&hK{!O&5^7o|j zpp_4wl4{uhzz(39s1xfP!@oKfV|v=8d+nCrCD&MQJ-$)o#MqRG!v8|0yR^|0e`+~r zH6uylE9210iv5DaY{ALSpw}KC@N@`ixz_LayWc;ELiT5@jd^vC>RIX@Ah$ikw&e`_ z>AVGv&Fi7)rVpp*=z1b_#uJE~2QrV92ADbmH^|%~zt)!BHN~Hrf#Ba_+clog7tZ^x zKy1ky&UHcwUbk~hB*-VySABuVYv~YV?_jszmNXP~HY@+b)D@4)UYWK4!J7p`gE6nZ+zn-Qunp{X8O&6Ghk(|4a z&~wg6%tL%E+o+0z{^?HB11J9D9}v772G%eB0xCI0A9hUoSbsEX1YU_MRCR@-_g%NuFh;3F8TwnZF*yIz14fM~rg>HH zOC%oaVWuar=+~Sjnp_g9y+SB_a+TyYKpoEIWER^W>_87xd1#DJf<-^Dio^^hJ*Z;?U6R=i26P7I zY`WgJChMGB!o!!-nv`0HZhN#Y<{Rt$UXxpnmsm?}o-qThmOcGZtr@@%UC6hcU)Ix8 z0?htGpSvXBk%DRrpQj%l{gNR}`e4cHVEzH=WYK;p8Z8Dwe3T=^729N7Z+yMxM`|1M4Ol55KRx7box3Y^R9=I7(Xm6;x zlGfy9!lHhDL%eL{$yJ_IXFo8vCCy*iy}7c+3eMXP1fG)X*|_2eVd2Kp8e=m$coFh4 zxlCXvC{B~u2yws947a#7LZPaJv=~sn1t5+e#BXI4E`+oX7v*ynsd6J05Smoo6<9CT zcu5Q+vE9t6Yfzua*tOll$ea1+c|SLJiFie)e{Z*5GUO0E=@l7fxFhEdWG63}gY89X z5TFC8Ae5jWoRAnR?cqu1kKtyU7m!XxzXDc7f&!3wg;(<7|HHAcAd)o*Tn#G#E~Irs z?z#m~GNGGbk~a%_Br^8x#GL1xnZ}$LwfTDP=rNOZ7Kj2;7gca1$=^3z7BU3H#l^%t z8ZO!6UA4#BP#j`mdkAEc7>=xv_i{N+up>(Jlk5xvGnz7e-!zv%{!bj>Acu(RQ&o1$ zSw>}%o&GWE0y%i@@)uA<4Joc9}Uj9KXd!NK3XKRYKB z(#~np7?L!@@fFHv34^R7f7-aaov(_6oFS9Q^yfo#Ix19{~?$So?FejVg_g(hDY zm+W&bF6V2QJB(rgjaqps`_YMAd%oi1F7WUWce#DcGnG?83OHLr4n(-+ZR6U7#?}az zC9Z?@Ua2)>EZ1yPPEE?R&4B!|(I8?JP~|kB=6WbVy|=wYpG(A_8e}db%T3+#1rOmS zM`myMW@vx}eVn*NshS0Jv-)CwS?#dHbGKzKCm2I0ZP)%7B8lkFcJoo-4GgGTPaKoE zR%dT_QKH+%W5umosBz~6s>-m=HfqOuCah{x=8NM5r#*pf6Dt=L2RgqEm4|z@*lNCfOM08eSQbt&QTv0w-9-fK7NO=UgmoD-W~n4Pci6Nu+&2RqC*uPC zK=qX^d+$xsXEG-F77qC{mY4}>8>Z!8kbZtBTA{kSWiS6awchfI>>D1fN@1O9h%25? zh*x$}!Cx2s5K&Qn3=e%5lC_Q_} zP1i6|LAsK;l25U7A$`vDfq0U7bBW?#LWqzNN?YMj;)PU3TK=Bvl&EsJj__aB?)DQh z|Ak?nFiDLFNx2OB@6&9!-`Eu(IJTw>`Dd|kh9#y-YqCysO>DN`Kgy_H2Cfc~@@A^WV40{Qct57Vp8w!H0h8@KrSBGh#I=hOu)rh(mlj%l}h?ibMND zRM3A+i_Ze9&=-*gFQum4@Vis_Gojrvet~FyZkrPnej0I;ehIXAvS*@*?=3m} zAQId^H^5KSxwAZwIVfDH(>mHPV>*nLXZ9*l;cxAhjrtMQ5A7jE-yg?7tLODHv=;@c zJ5)AL_dDuT#ebXyCU^uV7gvO2@};f$b{MTWMXKU|m7jzko`0ZWH=+tERqx zQ8AZ1)&1zWa+A4EZGQ5P5rFddl7Ur#*>1hhwje9e_L-ccLt*py%hbh5bcT{#Jj#Q2 z>9;#jfBd3QRX>fS4lh+6_iq`CkRTotc=%pL1Q;3NG{O}>5x1tIDl-55Iw%ZpQ2l&E zsUC>L4&@{FF%Ww+3I3DBWXF=}@4`Ec)u)kOUBSgZ2|$k%BFJy16LKNI;Rt4 zyDuDb5@tUz_t8cYEeQOfLY16B0PS@b6P&H<$yfw0Fka_}VvzV223DC!l=}aYG)P0l z0_VpFVkFAGR;!{DOB~#vOC{3%#9(s9DI>d9FqZ@kJ$sT|Nhu@9PGEzIfGtZZD^w)r zm#fm>$s=`!dTHD;p^Ce>us?QD<5i@g^>fdjB={2<2q+K|5}oXyz6LYq09DK>HG^UK z&cgm)Nrc|e;4rRrl3+f)_n9OA3#1uLaB}BltBN(SIM6rZdD$1b*}nW+V<|E}Bdb?0 zAwQ_`*TF4%_xq`-T}*$<-~9G*VhX(F|C@?Vi%35$YroA+k|cFl$o-438^B;Gm;8St zorQb2f)Yf68!fM?sj+yt_np4W@IaQz@xiHc0xgmf6dIGO`l`z_2Pdl*5CZdi8=%b% z8P1!G-Xn_|wq*T3bqEENSChXi*rg1Wz1V*eG^OuoOrq^g`%81N@ca~ef}vEU>;DCw zGSo}@q`aVsxSRwsYd2&v)MV! z5rcc^2vkH0e8W~0T+s>4T_OG)tyYl0KoJgBab4D*D8_VzioDUU0Jw4*ck{_AL;PE| z+z3Be$bh*r!f^ffnE5dR1X@%nM<=Dv&65@re}>C7hQ=fVTvf#r&>78`B+nFrt^D@~ zgwWvpz_^04V8j*?i;^=GRUhE|(k1=|FD`1;9u({P!8!%%3f?IwdRdDo<}i(|^vq~H zD*uK4Z`3OHs6N>jXjG2I;qmc8i`t~g^;g*ZgB<3fZs;F(|7iCZKMJ~_;ysw^jIQ=; zfhDPu{k+KzmSy2T1BgZfPY)vApZBY3!g>z`yBe4c#&p}Pn$3Y2tQIbB`nUQ2?3O=Q z#ZHkg|?oJ4R8Mt$N$UoyU}0| zp;;KsLq9U(jxHgY9sX1Cajl{GZ6(kH7IpmhdF`^0HoV#u9|u11u|(3&+x>WtO#O3h z1KrCKL`ivB!;w@TdI0mda`PF>DVsAt3cVPV2 z=-aRa)F4z!c$<5Av!(xn%bu1jHU+O441xh9)97U5N@c8mMppLl2w9WleN#QHZuoa$ z&ISPuA4wKs1OAugq@W*AgG;QTdGhm7?ih`?xmUk6xsh1 zLWziWQuz60>?+~ffp`%WSplTBx`ZDj^)lvjw10{H@J?yT&NA*4t4yRT^zHHI1TzVW zf4sC36cqRcauN#M7Y#EIFHMF_b0Qyl#dJrM8AX=G{~7Zx<{5VB_B0tT2)Lj4;US%6S< zpkUCni6Ho=$a0Tr_U)%JUh0pR#R)lD6d@1=(|=;lo`-Z(Lye{JBOr&sur$W~DvF!v zslw)u8V)2sMS~Oa8B_$_#7^J4BB|-<(%N4v(9a^*s7y-0evn8d{;kqf@W3mvdusLf zz9XzV>XGq1_CrmSfMBq{qayG(n)kzXHw>3N*$RaD@UMI~M}@1C!4gWiU>-q;)iuAE zjQ+O=URK~9xO38AisySsbN*JgAe#8I=pX`C1u6rnO3+qMGrLi{H4oX{R|R2lve>wi zS{jfSBj`B=vh5dK!2|nL7ZZDr!U>BGoAqk>1wo_8Mh6k*1!&XU>exQ^6v+kY}lwFVK$=3trM43Hky0wr-CQ$O@1T6~J8R}+O z#}vpNfyt;&(zA=mku@-V)LJH*SB3`m2Mu`&N~-)s?r5Z3yQwnAJBXWA;y^@Rvd~O$ zB@GV$8lLlWA*0J-DH@4!yzC9B6L4GFY19AG+>X@nIN6aC7hy4eQ-j|;rlPhxWM6XYiYEZFLA(o zs9D4y4N@db3Qd%U*FW(z^Tz#fh>|tVArDhVDNvHo<}o={EIJj#W>c=Ad8R(#?)JUZ zEZZ5x%n9j37|wS77qj=#gdQ_Cm~(BP8Plut*NGljzSR%Qa)KBTgf?278bJ} znk&y?_yu5>{8w9{g6=4tyc&TDnq`V82UrYP0th_|W#0cgl4sCBi!)-i9G`2__PS-hGcE= z7k}uK3pnC~JTd!D+ty+#Z#N$CBzjZfeiwffv4q`$ZJP)3#8OEDF8_CZM`(gFLUTSx zjkF(q0dh}d!(7HD3;&<>WBfjc@8zYvLBO%%!;$PzO%x#8;H#7$f9?G&3mxZ`{VV@Z z@bBV)kM7WW2bgV1_UmMxkmr*~74)vbC;WbAqOj(Zf|o^^+`@AJN#%mc(yH`e5U~xW zSIalK!kzMUu_hIYIuJH%=O( z>_r(23XLuHowRK;8X6y=bg1x~Huc$0uK$#YN>J%=px9*kAn-jFI=17WJom}vR|(j* znC#!I&NU9VD-_rXo(lWI`jMO_1KEyC2tG}7a?!^xx=e7e8|K-5lxJ8?X$fQhhRNMS4SzfT7T9M#8R4}@_$6~z*t&(fC7qpD3AtiEa8DlvqBC&JTjJE36tVq z>f4F*gCpkK4Y$A=-hcEs-ZJJHg&4@hTd{b5Sxdl9lUoX1(hGd=rmcBYZGsCwComej z);t^>+Lp%TO-l0{lI{wKBRpLV!GfY66(>nJpOxNhN~5+QBaHWzJB(iFU85l+1nQ>2 z*EDLsyOK<_yPv?Hjn_?Ri;lQl6@O4eYXGC|NCg81+gAo zRzy}HM0+VnOQ8%p21^t&mdP@R`BUXOUIn6abIFdwQx@4oSg~(e?9p&53EO)XJ#?YoQ0KQO3n#)y_)(oF%$Y zOk2YC3Wn1d)6_nXy337TI7Hf2G3Z4kxuf|X!mWwrr^c2Z3DiWkSI6+SR>o4JRp`?_ z=n*1gQ|!rHZYn!w_L6kSf`A{M{Xk7Fk!jT;gHcz4sO{ka1KV`Of^Uq?JJF%VE-h+x zR`&oc~L2r2w1)i&r!6OsMwAFDH zF1zOFR+d=<0c@Z#-+rp2s8iT#2|?wudxOBY zckuPt88f(9%tMjc$73~{x?Rwr2SMuZtRMm=@ygck%^2nyd7!UP1=QyArHt6m1=YMqqS zfN`2`hm>_h^e3Z@1ll*vGQ#&+K3Fzs8tB?A`W zif38}2W>r>JxE!huzdXqDOs&yy>SFY_ z%R4OsNyJ7noE%SH-q3*79o${(O}LBAUuBp3 zQY>r!%t3T!x3O;+kw3_1c6LK0pQ*62&yBSHaxJolq;mBOGuuT;@I)6Dg zQwedYZzr(h=ALbKv3jz(X-pUrF?@DibX-2MGT0k>ozeQ4G`b1sR-7k zh@Sc$7>ZG19JXy8QV=j$4W_+#byeyhqbM<|uY(CISDPpM<@8zlJ>zm0>?-iV<$@I9 zRmf7CrEh#mqUCK_3|8Wtd>eYMICaWep|2d8nSn}s<>TCM0f^V|@;i4pCttCVkDM7b zU6GLHn-B25QxuR-Gi~?$a*W6TwV;^%{Jc8DKH6WJjZw)42DgvnU4gx911X$>M0Fj? zw7O-uR>C6p15CF~zK!c<>)0tPq54dm08p50S>%TGY#T6R|3b}O8i4L9%N`MBAX(=L z#Avd(pzLHUkc_E)VM*cOzUBhPfj?e)3fmV+=bwCuT5vzbx$>OcNUYaB=Wxi(FNNJK-77(W-sbhN(wcqEw4^e=7=y|j@m&30Z zztO+{Q>O-ej3ue?)5`!U|5sW-8oo&!!RR9JgG_08g1LI%N9oBlc{XSMXeb4Yi< z)R1SIEU$dps9T^%Bsu*t7gh%eCwA~2-W#6dIm|lJ+qZZ_4D*A8F-%?yM2c}fIn_+) z7*{?t7F4x_U0EuIB=sgmylJXka%y zdsOGRM;jg$B_5?(Z|TyUEWat{L=M?F7tL(cKb7SxZ#a`DTf6}<^IS)siB4gC&mr-_ zm(JjE%_gvGogZ*UZf9}YA1^9Vc`tl;;Ob{elu2X|)oF45Su+gsbsgppUgm^Ri7Z%@ z+Kg&kF90>wn1;MxlTV~mN5?4M@Oc+a?=a9c?bjvlEQl$_d5ww?6q*ox#so9Xck9^HdN*UnD{P0HJ|rP{QWOd4Eg-V-?< z;Oe`5hx>@FR|>}~Nbq=+VE|OAHI?rRJDD}S@Oeb1D6KyuT3X8MML0!2(U9_} z(CugW{Qx|;kMOSBfT z<59B}5QnwgknfU*_#>{YLv-H0&(j9$(Rd3<0g_dt{TwXcoTwE3+oL)QyhJ{R)x(cg z-czdRHDN`*yI43<5WiUzBj}NoT7M{2Ae*Q^aNEKCO7KSRTG1|1(IsFxUnXtzo-CKf z`FU&T5-{7Mjsi<#iJaH;dA0SipUz7!A~->k|ERjf@F=ZPVDGYlP{-l10HpNYxVuzP zsqDDJMk2Ti37ubU>qo*aiE)jAL2cckLuXE#ZN2Ex#~>c)^}FX&8wS}ssAz94b#(Z5ofkgN2U4l z$;t-&QyOXdRtp^AuP-AUE*7`pk2iy&_wew`P{JmQEhN)^}Qb-shnLm)``KPUcg#% zy{|eZj=Eq&Sjz3Zd)65g)ph5xMtl?9UVc&7h!VsQa+3i^f?pYNa!%&8Y!f{ANGMLO z-PoerAD?_@vwiqu^!KC}2*fvWQSCEAcK3LuTDJ{P6=HH;Ff!T0)N3gf(}w7vwTz*` z0weJBnZ`fsHHEyTb4AUUZ+tp}1+W|R-giuHupTIzQUc2-1iO*a8YUAgYJ<2lE?~0! z5GM7!oILN&i#jOf59kRRm+Lhk%k!NCcTfoP?S2DUO~;Uy5m?#GjE$#PA0sTfati{` zSme?!QIOt`VR^i`x&mD$1K#$a%3kzQB}fL|xHDkx-eY1e{P(T5zjjHhm`*NU#{bqE zp$=2eyLe5z?^`lPWEDvAC*moZNGAs(CTmyeGr{y^Tr9A;e&FAh3~z1#MkczQ-8=YB z_YV2821ei4b?L`Mmd=+IZS=nl)v+E)8U6_E$87$&aWM2UUReFg2{G(*pI2#qV~4>v z;h0Afd_ z`hA7Z?vLGEzRQ?QU~p-7&|7*fW8sM%t{8}PW=RuEjNiB_72Vi`zZ_x7;oFHso-PLE zz}kHS2rG>9pIEm>HYMCWbQ@)|LqJtfa z=+)4BNbTkY%-0ItRDqWZUuBf`g^htXVSdfnr@OSRo4JJzk87@T!tcWnYJvT?#maq- znZZ=%oVM*pJgGc3JY&hs5$~o~&+LJwW2y4K)eZZ@rQvn@EP%c?ove*P&IL*F zN5;*}T+hhZK)uH^+X-eqOK-;LX?Wglf=uHuyiGjz<~ZRXIM(yN!Bi8+vGe%Q_Hz2K!6jmlNZ z{XFRLg?M&0oJL*<6{k=5{ANOW>Ud;=e44_P9|^e6u99N=#Z!^2z37^7<3GRqYuLp((m*~rc zu$%G~x2a9__H0j>8~r&qt!^1^H4C}tFUXk&5eNhQK*{KWngUs+1J-5Pm*ndB!yY%v zsgw-f!OZJvUE9bbj36+k!Bx3LKJVT8$h1!`Ezf~wj5_BVfkRdr$2EJU7Ck?8ZuVu{ zDB!&VX?peI3#ZIBUIO+nNr(3lX^v*wWC@y`CT~@nl*LO>>du*r?)W^;))| z7PQAp=S9U?{pJi#KR~mVExnIYB(s0izw$i7;+)bnbIlF~+~Rj633UJ`n@wNmjf~tz zKCQH^VD*E^ZG%oe1Y2my-#E7(Ji_~>}q9>lrcT4^!-0qI4!WG-)ZGuI^ zo{G-zE*V4sb@U^D0oi-{*Th&S)@+t#sxx`F7yAlgPwFPXAA&UTORB%Z%?Ov;y{XD| zYZbzeXNq9OtL-43;Cu`&8Y{4onHE^O`$iZAM0L)j*$_IL2taOgCT5S2WbP?{##I<=qjJJq$8bHn3g zXLvD0eMo*BOWgNey#7FN-*YCLr;R$}CClMaKuqY3^5>Fu+(?D_-cc zz@x>|%C?b0ttbsACvN_(mMpxi9~?H{BCenK?*$|T-?{u@bXnpmny*-fY%bQZT4FN2 z-zYrJI~1=>Kg`#mE_cbD4`c+oP0b$F9%A=n?VIfDRF^J9kSXc^57O&XU=luAXd(Yv zp`?J&FY7xDW2<#LyvNt@mJDTdp;>DS+4i`8pju$4>9LgpTf$IzPFiO@71Ztt>^SZH z8Z}(S&jfMjU)g1nOwxeY8jF26U`pw#pluAj?jJAB`j|06y}*~oBbUy*{`djkP3RHV zuWGy9rw7|ow*!V=uRinc+Gi^{hzu8_o})ZcvF2qhketuVuMQiM?T0aY1Q zY2ejuO)d%PaKJU^mfykA$d^k#T@Enr92i%t=zl1ut?OK9Et=JRSDokk9`WRSvRR9@ zyInwcIEK<*=mRQtWMR`MII1ZurndKP&Z#!OG_jbt_Z@kVXc?-k+s;#a-(Le&>y z&!xjMWBq)`X%ymp4BI*Yh&*bqY(5#2M4^YkS&}~D@u`G+u(g-cnt0=!>KyT?0ZgA5 zia=&nHEsa1GCl8TG`r4S)zowJT5S1syw_};O_T1dGkf+^v4%bSg+C4+gw93&sNWqKNBv0+(*!DMc5m z^oCElBa+wY%%x0KexD@v7qcPd)^Vvt2{LuH!KGW9&y==)|_h!tuxKMvhPAhpm8qA_`SjwSn|RVgDUKrh0YbxEEWsYLDq8EwKrt^23K&EywxyRT7VGQO11JBPd}Cfk{d?5OyTR!+)t25 zcBRRw@l;B=$Q6l1JHrIHL_o!nve*R$fdRu})?BgyNCZY4ZI(6I&bV4G{Gut>u8rHL z*PxA8q6+K`|2l##&u?j)PsEo%I{M2pQHHGdG<;3A-byV`iWsgM!5BujE>Eo-zs!(< zkxtKClq~HNk$_i_WW+M@G;sla$;-k+3!$42q&_#P4YI=TT71pc6{hML^(`K z6R=w31uJjPc4q}bdz6=X>s5uA%mpnr%|ah@=3y42=Eo4a$62ir>&;xm@hz<1T&XYj z+RfIRk1s@O@!Ms*l11YSCyF>j_(n}3u=q;jsZm-A)7PHm@E@PWj@@kS zq&aQGnnPa5Ngo_I%=t<6Pg9!`IifVAVF%9gin05s!{y7FrqIhJ-y#I1xy$Z(cZaW~ zi5;5;;!utHy<9hm>>uf8JJeyH4g(uaZi$U9Jb}Jqih{SvTvYdUpbis5YoK?Qp`WF? zionPFaZg6`%Qod@G3bx5aBk~4pd2uRY<%udtv;6yQhJQc+awGckp(Q>VcjRQZLf(Q zx~k#mve7E8aM&f8O@uz`j?O6vk&OOE$>M@COPAkwV!q)Lx)>gTo!pq|zuq2@5iod# zNWm1Pt8(n49hxascf(`!PZ~N=m6b$CF9t+lt9Iz}bDQ;? zUhVQqH1X_c*;gn^)W+F=iesmHhVLdKyfv#SQC%9I?-gkALxkFI1MBGPC0rrwco|M3 z^WuB!W!-iMTBmnG5rnv)oQ5*S;*chs`V9}{5ulkF6&42rC-X~;q<=)P^(m40t za@_~F(WA^^v(p&DQ>|&>l9rUxCw8ryHSwl&u@V*$vD4xH=nd*m)zuN_QU6N`Bv-X_ zo>wn16yG8jd*(kA(*h|${82Y4nuVr>cR=nrO3OQ$#w>#2*%axgP*#yY!w6Gr1kb_R z?#AB_l|<0_Uk@{8hm#u?&w?d4vHWB8uQ7^;UDlnMu7o7&3*rE74Bnj?-&eXqr4C}m|i!Ui`z6Gl)2$kzMp z;p%$^_H(aHNW>-cBTc z#K7(2dIC5fUUgjiMf9)H69j-u7x_!X>Zp#-8i$M&x8hboZ6;p0r{&&;*#6yMv%MrZjbUs~X_(u@MhwL65x@`q3Xq49{dv{l$KL zYa(Nfg1mVv+L%g&oG>7;v-0n(1NRmIfJ*M1ckgSuaL>al|UR^{zw`iDMt%-ZH$t!zPEbO!W5H*5*&_M4UMP}*$Wx2 z;hCLoG6eJJLEb2oV&yfj`ZD!z5}+$X$Y2a&y&e#cH3qD<$9Ymb%#vn(@*uOuS=#A+T*?p zN;CTz#p*HRs+B%E$1^RQY26tgTf5?Oz*5;agZgTgY7eF(Q&=sY8_ukkdn4?f3Z1Iw zM^*}T)HP9W=HuUaz05SkdKO=gih3+=iXEKqns8>?yyg+gs5?WWxNB&8nF_Cz~ctvX%ul%9H{>}Trp|Bh%jo^$EjzQ)<}n%4A{c-XbLpq+O}@CYf&y~f7k1*7c*lV9xVvujXY&YzfPRc1WXXlbF^MO4cx#V z*ew6f*#wIk-l)Z?rdc$#TxrHj^ZII{HTCsoY{FMY%dYuNCS|f);U>!9Jug^xVX70+ zv)aa5e!13+L_VEEeYUo;{i3+c`T&LjCaZ*XKVovaOj`7Ku^p>zydBKm*mk3#;6vmh z06x(9#lMHRo-Y}Mr8xd%(Cg`*_;x&3PVS=rq(HPXyt@`g(1D)Ywm5)scWOO?3FbOS zH*Z_0*zw?hyih8hr2RlLPkfdSukvO<5`l?-H7d%-q~$u|bU>e5r1uu<;bJ4Y*6f;a zKAPO-m+8I7@9~^SRh-g>0VkKT{$vm3vaKVW;5!69{ zm?5e{G91FyO*EAU3$S?id;6Ik#*FnN z5hw52#3hEnXG=iaLs`1{FWo3uC*wWT`H^Hk0fA z&tCO~-@I~}1DLof-XZ2U`FL+II98U0(;Cln(_m{PLK|&gUP?(y_|hzN#=7%zIK30# z-ikZ5!qkkjsH}%4%TMqqzg0d8btY?llvO@OTYg%>Uw#_n8RqF;vEkro`38_@x%zTL zBZ9v%|K^-*``O6leK_6ZxO#z_&slHyyl4 zev2-*wIlJ$`V7`~f1Z|^=tVy0*{q&TfLOeJDyb3Tjp&4^!PIGovk>_~H}ZSw2k4e4 zDXXO#?x>ebD|}vCh;p;|#)1*`DYGnZW0SC7l3Cs_gmy)q8Id_^`H4&X6_0aU-@){r zk4w>&Cc82Y38-*;}IC~+}ZhWCU1iWXmr-B${n`K_p`_DDr=u$^t&4mwT) ztCv7xdr~PG1tS|t-{YAXN6a@x;JIN#opaweo~#wEVD);3Zw#Z>9`}bL<6({f2G3r_ z9Wm4ZOT5<)9MpD32c3y04O7_!m9cl7_mH7d3`Rw~AY&EH?I}IN&v@gd+HmguIbSWx zz}-*%SBlNt%EOR02t8}qd6T8E9Xu8RaI$BpHuIp)jQ z3ZU*30nd4rM*;871+YM(-OIM4Zr*yn$Cosytk97AISiYzW)}iYxH732L3gS&an%Ht zm8v1a^pTHjSHe|y@<2`VI)ycHqBhTTal3)u?=+-xzsC3Jag!=Fz4Yw6X3qP1!hc^Ze^ACGa*3r61Fg#fuK4^RaCyT1`v&y~%>!89w zv60f@@Wm6ftr)QDxfxRhv4Kz=dSu&OjJ-*fq=K4t@HQd75-oQ>W0~F7MUFj8)l*sa z>?{--ZOw)l!h*K6b}`~|A|F1oy}inWVORYN+A z-~q^Iq=WI)N-iMV$=z_Ub=oAbZI@I!721$9jPfwcih}fAu`)HoukQP+eYyDM-%1Fd z{Z0$>_#6V%dIj~1sDMJD&aBCAp*9yeGQn+hPss8@6Ra!4v}|4!OqYSNepook0x4dT zt_k{GP^PRJnxPUDQR;1JRq*Ooy5J(62++w$Y?w2P>9B#!5a}OCwxyd`^>dN3V1qQ~ zLvUBrsF2RbzywX61hv)W?`$k6KhdXg=GbOv&2&>lX^pD?=LJw&@(vB#x3#p}2XUBr)L=(+7V+WC+X#tgI41?j))q1W0xo%K=vgSf$)s(ZVXiWB>efP z@LD~MTMp{=Cwj7DF?JzdcOOWExy1Yc+b19q8R+L06z1IpHY`2~3a<-%%T|U6MKwN2~o|+h{@) z&UD-TwA?X4A0^hjD3WM@z(T4@!@x?qnn0CXceiH=ORK^5_LL>48o?KLgy|?s5DdJx zCE^DS?cyA94WAMJ1A2dAYrtdq&T1It7|-M(^Nu)|MvXI`S@~dUemekbD<0XYV0IRh z+nd

Dp9&4~3WYqYz@f$E{@vB%-cKITmFD#3J2MCm1fiZ^)e0ycC}RlvcZ~;roF6 zNn?$Zmv8e~gH})xna&Fjz~5$L-J8w#ob7lfX#={aRS4Bkh(PIGm*K!DPT^RBlIl|NA^VR+SUi7jC(Wb zL3h+`r?7{2HQjAW#E%gUJE{tjQtmh%uvr`p7TNa_4jePg{d5>gcEL#ImzA4RvNT6F zY{FGW$~jH@5^G)q z0M+KF=v8}K1!GuMH8j5O1}6)VawCFWOS-E@7vjFzkD5L0bo8kl zvGE$rfB^-34T}^e7lF!LyL&XDPnCI0a;-8oF^~-_fz_%?A%yyy5~^|zx+M*67_8nw zD9~zEQQzF@twJo-E5%5>IYcZu?C|WR`nNySWhd>(D1S4%+;{(@bZFcc*-B zZRo}b#Z^<@EA-Xz03NMeTZ~D?RusVf!Yde)$R5DFZw)|-ax z$-1V<5v(#zGw(Z@`^URkuC^C zTNtNtcZVRsEx5Z&@Ss5x+=9C{4#C|a1ef4W<4%HmH2Y zh-rwFpwl&$d9@G>%#3xf!Z6#BQT<<&pGEF&YcTp7+@?sJqdWq5~R6iHtdP{o~7 z4<(yuXyN3ohWk@YoKk{ux|M^Dh?&>oH@!nP&M)Y5ryaUti^{7yBaD0>Jmc1l^3I5Y z%*wt`*X{3vCsgoT;o=y^e zkso3vY3I-IiVO*pk!f9DXkWN*9f;Dnbklz5biima>j$OOwh$-{vjgEtzntvi-Iu3G z_&x#Ydq!i!FyOR%GkEQWdex+f#x6RbVbeD_EiGk}Zdc~^a$Dmt;8`t+GgD}CEat8r1vKlAcj&(s<82U%9UkfGx5kFfAZ63b^L-vJxKs+jT6k0 z+6+hSkbl0o^Tulb9b)BjEZiqv)AuL$wlvazVvFR~KI}CJb_mJwN=6MdkvfI|Sf1qb zILn9mh*~|bO4_kIBUGO{GyEPSnj$-b2y*#MW*-w|7twPG$o=kLQPy4?{Dz(>y9_za z7$zpWd;I696OZQm;_hFX%=7!4k#}MDtJ)$(JlOw;Y>S zWGOmF!w<4$+uSQIlvJj9lA@999zL!iF^+`&_7e0qi%aLS(#V`+DYI>{(tJ?vH&dkt5y`(vd?Q$L@e~o((5oiZS*?t z^;Vql0_wRCV~_q)Fu_D7Z?1jEjg$3!KF3q#B~0Ngs_M67Ms4tu^YuKaj5^@M598c! zdPa`3?P{F?Cd^FRdl6#pAF9>0o~MbbLK4P4HdX~z6nh<4)Eb4!8lsT#RcXkQ)(xgH8t9ofrqoX@fT?F$snvF)zBIcG z=xBJ#onNlU_D6AOYPFMP_B}snD!}Sd`Dlqv`~!_p3fzLakUF=Otv+_h^`)no`0BIM zj@}b=_=SUix>(Z%t9q)j7uA`cmbg+eB~*`bpA{vFW&#;~Fi_Zs`BQt4cEzGZwdfnv zSB4s!|eXg838j~9(j@o$fWb3POrdEQu^1`lav9uJs@}R9Ara0li|VLBvgZad#B*kYgI?fk z^zk8cH>J1hWe!u*xu_5C0tqP(dly*`j;j+!_5#x=d0L_oC*(b!UM3fDZ7E(--DR&x zp9kafSi}&}uiHx*Sw1ypylyK)oeM$@?09fubVc&6zkSTo4)1tOs%Q*-^d-R&_)?1b zI=S`@N=D1}gslTn;%r7-3>r%v3%WK6z6OQo_@qhL_wjnMZSvA*&gu;9NJEpEL6;$t zlCgt^1ru;EO!xM%dwRUKdQ6uYAMb|1bGLSIHQvGHvYX^I!|&U(D(cKX^P99-OU1m= z*Jj?XyHK?w=!lhnc7H}K+scKrHtn{A3Dy5nrai=(pbyk~L9FfFE; z+*CW&i#$eVg%Ou?v#Ud`_8~A;Rh(jv3_abl$}^;N(z|~= z9G+HhScr|n74*7z5ZuANh-f~b@aOF+j3r_-NFUc_R|ViW-L1dHGXvu|?#7zj&x|}a zs*bkL+pa((+vxliXUaGOqN&DCF}AO+z2D{yLxY~x4fILoEA@4-Tm*2s44eZECd0{4F%H zt)O{)9K!4Hk#iwHf)FY(XLaxDFzj*ReNSr zb19tnR#bAI&)s+Nfd{keHPtoQESau7z0&s&^P(|d2vn6yO^K9OoyFx@L%$gi?hdu! z#m+R2&ysxd+vS0FJ1?s6vsNhBoYPgOJFND(T2 zNYl*@uMWLl{DS@t-O_z|4i<<#%Gni5AaG5A$zd~b#mB231(Ex%L( zuqWX>PsZ=0={}&9Mtn8>l-SGAeesWt_@*gpk+DE5PQPiGL3kp+i>b&l81wkd1s zRRqa9`o}&;l1|AreFAFaL`k3{d=<=0MRI-l%Gwqu8_O?-&X^S#9FBqGlwiM0W+plr zF9|FEdVTWycah05D)jra3nqtlo6bI*SmBwFi@g51aSfkvW=r7l{fO34mh0LjG78G} zSUj0&^5~nNSMbkopMBk$3gsk8(lI@)IS6e6q?imKi0?v~y z(9XAd&La&BW?eLbC);_BX5a>{3GD1BNe;i23y+T=e+7jQ*kb|Z%mFFZX2+~e!jH!( zv1W)}aYhoh9d8qgy8%Ku5ebQjW}Q?xW#2{Js8$;7^o4F0V(M_-;A8n8xIcx=z~_v*OJ>y}2kFe-PBL^tqhs z_$PxAdYc{RWB$3kX><`z7)P8LRwhGJSYd4@FJFE+U3yv(a%i_bV3XiPP19f`akgbR z2{Kwo8<@d}Ajj$nJ!ES)RnUk(&(2q)Aa2`Dhp*UAbY(b#8KOz~VPwgj_}09h3=;rD z>|LKg=F-yZlY6AnNI8$N_mO;#RbZj34OsU~ zSgcajx4G!tcK}u46D68m_mN?G3^MmeuBN?>9p1IR>F_wt z;EN_M%g=|YTrn%6NBGCb8?_Qj3YPMpB3Y&r?x{aZ!1SYPuC^6q9|t%lD2CcMrdC)q zePcpruPCKJOH6*~V}H#;>{c>lQjPrC=#=?T=Og=BO+Oow($iNLo&x&URWP^UHM*X$?jivT zU+Kwgq)Hdq9DL7dCq#A#U9^!B7aA|dk}ygpKsXpH411n@ILai`>LV)&;rya+kq&{C}JVy&vred>OL~Lx0&a91XeSc<)f55q%8smWg^4=Uc41_zESEhG+a@=aQ zW-A_8YK4z~R-*83Hii55&Q0kY?AGJp=Gq ze-q#GQe^*;Xti5-^>ysM*o&Giw~DbS@Q=Ko7}O{=TPk%R;=sT4{c+J;Vhy@GG{<@Z zS2IpH8h4!SH1 z1uE>tZmAx0)o=dsY&))t8k?jbPFoug1_LE~jBBV(<=JQ{V?uD{(aQ;29nPK>EA8h7{)Js|GE-a+IDLn6A1Kwqo%f<*0x>)%W zY^Y-Ww0e7z3NVfYs;oK|{9%}zEqv9~?kOhZaFi{v zZOfe}T4aT}{poc1CD3`V%1SIigxeENqLQXBu-Cm&2%4IWt6yd9VcivV-93PVz#60r z>JkxP-EIPgVtS`#wZ#f;+m#)Mt-nrP)j58pX=8mNitV)=NDVE`=JWIeT(x*ye)Ukn z^>Oe&{^n|(9>z+hzZF(KnR-S1nC9p#&f2xFRGW7VQ`PxEwT&X!XgKPsBy{iv>)T@w zuxlZi!JXXWM_x4YDI*d8Yo(sxxJgfd@Y8kgw^Ws0m+H>&_dySbW7&Kz$BtQ?uW~}q z4K=yJCQYz_#e!Uwr-?KtvWBLm&kHwx6J6+6!m(%x_?e+){@Z!AVn;Bcan(K$=p@a2u6#LFo z>M3jdZ0`VW^2_j>z1}3SWvYR9Dt|<$qO)u;Z}JmLzri^+zx+MZ0q>ItedO^`oM>f_ z)!C{AAl?LZ0o_yqtF5cimHhAroYvy-^qDOd{8B$qZ*X{L&x7&YPhT|!fH`u z=fafn_OK+x?Ck-qP$&#M+xg|Vb5twmVmowk|AK(V+%xVZ;xwppx*B)-WAk~{$@(bA z7umLVcPy6kH8sy}(6V_ulBD)7Ajg!_oVLX8IfGwwGB*8}7DlGS`Tge?NyAmMw2r2m zW6FY}IX%(LrkEr2J>MG97hB?T8;P!;0-1=vLmB&ab<~BzIP5a#D(zg2SNG2*=GT^= z8Ahb6u4-Pd>zzDRt+rebR)#OmA0NoK2TC}$>)pxCns4?xSZI@h_|yZt*Bx6R&qI z8RdwQv$+U@gZb^W*E23Xf~U@c4HZ3TXe2QAwfy+n7S{#R4Lw?@tz7(2x(2hQr(F|q z{L)AEIYZ8(t7dJJbXf%zh~^G%LBXL%Y190?<3g1~vry}^1nGTR>`DjO?x_sIl?%rO zp3rT|_`=uarMm}ik2{`<>18#W^|{dvZ^(~o&#gCTTz}!@+F_S`pDFkxw3+JL$L9)4 zf8d-@>1k+5LoF)!CH#Ix3i)C%rAJ`RXHZgxVt4nbnw?{jfSYZsU75t!hOMr>zg5fh zV<>(jkizcAvKyyHW2oTewW3??&7xc6*7W*qbz3XQA~Op`q5~sGQ{{pMo4@fjdQ|9M zrTzq0HLreig4!qQ;5UToPq<@CGQe%6)G5=fyk*kgs02oM9BhnQaKP^kb^xp^=15Db z$Q7A=9}lP2L3zERnG>l+t?lq6k99=pZ@0Iwxd?;H%|y|6>gb>dJd()TFE9<|YHkIv z&^Pq|K#WU7d!LR|H)qn9B#fE7p!_H$%ANTvc92qpvRP_96Nkn7)s-Qbqsg_kp?D z@L&&3`i^ng>PWF7fVqQioHxQfFI3R);)btLihjDxF4b~6!%dhV=vr8#q@fx5^iXw2 zgqxFe6k~5n6UWtiXlI?(ItP9z$7xdwdOM%GI+l~~DJemI&aq+3Euu!d^0!Wtf9y{g zMDWXQwqdxFXs9;mlF}%Sq(a?ZS7K5AIL1cJIi9$cZh{v&#BR?R_^Guv59JFY;4+ut z>&Jty8u`>?=W+rjuCMQYX>7ZGMH)RJwETUU^DyHWu-vlM{Bk1vJCVVJOf}uHVLE?! zCBp)k?-vBF=^D-))2y>U|2-;``t z8>%~#9e9@9wE-7E*97~kAF4V}Dr(08A=bNdb~EIkI+!>?6w1oWe4B@Mwc|$Vp`LdW zpgA^P>dr0`rZMKiFZSW>jzruFZvf(xSn9h|Sw!r|A$ObCQ=@p>T#_i+zA$aIW`Bb+ z%8wl=btmOzk+ZITvz0pE4r|+HG@FzYO3Vc1d^BgZN?#hI4drdFAXY?b`has60JT_i znp5X@AFQTLm=Y?!HUP@&#=ULd0y>HPi-hnp`?5XB;0r0~VAzHA)-vDi;sDZZ)8^dz zKp~`{HQ%@!+hzO&A*tXz8>qjYHaGf3Q~dP7(J`WJgSFUN5PIHmG`Wo%JN0>Sl1SY| z-|H~6J?mP>>L@6CmOg8v21tSst)g?udy?eRNfH@CM^HzJ;FY&Zyik-EW{URry zk*6n@iqST;brZum+0p+fZRa%IEi^!=O{EEWlKtNui9_T9DFV^qqJ|x9D8B;glTq>T zkN5oC)|Z8Xs@t&X4VKhi^Pg9~l`&^I1#fBILPFB^eQuW|D;yFhnux7fio-SC_ZJAq z)_xN(P0x(H2A!MFdfAb^D<=Q~HUq=I&ylZoCO16f|sa3X5vqSCn9Gcn&ZeUn|n8q^n4zG>$HnGcc*%?S< zt&Bq2sXn{lPC`X>6hF4^CzZ%hAa;=L$^0nC*&z{wGNZJui?c{bq5eT{D^>eyTYhYE z9S`+9&m!8dS?d3wY{Y~xu`NZI$#Y~yn0Y^Rg2nURcXquK+9&p2)(6yzcaX=0XVOj& z?E25SsYl~m@libK_Y(7PeO}93>si^jk@bu8D%e_r4Z$!!4knW_%_B1OX?OO+B@Mgu&a~kSCLk z`AK+dkq37aoc>{aM{Ts2f(;b3)g`;qQ($|FRUiex`{oBXHZ3AiLG(pI)wW5H zKBsp+mjcQz$)`Tuw&ED2mZ%OWe{wy;)?_5t1~S=W!z z!@+xS($a&JWy!kaI0}VI6E{F*>oD!`c0|>PZ5_t&<`kgl73&(bs(6V(z1sJBK)Yh0AZ100Jsq+F)zZ` zze7_HuOcnVz)lX}BM0g@SnH$UQB6}Bpbhl|{&BiEX23F)T)-x6-2#cKyrO(g5Xpm| zdHN-G^~#d4R7`}uZIHb1jvvUuiok(Xdr7mY-suOLph4`2L?tP}nMs&)&pMZbAw$Aa zl^0P^L=MFqmXTLSS3r(Z|45lKlJY{C@P?Hpmixa|Knr7e#nhYP{_hqiX*re@vey|IxeztkV7Rb&9ol8{TG1{z zq!;XXPIfY+lf?MB_psxwjbim85{|A4veB5t)6M}Ft`%x@tg-<9&++kv797sp`$`ke zqwJq>xKx0cs_GFDHgrVJsi@%*bvm`!Z0H=rUx6wK^3vwD42}A5I9+W<=JDhN0}`)8b3};jEO#Y zzl%|lHi$*!cdCoWw>bRxKtx?6ClwWfGm}R)=*m?!dd{k&8i?56g-69hk1$UEOMFyu zxxnJA@yl#A8TKdIP+P_ePQ=mg115AS-5bJhqqB}0w$_p+3y4N~JQ4gkI6Jf=?_%@C zl`P+xY|AFFL|W=Sg0e%`ARO?2@o_-`N`gE5lq+aaSdFh!;=X8dKH4x+>jaRT{y_jC z=}wfFu=G^ZkKux8`uE>~Qe>#$FNR{=lQ4wp)FvVbROHlyFsVpSiBq`X#8JP!H&@T4 z=`z(jAANs1erFTfNbpVO$ajgRBY5AXLFM*Cbd>*V;nj(ZXQur(DZ&B5PDd}P?X;2M z%;^_*A5*GJE;uw7^ypE-!~dlL8;sj&L{VrKRS+NL1UGmGlqr;S4}?>Q`Ae#8gN3fA zqBa#j^4AUZwDJuH1@|u{%NaU#C=%1CNL76gJxX8-K}-d`lkmu8^ixL*0dRzb19d&! zfP}{a7~ocVYR~oEFHOc)4Z<}z8Q&ZNo3}lzYAk=FwTY9zXSH~(-@)S#^BzWY(2TtT zHJVyoeFL{Rm+_^C{fAHG_JaG_TBZeQO-BGL9?z`a!i-i0Ba+imxj5ca&Frs}+2v8I zRby>PWJVp2U%mFSrTRtfpZ1b(d`jE%@t7a*iDtv|pMJ{&;CCn%2ss)1UXSi^y^V-S*A`ZzTl^rMq~5^2nrBXq!}M*9Tu~oY3vmsx!-yHU1@|epv!I z+M{Ppj~(w|Ql6>2kncel8rYP|Ph`_`OfWYv(2x!A$%Sjz=mt#)i5v?r8E3)}6khp* zNZV!U|GJ zCk^>djOXV~An=p79RgC!HTds>;W_GZdoR{G#!h;}o6Qb7{sBrwifxIT5J=Y?hv0`s zU*m#C;Hv+jb_TXebz@TqYTNc7Gj++R+e4dvG?hN1d6r0}iXe}mk^JOWfl1}8@lFaL z+q~^15hB$uTc}y#mR#{(TxnFdfqWI(FzzV0@ySifAR`ORI)RBWLnvvh)>TlF%{zJ+ zX;Le&;~kiua#wlq)5h<=Ous=4{0TI1N&yT*e|Cx7F<%*S>pxW8`b7u%eG0-}1<6jd z+K#n8GHp8yOWSf$F-s9GtKr~rrz&oMup^k>kWJ-%r1IGZXh3qcm{d+-d}WlLC-CZj z6edm?jPwFRREGC`JXKvur^zZ2n^NofNuvw{Lu601`lpZ-*#1y=XZ(i=6=Q%40$}vfm0SV4i)BT(_B51Dkm+WDLqU!F`6SMcCmB4A;(L%pBh} zj~(S!oNR8^%C|Q2V+S8Uy0%pCdPN__MGNacMJ4kjI&uoQ8=Z!T)`+aYJM+Ng9!kD6 zp#LufWY802;&4Eh0L=>0Pv54CYUNZ^xb4&=iaOnk=Tx!2m;>VP^DOB2H@$l_>f;~! z5kPmiQ99B+R!*{W_I(%e#T_(Zcov|#G|pj1IqK2ErP`2qcCdB}wf(P708#ia@w0G* z{FfS5AU;Qhn7yo4+QMvA0^NVKOEtJd+(1eg5K{{ij-|{Mw+6?d@LbrwQ+DGg6v$yK z&?^SYU3Lgcm;W2boKTAtFiuJ``dFd3?5Rf*IjS%em{3lyFfq4~j7lS?nAmDDEph*> z7m(C*u2h-u72wo%6PszJDdKC)w(}4fN zu1pL)K?eyt&F#j8$N6DWwbRgf&;InU!Yq`JbdQwLRsXJuB}vGd@Fa0QAFbq4OEL~w z;HDD$V&8;73ZEqx@@F?cM3dc0Fj9x0;AWa^`sp~(bn$26=YzD{=@9$ux@5`EL?hLv z-F>A1ijPjQ#Q(8+r*JVhn6ab+9Ak^f0X4R>GNkN9Q&F&mjL`xd~+?*`-`R(UsbBKD%{Enso<(`>c|0h+I_}^qwFY4*fgTt z@n*^Ql~pB-Y)&52X`?#GWd}Qn(ML{A%J;uF{-pqrL?d>Lo0NqcNBApfR>~N~u93Rt z39DwAbX4@2%)g@s`=SHKI_v(&FYV!sOllqJ(W?ZJ2Kd`nH~$8bIsW(~b%*95wz^NrOWB| z)3fI!8}Nj##Km(?7S>VSsrMJwkwGzu@V>K=!?EWCW>E&tSn+GGT^XAfxgUe16NALV zgT{XLzx4}}8dxw%d69oOEHRBLT6jTfb@4f$_iw(s00<`# zZ$yxVb?@()|50hN)LvTSS0dI`mdSfk;6e{AtR>QAtQWQ=Rdifi3+zQ6tsF_ieul{t z_E!Jo3?dZBpK9vZO*{Wb?mdKs(b^2C>D+-p*{1-Nf4zCRS>Uu)^@C!nE2Itl`O6DC zaVY98OBS@I>m*!7O6d{a?BKv3rOl%iuIuzPn((WvpE{7<3Bu%Bx7m&x|D`5F0>eQG zk%Fy0l3(DG&k#_3^{y8yQV?(!@thZPTzCO>h0S^v@&kE^K$`0B?^d-TC z=kqYG9Sv+@&o3t7_n7rKDN()ZnPay;}fRvJtYt6(LtA0`i`mm zPUJ8qw4AXMa$C^5lG_u6#WXHY^B*pkTN#co5iY{yp{d8z%#3(9*68=KqTMg*sXWY@ zmAD%&ZPRfsMXY6csWj{Tnw}-7AUZci;o@`VOOv5L>icdXI*VDRI%vuFlxl86dmpHm zsKLNr(`Xr`|80*nVgX$8n9#jML+J^cXYE+mH9X>2Kf(coU`hOwP(66vM=(rMvC|(X zDbXXtZx(XgmTuDWOJ}(3CJ)jz zq(+_$!z}(;$dP|2|3i$@MM7CcP{M>H$`chx3l$ijRUzOrm9I*1%vk=luu-Pkm`y$3 zPTsgH-OF=Sga$7mLx03*p$NOjtSxT_!J+z^xNgykFyrNOODcElWW@a!ZdyRRs*wuZ z=$It-N5&}lPwQHzva}4=f32CNLZAk5T5m)vdQ*7ksj50KDQ?s*vJ`fT`<;os)lqMK zzuk(Fn(I8l3qbwR|90%=`-2)gcZCaIccWkfPft zTYn82vlCQOq7{1%IQUz`G|8X^*()DCu$=LaMqe5G^ZY47(EHkW zkifwmWkOLuyMAX#{I_l&0g&S3w#SG}bnqS+lVGUuulhQMfw6>@3`?=)zwo&cRK#qO zg&B!FTK}H9>n2>TICYkjzwi8o4NDx)Mki)yCblt8EpHsr`i zg=lg)Wr80Mf4dF8rA%)2qSPB&p)}8{bX3BGu_>fSk*8lq{PumpYb9PKDK`~AKg4F* z<#uR)5;FmHmnz`Qe}cn~ntho46v}P(U)IzB98Vdn;78fFXp1al1i+?tj=t%Zy^Yea ze`^srwaNJDsX+(Xk%(^WzIKw+Ph-3o1)$7Dm_&m}73{5$H-IvFePHy3^0o?nqZ0MZ z)?p{s>G|T>z2|*jINab$vK2)S)wjrqDv_qn#>b^Ow&s}apP^e7i`;nqNE52LN952a zO|56JmEx;3YIwA+6WA%e=W|(m0ZGKuW`p51F5$DDbvOxzlE7(1NRoV(%@f$p?ZFNN&;wMUdWM|0vXW*v3j@Js)0` z-jrOab-P*Xkjs5|iSszFrH@ZdJ-aqExq^v|#F_@*-+N^FT*4_4`nMyMf29ryLxor@ z^kEb82<4exZrE!$risiO!!@iQI;?*gccXyOp68mu4hCSJHN3l$b^d5tjlZ}K^l_nE3RY@7H~T2v(UY#N{SJ$fQrAmdz3N=|#u&33&Lc08lB5Mome zU;IVQSAx=}?OJ~hy@*#)aulECP-C`%HBziYD!@gS9|okvP$x4qF)aB}LI?~VkuFP( znO69lbT1MCW=N|`)hRT4^JH=hTxCY@b7lLZ)&|eu7p^+7ro z)hK96Q9={l8S#4cS zuJ>++$8qeYvTUlUFFAfrGA$g3ISpfbe!=j$=uf>rzN+RpxjLhbFq`ok%O3;-`((F@ z5(f%x=7qD|V4B3}Tq7nl%9? z{<(8kKW%Ps0|g}WR(RBtj!Ba}ggiE5%5;CZ1()fT0pI=jM<-I6!tt38y~}FiKrCM~ z3TdvQUeb(H5sHh9lbOztaOEo{@yaz%p2*xN=;2v3VmjIQyP+i0RZRoxttNZ4bl%X& z)2r#SJTfqGmz7@o`}+stUi1Cx4rQGZKnd=UD<+Ry&r#L=lcJMc1`uHK&!gjvtNO{3 z&1G`&a9s-EP+m->g+_rC#2y@ zIc4P!A(9FTk*eXLuYaz73`r|`SUbafPfVQ3H$w(^r4oU>{9R z7x6`i6+ZcxWKLk(D_^>`jWcN0^>Qn1{fUvsej#MtPakNNMQgfv_(PnKc{~nQ2nHxyi>{Y=AmCdB{+cV{i4c>eq8uTtGmqgci!g##ia< zHlO)*b&^NL;u}(OSSD$HGg@c!n&WzXH9P-hDGZ0O3{$GibMGvNz`){Y<#9)S|IuF` z=@H0r<*ptZ2RznYMftD1#DlBAc7LTyn0_;PUyu>S$vQ8tHC%+hRp-aSQA_Bt3N2^N zgfcHv?P`>0;v9Q^XTG7KoPr~7WRYhNPsUHCr5>=-!bK4En#LsR&wsaaN15|9F`cLiX(iPNC7EuZT;vd)0kCOodGFk@L%J9W4UtezcINjtLoU> z2?o~U0|o?8gY=G;Hr>PEdgdY<)eRM;35w@y`{t>urIWoL7q%K+Z%>L9{^4tJAe%SI z>D7-7y5_Z>NuICLo?(i84X3WRITw}X43#lv)u-2|Lbe`5Of%!q9AS9 zWkHnGl9IbkYRa+7eCiQ4k5PBFt^2KqvmmoD45Zi=#mSG+v;qb;3(|o_?{U-VQb}Lp8Aqt;mAUa)?n#(1M z>Sx-Xx-5AtggS+&(|^|vLDT(K)ze#6(`B$DD6kWIdnNpEXi@}p799o0dAwZ==6YQ0 z%yU>?%aJ;P^6xLp9oVfV3~&husHjA+UJ$PbH^a$Hfy(-__~vJxFBgN0X&=0KoSj30 znPjmWzOEt^%1}g;uePNNEH-x{AI4Bmfw1z_Q~!2SL8$Hn(VIVDZzWJ_LE;1#tYTUU zbIlM1Ghc$@=fl7st_2On`yyyAC} zsrh0xUK>5K7e{QO_h4uuLg8Jg760|@1sy&q9x|GEp!aix)%mst8(`2nmI=+FZKF3z zwcF5rB`AeOKTTN!S<-Hy1`9*ZsFs>o>*L4hTC+HGg(k$RmRs%>h{cu&I1~%`0V($B z)E_X}d5+IhFK3>;hMF?ouv1fH>s?DZ$J*t)|SaW19z2c@l?_@0V^ zN_j)CM5w!y4g1n5!K}#9y2V9UnpW=8n{C}GNh9Etwq-xx!Jo6;tYRopks%uFI2_{{ zTk(=I8A=imfBU#rCf?_lB?XlFhsjJ{<4a+Z$|c&3=!iteOZlz%l$0>EUM$be{`vD$ z!80lwZyqD>9X*KO>cC(+KXTsJE&OPqd&>Hj$709$HLpFh=c68P4%@E$0cxVHItRI9q35Bk zW(`0_2LgG3B3rAD<046|Gu=|dSK}??xOUc(oI$e^Ot-#pif;42N7cNHzg-+YgXVtK z7LJmCdsRTpb96#~-(SenLOn>wUQ&PL$}#N^u}uqpfe>#D zUa#(d1MTobU+$Js?uIA)WZ4G8;J@MYQu6X*7%M*!o<)8IE3&ps(cem=q`<@XQy(_q zX^46u%SNUpetWrH(WnSqjdWl0n`IbGgsP3Dixqu6mppdwc6@%Ce&R6C73YxyCX0Vr zV>Wcv$-$+zM1}zMoX_ZJjVYfb9ttu^mQ%FK=kom5PdzRp!lz4B*^G-IB?@J4lj8ny zRF!?F1H*pt zyhd1XFaTuruVB**2_U0)s~YM}$(^GS(4u>OWOp0N7)m@7ch2R$CS70W?)mfK`cqi} z9Zx6w*_8cL6&QiD&YuVUR$q$thuf#2iM36p98U*>E_qiT8L-;) zavqI%9|clz0*x%8DC=68j`%4eh9tz8AQ#kydAI5dF{A4lGHi3}(X&!cYSVn?bb#iG zx)e6tS6yBI-h8i%mH#PtlvQvYlcGXU`L&)b7!f1sN|i3(uvGZswv8h4%cqoKE)_m9 z_f^lR{mKf^PO34fm=Aj|rTl#HGNrlwI5zcY8R83zFt5*BAm3}V8QO*T)mZ?i>8=MrT?~Q!CiRWH^Et-=oZflMcf8m5ks4t`dk9lGef4%TtQDn^QcYRU* zFX~oy@9qk1UEV($3*x>f`#p}J_(R$_TdRf@uKyCi z5q+&Uh>=?+wzs#ivt5AUSZ#BC&?e=#{=r~)$EBC(NL6d{bdqKk%l;i@G^HA=wnDiR zOosDox#q4LTH=_G6e==H&oHUcsQ7F=vk3tG(R`*-w-&o=?2Qcewgjk-%Ok(=bJk{C z^X^9G_<(J?IuEa9Iy}0Y!k_hn0FKg^BOA_(m)ho$WLyPnu4CRm)z{=qb~WFKXhCXE zjVv7QbFNtQE&$BA+?!%K{BJ@Gj7?6zEtw5lNxPy79w4=an!dXGPX}mASBgtoQJ~dG zxGmqXjb}IK0R*sj9na+D)p3sXxD+BosyX;=MV;^IUid{-_`4%oL-_w#0FX=I0w+do z=toj*ax^Cc_qP48@==XIT&{C7 zd2OeNr+Ivr%ulzPkR3&Xv9>&qu2*5E^D>Wjib97d4Ka1}{ycq`_*g4=YO5N30Ho!<-v05z&DlSmaaFZwf_p?a1rbtY>Lu^(7lHqO7bu%vJB=<(MI=Xf>=X*Ei6A z#g%^dMX1l*zx$knaH?7`R>Zl;B$aY*u=D%blB!(u5vChjAGG3#lOWTa47?jLSY8Qr z+FpLDQlEZvfYfXWtWtd!DW)Myd3=WtL+BR>`LM&K#?Fd}KW~6T-Qx9+-rArPJB1jY z)LfK)VECjH0J7s*%m`k*5PyaoftRMG{vg?Fvp)iTq~DKgGHY=KM>pa`^C0&R9X&g0lX) z0o8X@!GSSX*% zwX0Kk`SL!j^-4a-W1^r(s)B(EyY+s0frGCvP`5-vL;E9qPU+cA!P^olKz*W|e8@M# zl31~Q2X=18XBe_TIUPPk*i)!1_oamWnc-T7&xm?D+#UbSTXc(ew>dM8uz*U+Y_R4< z$%}8gukH2ZiNH$(g-7bX4W+$QCi7Oe#H=}!qF`VrZp=%V3msBCO)Mde@_0Xeu1}!n zmEVUD1cINZxrSG-_gl>TS73CX+gT;^21fuwJsmpKXiuxlp2|Yu(^>&=Lh`~{8FhEq z*|S)mI`RZ z@Xg4#wlPf4KZsQGKvqFPlHAE>Lm&x1aOz(3O|@aa@cLv~F-g2`oS*ugjK_khW81;} zPc6l-acP&gvA(lxS{jTn$^?Oza6q2{^H8^w74)+A&Ox<4CJF)Es{~T|RRF2T?i5dd zDsOT80vuBqJ5SjRakPQLW-WP34gu0-t!9degAsw)P^g8frQ;7$Nn+LAKsQe!!qTrI zCv9h#S!AGRkw?OHnTp5UC zWnf8IfO~O+{gSg3t@>oaDKtZ3C0@eNAh}uS6IF1AeNpohsEeVYbH~?K?%w8}dsDJ^ zuknbgP22iL!zK0|eb7okc~v{EL&rsoeQG~K*oeqAoe+N&|!8>#_D*E-Wi^UUHCmt%Ea`%CX-4&im=gu8H2hTZu z-7}5fOUE_k&yy?3Z+3vFm!q_daxEOvMm`ODf9S3Xp54Fp{?yiE84pxc2JV#RZ;kL6 zz5+9*OD&&;ZPuPc8^YXpPJ`kb&sLYBf73l7v&Kcb@X<-|dvD5+WcV!7{tTOJCu)H! z%I3m@BNWh8pgN0MaQ6M1yXIjoO_t^PN=e|}!IHRYN5DqhG|AEoC|Ffs29{~eRtv$! z;>LW!-ix#@U=fU|*Iyf{7IJ-!9=4nXEOr0QU`sXCyE$i6dMa6eH1$DD^+K3^2>KQUGz z6K+Q(OA|N2Z7J|+qI~iC;{T;Zg1g%@^&keH1c$poOma z-6n!gSRJTH~bUHyPex zCUrM(%4Jx#C=!dd(g<1wU%&4hMei~Eri5b42kQULm|O0P%%xXj#$6(g#7SXFUL^`bmbpCotW0%NNt0|)bZzXtj-#v#4%nB zy}NlR=9YUljYzipj6YWrI26cvD7=W|!6LlUC@9M&u}mQrr6257RC^XECu1mhjh^{F z;IYX_RIhe{oH~pnqg)8QhuukkDRhNX$I$lyo7SJ5gUJ)@hBq%wueED^MX#-PlSgvfao8O_7k;+Z&L#a+h2_%NcYXhUh#&u z(Inao@(NZ2J#Ra7L=(%Fgo~WJV`f+WVr(6UsWphLlr5JW+$UPXx z)yU=WVj!`+Db;#x^AVfx8?L z0~2ephEjEOc;4<8)r3H$iP>N$z59k83+D0t=Rbd!J$Co@hCHx7Rylu-VQpOk=L54< z>iLO=P*aKj?so+@Uy;W5)=JK!FkR9L&FDH5Irp&>iTYZMW(SQltc`XcP%HFqnB4YF zDGHiT+OIUJqde+-m1yq&EOYVY$!YJPZBNvnUb9@Pf@TwRG&@5RR?9QAL!zG&X2@61 zh%4P&RJ+mA@JP`D;_qFkw{0dkZUh#PVNHT38P%cZPGrUIR_O2$tUQ20c;oZH{?#g? zyAS)A_1|f27dI1#u_F&oal_KhtKd_H$yUEN{jB0)SmLrd#s3Meu6%}t7B}G_#Xna9!Siwu*>TG1K4e+?W|5;=K zEz$qwC4qXMbqg6N5(l5c?lRO6Dacn3O!Ps}Puu?&mk5aiSp6+|I-5Dq%Z|jVcXWR) zidQIyBsXD`jcrkDFRiMK)#`Mk8NJNs95h0AKJa*&MGtB#iIeZErMoYSu$~He6n&7| zXrenH3qR7&aO$+mylK!pA|9B@EcD9CHR~KL7S(k0Kv7ona8xMJYM9=37k63kVhj!N z&=U4^-8;IiJ*oErlbj7O?zjw!jsQ<%Au|%Z>7iufN$)V~QSOWw)pjV z>$6q~$9ZM73gk_bJ2KTbxmxdJD!FZGB0;&N#by#Ns_UA(*BO25e6WiD4j1W<_rn0~ z))V%cb1Q17zgHC_{60cT&+0QQg;mVg6LXVMF=Cr#_2c-RwpeXuEyr#~OIq;PvrqEF z4%*B~yhhWbY6@S>DxovAS4Eo<_zJw~%|ri2?~r7aG~o+lyKcmYDNAPKm`WGzKqskN zz3Fm}{pgLJ#iH=_uT>$%h~)cg8XvL(sdTf^7IVEZaT~~<^5%V_`s+(=XV64K@W1#d z27qquq^({Rf}~F5;p#A>bWM+$g|Jk2rAqL}t>1nobS1t4XjQG$tGBc9oCpy(&lcqT zuU?4P2r&kpW51ZV2Wb{->4lv{r)Pu!98k;PUa)mmGn3SddQSyb2;h`R6+e*V>mNF% zFeovxzXK%Pl_I}1<~tY843dXAE5OxM4h87ruquz)FL6&wMLL*bUhYnUG6D=RjGnx3 zsEdxj9CO>t%AIafPGnLw@0X##{vcRUU59j8RI|EdQLMrIin7|mfOE%dnxP&H?Nc&9 zn>RxVvxRpRAzQ?(MYw)PD1zM$6PX;6;C#JBBu&)!lYKsG{v(wX^@tR>dhuF)Mna5Y zr(3_Keqb>QE0Ad8a2wl0kJJ3GxZfI$VyWh4-o{PltQN4C@xA1^5O9eUAt9?sjUE}Q z4-OW=&%=!0qz&4U?D6daI1`p^QPUeroh#~LBT=_-$2oeKKmgNZrzgGjUw8s?Np#i( z9w26s@_)!F{0{(iVCUvLbaH%%_m9hQ+RJ!ha^7%BGd6PJ+wa_n4m)uY&(GKqsW@bV zSzK*Pa&A}@;@IW(lpw|AT4BC42*OI;`~C8Niqh{X!ZEbAu`xl5q-9(K;OcZ`A1nSEKD(5JVR_!m`U{oj0hu>9b!Qow2d z$SIBu@Sw9QPU}$rfqpG|L-20Kw}DkAqCVzCm#@p=X}88Ql`*4lVd#=qlK@l|)X&l? zQgVrBKdc}Pxqlr0o|FfW!wRXVYyA&WM+1Q9xck!mVvqMt_H;YTj2G z{zv>I02uzOIDSPQ5?WTLT`59F@!+S81v=>d)sgtP6bn8oHZ!Xe@qe%>|NOrA(|i7v z9+4n;*K!~%I>#&UUjqUF``6+_0}6~G=@mla_;Q6w9*MIkDJ_H=u{I~S2*qS*<2qtW zdy39ih=lU7%ks4UV?}U~Ko0^*>Q5=1x_&tcG2nxf?3j>bBGuGQ$CTP(3OJ{seFCSi z!Ya{hz?X<4+}P{ek<3fW7)`wyv?@7*+b@<@z7lVG4!P%~ovb(7U}JwTq8yNRXp@1V zPl^Q9)zwxnr3bATi^h^aRiND=He%Kq$O@fT4t$jY%jK_yH}B*nN-0H>o|G-uk|PZ* zxjY$hNax8}a(#Q@V~WQ9$!3CGmWTxyn%Iv>HlCcEjL+VJqaXl#Ko%k?UB>-S)h3+0 z11PSMk%f+0gJUP@QmXa0l>7zt%ifg@v*hMFCdb*rq)XJ7fakA;sKEOg2QNxZL7l{il$O3%8mU|HPu=N)BlicU5O-^A1SVZ4h~%WA=e0{a`%8R zs!&WA%VEV_~Ov)vy=Y2_+_)iKKWE~HA1lE7$S=sV1v9LZ` zYsq^B$k2YEEeC40fFPnd~qAD|{ z#n=1qYpkRlfARz%#U@~tMSPF`+En?XpoFWV?B}I=N=8j(E1LO^F^}+U-I1)&*H*_8TJ3jgUuXz^Iq;j>N(69`oBjssRLWz5O`p8Kct4lziIF}53l45l|#slqn@(M=?l}1BYeSEje@nR33gmf+%Fa8vTR0{Km{n9(N`(YRgRtei~^%H_AZt zwt)r>nN~Rl+K+Wg5qTmi?ibY~_64+LdTL;l$i7ez zL5}P0XrK1124nPcmM^O|{H317V*ZPIBmW^(vWwA(+={q>m#F(UCV*l9ugxV5-OKF< z`QkClzqQSG7kC4vH=w6L3@|gKIE%RCmJrpY%e~WB+-c*sxk}c@_{1f`MsdU8LanW4 zW?s4_!qF%s`Gd58Ft=Scq$>AA^dZu{xQaPw^q2IEmuY21TJWi4z04f5_28gCx*zLC zXmC5L!c>wKoo)N48Z%@rKV?04spAeBGl%51as4ZAr>|zT6KD9pXCadKUO92Z93Ob$ z*_j9KkJl$dhJGXc#~WLclemOv<`2dO0vi&r7;Z$mcn_^8%-zQ@5pihyvojJm2^OG% zo89Ey2;u1Hv;~x#%-?9j%QM(ThRwb1a|4}bq~ZJz6Hwv{BRR5eL;w3j6VVPkVX4I| zFj9K>hON8b*f_iO+Yf<8_CjcxdI4 zW3pIk3XVtB5Th{G<;*1;w*aE;hA82fNnz4ycIUedN;OG0l24ER3`=QENVK}0A95O* z`2)IL@v!%~?5nZ)+=#@9Vrr|pHPPk)ScJcrR5@i=*$nmz7x%LH5OQr9Eu_a51nqlgxAGHDIPwwVkq z$WNSxM;G2nAOktJ|5mV3>xRlqe0Z(!5SjG8@A(9f#u(T*o~4HA6NQsy|EMHqAOsxE z-wl$IExkJxfK5TvXQGXe;xb5RnVoQQ$34RnfzY=hXrE)K?5?6owEx5ehRmDRprOEK z@bhGcx|Gn$8Y9!&IP`NImb|~rM9RrYjtnBgOTk}ZUvP9}HlrtBU zJGeH-Kp0^vkyGzKH$I&OlmUe(cnXF77e9W678}%ZWFKzor>6QL_Ah5*8Xd4Y;z}uE z1#fVsWkAS&B!8Grr;CMnauo5i;lGgXGcM#PI=G%_qS~I{9mu`vrapB->xsjAbP$3_g7FQonpvJFE2zLdW^R7$wc9!jD}R85;3;i&D0#f$V) z&gqk=^|%ArN4`_Qq$9tPn58`}IhpQl^Ol#K9#1<|ji-ZIM8eYHrPTn{J zqxKl2B?)24j2g5X4gewCQ6vM6gpd!J%EZ+wX9FOu(ZH~4(_C|n8$N9cp3KkI2A{*(g8bpU{yc5)nA=%^FC zpT?}OLu`CP%)GF(~jf1%ko|Y>yThEa3?Qpe%`uT87t#-VfG3z5{{Dod z@k=W>=LtnBmS_c8xfAA0Rq+LfUZbKLuP8g><#uVV4`@{HW<($gj21#a2!Q8hd^*2n(lO%#d4*x7?);MaP4cs4YJmm07J@TL9!UFYHi z#2%lJ5jByAngZ&p7C4N}0fCb=lJ9Jc2(JFSN$@~h*1y&u^)6qLXdHao?_hI=CXdTN zi!^u4#i5GyjX@k;)pz){=vjCuO;7vAOe*4Z896QxY@$|Npno!xqr7t*93!E-6BGXo zeEA<^f^aP5o(64mtGX|%`({qhHsZy#Q*7CLuiRp#X@&`dRCj$e?Ewl5hZ3u^n1Wm4 zVy>vN1ZPvhf$HA|rE(g!qqhm^?DYzM`_8Mec2jt?UW005n2MH5wnPqY?lm+LE@Gw# z&~ZOkw~~}p$cm5Xf_i4}lUO8y9g5ORw5*x2sKB&9biO)71D)a=5krS4_ zM2d#QNz;v+3|`d!+UUx)JjPgE45ioP()-)D8PeHT-|u28^C3NQGc65wI7<*NPb#`Q z7)LLpD9h{Dpe>RnOx%*P@=p6cZ832sdtCvn~DS{qpW8M>4VePm7$tdANa!ml&t zdYty}*Nq{3K1C0yy2MYXOF<*p*hSm8;teuZF2u4Rhyfgc#0nExN436rz&eb=zAoN^ zFz-DWs2vIhYHR-(a|=!9pHqw|p8P$hOH1}?%y=??O1}DT)tf#>;F868{d9zT%@5qP zkbF}nsFJ;Cx_p1Bf!pr>X-&jBVS{FiNBkG`t|?Brn~}Bnf&Eh-lgdLzLPEfjUF(1Y z9~kEFHCIQu#=VkBtk(Ph@|A0Bu%aGiBBu|scp zfA$6geWSo^`~vKgr+}F{I`dZp&QH`aBRhJsrj9IpyiR7VUragrgm+#BMn)u?-E2QM zGEPOPabhSlFL4KbPI%C*-meALDlrkHFr<#AV9=F6(gK=4`s;1`@oZ5VoGiC^QFQnH zP@MpQ$m`y@JH-ZI;2E6E=P1btnjHJFWW8lv>pJ7RndB=wU3rdOTY3p)qi|IgI0l{0 z70qNSEp$;gY#}Uep-FeFy&C$Qlq+Qw731wITC%I`zU*EYoDAz4z1DAxS?-tZX%3rs z_xrvEh@ttopf%TzlT%Y&Om5`ms5t4*JxDo3;kA+0OjH9UImNi)R8DFts#C)=OgxN_ zQJ>l^Hr(pa1hMNAFTQ6H#4Ts&s=A2!dr@y{(lp;YvSm|C{WLKg+S}ySpR8hfcz`kH z{RPdcBITr#P^plE-C@IjB<}q&R`;OzE`bgjV+#(0*#q3TYgKmD3(P~%HO1b!aJ&fc zPaNGeWlIu1{pv&;u`PXM-c2eb)ESn|TG2BqD-FG~R|t{e7w3xv)11i7f_DL zY;vV`kk%f+v&YD;ITEca)lmaE;Xd#}X? zDTy*FY!^42I3(L$oWrlx@rJ6@LaN~}y+7>!ioy{Gx5CAC6pQz6cES;N@|D=+InZ8Rd4gBq~Y`4sQtty zW#idvsAFCJg6BB=H8BqXb+!}s>(g?iRBFI7RC6Ior^C|89ZBnu5`%sV=9N!otTUBC zln)e2w?7%L>aDQ6K9hk2vo;AFJ(u8XW&WxY z7k2XqV~;_7vFA3LgWJBlwXv?CL@GI9f?&{^w{WpS0*SP5@aUSwMc0Teb-ub!^b` zcov`<{O;YR#-^Kpj*{WLF}GbKGBuqG2%LA2H$K-yM$Lan_8H^bBXc*^d{}8Pkov(@ zK62J|HP*dW(F&<);QGL%Lsrx5_bf!`%N?$c*#_o_MB#}~uoOl}y|p&4&pjNSA2H9Z z$4W-F@UO~FDxx2|9@n1m*PCpm2ltPT)~}|u8)Lw_+LJe5p->xN?Utv#4e@DL@sUL; zgtzTOau2gJ$1W$5dEKqZPk6W!R<=I^*cNZWFpYB7qdv;ZC&aV1J7IyR;r8lEtsP_h z*G3)1NQFG9EQW(WylAl-;yeG zpYYlT?WtaG*2U8%v`ok0M=$2i_UgoKG zqZSmfdgHg4-Ygv1$%4&wdEw_(4JWs#E8}%eSE82DuYiX9r_84`Y z29nA6>R_|IAM2}0dKwM9F0kGkngj73Qx$nvGI6#fP6^Ob8TDdfgw z%8Z`wulXuoA2k%&$UdzmKJ%%^Qp`J8=S2}doHZVNUx>an-@dN1y1IJ>^vJmCf>BDJceo07hg68b%Rh> zpI{S5?-dvv2<^K}B&{}MJ~DMYy83>#xMO>ziF^vqMuHiF|xgHVIHqf%~qk{m<^oiT8wn*9;vCQ z!rP=Hx<>%XkLAX`#oabYgg4^%wS}M(?kO<#l3MAN&7L?%+`z-NMfP(B_o^41@AEC3 zLN*U1XxXh+@lU2dPKIwqT{&*59v56?>n(Q3F}v2_f;tppq1HR?G8DNEyZQqaP_VE4r zqeTF)+X~zwb49>$cvB|mh)}qQi?r`SjZ=aUP?&_CiS>khimrp5cWoy_UPT`hBoD7_ z7z97L7Ll;B6HgVsNS+Y+COzJGCc>h4>D^lU?d8uI_(uA?T4FC@F;pELzxDB_aN91X zt$N&fANG~qYYA%7&o)fCN$P@AKv|D>zUqT&cf&iISyoTMNU8IBjA2_4j@*$hbP79= zCYbtYPhPl8dNVI|e5J~_IKRpFzNq;+U1iZG2?i)+3z<;+b$Ss9xQF==y?ylWTxx!U zCj?If)fcgF=S4(xXon=BP=cR*{aWit7GfKrOmMsWbDn-vz0A1?rT24cyP^K*!pa66 zZQxM;fzOl((djqEOd&<}G8`;^s=E<3+*)$!7-dt_0aF&q(@)c^U}=Ser3KBL_OV5I ztm!j9ZLS5+&Jae%dawia$Ks<&cnfGYL_qJLsi~-mbM3Va))#=H?#H{#->f7D3+eK@ z4XpX{Eq>>pN{Q>cyN>ZJ9jOOwWU+n(xU=bX16 zXX79f>00GGDmu-IsOcKx9y$$rt6}s6(7Z@v<-B}8?3K}J0NEsl>V)z^wF+ui=GxTusnq)-V=H5+pz5v#_3iM= z2onw0aDI7S0+R+XsjRF2wfP6hQb?4Q4Fl&lpYQSlgnF`MdE`0QBawTO1fO_Ga*#|8 zP}FXQZBrk{a?y_2Rf?4w_fF<$IRSXkkn$dVOXB!F71#IS!EIZ2iP+;;gv8??WMJ_a zRz5_FNQsinucadHjLK@}dQ7qV7*JeTe*R(Z+^U7Q>baj$?lpxYU~4s;USNCpcc^^7C#!P&>8zbmC8$g@@8ARkJ5_Aoo*R99i-nF51ZG%OgK|Sl z)~xNT(r2x043AUk5>P>eob0lvlN~a=noK636IJD+Vu=fQYBANz3xPgxJKpLhVwye2 zYGLGC3|d-k;Z!F4QX@obQ*2I7p@<`0uECJb#zjo~gGsY4uR8BW!W-W_;$&vcls72N^s!*Q49I&_*68MF?6l}6GX-*|eXShmt$WlOWvn(dl;Lylg6V&2kKykJ~9+D~eoNwVX1CJ-mR1_tWj3&BTYs=L4p zx$zAXqT!EZr^3$BF&S-i(16nehp#{x)b1G`@#Iq1C;jPKO#}SPSN_ctgk}p={AWmS z&STXt4R%oKB`UHI+6_MBGaE0oU~oRI+reTs;5&Xs+ayczH z2+BSS_hT8Fcr0hjeP?ogujulESOJ2g)H#}njuo#1wxe4o&U`f?sfst{S`%ap3;xtqQ!T&^CfWz^h`CAbq|mwZ-_~>UCl{jC#44_h zmH}<$!2US+b=f)=k{CC!XDe(EKI7}}QX=FI++=>J!~v+DnRHm#A~+p>joyK{mQ#l~ zL0S;(BuirkMNrgH$zK%1YwN633mG(#OZli45MnW?v{mFVXaJ{Y?O$tmCxz;t_Q@q! zxVHX=xMurYk~V+S`!rLgnM_9lWBF!gw@XT1=|IrkXE$*zYV^T=l|M&IIyy+zY*_dYysZ^dJ3Gy={hltoW-#v~&#Q=HNI z=!$&|L$3~eM>bm(x@>J_f`AUE5p;4fA)!pU{Rx!Ca%S#*i20S$QRsorGtvY(WVfq7 zQA@O{b2+ZJn4zUH;}Ss7k7$@SjjXG+Un}dNTxmi??HV7HnLO`Kgh`~XmHs%VDwgkv zL-CBg=2ZF=1aJedSznIKyEPevDvw`_0%R=yx$lySu7aP(} zSTLMnmT4$X7ML}ufK{L5FR5QF!F0tSCSooWD|d;h16RbAt}pe>Bh)2KR+U>;vqE1U z(}jAc8odrq5-uPdEhgOTQy>p9aUjXtNy7k#UvyiZR2yFt2h8V%kb0IBD~+; z`v~c*CX`3ds0E42%3?eQ<{^l5=4(;+0qMfyDQ;(i{m{kieW+c+2L4_MVPEETljwAQ z)Z48|8lb+V(6LwR7rI!MYLrKym7azf=C$H(CALI92)3|$*)N#2ioQJNoL-s=G_X=am)`i~Bb#b5td#s-=G9kw6#L zjhmWoJ%to{<8u;!r;o7Ux98ZlCo`%uL?Q8G;l-MzmFJwC8vf@RGkS~D7GGZCYC0`T zBRTbsy<;xz1;SxPjo;33yX7=yTXA783V$yGtZ8IOOB0crWh{zHhxq zBp5gH-0JUHX-!VdvcAr}gmiKZ~F6r#~;Ll_RsUZ2S8hmR$t}N9tdEa-E4F2F&OlKv= zz5kTTbae(?HG83c_$vr9`Wy1O%g+xl0BI>!h@iVv_H29@FVS*BEag}U_{vYVQ2pac zor^2$Y3#$3oDdm{DI6+cUafNTNmlW61AaZl%cGF=7;F6NL}*CU^iXBXDGGr3;eRY{hA#fZnsC1^3EnYARlNgCle-y>o@PCq=Pqs>o2}9WCwmYMA&F+n)bmF5 znx>eAefze~Q}cE2&y1~lSEu95-+b~ESV#A?dcuN2Ly@57p9*j+R~FwW)^woY!Usv1 z))hcUyXs!B$s$k~>j+YZWk$rcj8kaoY~WdPTh-J6JL-E>Qnlqzci%2Nj4svqqj_G+ zfc^LIhV?qQXwrEv9yp4G8~}XCXg>@9S64?YH@OXNLS)5NOpDgTZ*Tt0gu)w`Taw}I zsmNJkGf+mVNgCwESMW0qmi;DSHoBi}$HWjBuz%Z}lx{{jiT^#4yF@vW&PMIE`qwXU zLL?(NdzHD1l2f%-E6J3I7UpK9qU7zr7Din0O;Pve`Hc`7(8a*L=g1c}F>&MrxJd+7 zy*7rABdB>Wv4Rp$wg2FxRr)EApU!uB0RB2|_a3zv{aYF&syN}XcC$CD^5 z@|k?U^LnEXl_);ykZUbzW)^T6cyo$z*>imIQ~HXL(((L!h5Mz&g7u8kDXGA)NOBR_ z%Y|u(4<3L@y;B0NY?5vDdNb%3RGBoDJ#H7Cz@3P{k5;`J6UxPIaooAs>N~(+!iPC$ zI-v7CTOF(YxF71SOZbDEoH(DFSzs*?d4SxEfT_yJHyANQ6?%JQ>{d8WDi({XE0vPH zRA8G?r;x+@X(aVpqB+z|A!EH&)GKX+z5_Rf*&yqCHq~Yagk^b}tmvaOd0Z#3ADa-P z?hE-eUPDJlvu8_BMeh#t~1>;a`oZVZz z+O2biwdg>bXm?iw&#V7(6vkIa{%&QOl2y_Y#jiqM%}l_-WPOoqw^0#DBfn6B8&E7$~E)RfQ6kRGs_`a)%Cw#0Bq_n9hTkPdGmU9iug|}vA5nd#vVD4law|-MaO7rMCvIw zj|A)tB&9D4j81ZazvZoYcinNbO=`u^4txq>)RLtLN6Z?VzQ$;nW0&{gc{xE5*&46WpiUJ)q6V@WiTVndE z%i(;dJ(xIDPQp1tx^c#79lMrW4mXAbm7uTxXR;-)}10v}MGU^M%Pd153 zJO}H4F--NM6y7zOD@RbtgS|*|kB5#5cF%>Vas>4%v}rN^ecQr3*P^qv}Fbgb13Q ziRP1$Rdix^_;cD-?unt$u=_VQ6nE}UjcqFC%Py?yKk{nPPQ2lQ#qQIAK7J44N-vyu zBU!T97SNMG|7{Cm!%`g@I3I*_;jFW|w{zOn9M0KUEUz?qMJYZvCCzg1dpw^Qa4*t( zg$P2?Z==CKR8&4ru2JD@!?$C}1ZJ_r+48yjXLW}zKEo&qr?DxH9L{86o*A9R_aU6{ zsysml;faObo&@zrhyS7K&bYYP`g5@JIacVA1#27mTqNvE_~Nu(EZv#gk!U;SL^zvc z1-vWBtjv7|_Gn^$o8>~?!foZKs`e)GS4dSA?sl|W6jGT zGcWUA^=6~3SwLp56uI9lTS2F#T+QOMR zeE;Dfh*cVF*dXera=2HYHrX~@Hr21LI-CG}|7lSXZ?{NH)68o_;)quNU?eIhm7;so zWI!^Buv=fV-J1uW&n_Jn3UV9_CWdX?uglY>ZYvf+B9T~(LcAoB4m7zG1_kCMuUT6` zvEz$DM{}f7-;#yX?IgS*Iz#xupZI$N1F_fev;!vF@(X8~rDtx3vX-k!yPxn9_)?`v zPJkUc%a?9k@Cb3}ILy)*w}1&zaKtbUp9WMS{(A}Zpk-@d)-z+3_=f(x$`H-#bil{B z`b(fYACBHsN+x>^0lLFbF;`*O-8YA@iNtKMqyn7@q67%iZ+cx=~ay6Mzu4nO0sVb6_UW^opHK|gGY1{Qg zD_bXcxRi&t^LR~QszqO?GkTua;g5s^RZVyr6fr`*0>`F3N3kN^N3nlo^X_5Iq0w1L zv^cvD3lYCWmB;<_#O#O=S*gi6Fn%(!gIm>HJ&w5>PuBWUOD?wvMeZ?WJ)EJN{R60E zOy zZC+_`AWg`LNZPJq16to|)!?J&#PLYc{`7-|W$1#ld=n>wxQ31Kh)q$JQE+!m%c$mV z4Buqh*`f14-}njaZ-Vy&$tZwh#gG^2=VaY8`Sjq92xa>uL?C|bNJGSsNom|-M-fovrJb_#uLji#9FKcC4!@OL$H9>CHdK1 z4s-daI?@H{a=94oqW)J5V*xvJw6}Ze7gnfloz|M1A4D4f{?J1Az~Db&gPj>3AnvCQ zZk$cX7nm~r*5z_!NlfI_!QXV^>Cyg7TI6w-zz$=W>8fX~L#1j7{ibd;n|hboA<>%$ zubQcB>)5FZavW23zLNy*DFxOQhyNX70KDPIP?sO>B&v;oT9c_VBH}epYD+rgKtNt) zb3RZ88QO+^FPU7tL^lq#r~9g6zeL#%amWupB^%_n2)f`K(eu{wa$5H`cVo=z%B?l$ z>R~B0NoaKet7EdMdFH#2|5eD|23|{oYicUXC>O-&j+Jn~#r!(2>J~L}vNSMm%_`#{ zT#CV&lyZUc?5r$y%I61T*n+psw|d6EGv$qvuJSehqX?Om3B$iI{yp~h^<&dv$cTt2 zbzjl#whzs!PM6f?cKt-=y|I}9i+Pz8;y?_=Cy}E9Q$f>1IPN+nP0q7Xw2!$L-0C|t zf8k(-3N&Bvk16;Qz?GF~RTrkn%0E-6Qcetu`TdGy^A%11k4x zBv>KWi68?%lpEwgV2vb3o`_9qA|ssyeOm2;T)o~qG^yK5yA9j%IaVRs%6f1hPP|-n zQTU&@<>0j_NPf|ev_fI1kl2%WczT!>v>mp+@5$01;@1T4Hu9(>7+p9SPtV=|@w9l7 z*Dy9APt*8-xE^Mr6B%HYHa+o~O|v1s$CYaiq?ep?X8CUHkYI_1LbRb{!**9Yxn}B} zTMhKBaMQZPasmbNJ?f@d2010YyUqpe}elR7gIf6GmckJE8M8)_;Get9` zr+!I=&vnK#R77*{9vmR5jxlIcP)$9~YrNOV7c@2^`?JZVyHcybm+zSG+{RYqn$Nm6 z^Zyz*u+i*M$bIq?5)=TG%sntf4|j8RLy;WLKxJk+W+%HVJHQwHo(h^Hf!M=}W7#?^#Q>op111e^$9O8S%LN~NLhDS@9a10-+RW?-)(PStqn-i9 z6O9AZr1}dM!x<|sF$JVbJ(EuX^W(}bX?%3!0s>YVf5m^gu>E(q;0%glj1FvfmK-=n zc|R0XG$kbLWV!9UFTg*vk5Z3k2m$8eSVP$$YlFr&z=)Px$7~{|$}-V8DPcHsR&DO|(>GXDE88AUr z`fN9YC`#g%-Z3~)q$$L^`QrU97IraWwQgiv>qXXagltScBgzaN>i=~z zhNwP!yaM`J&er3zP((0?XUNd^{#MVEE8z1gLyN|(V;Jv_9T{1;F| z6B=p~ey8F#{dy3S<8n5op^6^t^=A`X;k`M>tK|q2gZ~E9XV6{#zf_c&2_gbrBXn3d zF)ON&%?mC^K+4Sl{FmZwPAS;`#CaPY!uB)2arox9xCY|y$aIg1L{T8A$H{>yjQMB# zx4Q-5&LI)Pk=tDK?c6&d_F~y5p+~!e3EsThl=iI)v#E-^_Wva!A(X&t9PazD*1$kO zpV<`S%|v33?xt2eLTLCzxDGpsj#bccF6g<72i~Q9Mbv-Y|ALOS`&aS@%fJ{3xIOKV zLy+_pkOULwVw|K#uFR6gP?YeeUDzo6PX^ilJG)MtKqw@*{O^BceiLVRx_cexeuGjA z3ve3OE6_Hy)f0@FF}1owB7+u<-+iLgit0A?y<29|Z6-gxxR0{fL(JKFz8E2hB#bHE zo5}?G#&DMO{Q38NQ61Q4UukUOt|v~ob2azV<^GiOgC&@BjySoRRnUc*1Hv5zyo>wl z!&s*Xd(%{L?e!|Mfw&zCiX;O5$Qr*7| z0|7i53TmWi)top%SxT|QH#|<3Z#sac?LW`4D+2If2}Yd6_}uERQm@Rzk@Whrw`KMd z9*1HOp1}j0(oFNM3#~UZ=OeF|4nA9ydG9QfV%2-aI+*liFS`FWrR;y2|A;iSTEg2i z#Q6H;ByV%iKPVIj1Q8k739NvrXM=fxMowY!=xi1aH&R7JxMZ;>+e$DN{8g!ADq)E% zqI;RAue&rft%=nIin$B(zjwD!q;DYLIE7x2^`9cSC@#WVUk+ePUIV}tlq2n<%im)t z$h3<%;&E9q*K9fK0-E}GEH)Fa1TQllG4`GJU3=Jy4rI)Fs%HOJ3;vRAueuK%3;(CU zYv+WJj-TA7-3yWExaS_{+CW{vL6AY4Xiz%>L%UpqclUF^&l!wSAx*)g*2>t+d zx~~uuaVAqRyS;6 z|JW6kr!pGDMbaVoZ_+unGY?Y3M4=d;C4M&9Ni?vD_5$59Qi5f9XK^pA-5&@M|x0 z=-rj}d@K~J>i!Mtwu2Z6FFra14(NDJV7bV;WIt;+q>h;NznpPEI&mwKZfeDftdZm+ zbt3MMOLps~l~|V=r=(T?s$e}R5yQYh-xu$#;Z@30+>n`TxYikC*&MpBP>;W}(=dh9 z(&ychjccuF^Qx3wvH)4FC599k?h4rT{nK%NhNV4j$8qagv3UYBiKkV^jimfET?s`;sD4N80v3O)ggCi_~@t zB?&^-H`az~wjb&Sr$zq_E;ba2D)i*_;(JMj%0+e;?~bD854n^=_3i|1E(PWhd~79c z&t%}&)-WdNbvv=fboc6gKOPKN-6qP&y`um1!9FtZ232q$8Z-5@oFhRTC3Su~NI3!n9rkC7e2a9M|fps!Ut2 zyeh38=_m3A^19m;PdfseDfi1oPamJI^v?~ zxaafgXobr-**sqfXkMwfRPs+}bLWS6T&9zXPo9*vTK&x*E-mr>g#^a6I>|1*=WSc^ z^kGbioHD0%v;LYb@;O)nf5=V&=iJ;yG}}jXw7g zuRYQrRtV#+e@8aro(b3VpAHV7b^{Bckifs$0M=$@B}1nbhFvQyhk*X2A+|_lx1<9 zjEp19O)$R%*;|F1c5Byj8qj6>0?MTYxVV`55!6O5q8xHSVNb|FQ{gYxV#Jo)#KSHs zn&TcjYI(o0EIMm#%g&nH_hk>$(pFoJLspQv$Tm#QIoC9N`62k;bO@*K3I78;jBWvX z9dXNfP05!uCYR4>a}`J*#Kgp;gd4T8qHWW+{U}_}`ziS`Wy3Cz$vltS>v3JswEnpsvER21jsRw)TzD@)G#&@^bgJJqLaZ=@&L#1Q1HMAKK@>c zy_3P6-np6X@ZzL9KUJWcvMcyMZ;&tvFk-u|2)+$`SxyAl2_OmWeN-r_cbs0sl!yM$ zo|~)~rwxvX`NdO#HH0iQqsud_p-h49QODwpNmRUhc-4&YF~lW(R|O23f5IbcsdNto zTAfe=6RR81U07FFmvfcJ=i8EfG?k&g`yFa-tL+D@t(&9#L=JzejEs+u4-HEfM(mR% z*06qbBF9C9j51z)m&#{{&jA9XZdWqU%bUg3vjeu-;g&~mt_QLE`H%On?>l5sktT;L zp_%E_uEkP#Hq?6si%Sk=vlVkhS{C_=xa`LFQlEi!Ks zFs-co%zv=1dSo3HHsthBbBmZzlM8~L-zX{9;)Kkf^4B8F*si6v)Y8vej8!GJk|;mt zf>DJ;9DANoe6K#hba-y3PvnVx?|3z;bQ7iGo?;4%itIx^7$;KbsqI%gV!e77f0iod z^)I)#y{{hk1qR=3IB!yJMl;``k+D%CL#e`-LR4*n=)<({PlGf}R571QnNjpIAPhN> zh0NE;GxFwOl0FG-zf)awr`2)GPZtDBq%i0N*)G>ohOp<3#(W{+eYt4uZPz)nxnFa2 zA-{lOPpSCSr*7Rs7zM?6u2Q24jzj(DNGuHv%^3V7dAN?;gvo{Q0`2MI-+>q!D#~`( z(>uJt>X3l-vXyYxM)uuF8v4Mx*MHvZxRuO(APH5_om7=PhxG_k)YW6Dc6ERk99nuj zL2JIHS;A1Ohdm{ev{GrsLR>v&3O&^d!V`vX=RS+QfJdOAwMHtQCPEp(nHKJ~N4VD- zENW+F$9SI$ZbC`<2G$h=ZRKdTEV`fnbhacRziY|IyHQbJADDL%vENh1L>j%gVkSq+ zmO8cP?P1CSSB)NgQ~pKKl)La#=2BA!Mlsnqa@2Dlf_okC-TES%6HqJ0XuG;=Xgjy- zH$h0C5FSrZQ1Z!GCR{dMfGYfy>vpjwZsdPYi%o~?K&`DBcbZ3E3iU%K*zQoud=0OgaZS0Y9dEwI%~(TdamXydB}Ol^{F$cXgRYp zCDlBan}(@-Tk)$BDFt@9(hlvei7LKewdrUM^PK3*q4>*~jf$IEzkVriO}jyxqkR@{ zO_ejJ617rpv1ScXGR5lyF&YdMF8u~bUp5^x3Jd7+fLbayRGcSOTB@6`_(oCRGE8LU zt=aU$uVjD@TG#J4*L_*x#!mjO0ilIZ#v%Ti35sx3b13LlpT}fX*K`-D}O0J68LD>Z);<=c(G_syx;xGsS;FIT2klk}W`K z+SSF0i~rX({~I<%UFV>I_w-0(Q>yFl(HgZYjI}aC#S|SG(^r+qNq|N#TmudNGZ8j440Rl{+Gk@>~YFRp=ixDYkpK5 z_BP5x+&iP$b}2uc*j8LIi=*%{+($~iY^rR&L~1VKam!+0i)0@Q+`>MuV?+Sr=Qf=T z{}tNKEQW|o5Sj!Y3o+cY-IR8L81#W|`)2Em7TULqwFA1Dt4y0;swU*v+I}%Szn0pC z|GXrg=UOW6D`OYrQoC!HyIjQ8uGP$UR2mIu#3TGPwq&~O?Bz7*B2es~Vj!i7QT=k| zd%4MduA}i>iApDyQdavzLKjNwhcQs!lZJC*l;gW4ib@>atSqM`wK7(1=h2&;AnWJzC#SM-!149IUnxlp1_B z?GGQdEYICy!}|`3|NL4sCJ8{r5aO!;Jf7L_&FvRjVpoTiw#Zt;_KEv1g%J^^O7<|h zu)MQ#QSK zWP5sqf-WO5sckNMe6hR*HS1}0f5AO=wqcb_411f*UI@CJ-q}RaXvRcg(K1})FdG)y zueYeXu{a*mj^66r+ziEaqDz}VBdAo2$z&W=D%_p)1&Z%tBcI{D<-oTaOlBX!$ zkNW_AfL4AKG3vEMn*ZG`nRJQ#ns6|wrJ}8k`#766k;*tY&*8`_wAKC%Cs4ItJAha8 zYiGMMwX#%$y}S+rJiN(kLbuQKsn^Cw5HzA%Zo-TzL4NB`2pS%i$<-9mup5W==YG7of59FXw^b+ zz$WA!?yJvsg>p>HUenXR-DE>w3y6Ncy@O_9GBLl5|Fqg~%_u>eR(Lhjsf`>m>YX6W z>J7m{L8(DAt;gpn(yIrw1YUReJR{g|H3T1>W6NSrxfy6w0d{UZK)keIW1|u|iw1CU z=t^bWSF=&2t85{e<<%azJwn`&23qlYZ1t03)feh%v_A50CL(==1MyyNw%W_-SY9mi zNd5-(pf{nhm`Kgd^}}6>{?U7GBiV{X0O^&3wz=Bi;o|OcQQp7$-=GuShD_4d*cQZD*X_SVYXSF zBTvuIb0B6qh5yAo#gSh(%;SWQIFY1^XA&_K@?zS@yL%)kb(d;0xqFpoYPOVJH{U+I zD@=+I?zV0=fBC&jnTW8AS~cqGjpE0VB_*kw% z^!<2Vp09HU;>-PAW=gFFUC%-#LZX7!tqWy-w~Jji!!qdGk47B5CM9*R%X4n+l8R7Y zBnP&J*GXnfo3R9U?SVVU<>#1USn{QOQ9*BD2=(yOAJSAVUj@jQUb^@GwnF7S|L0i0 zS9^qM?j?glfa~e}GpkqWHyo-qL~7Xx!!DP|)5QwPCCyshcpndNh*M2CRKYij_p5jA zWNt?gdCV7<6U0g;a$L@kiht3)2n_fvi|YVKafW*7YMp zPK?CZ-Y3y^XaL(U zj~$}{j|v|d9@kTs7tc3G4&OBiZ=nfn*}4Z?=}+%N8_V>G6;@Y@-&VOKVCNP4Ay7yW zK3{Vt#;o%u_Fa_A{z3NHFd?3JcFa_J#c+{*+8B`28*`!>=~4%YLL%MWnh?if)6s@~ zHpWta?lw^yxeGJaM_QE9CK%kqI0=W%0Ob+6a*B_L7{u@C!_=9G#W#m?Y(;f{QO~j2 z*STvc7#2R;C5~O(wI{sRUV5n+I?ZPbyXV4mJ#($ABT-dL1*6M2fRVyUS$@1hyL`Ss zvWhy!#Frh=3{Zt_o_%oM5|j1rx?Bn>Na@W6BD+&G?xTErBPorDJNIqayP`o3! zRi~eSKLntkUYqU~6Wjv(!vkMqyz5X~T{YPPC;X=2t_8gALK z#xc@X+O#wI9ns}$frZn0EejyJxeAe?syk;G4J;{6U23neIZY0qYm~jWW@FZY-fj(| zS^*hDzgmmL$P_g*L1sleoXdab%Kf~SWp6Bkgj{KLDM*VNET6f*(Ti4yqo+CfdH z_bA+iI_r^|Wbpe}6wl7wUi~Z(m&h!jAYE_0EWQx*TF|u|$>R7X7mN1?Gjffor2?X8 zp~IfvcH@`O^T7?aEb^)P9?#D5R%iv{7>;bbAW-#?F_(DiXjaFo-Q|QXQ{YFoj1Pcl z$x}XOHdqnhjOkQFwk@!|DE&IpdKh)5DX16ee~w+Yr6mRJyV-y>Wx+ zvKK`TFWjr}auxR`X}DpzxSFs)Ch>}38n@TFg`kgN?eeMyj3uCjtnSnLv)neMX;t>7 zV!v&)2baWzueB6*zoITwXQ*f3p2@`vY=oUI*U|eMcl6-DGICab232#&!z7Q|2XHto zRdNpaB-5$KmY^7{c&|i@9g`9+dK=q;B=TSI9+tT8u<;jO*J2*$!tohU^m|R{UC-a( z_~AWLZW_HX7sKU}pTdM*ojBgF7AQ2+Xyto9Uy7=Eil%C+l^&h8K3q8HGQTkB?+*n8 zG>~)znPaF(%NizrI-JS4PM$oCml^$@74~Hwvd-cP3*^B7ZEDGmT#PT5k&wiDI;3Cx zh#b}7oTy*-C_lILI_gGU;j%*5^mkPE`gp!jvZzFiA%p-_!t~t3RAmtsHvi>PbD6>( zpz{OQj1}u^lS#Ns8`kiccu)P!sxMd^GK}l$z(WkaO>gr zjd94=+B(8Kzf)SYv=@DPzMdFXhGsFyrnv=@O9phi4@eLfvN5C zhJjru+_dEve;HDfk_yK>D;>E<4)*f{2ay zWqj~FnbMQhQy;n=`BF5UTMB|j2u55C(CT0h+@n|#D$Bq9d=0sT4*~7ZMJKrzjfiFE zG9G#)0)LD>io?eDWUe1qFTLIr0}<9SUC(lH-SA1YueAbWKezn;a!&jd#;L-7AJ2li zNMeg2redhmw*pQ34LSYCjfL8nWTZfg$s~uPu?v5Wy8T9+{Zvjz)nEp+gA|^!F7G7$ zTtmFLIn9+GV@-pXkOXr~A+kTq*u?MYu<3O|;m1Ghl+i(~L&y5>JH0-BNnYJoNcSEs zSuDi1xnP|ij$H%S%Q}U3@iO=#eU%=xLw7|NgMN~+!>;R=>DLUaYS*W}7Q5>uSmK$^ zF+>i|!h+KhTYptz0&mwp$hh6uFf2TCU7V3IGY1POUD{iV@?pa;`1Fy*= z=M7&aY_OrLwelHc{x>o4zAYE|O#ha<2tRBUjv!Oug{ z&^5(RKlADbF*U3`*DTu6fi61VAwxuYah40%V9Yc-?+|yMiAn$ zzs~{@mR2X=nXM6(e5S~nNGE6;5!XY9fhL5xi+id>va1p=r&VWYV7t%=UlwNt;lkOt z3X$f)8)dsxJu$NMyiYU&+mCuGD~S{ac4|yl&KBK(&If@sHQi5GIu`Da%lr#@Wc2cu zPFR%&`Riidy2|Fv_kI%ZwU~B5Smg2x*Lvc&u4f9(jfTcJHo4SoLDkbuah$e~5QT(x z$vEdFw++=J1U=b<((Bdwfq?=T`6-YX6lth+03K!!4yaH}U*t1Hio6IlIDmB4_f}r- zxCNdX^(JRe>=jg5KLqyPJ|gw!nD`}9r9ljuHCldn51(~Q!*hom2Xl8Ut&&++<7w=XvIh${X%;D?#*_BbC4sILle8}Q_s2-Ea zVNY@TqmP1%OX;I;1Di=dg6Nx})*%EgAz@N{fNLO01ICrMHlTj7YK%fip&E+tA2B8f zH-`g1Fm3cP`E&1pC1o_dDsSRvhdb%*J!D~a$-nARR|p_|oG*t=HSG@xuny7vQ*zAX zbsK-q;l26e6ey5Hmx`1)jhi_9#Ii^3NK3NBq*@hp91Uw($xU1N~j<=hN}7Ome$FLcuQ>D zkxdBbT_hVtAwRd+0B>u|xLW;DvJ|;*le;b|F>|1;Y1YT1c?*B0=_`oWMSpp}sge_> zMWcZAxC7>Z~>;wE%n3K|@)kH+RY?0^eoCCp5CRZASqa-9tL_hlo`hIFR;~}ry zu8^ACR4Y`-ISQ{;1}<|BrVbOCWv{FSwh)^ep~4S8iUxO z>5#SEw-N}qp|6J@;(QpmXe8qxC)pnxRA1?*-4qPD?&Y0@%)!V5jiqRWK49$E8^Y;Q zk&B)YKT2Zpxt$Trz^)JlNJ)d~4(?Yxf*zT1pZ+EYKxN}zQZ$P~&Ojo-4;>R9NzQQI<}>WXcvhR@b%R{e>; ze^^eR2#sX2HPVkYXh<#pTzKu|!BeBjL3!9}Z0{d`5B9yKgfDuipnI88K!U|$4MF)88?0IC~pVnOgp*%j#kN%eF)?4NE zb=|E7i36Bu_=nAR@6o$_Ov-bA8n|oTO^fQStoS{AAOiUBNI02@p+$|6eX6yYsN8fmEPf@IV#mA z?Q!7w9;R3r_sefk>cwWm@t5T}l~7!=*HlPGH`63MAV{Roam!0&(S~8p3BD9n4Hjxy z2}~h28E}|4w9AtN597?_e)QeuwLhT&AkawH`Q#f+vZvq0B(%z{aK!8lFvMH{hic7|Eqj`1H_nWBF9wX(NTKa5F2Enr2LAmWx6h}~o za!j6?&{vCme_U>s&EaTi8B66CYIsIrge_W-6O%)Zd|J&6u)=F1EYU*eCRJEi-c?-8 zdUt62?7%kZjM$8JU{UB>Ox3qkV;DTO#D%ii4hy8@$}}}Aaao>O!n4^6|GM9K{xkU) z3`^`3^e{|M!-bF+CU4O+v{47o&P#N@vw;DmP0sq%u9hYu1hazrBPSrD0TNsUP@s2z zA&zGfiN^eci*6T*n9Ikwwowa{g}5FX9`5Q$aq4E?+5WcCRz?6>&nblN;K76nihe1B z`}^`r=Q1OLWox(RO5%b|3;gqSFZmt4_eUjhMjBC_QA}krLV=GcFS2g(LKA%X9dAj9 z_{1EW(1PsIBZt8}B_%cVM(&>~t)K9O%&$yalAcW*8R7~6FlMwo(68xKjw{oBxKthU zc9&vjA$2pbc+iGNL6Kgir$Ec;%)wLP_^}U266>iDv_r1i$Fo&xm`=NUxuzq92Aos- zTMB4=I1Mf`jUJGY{d!4*$e-i4H3b)nCMowLt$T^FYOGg>y!1d1DKW}>Oz9`D^utfE zqCFBh`*!_1>=t~Ms1YK>tD9msd1;he=Z?Tfvw&`BI7R92s`=z>OEXyDNRY3n;eO)> zhWXsDs3yuXt|hU5Le4f2KsJGHIL12(^zU zY&?R3lk+J$zi2*iM=tHFe(GZd`1Ikt8@4)h7kgCRV(!A=%%=195kZ05U_wdXVoK;Z z2H?T%<5ngfmMrp367MESmI^lnSngKT@ZE z%}EnLlLQC$g|vD2%xcZ!p^7lD5&8yWKNSr=El>Rt^%FtfO190EqFvS0PLABgU=FeY z*K0EN5y*i|tR z|JCrGoxjvmUJ#TFu28&(091+bq%dZNGa6@8cV3T?_ul%_{yspRUj<^eF!UKt)28X@ zZvdKC<(v|CXEp~a9U4p}PbQg#nzaxhimhfrRslSbF)_t;VY~nq0y=G_aa`FY{-f90 zS}aoiItRi^-EQ=n_4=PepS$1i1fJ|y=?Ai5r(hq-aj&PX4QuKcBvfRATQLf1V z&lpqaHbJuUw_3TOhqPetCqhFbk?O0`JVQ5o&*ZE`ybbFqe*+mFnazsPud1yn$0VRz zh3wD5X_V6Sd;N-oc?o|QxLxoL7Ba`qTUxwq1~+Ai?>f8z^g1==%wWbh=g;cA+kU+H zpG%a3mUh>-?|}5$6&!WjT9w*?I6^Vl?%%wpmT~=82G3R+*A1B`)DFA^Qh4G8)0NI2 zvz0KYXeRh)TR|KN_I}|TL!9$f#6OU6T;C0U*_^MrGC*&Lr_gB?J9Vjd7Wf?l>L;T^ zn!k=S8FestcWhVcG>x!HUu}RpFT&~-w%>k{HQjdU1m{vDH8~g#v)CP?J(I2JTnu$m zCAQ=4A$*4v*3%ezGF*a%H*ju=&J=d%V@7)$j7GbcBr6?}X~vF*^@s-}Zj1Xv>Ip}2 z)E&utpv~8?1Zj#Q(f2g|`MZCR+Fa!_#wvB+6;S3D3r18t^fA?bb+t3A;dKC<&lchZ zL0MX!)vg_KKeN5n%VtaA&-hTK%;7FxN-n51+)V9T4>fEI2y1Mv33L`nk=HCxYOfkf zRS(L2avu~+W@V(8xT}*TC3C(oQ#=Li2*ptJ`;c5Mei7FdCT8}kF+)C8WfZpO!4dbX z9x)GOA$Migu?Hs}fIz>XcI+H^ubxrMEh?*1c@%b^lP~hj3u>T0N%QQq83eLp4UQzi z^$n+^j_3~vDIqLS&}*qH6aJh^V8s-H{`UFt-nH&ReY#RXf5|4ON`Wjcgezx|=b5U} z)B!Kr82tVY5;DWuZtc)gNmzO-1W^9@Hl=~4wQ}Mq@+su*S^YC#aR8044C#%5I0uH^ICr*TYwtnr{5K$al|nXklaRQK|+Kc zkG=PB){=5erguCMU6jemd?W%_q90)O@z9z`nFE$LDzNv@w)dIp3 zcDm4KMHR1w`3kFW&FScl#*oZcxpxCngYt^eetn7j5$pn{05+gy6u&=>j_i%}3-%JW zoTg{-2>Ep5Sr(}C;ZC)IJZmm{KdXyVt4eezrlOL+$^QqWK3|P^%{17B4ZfH&>nTIV zM~;Ld5T$?{_qYUG7zjm}^LBhJ4SwaiH6-nYBk%QnWn%UFbf3fUluCW;R3s3?eP>G; zdfn-H%`7-LV|pUCS;lVB6BABAQFyvSCqFqUS1ZRBAh=I1j z24lW3BMzuBEmnm?MT-X{L7zgMM1v8f-geo-6tSe8$_T`e9M)%s{qlH1V`}I(K@twQ z$_>Ou_vq@2isMyu@^(8s1*8MTNN=xxMx%Ps_(cwc%eE((iGS1W1aB-B8Iuwg#2+`s%+}k zr$8cI3bS}D-r^UC;R6DhYW5SfvJr^3Y}01??ZWSH2Y%xB69fUILK5KBjU4sg?Ejn_ z$@V%3%BS2u%{TLKOVu4hu+8zljIUWH|11$wTv6IzYvy_J702?l7gFp8+6@uyN^|N6 zRyky#(W$aTbdT&~=`SvXwNFXn29}jgsf@&LUBRo!)Lt+l$Y@8={qc>FOSF~thP{rQ zn1NCaIOE!J!6)*@nWZyNX( zTkQEyrrPQ6p2!(3mMzO)%a1x?ykAa*x9#y>=3ehW^W&Siv!>y92Dl$~y4?Oig-V@H z_yYUG4zd+>?IpZe>%T1qcQ5#mo?CGwsU$AudP%R81|Y3 z$piWwA-vztLI4+v1?01sen+KL*$_Lf$pDfKy_<3T>2E1skOAl6u)m`8N3wMm%+*IO z{c)8afeRp<)F<=Y8ks7dW@wy|;U!ft{JJ=^H@>Y-?88TNYGnn$yrj6Udfs1fr8cL` z>I~l88QJ?eb-BR4m@jHTM}$sF1Tv;D6n{m@&5ug?i}?U0`qg#{;P+ScT;TGpny0K% zV=`eo_Vq-|(o0iC&~4oNr%j~Aq!t_1=WoGBuDy356eoW|v+!0lE_6l$Jc$XyhIYUd z(*3!{Q$V2TSHiW{z2UInyWt~oo9W77K#wV-D$YimA1^kIejugk>;iF@w?I&)>C+6L zN;kAS_+4aH=oP8zOmebGBjvK62rD2gu`lw%`d|%a$lwSaqXVRGRjM(n~yW3d}I>K0p354?PqEoP$E1&uP`%Z^7s4n z=^VMe9^77dOK_ji1ReHP43YA}hmO)PVz|oX5#Iu2*L5--K7B==4{y}y(-&l)?lgfi z79I&8@rd%y(wN%R3eSdvZo{O^@-e37wDI@250LH*mtKoslAP!r>O-`>>!ka0si2LO z{v@98sGKYvO>fs{L7nb(n%z^qOST5Kd z9O9vZC0xGxG&uIL-lJ%sVUPM`Dl+F+$R`G3^C?jL-IIxATkzQ_&#nz(4!V6gwjAIhqo9H4$Nk-Fl*2yg>?x> za8>J3U7wcuhL?F>++)FDpZv^xG~Py2V&9v>E;rpTziF}dBUa3Pqh{yqwjOP1=5QV{ z_wF$A&lxk^iJKdMZX$T!*PaS~hmHRYH28a-iTI!paa2i?DAqQSgazf%Dwfrty4QKx zMH@5I8=X3zTEjmcFKFMr<`}S|aWI({5A=RSq5sEg+q)dAnGFELo!k$xn`1r0!YGRUJR=2{H0E?VZtY!Ih~Jv@ z`zcRBLiAHTP|5oUE#Pz`>(ZBONWbWXQ?ikS-XB-PPt+vskMx=l2?ok9+chKSon$`Y?%NKsSk(CXD*}T`P}n52_RYjDH)lqg9sh6xdu8v2o1`93fk6 z1rkd=-$2cqDQq0wOv-*v>50i}+JBK94@TYC(I!MuxfVUi{UfD$EHN4kO>q%_F)Q# zze1Mepp;^MqEVM3wx^`p4m4TM<^uBqf8D+D6n=+YYj+ZolhZTXWx}_gJmBi(egP+t z1qlGKKe(;8TD1!SbM)3gU^IYjCA_eS1alVwvFmispP_h!UE1ko4S9{oH+TZ(Rc%uY z93a3fzY^r!us<7r!_E#7RxD!;2K{W7OICMna;Tmyqr>J|!q!6{f(nN(+b7ILMTtNA zqbKsZ!<9Zu1}6b#_H$bAItf`}AyORnB+Z*n-loXHg>QyEA3Bg9SKk;eT(nbNf%M%hp;JU&cV)4Hx58|=H2 zv#tg)z^DNYa-8u25D**8EHBrPSMv6lq*1c$r1DQ7t&Rigk(-KFGdox1TL(z zFRQ{6@y?H-RthpQv9-8U4ZP&=>!24LI0siF!Uh@F2*NKSf~Z;G1KwBy{QXK4e|m!y;ntItlAmlRI+?lSUM`xgE8FzzF66X}KrD zl7w-v8)>ad!S|7}`h{$D8-t~)%XX>l`AD-nRY~#KMGb_{H|XQxgHDO0;lDPT*bGD- zAK|h_EfS)0MeGPW_t+a}fz8^ep$qOM-;N1soS z(1VhNsnc0=NfuS*Hn%;CZ$OY0+TX)J)l7BQXu;2IBU675?K__>{wfxbw%d%~ERp2| zSRoawqHb@>j0x0TC%&aehO76h$iwbJsJQxEb#M4`i;q5ou^XQV}^2?iW_IVTF zCgV?G*AV0B4&<=Q;*toH`ftw1A_nt zW1k{T9UPu(1cnARq91-;I(hKU^4#<9H)Lk8rKso9{G>^!7UQs*hJrTS-(mVwsr%Ak znke>9$FP6hj9Em%nNo!;HHa8n9R#%F&$eBgHcu@od2qSq_ z4Of*JIbls9DQ z0;l-f=1e&EHIzaHMe$cW3eRQxL@#a$u=g+!MOW zjeTbt{G(h^u@^5ZW3}N&jhuqomC-kd-*h0?LIQr}LYqz1{~#(BeNqRv5IsQkKMW`w z92nR~eXQZxH&5A7E3u=yDvhapzqlbIG7EwxK>K`Zg3&UwR4h7`MKDW2dG06KLv<*b z23M%O;VFB8r(!5ffAtJ-nl^JF!aS?*3DLmB=PIY30uZs;L22ZKqY$O4`$&^?tM_kc zvJ~&G*2IY;RLoa!RetkTz=yg@rc~+g7*|897W=3(qp!f8B{PiTGe?2y6Co={ADnw5 zg6@8-vn?UP}mf3q!r0OEKO8&BQTlbn4)59UkJW3XonKvFW~DU)%_`t(yVGT55n&{{or%2KkeS8K zTGqL~r_iFrX0@2(6#B+ULS1xLl2byHF@LbcFX^`!IR^%%*n#;JPCs5Z za^gxBL4A9E_@-yH$iJXVJkj^Y(%YP%1?|o21L>|ouok>ssqeh5;U#PLs(Q&aq_ekq z;Oc6$$)0w8v9Y1FNbAYl(5!r%@>R?IK<6@RRO%iyQJPaCV#j1Gxu|ma!-lPN*g_uL z{oc}`abNNF&_YtfD7dRa9Mmk(ezHql;RX1jA-optyqAeX`_v7FkMWzLd>!3tAMoA; z)H=w#?iVZ`>`{T-BAUuQ6G}9=>~!;uDq%!987rOEJC0`V-C2|bQ48(9$8dpQB8Je= z4rW(b!Z;3@GVwJski9|7gxxKG$z#fOOabnSA12TLT6X4K6E*!b2v6DL9Bvw4f_{~# z030;_xhE_TFKPxCwwW@%Y|LU+2QH0ACVbtIy*z7$t@*5#I zIX3nkW&W{u#+**@E;@Fxk&R}5}JQ>{GEjSE8LvVKs1b252 z5Zv7f?rye{Dvoz=B#FS-)(B9fI=zr1&Riw~HTwAJM) zm5NG@QfyxuD)^ zL?oZ=lg7T9NkI&3yqQS9DX50Syu=CW!rIS$cF;Mfgi9R32B0MAMrhvkoUKP}y!z3+ zG{1n=$9MX9DTbu^;!m|%(Qj0#sZw$R14jm(E>4-z0+nUw#n^Zq+;NUb$UDTrh9UlT>t{ZU_?ORPO3n2=;l%C1@sh-f1R?Gqg zE=4aJF_EE(D=`^CWyX$i|3L3?{Yo7{x$FZ^#V66*Dgc#8w|_5Lst8ZiRVHw|Z>f~)c4YyRE_G(h+{|^FO<08I_Tjbl z&Bny9gT>gAMA=e}%Ovuva6+#e9Pee{zAt0Lo!%?*Yx*8vF3EX=9j&;9jPCpog)ck6 zTSib#i7gjaIA;IpAyh6M){WpsdQe|0C}y%;>`UhM=*2L(f#>05$2vEZIh5p0xz93} zc%NZW=R4|>@?Os(y0c9bN2>4e={&nkqK)(ZeUKKaCNgl{pjRNJ4%@tmnazS9Xw-l+`4ERP2f73@3g;kto)eo6s>#Sv ziy3FlxotX2izFM`m0ZVi7$$i|Q3!OdGyVhJbQ_<2g6Z^OQgAWh3#HlfmpP2>e9Y=3 zx|dh%KQS$u8eJAtUR#6r|DZCtjgZhsQ;WHIU3C#6SW5TzIOvwB$YgV+XGngd!tYFr{ChG5IAbzdeB- z{N5*;*KS=>cv%Gg9u;tRqE?La>tjKc4Us_;r?;_jK?+73RT_XoFD@=Jb6(G)MG!xmMmMuvNkxs_=4J3~lo%Bp{ z$Mg0fD9 zSnWrE+SgNOmhVCJ9zqTlxWwod-as;q7OB>$9miz##!mAM!D*l2YDn z8^JtU{gVDVGcj!YBfDVYcjzTQnTie(@NRbGgP*{1RjJPTb*oG^yDtvAMqs|d!a!&&2^s)I8ziJv8;*$PX4f{`(?JJ(PAAYk;-chs-K|)3OJ1Ozy1_G z{AGS}6qA~pe{GH>Dei0-PcVVn$GyRCbvKmFeV$3No#XucdvGFYK&6edcv)$kT}7Q< z+yoE2%cc-z)_q2%er-#*OCJDDi51T5?G~p~OuQEU82owY_nJq>r_%pT@^F$N z9BU6h;N)yw9x##{6uaWrTohv=w6MS{pXh|4k7YySim<@$n%{r3SWu?A9($U;ABx>8S8PlZTJY7pJT&fz|#ixuf?Bpyd+$1Gr7x46FP)UntXod zAmV}3qPj`%aBD;kK)#ML0>7QT=1ZzN4&mK!qbB!27+(+y*}ky0%VEDG^mnU?noQ|c zU?_pJig~?y1$APNe!?x8>7=n9i4xxB*isY`6x5eXRt zH0nw;YB6pxvpVuD9dYaeA}Iz&a#A1?{FYj!G;)(pg^GJsD|k<4P=nE~Ons(6Es4}z zS;ky;i4YgSF#?i^Si0!2x7#;QLqkO4Hh#rOeAqvKfH|;0|3K~UQRAa$S208q+HOR{ zpz9SeI3m!NJvV0WwSY|-?%iCs6Z)O6ms`UYqh6cfsHQ(V*`ZFqvJ;D~32VswrV7Ds ze7ETa^AMAqHw<4M!q={LO&u$az%Na7iP9x(;G10TBBoAZsWIP+>eO8s_9`QV==|oM zFp7lFX}*WrgHqw*zO(TGGldJW5tSQ&v?~!&Ws~Gy`|xA=Pye)}{PojSB0=z>yUMl_ zt+f87DztKQ{5(^?BApio0*3dR&>>%*_eZQ`9Md5*A{y6&fDeq14s#^|Zj`t9pZaa( z2j=~8C?6K6^N4@-$&-6WV(c%kzhHU3qj6uSEpu>1;P?e1tpro%%!RCb z`z6tgYY^wI(wT^LHhwa?4zu1;^mlRsMK`(=xzeuq@`ofg+=xr~Z2U&PM#o&g=(3G= zWSe;6TqY|;Ci6oO49VTgOm3_9S@55Ht34&AgXYM=`4UK1^waZTtg0p25#X5A23W%-DEVOx^v>I_vJhL^+S z(bf=2D52rgyZssM>X2jg*P%&H=-J@);A%tdO(G?iQAYznoO(213G(NP=5lI*QDD|0 z`+7DPI-+`hipkfg0Eq2pJEvxd2;_K)(OXN!2VoR+1QoOcKL$YF1i~A0dosZbU>-^1 zoG;MhErQdJbJu~P`l(eg^W>(80M55f01FmZbH2FXv#HOS|0wHI%<>x#6gyR$^5);0pt>r~X!dya4mX;UuZ?b7KGjxn%hI)lEeD?LuwhH;k_k9!qI7ngU zuPB$()8Z+<^UTDo6Lxy!;k28ONf$D1RCp_@LmN#JO78tLBl`d!;BW{Db&as`r&qr} zHzx2oarkDILYXI*veKMv1I-7(7rUi@NqSx4>4d%xU-wnmkLoAd$DR0{#C)+HU)}_l ziC~3L_zmBx$=d(Ycu#3bF6tNuCP55bq-ct9B(vdQ7bnpt@@v=@Bo^EgDND621E;>! zpmH^PozdPdOfB_k(K;|}S4{X=H0$~A!9fDaY!`by!KKHC+E7tK))dz#-MxK|{z+H* zkS@8>#mLLXWD{yO?R4UyVs>cl5g;i3Y}LJ&=xDi9NjTxDwnh2Rx$W-4sBaOz&pZK@ zks*@Xvobg#a-0VgD{>xv7Qf&DKc2F@45>;(VXZv!Zh6h9zHXn}*_ z2*pmxG1(4InWfpXkt#ARoz)lS-$%d+OC%?!X7svBe;atWiXA>f$>D~HGJo~KYlb){ z$;rz-47&VqB`oJfNl$*p*le>(5#8A3>7B0t7VHC#(zT<0jgmJz^4I8-d5@?(sfv|o zN=yQ}n8Zmt{!OY~)_`#C!4|$E-AU12X!UtFAHg#sCNktWE}ZceTprwtRWKIT|Av~) zpK9Bh|BFmz&*Kf-$J*`+V;6r4wc)RuIkCJY{Hc~DZvw-g_KzIbI?&Grht5x?B;6#0cDa=JpJ+KeDt?mOFE;#`WU z8cS3;s!uoFd6{uLHkAZ!eHM1O%rhR+8WNb@V^!a;r2ZoLO3SWvlV8Gv*G#G?8p*C$ z$`uG=57!&N&qk(o3nL!53CD?h!23f@d}MWg8Yld)X7FJwDSZVt(>|knp4%ZOvZ{vA z5eIPauZ>0Lu!=BduRTX9D_MrHX@yhpaC;!{iaoj@F*oWTDZ@P0VJRXRajVfNW&mq}AOWuGIxccQ~d^_?@w&d;Kg- zSQ%4ZWS>7d#B%<3P^2xyO+;oXo2!^VxaEi*=kOS_y^Pi=qLM}%n zPG@oWm%A=?S97;hV;`Mjha<8ApG2SzO=}`;6PN>Sy4$nvX7`i-U@1ud%FzZ;wobC^ zG-?{fiMLm*`{&^)FZCq*zjzA}ah`hgbAc9$uHEs+$746(Tl#xAzNo(n+0HJ#R`6uT zcpHxU97vGZ?g!Tp2j%jTf-6)%c&B^JJ9sQ*(5YU$HWX10$&S9N;C|X|9_7oBxyYhZ z|89`>61Hp46o(l8X1vN>$go^$+v=U;gq_x2qEcI`McQ`3tNKB~(y(5{o~wvTIYMfioh7G)!apx565{s72^Y5a ziOlonCgyrBp$g*=!evP-|14tjQ5a@*9`LVAz4RtON(hoB zvRhxb!BbaJX;Vtk0Fop`N1}3H@(Xq;20SQ#XIL+4{gD%hyHw>euhv=34zNGE;v5vf zY%R;Znrn2NCm?br%sg3ZSH}Rh$cD)plTm9R=zC}8rY$KD_&(!pN4V6~b3gc5<=%Ak zm%VU!EI0-E-W|uYNdO=)$OgA(jZJ3W5#li z8>7zT_L)$tT} zYvg@?0{t>g3b$OYhkA<3$&5mdUaf``#v8d4B1kSOFuyn4A*OB%AP0B{%p3{e*lweR zxm*4{ADar~GkJ}t^c$ldR9B(^G7yBj@1-BtIfg{0r7~KsDUOSSf@EicqW8oOO)V#J zq=`{E3)xvwqiDY-#v43eW3A`^E1l4$ApYT^R20dgtx5sxZ#omm<$Hj4>QQ-McOv5c zfJ6UFfB0d|@SS@ObZvcczvh`$vt&&`)j|{+fTm%&(6;7!m-TbHVHKO*Eft*7mb*V1 zWoVOF6cIMpsw|0gw3Dc0sCwtz!aS6p`)(w$uw&f5UN=3IbzPYm);cAsI04*z-0h9UP|Z zJfF(p;SYYbO4TdqG{e?W!QgRfjo3#b(W!UIM#CUtX~Mc`spBw&Lq2N-faBt1fR}e- z?^lkgS3r%eoQ52sS!=wU+gX=Cz3fD5H`%*OeUt19z4JIP!*I;m;B8);Ky(fIsFvUE zKXef-m&&tW(j~p%+Q7H5boi6UB9G&DRrt+LxNmDZH(!`r_G#*g1KnyV-*nf9aGXY4 z1Y_f&ZSZBCsdlGF@j=&JJ|>Aze382hSAXrdk{ulO7Wn!|XQz3~bY5oN_9C8SLc;yg zhtTjM5*x`{7Rj{fF$kIrH#Ip&1Y+NSIVn4b*kx8mmYBbXsJbDQlDz*@_&vd>Dk0K0 ztlgTJeTIJzPq9?smf4ew2_a&$QMd-)MLQrCvAWCcTTyKEu0X`In}d|G8|#U>!Ik9$+6? zzS>yba z{zmjwF7~Z^7pA4hA~kd9>}KI;0K}UJ=))!u)RaI`ksNwGT%_@SPVq1OD-zD(n&&*pFqaike@?Qr*)mH@lR-htsIPvU~nuguifn3YMk9kTwpW?;1ZS_@!S*T&tqNXPyx~+ z&*(2H#c6z3f`Vk3{>v7U7+&&>k;0?~Ed2QZI6m~GCw^BWD@n)^j%fNB zX!nz;_xLRHhzaVsJSsR#`Lhm)h%Lfpy|2#O8u5S#*NgLlg=Jv@NV)^ zvo5|1iQ}bce7vbAf8H=VwIZdf5vM1q=!ZGJ6 zrVA4g3`BW2@dGiLg=6*aS&pj(e-uI_qYU_5_~F}%rf;w8K^d$^hw+=k7k~q94Z`_4 zjKkk{IQhkjpVGNs_XqF~a?Hk1Ptc_VcI4;$y;uR!0dY@81v&(LCanB?QtfUs3Ghtr zBUv=MyQ|sIVj9Zts+0&i8$_O&D6W^-ntiU^wjgbRj{2`g!lW6C$!F!l6mPC3i!Sp$ zRUBINh8iQ{4OnogZ?dAlWLo9_<=L-dFCPLfh&aJg-u_9QF{{PqatRPAo*-*)>9e2J zux1ybB^oLpTCSDxAGpC*0LMHX4Q3m9r{|_r5p9O+4NYCM*Lso!O%+;}O*uvpPRu|| ztF@0|#pg6r<=Tm5W0A?PU}i*>Wyq)h-hmgGDA~I_USYEn4o`6~r}TV(NPXp4rzkc3 z#>kvW_-`Lg4#BD2sBitfk2dRcv*}#y|G;}qOidZp&6MQsMjDr+H2GDs=nDN5iTH;s zN#9o=<)Cqt-QHOvzKkIAGOg)@kEV-cHqiG-DT-46v05YfW`Dp8p~y}EcapKd%VYpv zu@-*FJSXCr+TQ}<6$UpruJFeBD$1q#PQ;UfN6&|b&x%_L0%<|m!_N8u{2 zBEFKzwt+zpTd{lC-aUt#os8h`M@Eu9{{l1*mSYt7+@Imth!Q-ACch~g;TeIBxBFJVNNxEJ0tn0ofo+qzQy^{_F wApM9Y4wzO@8QPuLtStPCASG0sOHbtA*iPKbJ%pMxvT(3RR!R|4EnyV&f4TOfC;$Ke literal 0 HcmV?d00001 diff --git a/examples/url_generators_examples/public/plugin.tsx b/examples/url_generators_examples/public/plugin.tsx index 016494037ec05..77f7d66ccf103 100644 --- a/examples/url_generators_examples/public/plugin.tsx +++ b/examples/url_generators_examples/public/plugin.tsx @@ -18,7 +18,7 @@ */ import { SharePluginStart, SharePluginSetup } from '../../../src/plugins/share/public'; -import { Plugin, CoreSetup, AppMountParameters } from '../../../src/core/public'; +import { Plugin, CoreSetup, AppMountParameters, AppNavLinkStatus } from '../../../src/core/public'; import { HelloLinkGeneratorState, createHelloPageLinkGenerator, @@ -58,6 +58,7 @@ export class AccessLinksExamplesPlugin implements Plugin { - public setup(core: CoreSetup) { +interface SetupDeps { + developerExamples: DeveloperExamplesSetup; +} + +export class AccessLinksExplorerPlugin implements Plugin { + public setup(core: CoreSetup, { developerExamples }: SetupDeps) { core.application.register({ id: 'urlGeneratorsExplorer', title: 'Access links explorer', + navLinkStatus: AppNavLinkStatus.hidden, async mount(params: AppMountParameters) { const depsStart = (await core.getStartServices())[1]; const { renderApp } = await import('./app'); @@ -40,6 +45,26 @@ export class AccessLinksExplorerPlugin implements Plugin { beforeEach(async () => { - await appsMenu.clickLink('bfetch explorer'); await testSubjects.click('count-until'); await testSubjects.click('double-integers'); }); diff --git a/test/plugin_functional/test_suites/bfetch_explorer/index.ts b/test/examples/bfetch_explorer/index.ts similarity index 83% rename from test/plugin_functional/test_suites/bfetch_explorer/index.ts rename to test/examples/bfetch_explorer/index.ts index a68a5090b9bed..1f039a2ea415c 100644 --- a/test/plugin_functional/test_suites/bfetch_explorer/index.ts +++ b/test/examples/bfetch_explorer/index.ts @@ -17,18 +17,17 @@ * under the License. */ -import { FtrProviderContext } from '../../../functional/ftr_provider_context'; +import { FtrProviderContext } from '../../functional/ftr_provider_context'; +// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const PageObjects = getPageObjects(['common', 'header']); describe('bfetch explorer', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('bfetch explorer'); + await PageObjects.common.navigateToApp('bfetch-explorer', { insertTimestamp: false }); }); loadTestFile(require.resolve('./batched_function')); diff --git a/test/examples/config.js b/test/examples/config.js index aedd06c31d413..228af71a1f5d0 100644 --- a/test/examples/config.js +++ b/test/examples/config.js @@ -27,6 +27,7 @@ export default async function ({ readConfigFile }) { testFiles: [ require.resolve('./search'), require.resolve('./embeddables'), + require.resolve('./bfetch_explorer'), require.resolve('./ui_actions'), require.resolve('./state_sync'), ], diff --git a/test/examples/embeddables/index.ts b/test/examples/embeddables/index.ts index 878b1b9277ba1..d0d7d4a01fbae 100644 --- a/test/examples/embeddables/index.ts +++ b/test/examples/embeddables/index.ts @@ -26,14 +26,12 @@ export default function ({ loadTestFile, }: PluginFunctionalProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const PageObjects = getPageObjects(['common', 'header']); describe('embeddable explorer', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('Embeddable explorer'); + await PageObjects.common.navigateToApp('embeddableExplorer'); }); loadTestFile(require.resolve('./hello_world_embeddable')); diff --git a/test/examples/search/index.ts b/test/examples/search/index.ts index 2fb37afd248e2..706e9659fc010 100644 --- a/test/examples/search/index.ts +++ b/test/examples/search/index.ts @@ -22,7 +22,6 @@ import { FtrProviderContext } from 'test/functional/ftr_provider_context'; // eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const PageObjects = getPageObjects(['common', 'header']); @@ -36,8 +35,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid defaultIndex: 'logstash-*', }); await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('Search Explorer'); + await PageObjects.common.navigateToApp('searchExplorer'); }); after(async function () { diff --git a/test/examples/state_sync/index.ts b/test/examples/state_sync/index.ts index ea1c7692f64fe..297cd8f472b95 100644 --- a/test/examples/state_sync/index.ts +++ b/test/examples/state_sync/index.ts @@ -26,12 +26,10 @@ export default function ({ loadTestFile, }: PluginFunctionalProviderContext) { const browser = getService('browser'); - const PageObjects = getPageObjects(['common']); describe('state sync examples', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); }); loadTestFile(require.resolve('./todo_app')); diff --git a/test/examples/state_sync/todo_app.ts b/test/examples/state_sync/todo_app.ts index 71b491a05ae2f..1ac5376b9ed8d 100644 --- a/test/examples/state_sync/todo_app.ts +++ b/test/examples/state_sync/todo_app.ts @@ -26,7 +26,6 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide const testSubjects = getService('testSubjects'); const find = getService('find'); const retry = getService('retry'); - const appsMenu = getService('appsMenu'); const browser = getService('browser'); const PageObjects = getPageObjects(['common']); const log = getService('log'); @@ -38,7 +37,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide before(async () => { base = await PageObjects.common.getHostPort(); - await appsMenu.clickLink('State containers example - browser history routing'); + await PageObjects.common.navigateToApp(appId, { insertTimestamp: false }); }); it('links are rendered correctly and state is preserved in links', async () => { @@ -119,7 +118,9 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide describe('TODO app with hash history ', async () => { before(async () => { - await appsMenu.clickLink('State containers example - hash history routing'); + await PageObjects.common.navigateToApp('stateContainersExampleHashHistory', { + insertTimestamp: false, + }); }); it('Links are rendered correctly and state is preserved in links', async () => { diff --git a/test/examples/ui_actions/index.ts b/test/examples/ui_actions/index.ts index 55137e2acc2b7..957cd0c46e1d0 100644 --- a/test/examples/ui_actions/index.ts +++ b/test/examples/ui_actions/index.ts @@ -26,14 +26,12 @@ export default function ({ loadTestFile, }: PluginFunctionalProviderContext) { const browser = getService('browser'); - const appsMenu = getService('appsMenu'); const PageObjects = getPageObjects(['common', 'header']); describe('ui actions explorer', function () { before(async () => { await browser.setWindowSize(1300, 900); - await PageObjects.common.navigateToApp('settings'); - await appsMenu.clickLink('Ui Actions Explorer'); + await PageObjects.common.navigateToApp('uiActionsExplorer'); }); loadTestFile(require.resolve('./ui_actions')); diff --git a/test/plugin_functional/config.js b/test/plugin_functional/config.js index 9039f7e734a6e..74d52b842662b 100644 --- a/test/plugin_functional/config.js +++ b/test/plugin_functional/config.js @@ -37,7 +37,6 @@ export default async function ({ readConfigFile }) { require.resolve('./test_suites/embeddable_explorer'), require.resolve('./test_suites/core_plugins'), require.resolve('./test_suites/management'), - require.resolve('./test_suites/bfetch_explorer'), require.resolve('./test_suites/doc_views'), ], services: { diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json b/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json deleted file mode 100644 index 1acc7df871c94..0000000000000 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/kibana.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "kbn_tp_bfetch_explorer", - "version": "0.0.1", - "kibanaVersion": "kibana", - "configPath": ["kbn_tp_bfetch_explorer"], - "server": true, - "ui": true, - "requiredPlugins": ["bfetch"], - "optionalPlugins": [] -} diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json b/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json deleted file mode 100644 index e396489a1ffc4..0000000000000 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "kbn_tp_bfetch_explorer", - "version": "1.0.0", - "main": "target/examples/kbn_tp_bfetch_explorer", - "kibana": { - "version": "kibana", - "templateVersion": "1.0.0" - }, - "license": "Apache-2.0", - "scripts": { - "kbn": "node ../../scripts/kbn.js", - "build": "rm -rf './target' && tsc" - }, - "devDependencies": { - "typescript": "3.7.2" - } -} diff --git a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json b/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json deleted file mode 100644 index 994f81e396763..0000000000000 --- a/test/plugin_functional/plugins/kbn_tp_bfetch_explorer/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "./target", - "skipLibCheck": true, - "types": [ - "node", - "jest", - "react" - ] - }, - "include": [ - "index.ts", - "public/**/*.ts", - "public/**/*.tsx", - "server/**/*.ts", - "server/**/*.tsx", - "../../../../typings/**/*", - ], - "exclude": [] -} From e66eaf74fd5b02a8466864d3df80a7457a4568c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez?= Date: Mon, 8 Jun 2020 15:49:26 +0200 Subject: [PATCH 10/65] [Logs UI] View in context tweaks (#67777) Co-authored-by: Elastic Machine --- .../log_entry_actions_column.tsx | 56 +++++++++---------- .../logs/stream/page_view_log_in_context.tsx | 54 ++++++++++++------ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 4 files changed, 64 insertions(+), 48 deletions(-) diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx index 1ac2e00abca70..e27de7fd6b5a8 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx @@ -5,19 +5,11 @@ */ import React, { useCallback } from 'react'; -import { EuiButtonIcon } from '@elastic/eui'; +import { EuiButtonIcon, EuiPopover, EuiContextMenuPanel, EuiContextMenuItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; import { LogEntryColumnContent } from './log_entry_column'; -import { - euiStyled, - ActionMenu, - Section, - SectionTitle, - SectionLinks, - SectionLink, -} from '../../../../../observability/public'; +import { euiStyled } from '../../../../../observability/public'; interface LogEntryActionsColumnProps { isHovered: boolean; @@ -78,29 +70,32 @@ export const LogEntryActionsColumn: React.FC = ({ ); + const items = [ + + {LOG_DETAILS_LABEL} + , + ]; + + if (onViewLogInContext !== undefined) { + items.push( + + {LOG_VIEW_IN_CONTEXT_LABEL} + + ); + } + return ( {isHovered || isMenuOpen ? ( - -

- - - - - - {onViewLogInContext !== undefined ? ( - - ) : null} - -
- + + + ) : null} @@ -115,10 +110,11 @@ const ActionsColumnContent = euiStyled(LogEntryColumnContent)` const ButtonWrapper = euiStyled.div` background: ${(props) => props.theme.eui.euiColorPrimary}; border-radius: 50%; + padding: 4px; + transform: translateY(-6px); `; // this prevents the button from influencing the line height const AbsoluteWrapper = euiStyled.div` - overflow: hidden; position: absolute; `; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx index cf3eae263ed59..3ef32c920e293 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx @@ -8,12 +8,13 @@ import { EuiFlexGroup, EuiFlexItem, EuiModal, - EuiModalBody, EuiOverlayMask, EuiText, EuiTextColor, EuiToolTip, + EuiSpacer, } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { noop } from 'lodash'; import React, { useCallback, useContext, useMemo } from 'react'; import { LogEntry } from '../../../../common/http_api'; @@ -22,6 +23,7 @@ import { useLogSourceContext } from '../../../containers/logs/log_source'; import { LogViewConfiguration } from '../../../containers/logs/log_view_configuration'; import { ViewLogInContext } from '../../../containers/logs/view_log_in_context'; import { useViewportDimensions } from '../../../utils/use_viewport_dimensions'; +import { euiStyled } from '../../../../../observability/public'; const MODAL_MARGIN = 25; @@ -55,7 +57,7 @@ export const PageViewLogInContext: React.FC = () => { return ( - + { > + { /> - + ); }; +const LogInContextWrapper = euiStyled.div<{ width: number | string; height: number | string }>` + padding: 16px; + width: ${(props) => (typeof props.width === 'number' ? `${props.width}px` : props.width)}; + height: ${(props) => (typeof props.height === 'number' ? `${props.height}px` : props.height)}; +`; + const LogEntryContext: React.FC<{ context: LogEntry['context'] }> = ({ context }) => { + let text; if ('container.id' in context) { - return

Displayed logs are from container {context['container.id']}

; + text = ( + + ); } if ('host.name' in context) { @@ -105,21 +121,27 @@ const LogEntryContext: React.FC<{ context: LogEntry['context'] }> = ({ context } context['log.file.path'].length > 45 ? context['log.file.path'].slice(0, 20) + '...' + context['log.file.path'].slice(-25) : context['log.file.path']; - - return ( - -

- - Displayed logs are from file{' '} + text = ( + {shortenedFilePath} - {' '} - and host {context['host.name']} - -

-
+ + ), + host: context['host.name'], + }} + /> ); } - return null; + return ( + +

+ {text} +

+
+ ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 9d3bc008106c6..aa45fd4bcb292 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7605,7 +7605,6 @@ "xpack.infra.logs.lastUpdate": "前回の更新 {timestamp}", "xpack.infra.logs.loadingNewEntriesText": "新しいエントリーを読み込み中", "xpack.infra.logs.logEntryActionsDetailsButton": "詳細を表示", - "xpack.infra.logs.logEntryActionsMenuTitle": "行詳細のログ", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlButtonLabel": "ML で分析", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlTooltipDescription": "ML アプリでこのカテゴリーを分析します。", "xpack.infra.logs.logEntryCategories.categoryColumnTitle": "カテゴリー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 6992d4004e24e..56d373a6fcd2f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7609,7 +7609,6 @@ "xpack.infra.logs.lastUpdate": "上次更新时间 {timestamp}", "xpack.infra.logs.loadingNewEntriesText": "正在加载新条目", "xpack.infra.logs.logEntryActionsDetailsButton": "查看详情", - "xpack.infra.logs.logEntryActionsMenuTitle": "日志行详情", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlButtonLabel": "在 ML 中分析", "xpack.infra.logs.logEntryCategories.analyzeCategoryInMlTooltipDescription": "在 ML 应用中分析此类别。", "xpack.infra.logs.logEntryCategories.categoryColumnTitle": "类别", From fcab9745e0691af3878d7538681011b381ae2c71 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Mon, 8 Jun 2020 17:29:20 +0300 Subject: [PATCH 11/65] [Telemetry] collect number of visualization saved in the past 7, 30 and 90 days (#67865) * Update telemetry for visualizations to also count the vis from the past 30 and 90 days * Also add metrics for the saved visualizations for the past 7 days Co-authored-by: Elastic Machine --- .../server/lib/get_past_days.test.ts | 22 +++++ .../oss_telemetry/server/lib/get_past_days.ts | 11 +++ .../tasks/visualizations/task_runner.test.ts | 92 ++++++++++++++++--- .../lib/tasks/visualizations/task_runner.ts | 14 ++- .../oss_telemetry/server/test_utils/index.ts | 2 + 5 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts create mode 100644 x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts diff --git a/x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts new file mode 100644 index 0000000000000..28909779343a5 --- /dev/null +++ b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import moment from 'moment'; +import { getPastDays } from './get_past_days'; + +describe('getPastDays', () => { + test('Returns 2 days that have passed from the current date', () => { + const pastDate = moment().subtract(2, 'days').startOf('day').toString(); + + expect(getPastDays(pastDate)).toEqual(2); + }); + + test('Returns 30 days that have passed from the current date', () => { + const pastDate = moment().subtract(30, 'days').startOf('day').toString(); + + expect(getPastDays(pastDate)).toEqual(30); + }); +}); diff --git a/x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts new file mode 100644 index 0000000000000..4f25ef147ad43 --- /dev/null +++ b/x-pack/plugins/oss_telemetry/server/lib/get_past_days.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +export const getPastDays = (dateString: string): number => { + const date = new Date(dateString); + const today = new Date(); + const diff = Math.abs(date.getTime() - today.getTime()); + return Math.trunc(diff / (1000 * 60 * 60 * 24)); +}; diff --git a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts index 6a47983a6f4d9..c064f39f4bc6a 100644 --- a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts @@ -13,6 +13,7 @@ import { import { visualizationsTaskRunner } from './task_runner'; import { TaskInstance } from '../../../../../task_manager/server'; import { getNextMidnight } from '../../get_next_midnight'; +import moment from 'moment'; describe('visualizationsTaskRunner', () => { let mockTaskInstance: TaskInstance; @@ -55,6 +56,9 @@ describe('visualizationsTaskRunner', () => { spaces_max: 1, spaces_min: 1, total: 1, + saved_7_days_total: 1, + saved_30_days_total: 1, + saved_90_days_total: 1, }, }, }, @@ -69,6 +73,7 @@ describe('visualizationsTaskRunner', () => { _source: { type: 'visualization', visualization: { visState: '{"type": "cave_painting"}' }, + updated_at: moment().subtract(7, 'days').startOf('day').toString(), }, }, { @@ -76,11 +81,16 @@ describe('visualizationsTaskRunner', () => { _source: { type: 'visualization', visualization: { visState: '{"type": "printing_press"}' }, + updated_at: moment().subtract(20, 'days').startOf('day').toString(), }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(2, 'months').startOf('day').toString(), + }, }, // meat space { @@ -88,38 +98,99 @@ describe('visualizationsTaskRunner', () => { _source: { type: 'visualization', visualization: { visState: '{"type": "cave_painting"}' }, + updated_at: moment().subtract(89, 'days').startOf('day').toString(), }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "cuneiform"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "cuneiform"}' }, + updated_at: moment().subtract(5, 'months').startOf('day').toString(), + }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "cuneiform"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "cuneiform"}' }, + updated_at: moment().subtract(2, 'days').startOf('day').toString(), + }, }, { _id: 'meat:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(7, 'days').startOf('day').toString(), + }, }, // cyber space { _id: 'cyber:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(7, 'months').startOf('day').toString(), + }, }, { _id: 'cyber:visualization:coolviz-789', - _source: { type: 'visualization', visualization: { visState: '{"type": "floppy_disk"}' } }, + _source: { + type: 'visualization', + visualization: { visState: '{"type": "floppy_disk"}' }, + updated_at: moment().subtract(3, 'days').startOf('day').toString(), + }, }, { _id: 'cyber:visualization:coolviz-123', _source: { type: 'visualization', visualization: { visState: '{"type": "cave_painting"}' }, + updated_at: moment().subtract(15, 'days').startOf('day').toString(), }, }, ]); + const expectedStats = { + cave_painting: { + total: 3, + spaces_min: 1, + spaces_max: 1, + spaces_avg: 1, + saved_7_days_total: 1, + saved_30_days_total: 2, + saved_90_days_total: 3, + }, + printing_press: { + total: 1, + spaces_min: 1, + spaces_max: 1, + spaces_avg: 1, + saved_7_days_total: 0, + saved_30_days_total: 1, + saved_90_days_total: 1, + }, + cuneiform: { + total: 2, + spaces_min: 2, + spaces_max: 2, + spaces_avg: 2, + saved_7_days_total: 1, + saved_30_days_total: 1, + saved_90_days_total: 1, + }, + floppy_disk: { + total: 4, + spaces_min: 2, + spaces_max: 2, + spaces_avg: 2, + saved_7_days_total: 2, + saved_30_days_total: 2, + saved_90_days_total: 3, + }, + }; + const runner = visualizationsTaskRunner( mockTaskInstance, getMockConfig(), @@ -131,13 +202,10 @@ describe('visualizationsTaskRunner', () => { error: undefined, state: { runs: 1, - stats: { - cave_painting: { total: 3, spaces_min: 1, spaces_max: 1, spaces_avg: 1 }, - printing_press: { total: 1, spaces_min: 1, spaces_max: 1, spaces_avg: 1 }, - cuneiform: { total: 2, spaces_min: 2, spaces_max: 2, spaces_avg: 2 }, - floppy_disk: { total: 4, spaces_min: 2, spaces_max: 2, spaces_avg: 2 }, - }, + stats: expectedStats, }, }); + + expect(result.state.stats).toMatchObject(expectedStats); }); }); diff --git a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts index b15ead36a75f6..5f7f70ee5d62a 100644 --- a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts @@ -10,12 +10,14 @@ import { first } from 'rxjs/operators'; import { APICaller, IClusterClient } from 'src/core/server'; import { getNextMidnight } from '../../get_next_midnight'; +import { getPastDays } from '../../get_past_days'; import { TaskInstance } from '../../../../../task_manager/server'; import { ESSearchHit } from '../../../../../apm/typings/elasticsearch'; interface VisSummary { type: string; space: string; + past_days: number; } /* @@ -26,7 +28,11 @@ async function getStats(callCluster: APICaller, index: string) { size: 10000, // elasticsearch index.max_result_window default value index, ignoreUnavailable: true, - filterPath: ['hits.hits._id', 'hits.hits._source.visualization'], + filterPath: [ + 'hits.hits._id', + 'hits.hits._source.visualization', + 'hits.hits._source.updated_at', + ], body: { query: { bool: { filter: { term: { type: 'visualization' } } }, @@ -43,13 +49,14 @@ async function getStats(callCluster: APICaller, index: string) { const visSummaries: VisSummary[] = esResponse.hits.hits.map( (hit: ESSearchHit<{ visState: string }>) => { const spacePhrases: string[] = hit._id.split(':'); + const lastUpdated: string = _.get(hit, '_source.updated_at'); const space = spacePhrases.length === 3 ? spacePhrases[0] : 'default'; // if in a custom space, the format of a saved object ID is space:type:id const visualization = _.get(hit, '_source.visualization', { visState: '{}' }); const visState: { type?: string } = JSON.parse(visualization.visState); - return { type: visState.type || '_na_', space, + past_days: getPastDays(lastUpdated), }; } ); @@ -68,6 +75,9 @@ async function getStats(callCluster: APICaller, index: string) { spaces_min: _.min(spaceCounts), spaces_max: _.max(spaceCounts), spaces_avg: total / spaceCounts.length, + saved_7_days_total: curr.filter((c) => c.past_days <= 7).length, + saved_30_days_total: curr.filter((c) => c.past_days <= 30).length, + saved_90_days_total: curr.filter((c) => c.past_days <= 90).length, }; }); } diff --git a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts index 428909dc7feed..93bde69629fbd 100644 --- a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts +++ b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts @@ -7,6 +7,7 @@ import { APICaller } from 'kibana/server'; import { of } from 'rxjs'; +import moment from 'moment'; import { elasticsearchServiceMock } from '../../../../../src/core/server/mocks'; import { ConcreteTaskInstance, @@ -38,6 +39,7 @@ const defaultMockSavedObjects = [ _source: { type: 'visualization', visualization: { visState: '{"type": "shell_beads"}' }, + updated_at: moment().subtract(7, 'days').startOf('day').toString(), }, }, ]; From 2bedb59c8e0968eb05d2033d36e9426e556a40be Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Mon, 8 Jun 2020 07:30:14 -0700 Subject: [PATCH 12/65] Closes #66867 by adding missing, requried API params (#68465) Co-authored-by: Elastic Machine --- x-pack/plugins/apm/public/services/rest/watcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/services/rest/watcher.ts b/x-pack/plugins/apm/public/services/rest/watcher.ts index 3027164e2863e..246ed061eb20e 100644 --- a/x-pack/plugins/apm/public/services/rest/watcher.ts +++ b/x-pack/plugins/apm/public/services/rest/watcher.ts @@ -19,6 +19,6 @@ export async function createWatch({ return callApi(http, { method: 'PUT', pathname: `/api/watcher/watch/${id}`, - body: { type: 'json', id, watch }, + body: { type: 'json', id, watch, isNew: true, isActive: true }, }); } From bc3918671cb9bc7ba33a192fa1ffc7c0ee1af93c Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Mon, 8 Jun 2020 10:43:10 -0400 Subject: [PATCH 13/65] [security_solution] enable react-hooks/exhaustive-deps (#68470) * Enable `react-hooks/exhaustive-deps` rule for security_solution * Disable it anywhere that it would catch an issue --- .eslintrc.js | 4 --- .../alerts_histogram_panel/index.tsx | 6 ++++ .../alerts/components/alerts_table/index.tsx | 7 +++- .../components/rules/add_item_form/index.tsx | 1 + .../alerts/components/rules/mitre/index.tsx | 3 +- .../components/rules/pick_timeline/index.tsx | 2 ++ .../components/rules/query_bar/index.tsx | 8 +++-- .../rules/rule_actions_field/index.tsx | 3 ++ .../rules/rule_actions_overflow/index.tsx | 1 + .../components/rules/rule_switch/index.tsx | 3 ++ .../rules/schedule_item_form/index.tsx | 3 ++ .../rules/step_about_rule/index.tsx | 3 ++ .../rules/step_define_rule/index.tsx | 3 ++ .../rules/step_rule_actions/index.tsx | 4 +++ .../rules/step_schedule_rule/index.tsx | 3 ++ .../rules/throttle_select_field/index.tsx | 1 + .../alerts/components/user_info/index.tsx | 8 +++++ .../alerts/use_privilege_user.tsx | 1 + .../alerts/use_signal_index.tsx | 1 + .../rules/fetch_index_patterns.tsx | 1 + .../detection_engine/rules/persist_rule.tsx | 1 + .../rules/use_pre_packaged_rules.tsx | 1 + .../detection_engine/rules/use_rule.tsx | 1 + .../rules/use_rule_status.tsx | 2 ++ .../detection_engine/rules/use_rules.tsx | 6 ++-- .../detection_engine/rules/use_tags.tsx | 1 + .../detection_engine/rules/all/index.tsx | 2 ++ .../rules_table_filters.tsx | 1 + .../detection_engine/rules/create/index.tsx | 3 ++ .../detection_engine/rules/details/index.tsx | 2 ++ .../detection_engine/rules/edit/index.tsx | 6 ++++ .../cases/components/add_comment/index.tsx | 4 ++- .../cases/components/all_cases/index.tsx | 11 +++++++ .../components/all_cases/table_filters.tsx | 6 ++++ .../cases/components/case_view/actions.tsx | 1 + .../components/configure_cases/connectors.tsx | 1 + .../configure_cases/connectors_dropdown.tsx | 1 + .../configure_cases/field_mapping.tsx | 2 ++ .../components/configure_cases/index.tsx | 7 ++++ .../components/connector_selector/form.tsx | 1 + .../public/cases/components/create/index.tsx | 2 ++ .../components/open_closed_stats/index.tsx | 1 + .../components/use_push_to_service/index.tsx | 2 ++ .../components/user_action_tree/index.tsx | 4 +++ .../user_action_tree/user_action_markdown.tsx | 2 ++ .../cases/components/user_list/index.tsx | 1 + .../containers/configure/use_configure.tsx | 3 ++ .../containers/configure/use_connectors.tsx | 2 ++ .../cases/containers/use_bulk_update_case.tsx | 2 ++ .../cases/containers/use_delete_cases.tsx | 4 +++ .../containers/use_get_action_license.tsx | 2 ++ .../public/cases/containers/use_get_case.tsx | 2 ++ .../containers/use_get_case_user_actions.tsx | 2 ++ .../public/cases/containers/use_get_cases.tsx | 4 +++ .../cases/containers/use_get_cases_status.tsx | 2 ++ .../cases/containers/use_get_reporters.tsx | 2 ++ .../public/cases/containers/use_get_tags.tsx | 1 + .../public/cases/containers/use_post_case.tsx | 1 + .../cases/containers/use_post_comment.tsx | 1 + .../containers/use_post_push_to_service.tsx | 1 + .../cases/containers/use_update_case.tsx | 1 + .../cases/containers/use_update_comment.tsx | 1 + .../components/alerts_viewer/alerts_table.tsx | 1 + .../common/components/alerts_viewer/index.tsx | 1 + .../common/components/charts/common.tsx | 1 + .../drag_drop_context_wrapper.tsx | 1 + .../drag_and_drop/draggable_wrapper.tsx | 1 + .../draggable_wrapper_hover_content.tsx | 2 ++ .../events_viewer/events_viewer.tsx | 2 ++ .../common/components/events_viewer/index.tsx | 1 + .../exceptions/viewer/exception_entries.tsx | 1 + .../components/generic_downloader/index.tsx | 1 + .../components/header_page/editable_title.tsx | 1 + .../common/components/help_menu/index.tsx | 1 + .../components/import_data_modal/index.tsx | 1 + .../public/common/components/links/index.tsx | 1 + .../components/markdown_editor/index.tsx | 1 + .../components/matrix_histogram/index.tsx | 33 ++++++++----------- .../components/matrix_histogram/types.ts | 6 ---- .../ml/anomaly/use_anomalies_table_data.ts | 4 +++ .../permissions/ml_capabilities_provider.tsx | 1 + .../ml_popover/hooks/use_siem_jobs.tsx | 1 + .../filters/groups_filter_popover.tsx | 1 + .../common/components/navigation/index.tsx | 1 + .../common/components/search_bar/index.tsx | 6 ++++ .../common/components/stat_items/index.tsx | 1 + .../components/super_date_picker/index.tsx | 3 ++ .../common/components/toasters/index.test.tsx | 1 + .../public/common/components/top_n/index.tsx | 1 + .../components/url_state/use_url_state.tsx | 3 +- .../anomalies_query_tab_body/index.tsx | 1 + .../events/last_event_time/index.ts | 3 +- .../common/containers/global_time/index.tsx | 1 + .../containers/matrix_histogram/index.ts | 3 +- .../public/common/containers/source/index.tsx | 3 +- .../common/hooks/use_add_to_timeline.tsx | 1 + .../common/hooks/use_index_patterns.tsx | 1 + .../components/connector_flyout/index.tsx | 6 ++++ .../public/common/lib/kibana/hooks.ts | 2 ++ .../public/common/utils/route/spy_routes.tsx | 2 ++ .../utils/timeline/use_show_timeline.tsx | 1 + .../view/details/overview/index.tsx | 1 + .../containers/hosts/first_last_seen/index.ts | 1 + .../components/management_page_view.tsx | 1 + .../view/details/host_details.tsx | 1 + .../components/embeddables/embedded_map.tsx | 4 +++ .../embeddables/map_tool_tip/map_tool_tip.tsx | 4 +-- .../source_destination/country_flag.tsx | 1 + .../network/components/tls_table/index.tsx | 1 + .../network/components/users_table/index.tsx | 1 + .../components/alerts_by_category/index.tsx | 2 ++ .../components/recent_timelines/index.tsx | 1 + .../components/signals_by_category/index.tsx | 1 + .../fields_browser/category_columns.tsx | 1 + .../fields_browser/field_browser.tsx | 1 + .../components/fields_browser/index.tsx | 2 ++ .../components/flyout/pane/index.tsx | 4 ++- .../components/manage_timeline/index.tsx | 1 + .../open_timeline/edit_timeline_actions.tsx | 1 + .../edit_timeline_batch_actions.tsx | 1 + .../components/open_timeline/index.tsx | 5 +++ .../open_timeline/use_timeline_types.tsx | 2 ++ .../timeline/body/column_headers/index.tsx | 3 +- .../body/events/event_column_view.tsx | 2 ++ .../timeline/body/events/stateful_event.tsx | 1 + .../timeline/body/stateful_body.tsx | 9 +++++ .../data_providers/provider_item_badge.tsx | 3 ++ .../timeline/fetch_kql_timeline.tsx | 1 + .../components/timeline/footer/index.tsx | 1 + .../timelines/components/timeline/index.tsx | 7 ++++ .../insert_timeline_popover/index.tsx | 1 + .../use_insert_timeline.tsx | 2 ++ .../timeline/properties/helpers.tsx | 1 + .../components/timeline/properties/index.tsx | 1 + .../components/timeline/query_bar/index.tsx | 6 ++++ .../timeline/search_or_filter/index.tsx | 5 +++ .../timeline/selectable_timeline/index.tsx | 1 + .../components/timeline/timeline.tsx | 3 ++ .../public/timelines/containers/all/index.tsx | 3 +- 139 files changed, 313 insertions(+), 46 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index f0b7d6864bef0..c33f4de15b919 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -758,10 +758,6 @@ module.exports = { 'react/jsx-no-target-blank': 'error', 'react/jsx-fragments': 'error', 'react/jsx-sort-default-props': 'error', - // might be introduced after the other warns are fixed - // 'react/jsx-sort-props': 'error', - // might be introduced after the other warns are fixed - 'react-hooks/exhaustive-deps': 'off', 'require-atomic-updates': 'error', 'symbol-description': 'error', 'vars-on-top': 'error', diff --git a/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx index 7451ea6ec0ca1..ed98a37775576 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/alerts_histogram_panel/index.tsx @@ -131,6 +131,7 @@ export const AlertsHistogramPanel = memo( totalAlertsObj.value, totalAlertsObj.relation === 'gte' ? '>' : totalAlertsObj.relation === 'lte' ? '<' : '' ), + // eslint-disable-next-line react-hooks/exhaustive-deps [totalAlertsObj] ); @@ -138,6 +139,7 @@ export const AlertsHistogramPanel = memo( setSelectedStackByOption( stackByOptions?.find((co) => co.value === event.target.value) ?? defaultStackByOption ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const formattedAlertsData = useMemo(() => formatAlertsData(alertsData), [alertsData]); @@ -154,6 +156,7 @@ export const AlertsHistogramPanel = memo( value: bucket.key, })) : NO_LEGEND_DATA, + // eslint-disable-next-line react-hooks/exhaustive-deps [alertsData, selectedStackByOption.value] ); @@ -175,6 +178,7 @@ export const AlertsHistogramPanel = memo( deleteQuery({ id: uniqueQueryId }); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -189,6 +193,7 @@ export const AlertsHistogramPanel = memo( refetch, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [setQuery, isLoadingAlerts, alertsData, response, request, refetch]); useEffect(() => { @@ -219,6 +224,7 @@ export const AlertsHistogramPanel = memo( !isEmpty(converted) ? [converted] : [] ) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedStackByOption.value, from, to, query, filters]); const linkButton = useMemo(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx index 685e66e73ced2..2be20a9d47f67 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx @@ -117,6 +117,7 @@ export const AlertsTableComponent: React.FC = ({ }); } return null; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [browserFields, globalFilters, globalQuery, indexPatterns, kibana, to, from]); // Callback for creating a new timeline -- utilized by row/batch actions @@ -143,6 +144,7 @@ export const AlertsTableComponent: React.FC = ({ ({ eventIds, isLoading }: SetEventsLoadingProps) => { setEventsLoading!({ id: ALERTS_TABLE_TIMELINE_ID, eventIds, isLoading }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setEventsLoading, ALERTS_TABLE_TIMELINE_ID] ); @@ -150,6 +152,7 @@ export const AlertsTableComponent: React.FC = ({ ({ eventIds, isDeleted }: SetEventsDeletedProps) => { setEventsDeleted!({ id: ALERTS_TABLE_TIMELINE_ID, eventIds, isDeleted }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setEventsDeleted, ALERTS_TABLE_TIMELINE_ID] ); @@ -210,7 +213,7 @@ export const AlertsTableComponent: React.FC = ({ }, [setSelectAll, setShowClearSelectionAction]); const updateAlertsStatusCallback: UpdateAlertsStatusCallback = useCallback( - async (refetchQuery: inputsModel.Refetch, { alertIds, status }: UpdateAlertsStatusProps) => { + async (refetchQuery: inputsModel.Refetch, { status }: UpdateAlertsStatusProps) => { await updateAlertStatusAction({ query: showClearSelectionAction ? getGlobalQuery()?.filterQuery : undefined, alertIds: Object.keys(selectedEventIds), @@ -314,6 +317,7 @@ export const AlertsTableComponent: React.FC = ({ title: i18n.ALERTS_TABLE_TITLE, selectAll: canUserCRUD ? selectAll : false, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { setTimelineRowActions({ @@ -321,6 +325,7 @@ export const AlertsTableComponent: React.FC = ({ queryFields: requiredFieldsForActions, timelineRowActions: additionalActions, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [additionalActions]); const headerFilterGroup = useMemo( () => , diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx index c8eb6f69c95ba..b0098d62cc9e5 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/add_item_form/index.tsx @@ -126,6 +126,7 @@ export const AddItem = ({ inputsRef.current[haveBeenKeyboardDeleted].focus(); setHaveBeenKeyboardDeleted(-1); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [haveBeenKeyboardDeleted, inputsRef.current]); const values = field.value as string[]; diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx index 88edd0e795531..e898a362c7771 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/mitre/index.tsx @@ -40,7 +40,7 @@ interface AddItemProps { isDisabled: boolean; } -export const AddMitreThreat = ({ dataTestSubj, field, idAria, isDisabled }: AddItemProps) => { +export const AddMitreThreat = ({ field, idAria, isDisabled }: AddItemProps) => { const [showValidation, setShowValidation] = useState(false); const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); @@ -101,6 +101,7 @@ export const AddMitreThreat = ({ dataTestSubj, field, idAria, isDisabled }: AddI ...values.slice(index + 1), ]); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx index 0029e70e4edda..4b27daf3180ec 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/pick_timeline/index.tsx @@ -39,6 +39,7 @@ export const PickTimeline = ({ setTimelineId(id); setTimelineTitle(title); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); const handleOnTimelineChange = useCallback( @@ -49,6 +50,7 @@ export const PickTimeline = ({ field.setValue({ id, title }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx index 82206b6ba5e3d..c53a9ccc22d8b 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/query_bar/index.tsx @@ -16,7 +16,6 @@ import { Query, FilterManager, SavedQuery, - SavedQueryTimeFilter, } from '../../../../../../../../src/plugins/data/public'; import { BrowserFields } from '../../../../common/containers/source'; @@ -111,6 +110,7 @@ export const QueryBarDefineRule = ({ isSubscribed = false; subscriptions.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); useEffect(() => { @@ -143,10 +143,11 @@ export const QueryBarDefineRule = ({ return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); const onSubmitQuery = useCallback( - (newQuery: Query, timefilter?: SavedQueryTimeFilter) => { + (newQuery: Query) => { const { query } = field.value as FieldValueQueryBar; if (!deepEqual(query, newQuery)) { field.setValue({ ...(field.value as FieldValueQueryBar), query: newQuery }); @@ -179,6 +180,7 @@ export const QueryBarDefineRule = ({ } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field.value] ); @@ -214,7 +216,7 @@ export const QueryBarDefineRule = ({ [browserFields, field, indexPattern] ); - const onMutation = (event: unknown, observer: unknown) => { + const onMutation = () => { if (resizeParentContainer != null) { const suggestionContainer = document.getElementById('kbnTypeahead__items'); if (suggestionContainer != null) { diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx index b77de683d5f20..c6ff25f311d9c 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_field/index.tsx @@ -56,6 +56,7 @@ export const RuleActionsField: ThrottleSelectField = ({ field, messageVariables updatedActions[index] = deepMerge(updatedActions[index], { id }); field.setValue(updatedActions); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field.setValue, actions] ); @@ -71,6 +72,7 @@ export const RuleActionsField: ThrottleSelectField = ({ field, messageVariables updatedActions[index].params[key] = value; field.setValue(updatedActions); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [field.setValue, actions] ); @@ -82,6 +84,7 @@ export const RuleActionsField: ThrottleSelectField = ({ field, messageVariables ); setSupportedActionTypes(supportedTypes); })(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx index 5a5156fa2b9a3..66f04c9bc6add 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_actions_overflow/index.tsx @@ -101,6 +101,7 @@ const RuleActionsOverflowComponent = ({ , ] : [], + // eslint-disable-next-line react-hooks/exhaustive-deps [rule, userHasNoPermissions] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx index 79a16bfb386ec..c85676ce51052 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/rule_switch/index.tsx @@ -94,6 +94,7 @@ export const RuleSwitchComponent = ({ } setMyIsLoading(false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [dispatch, id] ); @@ -101,12 +102,14 @@ export const RuleSwitchComponent = ({ if (myEnabled !== enabled) { setMyEnabled(enabled); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [enabled]); useEffect(() => { if (myIsLoading !== isLoading) { setMyIsLoading(isLoading ?? false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isLoading]); return ( diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx index 9a4f9b25e01f4..bb33767f4f5d5 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/schedule_item_form/index.tsx @@ -78,6 +78,7 @@ export const ScheduleItem = ({ setTimeType(e.target.value); field.setValue(`${timeVal}${e.target.value}`); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [timeVal] ); @@ -87,6 +88,7 @@ export const ScheduleItem = ({ setTimeVal(sanitizedValue); field.setValue(`${sanitizedValue}${timeType}`); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [timeType] ); @@ -111,6 +113,7 @@ export const ScheduleItem = ({ setTimeType(filterTimeType[0]); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field.value]); // EUI missing some props diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx index e41416f2a0ccb..f23c51e019f24 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.tsx @@ -101,6 +101,7 @@ const StepAboutRuleComponent: FC = ({ setMyStepData({ ...data, isNew: false } as AboutStepRule); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); useEffect(() => { @@ -113,12 +114,14 @@ const StepAboutRuleComponent: FC = ({ setMyStepData(myDefaultValues); setFieldValue(form, schema, myDefaultValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues]); useEffect(() => { if (setForm != null) { setForm(RuleStep.aboutRule, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); return isReadOnlyView && myStepData.name != null ? ( diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx index fc875908bd4ef..b56e1794eef63 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_define_rule/index.tsx @@ -123,6 +123,7 @@ const StepDefineRuleComponent: FC = ({ setMyStepData({ ...data, isNew: false } as DefineStepRule); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); useEffect(() => { @@ -132,12 +133,14 @@ const StepDefineRuleComponent: FC = ({ setMyStepData(newValues); setFieldValue(form, schema, newValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues, setMyStepData, setFieldValue]); useEffect(() => { if (setForm != null) { setForm(RuleStep.defineRule, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); const handleResetIndices = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx index 778c6bd92bc73..9334bd59bebf5 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_rule_actions/index.tsx @@ -99,6 +99,7 @@ const StepRuleActionsComponent: FC = ({ } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [form] ); @@ -112,12 +113,14 @@ const StepRuleActionsComponent: FC = ({ setMyStepData(myDefaultValues); setFieldValue(form, schema, myDefaultValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues]); useEffect(() => { if (setForm != null) { setForm(RuleStep.ruleActions, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); const updateThrottle = useCallback((throttle) => setMyStepData({ ...myStepData, throttle }), [ @@ -142,6 +145,7 @@ const StepRuleActionsComponent: FC = ({ options: throttleOptions, }, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [isLoading, updateThrottle] ); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx index fa49637a0c830..60855bc5fa25f 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_schedule_rule/index.tsx @@ -62,6 +62,7 @@ const StepScheduleRuleComponent: FC = ({ setMyStepData({ ...data, isNew: false } as ScheduleStepRule); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); useEffect(() => { @@ -74,12 +75,14 @@ const StepScheduleRuleComponent: FC = ({ setMyStepData(myDefaultValues); setFieldValue(form, schema, myDefaultValues); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValues]); useEffect(() => { if (setForm != null) { setForm(RuleStep.scheduleRule, form); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); return isReadOnlyView && myStepData != null ? ( diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx index 133f25ef3a03f..bf3498b28cd45 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/throttle_select_field/index.tsx @@ -31,6 +31,7 @@ export const ThrottleSelectField: ThrottleSelectField = (props) => { props.field.setValue(throttle); props.handleChange(throttle); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [props.field.setValue, props.handleChange] ); const newEuiFieldProps = { ...props.euiFieldProps, onChange }; diff --git a/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx index 8753064751f76..fc3fec7c29c1f 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/user_info/index.tsx @@ -171,18 +171,21 @@ export const useUserInfo = (): State => { if (loading !== privilegeLoading || indexNameLoading) { dispatch({ type: 'updateLoading', loading: privilegeLoading || indexNameLoading }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, privilegeLoading, indexNameLoading]); useEffect(() => { if (!loading && hasIndexManage !== hasApiIndexManage && hasApiIndexManage != null) { dispatch({ type: 'updateHasIndexManage', hasIndexManage: hasApiIndexManage }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, hasIndexManage, hasApiIndexManage]); useEffect(() => { if (!loading && hasIndexWrite !== hasApiIndexWrite && hasApiIndexWrite != null) { dispatch({ type: 'updateHasIndexWrite', hasIndexWrite: hasApiIndexWrite }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, hasIndexWrite, hasApiIndexWrite]); useEffect(() => { @@ -193,30 +196,35 @@ export const useUserInfo = (): State => { ) { dispatch({ type: 'updateIsSignalIndexExists', isSignalIndexExists: isApiSignalIndexExists }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, isSignalIndexExists, isApiSignalIndexExists]); useEffect(() => { if (!loading && isAuthenticated !== isApiAuthenticated && isApiAuthenticated != null) { dispatch({ type: 'updateIsAuthenticated', isAuthenticated: isApiAuthenticated }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, isAuthenticated, isApiAuthenticated]); useEffect(() => { if (!loading && hasEncryptionKey !== isApiEncryptionKey && isApiEncryptionKey != null) { dispatch({ type: 'updateHasEncryptionKey', hasEncryptionKey: isApiEncryptionKey }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, hasEncryptionKey, isApiEncryptionKey]); useEffect(() => { if (!loading && canUserCRUD !== capabilitiesCanUserCRUD && capabilitiesCanUserCRUD != null) { dispatch({ type: 'updateCanUserCRUD', canUserCRUD: capabilitiesCanUserCRUD }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, canUserCRUD, capabilitiesCanUserCRUD]); useEffect(() => { if (!loading && signalIndexName !== apiSignalIndexName && apiSignalIndexName != null) { dispatch({ type: 'updateSignalIndexName', signalIndexName: apiSignalIndexName }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading, signalIndexName, apiSignalIndexName]); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx index e67afd686a7ca..dda9b50239cde 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_privilege_user.tsx @@ -83,6 +83,7 @@ export const usePrivilegeUser = (): ReturnPrivilegeUser => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { loading, ...privilegeUser }; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx index 6c428bd9354ee..65a2721013b5e 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/alerts/use_signal_index.tsx @@ -103,6 +103,7 @@ export const useSignalIndex = (): ReturnSignalIndex => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { loading, ...signalIndex }; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx index 157f1490971f1..640d6f9a17fd1 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx @@ -94,6 +94,7 @@ export const useFetchIndexPatterns = (defaultIndices: string[] = []): Return => isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [indices]); return [{ browserFields, isLoading, indices, indicesExists, indexPatterns }, setIndices]; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx index 03080bf68cbf5..fd139d59c0a27 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/persist_rule.tsx @@ -53,6 +53,7 @@ export const usePersistRule = (): ReturnPersistRule => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rule]); return [{ isLoading, isSaved }, setRule]; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx index de4037ce7134c..5f5ee53c29caf 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx @@ -185,6 +185,7 @@ export const usePrePackagedRules = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [canUserCRUD, hasIndexWrite, isAuthenticated, hasEncryptionKey, isSignalIndexExists]); return { diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx index 6ae5da3e56ff6..3256273fb8425 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule.tsx @@ -55,6 +55,7 @@ export const useRule = (id: string | undefined): ReturnRule => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [id]); return [loading, rule]; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx index b9f5e1f152c21..ec1da29de4ba8 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rule_status.tsx @@ -64,6 +64,7 @@ export const useRuleStatus = (id: string | undefined | null): ReturnRuleStatus = isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [id]); return [loading, ruleStatus, fetchRuleStatus.current]; @@ -119,6 +120,7 @@ export const useRulesStatuses = (rules: Rules): ReturnRulesStatuses => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rules]); return { loading, rulesStatuses }; diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx index 3a074f2bc3785..1a1dbc6e2b368 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_rules.tsx @@ -46,7 +46,7 @@ export const useRules = ({ let isSubscribed = true; const abortCtrl = new AbortController(); - async function fetchData(forceReload: boolean = false) { + async function fetchData() { try { setLoading(true); const fetchRulesResult = await fetchRules({ @@ -80,7 +80,7 @@ export const useRules = ({ fetchData(); reFetchRules.current = (refreshPrePackagedRule: boolean = false) => { - fetchData(true); + fetchData(); if (refreshPrePackagedRule && refetchPrePackagedRulesStatus != null) { refetchPrePackagedRulesStatus(); } @@ -89,12 +89,14 @@ export const useRules = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ pagination.page, pagination.perPage, filterOptions.filter, filterOptions.sortField, filterOptions.sortOrder, + // eslint-disable-next-line react-hooks/exhaustive-deps filterOptions.tags?.sort().join(), filterOptions.showCustomRules, filterOptions.showElasticRules, diff --git a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx index ebfe73f2f0863..038f974e1394e 100644 --- a/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx +++ b/x-pack/plugins/security_solution/public/alerts/containers/detection_engine/rules/use_tags.tsx @@ -53,6 +53,7 @@ export const useTags = (): ReturnTags => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return [loading, tags, reFetchTags.current]; diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx index 9e61ec0eb3bcf..80ef5681189c5 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/index.tsx @@ -235,6 +235,7 @@ export const AllRules = React.memo( : [], reFetchRules: reFetchRulesData, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dispatch, dispatchToaster, @@ -313,6 +314,7 @@ export const AllRules = React.memo( ))} ), + // eslint-disable-next-line react-hooks/exhaustive-deps [allRulesTabs, allRulesTab, setAllRulesTab] ); diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx index 2bc19ae45a078..c65271c3cc014 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx @@ -45,6 +45,7 @@ const RulesTableFiltersComponent = ({ useEffect(() => { reFetchTags(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rulesCustomInstalled, rulesInstalled]); // Propagate filter changes to parent diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx index dd290ec1ae582..de7c99acee6e5 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/create/index.tsx @@ -114,6 +114,7 @@ const CreateRulePageComponent: React.FC = () => { const actionMessageParams = useMemo( () => getActionMessageParams((stepsData.current['define-rule'].data as DefineStepRule).ruleType), + // eslint-disable-next-line react-hooks/exhaustive-deps [stepsData.current['define-rule'].data] ); @@ -155,6 +156,7 @@ const CreateRulePageComponent: React.FC = () => { } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [isStepRuleInReadOnlyView, openAccordionId, stepsData.current, setRule] ); @@ -171,6 +173,7 @@ const CreateRulePageComponent: React.FC = () => { } return 'passive'; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [openAccordionId, stepsData.current] ); diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx index ebd6ed118f937..43792e8bd19f4 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx @@ -191,6 +191,7 @@ export const RuleDetailsPageComponent: FC = ({ ))} ), + // eslint-disable-next-line react-hooks/exhaustive-deps [ruleDetailTabs, ruleDetailTab, setRuleDetailTab] ); const ruleError = useMemo( @@ -203,6 +204,7 @@ export const RuleDetailsPageComponent: FC = ({ date={rule?.last_failure_at} /> ) : null, + // eslint-disable-next-line react-hooks/exhaustive-deps [rule, ruleDetailTab] ); diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx index 8fc646c01b17c..73e76165183c5 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/edit/index.tsx @@ -104,6 +104,7 @@ const EditRulePageComponent: FC = () => { }); const [{ isLoading, isSaved }, setRule] = usePersistRule(); const [tabHasError, setTabHasError] = useState([]); + // eslint-disable-next-line react-hooks/exhaustive-deps const actionMessageParams = useMemo(() => getActionMessageParams(rule?.type), [rule]); const setStepsForm = useCallback( (step: RuleStep, form: FormHook) => { @@ -113,6 +114,7 @@ const EditRulePageComponent: FC = () => { form.submit(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [initForm, selectedTab] ); const tabs = useMemo( @@ -206,6 +208,7 @@ const EditRulePageComponent: FC = () => { ), }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [ rule, loading, @@ -265,6 +268,7 @@ const EditRulePageComponent: FC = () => { } else { setTabHasError(invalidForms); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ stepsForm, myAboutRuleForm, @@ -320,6 +324,7 @@ const EditRulePageComponent: FC = () => { setInitForm(true); setSelectedTab(tab); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedTab, stepsForm.current] ); @@ -338,6 +343,7 @@ const EditRulePageComponent: FC = () => { useEffect(() => { const tabIndex = rule?.immutable ? 3 : 0; setSelectedTab(tabs[tabIndex]); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rule]); if (isSaved) { diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx index 277352c39df65..a57fae8081bea 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx @@ -59,6 +59,7 @@ export const AddComment = React.memo( `${comment}${comment.length > 0 ? '\n\n' : ''}${insertQuote}` ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [insertQuote]); const onSubmit = useCallback(async () => { @@ -67,9 +68,10 @@ export const AddComment = React.memo( if (onCommentSaving != null) { onCommentSaving(); } - await postComment(data, onCommentPosted); + postComment(data, onCommentPosted); form.reset(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form, onCommentPosted, onCommentSaving]); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 12f0d02eb10f6..32a7c4078071e 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -134,6 +134,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { (refetchFilter: () => void) => { filterRefetch.current = refetchFilter; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterRefetch.current] ); const refreshCases = useCallback( @@ -146,6 +147,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { filterRefetch.current(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterOptions, queryParams, filterRefetch.current] ); @@ -158,6 +160,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { refreshCases(); dispatchResetIsUpdated(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isDeleted, isUpdated]); const confirmDeleteModal = useMemo( () => ( @@ -172,12 +175,14 @@ export const AllCases = React.memo(({ userCanCrud }) => { )} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] ); const toggleDeleteModal = useCallback((deleteCase: Case) => { handleToggleModal(); setDeleteThisCase(deleteCase); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const toggleBulkDeleteModal = useCallback( @@ -192,6 +197,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); setDeleteBulk(convertToDeleteCases); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCases] ); @@ -199,6 +205,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { (status: string) => { updateBulkStatus(selectedCases, status); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCases] ); @@ -220,6 +227,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { })} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] ); const handleDispatchUpdate = useCallback( @@ -261,6 +269,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { setQueryParams(newQueryParams); refreshCases(false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [queryParams] ); @@ -274,6 +283,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { setFilters(newFilterOptions); refreshCases(false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterOptions, queryParams] ); @@ -296,6 +306,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { }; const euiBasicTableSelectionProps = useMemo>( () => ({ onSelectionChange: setSelectedCases }), + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedCases] ); const isCasesLoading = useMemo( diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx index 42340b455c3af..63172bd6ad6bb 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/table_filters.tsx @@ -66,12 +66,14 @@ const CasesTableFiltersComponent = ({ const newReporters = selectedReporters.filter((r) => reporters.includes(r)); handleSelectedReporters(newReporters); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [reporters]); useEffect(() => { if (selectedTags.length) { const newTags = selectedTags.filter((t) => tags.includes(t)); handleSelectedTags(newTags); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tags]); const handleSelectedReporters = useCallback( @@ -84,6 +86,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ reporters: reportersObj }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedReporters, respReporters] ); @@ -94,6 +97,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ tags: newTags }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedTags] ); const handleOnSearch = useCallback( @@ -104,6 +108,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ search: trimSearch }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [search] ); const handleToggleFilter = useCallback( @@ -113,6 +118,7 @@ const CasesTableFiltersComponent = ({ onFilterChanged({ status: showOpen ? 'open' : 'closed' }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [showOpenCases] ); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx index cd9318a355e3c..df1082ec48f91 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/actions.tsx @@ -44,6 +44,7 @@ const CaseViewActionsComponent: React.FC = ({ onConfirm={handleOnDeleteConfirm.bind(null, [{ id: caseData.id, title: caseData.title }])} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [isDisplayConfirmDeleteModal, caseData] ); const propertyActions = useMemo( diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx index 947d68fd04f7b..b8151cb6fe18c 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors.tsx @@ -68,6 +68,7 @@ const ConnectorsComponent: React.FC = ({ ), + // eslint-disable-next-line react-hooks/exhaustive-deps [connectorsName, updateConnectorDisabled] ); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx index c5481f592e750..018d3a0fdb4e0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/connectors_dropdown.tsx @@ -91,6 +91,7 @@ const ConnectorsDropdownComponent: React.FC = ({ } return connectorsFormatted; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [connectors]); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx index 415faa96eeedd..fe5c0c19820a1 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/field_mapping.tsx @@ -95,6 +95,7 @@ const FieldMappingComponent: React.FC = ({ const myMapping = mapping ?? defaultMapping; onChangeMapping(setActionTypeToMapping(caseField, newActionType, myMapping)); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [mapping] ); @@ -103,6 +104,7 @@ const FieldMappingComponent: React.FC = ({ const myMapping = mapping ?? defaultMapping; onChangeMapping(setThirdPartyToMapping(caseField, newThirdPartyField, myMapping)); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [mapping] ); diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx index 6e1ef293fd5c4..256c8893be941 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx @@ -77,6 +77,7 @@ const ConfigureCasesComponent: React.FC = ({ userC // ActionsConnectorsContextProvider reloadConnectors prop expects a Promise. // TODO: Fix it if reloadConnectors type change. + // eslint-disable-next-line react-hooks/exhaustive-deps const reloadConnectors = useCallback(async () => refetchConnectors(), []); const isLoadingAny = isLoadingConnectors || persistLoading || loadingCaseConfigure; const updateConnectorDisabled = isLoadingAny || !connectorIsValid || connectorId === 'none'; @@ -89,6 +90,7 @@ const ConfigureCasesComponent: React.FC = ({ userC (isVisible: boolean) => { setAddFlyoutVisibility(isVisible); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [currentConfiguration, connectorId, closureType] ); @@ -96,6 +98,7 @@ const ConfigureCasesComponent: React.FC = ({ userC (isVisible: boolean) => { setEditFlyoutVisibility(isVisible); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [currentConfiguration, connectorId, closureType] ); @@ -113,6 +116,7 @@ const ConfigureCasesComponent: React.FC = ({ userC closureType, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [connectorId, closureType, version] ); @@ -125,6 +129,7 @@ const ConfigureCasesComponent: React.FC = ({ userC closureType: type, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [connectorId, closureType, version] ); @@ -141,6 +146,7 @@ const ConfigureCasesComponent: React.FC = ({ userC ) { setConnectorIsValid(true); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [connectors, connectorId]); useEffect(() => { @@ -149,6 +155,7 @@ const ConfigureCasesComponent: React.FC = ({ userC connectors.find((c) => c.id === connectorId) as ActionConnectorTableItem ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [connectors, connectorId]); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx index 9e058ee5cf09e..1706fa38bb8a0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/connector_selector/form.tsx @@ -33,6 +33,7 @@ export const ConnectorSelector = ({ useEffect(() => { field.setValue(defaultValue); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValue]); const handleContentChange = useCallback( diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index ae0ffe498c391..1b65b2582c760 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -91,8 +91,10 @@ export const Create = React.memo(() => { const onSubmit = useCallback(async () => { const { isValid, data } = await form.submit(); if (isValid) { + // `postCase`'s type is incorrect, it actually returns a promise await postCase(data); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [form]); const handleSetIsCancel = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx b/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx index b9dab13090aca..e7d5299842494 100644 --- a/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/open_closed_stats/index.tsx @@ -24,6 +24,7 @@ export const OpenClosedStats = React.memo( description: isLoading ? : caseCount ?? 'N/A', }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [caseCount, caseStatus, isLoading, dataTestSubj] ); return ( diff --git a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx index 2e9e3cce4306a..f18870787ded1 100644 --- a/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/use_push_to_service/index.tsx @@ -141,6 +141,7 @@ export const usePushToService = ({ errors = [...errors, getKibanaConfigError()]; } return errors; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [actionLicense, caseStatus, connectors.length, caseConnectorId, loadingLicense, urlSearch]); const pushToServiceButton = useMemo(() => { @@ -160,6 +161,7 @@ export const usePushToService = ({ : i18n.PUSH_THIRD(caseConnectorName)} ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ caseConnectorId, caseConnectorName, diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx index da49014eb0204..52c2779a93fc0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/index.tsx @@ -85,6 +85,7 @@ export const UserActionTree = React.memo( updateCase, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [caseData, handleManageMarkdownEditId, patchComment, updateCase] ); @@ -109,6 +110,7 @@ export const UserActionTree = React.memo( window.clearTimeout(handlerTimeoutId.current); }, 2400); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [handlerTimeoutId.current] ); @@ -155,6 +157,7 @@ export const UserActionTree = React.memo( showLoading={false} /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [caseData.id, handleUpdate, insertQuote, userCanCrud] ); @@ -165,6 +168,7 @@ export const UserActionTree = React.memo( handleOutlineComment(commentId); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [commentId, initLoading, isLoadingUserActions, isLoadingIds]); return ( <> diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx index 03dd599da88e5..b3a5f1e0158d8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.tsx @@ -74,6 +74,7 @@ export const UserActionMarkdown = ({ updateTimeline: dispatchUpdateTimeline(dispatch), }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [apolloClient] ); @@ -114,6 +115,7 @@ export const UserActionMarkdown = ({ ); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [handleCancelAction, handleSaveAction] ); return isEditable ? ( diff --git a/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx b/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx index 0606da371d16a..86ff42561c409 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_list/index.tsx @@ -84,6 +84,7 @@ export const UserList = React.memo(({ email, headline, loading, users }: UserLis window.open(`mailto:${emailAddress}?subject=${email.subject}&body=${email.body}`, '_blank'); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [email.subject] ); return users.filter(({ username }) => username != null && username !== '').length > 0 ? ( diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx index 5a85a3a0633bc..e89212036ec20 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/configure/use_configure.tsx @@ -253,6 +253,7 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.firstLoad]); const persistCaseConfigure = useCallback( @@ -311,11 +312,13 @@ export const useCaseConfigure = (): ReturnUseCaseConfigure => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state.version] ); useEffect(() => { refetchCaseConfigure(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx b/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx index 9cd755864d37b..812e580ad653f 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/configure/use_connectors.tsx @@ -50,10 +50,12 @@ export const useConnectors = (): ReturnConnectors => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { refetchConnectors(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx index ef68f4f48b1a0..c333ff4207833 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_bulk_update_case.tsx @@ -108,6 +108,7 @@ export const useUpdateCases = (): UseUpdateCases => { cancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const dispatchResetIsUpdated = useCallback(() => { @@ -121,6 +122,7 @@ export const useUpdateCases = (): UseUpdateCases => { version: theCase.version, })); dispatchUpdateCases(updateCasesStatus); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...state, updateBulkStatus, dispatchResetIsUpdated }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx index 2e8c7dfae2313..f47e9e51f865a 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_delete_cases.tsx @@ -110,6 +110,7 @@ export const useDeleteCases = (): UseDeleteCase => { abortCtrl.abort(); cancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const dispatchToggleDeleteModal = useCallback(() => { @@ -118,6 +119,7 @@ export const useDeleteCases = (): UseDeleteCase => { const dispatchResetIsDeleted = useCallback(() => { dispatch({ type: 'RESET_IS_DELETED' }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.isDisplayConfirmDeleteModal]); const handleOnDeleteConfirm = useCallback( @@ -125,10 +127,12 @@ export const useDeleteCases = (): UseDeleteCase => { dispatchDeleteCases(cases); dispatchToggleDeleteModal(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state.isDisplayConfirmDeleteModal] ); const handleToggleModal = useCallback(() => { dispatchToggleDeleteModal(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.isDisplayConfirmDeleteModal]); return { ...state, dispatchResetIsDeleted, handleOnDeleteConfirm, handleToggleModal }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx index 563e2a4a58c70..e289a1973cf6e 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_action_license.tsx @@ -65,10 +65,12 @@ export const useGetActionLicense = (): ActionLicenseState => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [actionLicenseState]); useEffect(() => { fetchActionLicense(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...actionLicenseState }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx index 01ada00ba9b72..ea4da41151993 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_case.tsx @@ -118,10 +118,12 @@ export const useGetCase = (caseId: string): UseGetCase => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [caseId]); useEffect(() => { callFetch(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [caseId]); return { ...state, fetchCase: callFetch, updateCase }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx index 050b2815dc511..76d939de06a0a 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_case_user_actions.tsx @@ -210,6 +210,7 @@ export const useGetCaseUserActions = ( abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [caseUserActionsState, caseConnectorId] ); @@ -217,6 +218,7 @@ export const useGetCaseUserActions = ( if (!isEmpty(caseId)) { fetchCaseUserActions(caseId); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [caseId, caseConnectorId]); return { ...caseUserActionsState, fetchCaseUserActions }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx index 45b571a8fe7e2..fdf526a1e4d88 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases.tsx @@ -184,8 +184,10 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { abortCtrl.abort(); didCancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => fetchCases(state.filterOptions, state.queryParams), [ state.queryParams, state.filterOptions, @@ -224,11 +226,13 @@ export const useGetCases = (initialQueryParams?: QueryParams): UseGetCases => { didCancel = true; }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state.filterOptions, state.queryParams] ); const refetchCases = useCallback(() => { fetchCases(state.filterOptions, state.queryParams); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [state.filterOptions, state.queryParams]); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx index 476462b7e4c28..5260b6d5cc283 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_cases_status.tsx @@ -69,10 +69,12 @@ export const useGetCasesStatus = (): UseGetCasesStatus => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [casesStatusState]); useEffect(() => { fetchCasesStatus(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx index d723b8cc37c23..b4ca775660910 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_reporters.tsx @@ -79,10 +79,12 @@ export const useGetReporters = (): UseGetReporters => { didCancel = true; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [reportersState]); useEffect(() => { fetchReporters(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...reportersState, fetchReporters }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx index 14f5e35bc4976..eded326719e52 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_get_tags.tsx @@ -89,6 +89,7 @@ export const useGetTags = (): UseGetTags => { }; useEffect(() => { callFetch(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...state, fetchTags: callFetch }; }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx index 13cfc2738620f..0752fe9b2071c 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_post_case.tsx @@ -86,6 +86,7 @@ export const usePostCase = (): UsePostCase => { abortCtrl.abort(); cancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { ...state, postCase: postMyCase }; diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx index 9a52eaaf0db6b..e6cb8a9c3d150 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_post_comment.tsx @@ -79,6 +79,7 @@ export const usePostComment = (caseId: string): UsePostComment => { cancel = true; }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [caseId] ); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx index 4d25ac7fbf0db..0d8a4c04ca7cd 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_post_push_to_service.tsx @@ -146,6 +146,7 @@ export const usePostPushToService = (): UsePostPushToService => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx index 77cf53165d914..18dd9f5278503 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_update_case.tsx @@ -118,6 +118,7 @@ export const useUpdateCase = ({ caseId }: { caseId: string }): UseUpdateCase => abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx b/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx index 821fd5523a751..f896185dbccfb 100644 --- a/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx +++ b/x-pack/plugins/security_solution/public/cases/containers/use_update_comment.tsx @@ -111,6 +111,7 @@ export const useUpdateComment = (): UseUpdateComment => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx index b19343a9f4a5c..bb6ba01821835 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx @@ -69,6 +69,7 @@ const AlertsTableComponent: React.FC = ({ endDate, startDate, pageFilters title: i18n.ALERTS_TABLE_TITLE, unit: i18n.UNIT, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( { const isDarkMode = useUiSetting(DEFAULT_DARK_MODE); const defaultTheme = isDarkMode ? DARK_THEME : LIGHT_THEME; + // eslint-disable-next-line react-hooks/exhaustive-deps const themeValue = useMemo(() => mergeWithDefaultTheme(theme, defaultTheme), []); return themeValue; diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx index c33677e41db0e..32f05e7c837a7 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx @@ -126,6 +126,7 @@ export const DragDropContextWrapperComponent = React.memo( () => () => { unRegisterProvider(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx index 998d18291f638..4eeefdbe2fca0 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx @@ -63,6 +63,7 @@ const DraggableWrapperHoverContentComponent: React.FC = ({ onFilterAdded(); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field, value, filterManager, onFilterAdded]); const filterOutValue = useCallback(() => { @@ -77,6 +78,7 @@ const DraggableWrapperHoverContentComponent: React.FC = ({ onFilterAdded(); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [field, value, filterManager, onFilterAdded]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx index d0bd87188e541..6b4baac0ff26c 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx @@ -103,9 +103,11 @@ const EventsViewerComponent: React.FC = ({ } = useManageTimeline(); useEffect(() => { setIsTimelineLoading({ id, isLoading: isQueryLoading }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isQueryLoading]); useEffect(() => { setTimelineFilterManager({ id, filterManager }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterManager]); const { queryFields, title, unit } = useMemo(() => getManageTimelineById(id), [ diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx index ec726cd603579..9f1d71108e2f1 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx @@ -74,6 +74,7 @@ const StatefulEventsViewerComponent: React.FC = ({ return () => { deleteEventQuery({ id, inputId: 'global' }); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const onChangeItemsPerPage: OnChangeItemsPerPage = useCallback( diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx index d0236adc27c6c..fa21d61b06ebe 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.tsx @@ -109,6 +109,7 @@ const ExceptionEntriesComponent = ({ }, }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [entries] ); diff --git a/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx b/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx index 2f68da0c18727..2e8d5f77afc83 100644 --- a/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/generic_downloader/index.tsx @@ -95,6 +95,7 @@ export const GenericDownloaderComponent = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ids]); return ; diff --git a/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx b/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx index 0c6f7258d09dc..6f6c94a0b1124 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_page/editable_title.tsx @@ -57,6 +57,7 @@ const EditableTitleComponent: React.FC = ({ onSubmit(changedTitle); } setEditMode(false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [changedTitle, title]); const handleOnChange = useCallback( diff --git a/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx b/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx index ba9c136445983..56f0c825aa59e 100644 --- a/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/help_menu/index.tsx @@ -45,6 +45,7 @@ export const HelpMenu = React.memo(() => { }, ], }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return null; diff --git a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx index c4e0a0de5ae81..a42628cecff8e 100644 --- a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx @@ -109,6 +109,7 @@ export const ImportDataModalComponent = ({ errorToToaster({ title: errorMessage, error, dispatchToaster }); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedFiles, overwrite]); const handleCloseModal = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/common/components/links/index.tsx b/x-pack/plugins/security_solution/public/common/components/links/index.tsx index 8a41d4c36edbb..637f0d8d53057 100644 --- a/x-pack/plugins/security_solution/public/common/components/links/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/links/index.tsx @@ -242,6 +242,7 @@ const ReputationLinkComponent: React.FC<{ name: isDefaultReputationLink(name) ? defaultNameMapping[name] : name, url_template: url_template.replace(`{{ip}}`, encodeURIComponent(domain)), })), + // eslint-disable-next-line react-hooks/exhaustive-deps [ipReputationLinksSetting, domain, defaultNameMapping, allItemsLimit] ); diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx index b0df2b6b5b60f..d92952992d997 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx @@ -135,6 +135,7 @@ export const MarkdownEditor = React.memo<{ ), }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [content, isDisabled, placeholder] ); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx index 08edae208fefa..3e196c4b7bad4 100644 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.tsx @@ -19,12 +19,7 @@ import { MatrixLoader } from './matrix_loader'; import { Panel } from '../panel'; import { getBarchartConfigs, getCustomChartData } from './utils'; import { useQuery } from '../../containers/matrix_histogram'; -import { - MatrixHistogramProps, - MatrixHistogramOption, - HistogramAggregation, - MatrixHistogramQueryProps, -} from './types'; +import { MatrixHistogramProps, MatrixHistogramOption, MatrixHistogramQueryProps } from './types'; import { InspectButtonContainer } from '../inspect'; import { State, inputsSelectors } from '../../store'; @@ -125,6 +120,7 @@ export const MatrixHistogramComponent: React.FC< yTickFormatter, showLegend, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [ chartHeight, startDate, @@ -145,21 +141,20 @@ export const MatrixHistogramComponent: React.FC< stackByOptions.find((co) => co.value === event.target.value) ?? defaultStackByOption ); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); - const { data, loading, inspect, totalCount, refetch = noop } = useQuery<{}, HistogramAggregation>( - { - endDate, - errorMessage, - filterQuery, - histogramType, - indexToAdd, - startDate, - isInspected, - stackByField: selectedStackByOption.value, - } - ); + const { data, loading, inspect, totalCount, refetch = noop } = useQuery({ + endDate, + errorMessage, + filterQuery, + histogramType, + indexToAdd, + startDate, + isInspected, + stackByField: selectedStackByOption.value, + }); const titleWithStackByField = useMemo( () => (title != null && typeof title === 'function' ? title(selectedStackByOption) : title), @@ -260,7 +255,7 @@ export const MatrixHistogram = React.memo(MatrixHistogramComponent); const makeMapStateToProps = () => { const getQuery = inputsSelectors.globalQueryByIdSelector(); - const mapStateToProps = (state: State, { type, id }: OwnProps) => { + const mapStateToProps = (state: State, { id }: OwnProps) => { const { isInspected } = getQuery(state, id); return { isInspected, diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts index e30f1e9374c26..a9e6cdd19bb20 100644 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/types.ts @@ -99,12 +99,6 @@ export interface GroupBucket { }; } -export interface HistogramAggregation { - histogramAgg: { - buckets: GroupBucket[]; - }; -} - export interface BarchartConfigs { series: { xScaleType: ScaleType; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts index a76c4c850b8d9..8568c7e6b5575 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/anomaly/use_anomalies_table_data.ts @@ -121,13 +121,17 @@ export const useAnomaliesTableData = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ + // eslint-disable-next-line react-hooks/exhaustive-deps influencersOrCriteriaToString(influencers), + // eslint-disable-next-line react-hooks/exhaustive-deps influencersOrCriteriaToString(criteriaFields), startDate, endDate, skip, userPermissions, + // eslint-disable-next-line react-hooks/exhaustive-deps siemJobIds.sort().join(), ]); diff --git a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx index 1d5c1b36e22af..c83271a56be5a 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/permissions/ml_capabilities_provider.tsx @@ -60,6 +60,7 @@ export const MlCapabilitiesProvider = React.memo<{ children: JSX.Element }>(({ c isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx index a84d88782926c..7f0a8dea1913e 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs.tsx @@ -74,6 +74,7 @@ export const useSiemJobs = (refetchData: boolean): Return => { isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refetchData, userPermissions]); return [loading, siemJobs]; diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx index dd6e2d3f47110..de4185c8644a7 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx @@ -46,6 +46,7 @@ export const GroupsFilterPopoverComponent = ({ useEffect(() => { onSelectedGroupsChanged(selectedGroups); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedGroups.sort().join()]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx index e0a24a5fc083c..0cbff9e70eff7 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx @@ -54,6 +54,7 @@ export const SiemNavigationComponent: React.FC< chrome ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [chrome, pathName, search, navTabs, urlState, state]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx b/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx index b0b9309b44c68..a182102329f05 100644 --- a/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx @@ -134,6 +134,7 @@ const SearchBarComponent = memo( window.setTimeout(() => updateSearch(updateSearchBar), 0); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, end, filterQuery, fromStr, queries, start, toStr] ); @@ -153,6 +154,7 @@ const SearchBarComponent = memo( queries.forEach((q) => q.refetch && (q.refetch as inputsModel.Refetch)()); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, queries, filterManager] ); @@ -160,6 +162,7 @@ const SearchBarComponent = memo( (newSavedQuery: SavedQuery) => { setSavedQuery({ id, savedQuery: newSavedQuery }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -196,6 +199,7 @@ const SearchBarComponent = memo( updateSearch(updateSearchBar); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, end, fromStr, start, toStr] ); @@ -218,6 +222,7 @@ const SearchBarComponent = memo( filterManager, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [id, end, filterManager, fromStr, start, toStr, savedQuery]); useEffect(() => { @@ -241,6 +246,7 @@ const SearchBarComponent = memo( isSubscribed = false; subscriptions.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const indexPatterns = useMemo(() => [indexPattern], [indexPattern]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx b/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx index ec9cfc62ebada..dee730059b03a 100644 --- a/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/stat_items/index.tsx @@ -183,6 +183,7 @@ export const useKpiMatrixStatus = ( }; }) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [data]); return statItemsProps; diff --git a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx index 6b979df653eb4..84ff1120f6496 100644 --- a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.tsx @@ -117,6 +117,7 @@ export const SuperDatePickerComponent = React.memo( refetchQuery(queries); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [end, id, isQuickSelection, kqlQuery, start, timelineId] ); @@ -136,6 +137,7 @@ export const SuperDatePickerComponent = React.memo( refetchQuery(queries); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id, isQuickSelection, duration, policy, toStr] ); @@ -175,6 +177,7 @@ export const SuperDatePickerComponent = React.memo( setIsQuickSelection(newIsQuickSelection); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [recentlyUsedRanges, kqlQuery] ); diff --git a/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx index 944e8f6d1fb39..35036ef4b16b5 100644 --- a/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/toasters/index.test.tsx @@ -69,6 +69,7 @@ describe('Toaster', () => { if (toasts.length === 0) { dispatch({ type: 'addToaster', toast: mockToast }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( <> diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx index 3e83866c7cf62..c28f5ab8aa44f 100644 --- a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx @@ -109,6 +109,7 @@ const StatefulTopNComponent: React.FC = ({ isManagedTimeline(ACTIVE_TIMELINE_REDUX_ID) ? getManageTimelineById(ACTIVE_TIMELINE_REDUX_ID) : { documentType: null, id: null, indexToAdd: null }, + // eslint-disable-next-line react-hooks/exhaustive-deps [getManageTimelineById] ); diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx index b3436a7da8297..ef60967e70ac3 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx +++ b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx @@ -46,7 +46,6 @@ export const useUrlStateHooks = ({ pathName, search, setInitialStateFromUrl, - tabName, updateTimeline, updateTimelineIsLoading, urlState, @@ -206,10 +205,12 @@ export const useUrlStateHooks = ({ } else if (pathName !== prevProps.pathName) { handleInitialize(type, pageName === SiemPageName.detections); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isInitializing, history, pathName, pageName, prevProps, urlState]); useEffect(() => { document.title = `${getTitle(pageName, detailName, navTabs)} - Kibana`; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pageName]); return null; diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx index a5574bd2a57c7..0beecc500e722 100644 --- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx @@ -35,6 +35,7 @@ export const AnomaliesQueryTabBody = ({ deleteQuery({ id: ID }); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const [, siemJobs] = useSiemJobs(true); diff --git a/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts b/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts index 260b13c23f39c..6050dafc0b191 100644 --- a/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts +++ b/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts @@ -33,7 +33,7 @@ export interface OwnProps extends QueryTemplateProps { indexKey: LastEventIndexKey; } -export function useLastEventTimeQuery( +export function useLastEventTimeQuery( indexKey: LastEventIndexKey, details: LastTimeDetails, sourceId: string @@ -84,6 +84,7 @@ export function useLastEventTimeQuery( const signal = abortCtrl.signal; fetchLastEventTime(signal); return () => abortCtrl.abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [apolloClient, indexKey, details.hostName, details.ip]); return { lastSeen, loading, errorMessage }; diff --git a/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx b/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx index 4632e9aee3fdd..9b9b5c5d815b9 100644 --- a/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/global_time/index.tsx @@ -59,6 +59,7 @@ export const GlobalTimeComponent: React.FC = ({ return () => { deleteAllQuery({ id: 'global' }); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts b/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts index c675c2745c66a..8c7acfc18ece6 100644 --- a/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts +++ b/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts @@ -17,7 +17,7 @@ import { inputsModel } from '../../store'; import { MatrixHistogramGqlQuery } from './index.gql_query'; import { GetMatrixHistogramQuery, MatrixOverTimeHistogramData } from '../../../graphql/types'; -export const useQuery = ({ +export const useQuery = ({ endDate, errorMessage, filterQuery, @@ -102,6 +102,7 @@ export const useQuery = ({ isSubscribed = false; abortCtrl.abort(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ defaultIndex, errorMessage, diff --git a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx index 26fb14c6a9c1e..ad480ad2c496b 100644 --- a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx @@ -75,7 +75,7 @@ export const getIndexFields = memoizeOne( ); export const getBrowserFields = memoizeOne( - (title: string, fields: IndexField[]): BrowserFields => + (_title: string, fields: IndexField[]): BrowserFields => fields && fields.length > 0 ? fields.reduce( (accumulator: BrowserFields, field: IndexField) => @@ -173,6 +173,7 @@ export const useWithSource = (sourceId: string, indices: string[]) => { const signal = abortCtrl.signal; fetchSource(signal); return () => abortCtrl.abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [apolloClient, sourceId, indices]); return { indicesExist, browserFields, indexPattern, loading, errorMessage }; diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx b/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx index b73c400bc0460..eba8d14d60538 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx +++ b/x-pack/plugins/security_solution/public/common/hooks/use_add_to_timeline.tsx @@ -159,6 +159,7 @@ export const useAddToTimeline = ({ document.body.classList.remove(IS_DRAGGING_CLASS_NAME); // it was not possible to perform a drag and drop } }, 0); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [_sensorApiSingleton, draggableId]); return startDragToTimeline; diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx b/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx index 05b0521e35217..837d6d5f70b5d 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx +++ b/x-pack/plugins/security_solution/public/common/hooks/use_index_patterns.tsx @@ -45,6 +45,7 @@ export const useIndexPatterns = (refreshToggle = false): Return => { return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refreshToggle]); return [isLoading, indexPatterns]; diff --git a/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx b/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx index cb227563b697a..30e2c650a70cc 100644 --- a/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx +++ b/x-pack/plugins/security_solution/public/common/lib/connectors/components/connector_flyout/index.tsx @@ -53,6 +53,7 @@ export const withConnectorFlyout = ({ if (!isEmpty(apiUrl)) { secretKeys.forEach((key: string) => editActionSecrets(key, '')); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (isEmpty(mapping)) { @@ -64,6 +65,7 @@ export const withConnectorFlyout = ({ const handleOnChangeActionConfig = useCallback( (key: string, value: string) => editActionConfig(key, value), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -73,11 +75,13 @@ export const withConnectorFlyout = ({ editActionConfig(key, ''); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [action.config] ); const handleOnChangeSecretConfig = useCallback( (key: string, value: string) => editActionSecrets(key, value), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -87,6 +91,7 @@ export const withConnectorFlyout = ({ editActionSecrets(key, ''); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [action.secrets] ); @@ -96,6 +101,7 @@ export const withConnectorFlyout = ({ ...action.config.casesConfiguration, mapping: newMapping, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [action.config] ); diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts index afd57cade5559..bc16e8334e81c 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts @@ -89,10 +89,12 @@ export const useCurrentUser = (): AuthenticatedElasticUser | null => { return () => { didCancel = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [security]); useEffect(() => { fetchUser(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return user; }; diff --git a/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx b/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx index 9030e2713548b..072bbcf31c900 100644 --- a/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx +++ b/x-pack/plugins/security_solution/public/common/utils/route/spy_routes.tsx @@ -32,6 +32,7 @@ export const SpyRouteComponent = memo( }); setIsInitializing(false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [search]); useEffect(() => { if (pageName && !deepEqual(route.pathName, pathname)) { @@ -81,6 +82,7 @@ export const SpyRouteComponent = memo( }); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname, search, pageName, detailName, tabName, flowTarget, state]); return null; } diff --git a/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx index 78f22a86c1893..37c6a6583f0fb 100644 --- a/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx +++ b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.tsx @@ -25,6 +25,7 @@ export const useShowTimeline = () => { } else if (!showTimeline) { setShowTimeline(true); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentLocation.pathname]); return [showTimeline]; diff --git a/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx b/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx index 937e3727ca613..86c8e00c0a56f 100644 --- a/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx +++ b/x-pack/plugins/security_solution/public/endpoint_alerts/view/details/overview/index.tsx @@ -90,6 +90,7 @@ const AlertDetailsOverviewComponent = memo(() => { history.push(locationObject); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [alertDetailsTabId] ); diff --git a/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts b/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts index 55a3a4b060dad..a4f8fca23e8aa 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts +++ b/x-pack/plugins/security_solution/public/hosts/containers/hosts/first_last_seen/index.ts @@ -79,6 +79,7 @@ export function useFirstLastSeenHostQuery( const signal = abortCtrl.signal; fetchFirstLastSeenHost(signal); return () => abortCtrl.abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { firstSeen, lastSeen, loading, errorMessage }; diff --git a/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx b/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx index 5b140a53a363b..4fbbcfc8d948a 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx @@ -35,6 +35,7 @@ export const ManagementPageView = memo>((options) => href: getManagementUrl({ name: 'policyList' }), }, ]; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tabName]); return ; }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx index b05cdfb3be840..6c447df618791 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx @@ -137,6 +137,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { description: details.agent.version, }, ]; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ details.agent.version, details.endpoint.policy.id, diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx index 5e0aa76e1d139..39b253439aff0 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/embedded_map.tsx @@ -149,6 +149,7 @@ export const EmbeddedMapComponent = ({ return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loadingKibanaIndexPatterns, kibanaIndexPatterns]); // queryExpression updated useEffect @@ -156,12 +157,14 @@ export const EmbeddedMapComponent = ({ if (embeddable != null) { embeddable.updateInput({ query }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [query]); useEffect(() => { if (embeddable != null) { embeddable.updateInput({ filters }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filters]); // DateRange updated useEffect @@ -173,6 +176,7 @@ export const EmbeddedMapComponent = ({ }; embeddable.updateInput({ timeRange }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [startDate, endDate]); return isError ? null : ( diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx index 3472cb629b9fe..d2b8322c8121e 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx @@ -20,10 +20,8 @@ import * as i18n from '../translations'; import { ITooltipProperty } from '../../../../../../maps/public'; export const MapToolTipComponent = ({ - addFilters, closeTooltip, features = [], - isLocked, getLayerName, loadFeatureProperties, loadFeatureGeometry, @@ -78,8 +76,10 @@ export const MapToolTipComponent = ({ }; fetchFeatureProps(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ featureIndex, + // eslint-disable-next-line react-hooks/exhaustive-deps features .map((f) => `${f.id}-${f.layerId}`) .sort() diff --git a/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx b/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx index b9c01826e9e74..cb1af5513c846 100644 --- a/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx +++ b/x-pack/plugins/security_solution/public/network/components/source_destination/country_flag.tsx @@ -31,6 +31,7 @@ export const CountryFlag = memo<{ if (displayCountryNameOnHover && isEmpty(countries.getNames('en'))) { countries.registerLocale(countryJson); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const flag = getFlag(countryCode); diff --git a/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx b/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx index 0fc4629c95470..d0e001466518d 100644 --- a/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx +++ b/x-pack/plugins/security_solution/public/network/components/tls_table/index.tsx @@ -108,6 +108,7 @@ const TlsTableComponent = React.memo( [sort, type, tableType, updateNetworkTable] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const columns = useMemo(() => getTlsColumns(tlsTableId), [tlsTableId]); return ( diff --git a/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx b/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx index 51634a784d4da..af9d2b0ffefe3 100644 --- a/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx +++ b/x-pack/plugins/security_solution/public/network/components/users_table/index.tsx @@ -114,6 +114,7 @@ const UsersTableComponent = React.memo( [sort, type, updateNetworkTable] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const columns = useMemo(() => getUsersColumns(flowTarget, usersTableId), [ flowTarget, usersTableId, diff --git a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx index 574260a819071..fe66ae2624c2a 100644 --- a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx @@ -71,6 +71,7 @@ const AlertsByCategoryComponent: React.FC = ({ deleteQuery({ id: ID }); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const kibana = useKibana(); @@ -98,6 +99,7 @@ const AlertsByCategoryComponent: React.FC = ({ `${SHOWING}: ${numeral(totalCount).format(defaultNumberFormat)} ${UNIT(totalCount)}`, legendPosition: Position.Right, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx index 75b157a282eeb..ab76219b3cc00 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx @@ -82,6 +82,7 @@ const StatefulRecentTimelinesComponent = React.memo( onlyUserFavorite: filterBy === 'favorites', timelineType: TimelineType.default, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterBy]); return ( diff --git a/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx b/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx index f2ad45be93522..5010fd9c06eb7 100644 --- a/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/signals_by_category/index.tsx @@ -61,6 +61,7 @@ const SignalsByCategoryComponent: React.FC = ({ const [min, max] = x; setAbsoluteRangeDatePicker({ id: setAbsoluteRangeDatePickerTarget, from: min, to: max }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setAbsoluteRangeDatePicker] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx index b0a8dc311228a..14c17b7262724 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/category_columns.tsx @@ -50,6 +50,7 @@ interface ToolTipProps { const ToolTip = React.memo( ({ categoryId, browserFields, onUpdateColumns, timelineId }) => { const { getManageTimelineById } = useManageTimeline(); + // eslint-disable-next-line react-hooks/exhaustive-deps const { isLoading } = useMemo(() => getManageTimelineById(timelineId) ?? { isLoading: false }, [ timelineId, ]); diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx index c255bd062bb4c..8f538e03835f8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_browser.tsx @@ -180,6 +180,7 @@ const FieldsBrowserComponent: React.FC = ({ useEffect(() => { scrollViews(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedCategoryId, timelineId]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx index 11c44cce89956..a3e93ff3c90eb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.tsx @@ -108,6 +108,7 @@ export const StatefulFieldsBrowserComponent = React.memo { onUpdateColumns(columns); // show the category columns in the timeline + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** Invoked when the field browser should be hidden */ diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx index 33aca80b940fe..fbe3c475c9fe6 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx @@ -50,7 +50,7 @@ const FlyoutPaneComponent: React.FC = ({ const dispatch = useDispatch(); const onResizeStop: ResizeCallback = useCallback( - (e, direction, ref, delta) => { + (_e, _direction, _ref, delta) => { const bodyClientWidthPixels = document.body.clientWidth; if (delta.width) { @@ -65,6 +65,7 @@ const FlyoutPaneComponent: React.FC = ({ ); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [dispatch] ); const resizableDefaultSize = useMemo( @@ -72,6 +73,7 @@ const FlyoutPaneComponent: React.FC = ({ width, height: '100%', }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const resizableHandleComponent = useMemo( diff --git a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx index c82a8bd18e6f8..8856805e6b660 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx @@ -190,6 +190,7 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT initializeTimeline({ id }); return { ...timelineDefaults, id }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [state] ); const isManagedTimeline = useCallback((id: string): boolean => state[id] != null, [state]); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx index 112e73a47ce7d..f88690ccd8aef 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_actions.tsx @@ -16,6 +16,7 @@ export const useEditTimelineActions = () => { const onCloseDeleteTimelineModal = useCallback(() => { setIsDeleteTimelineModalOpen(false); setActionTimeline(null); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [actionItem]); const onOpenDeleteTimelineModal = useCallback((selectedActionItem?: OpenTimelineResult) => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx index 7fb03b98432d0..4d45b74e9b1b4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx @@ -47,6 +47,7 @@ export const useEditTimelineBatchActions = ({ disableExportTimelineDownloader(); onCloseDeleteTimelineModal(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [disableExportTimelineDownloader, onCloseDeleteTimelineModal, tableRef.current] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx index f9c9d28ad89e1..92a8fc9338877 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx @@ -125,6 +125,7 @@ export const StatefulOpenTimelineComponent = React.memo( onlyUserFavorite: onlyFavorites, timelineType, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pageIndex, pageSize, search, sortField, sortDirection, timelineType, onlyFavorites]); /** Invoked when the user presses enters to submit the text in the search input */ @@ -177,6 +178,7 @@ export const StatefulOpenTimelineComponent = React.memo( const onDeleteOneTimeline: OnDeleteOneTimeline = useCallback( async (timelineIds: string[]) => { + // The type for `deleteTimelines` is incorrect, it returns a Promise await deleteTimelines(timelineIds); }, [deleteTimelines] @@ -184,6 +186,7 @@ export const StatefulOpenTimelineComponent = React.memo( /** Invoked when the user clicks the action to delete the selected timelines */ const onDeleteSelected: OnDeleteSelected = useCallback(async () => { + // The type for `deleteTimelines` is incorrect, it returns a Promise await deleteTimelines(getSelectedTimelineIds(selectedItems)); // NOTE: we clear the selection state below, but if the server fails to @@ -191,6 +194,7 @@ export const StatefulOpenTimelineComponent = React.memo( resetSelectionState(); // TODO: the query must re-execute to show the results of the deletion + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedItems, deleteTimelines]); /** Invoked when the user selects (or de-selects) timelines */ @@ -244,6 +248,7 @@ export const StatefulOpenTimelineComponent = React.memo( updateTimeline, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [apolloClient, updateIsLoading, updateTimeline] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx index f99d8c566c4a5..afc66e337d7b2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx @@ -79,6 +79,7 @@ export const useTimelineTypes = (): { ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tabName]); const timelineFilters = useMemo(() => { @@ -95,6 +96,7 @@ export const useTimelineTypes = (): { ))} ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [timelineType]); return { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx index 2d9f907cc7179..2bb78c0dcb0ad 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.tsx @@ -108,7 +108,7 @@ export const ColumnHeadersComponent = ({ ); const renderClone: DraggableChildrenFn = useCallback( - (dragProvided, dragSnapshot, rubric) => { + (dragProvided, _dragSnapshot, rubric) => { // TODO: Remove after github.com/DefinitelyTyped/DefinitelyTyped/pull/43057 is merged // eslint-disable-next-line @typescript-eslint/no-explicit-any const index = (rubric as any).source.index; @@ -151,6 +151,7 @@ export const ColumnHeadersComponent = ({ sort={sort} /> )), + // eslint-disable-next-line react-hooks/exhaustive-deps [ columnHeaders, timelineId, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx index 3808a10e851e6..a9ade7b34344e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx @@ -106,6 +106,7 @@ export const EventColumnView = React.memo( const onClickCb = useCallback((cb: () => void) => { cb(); closePopover(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const additionalActions = useMemo(() => { @@ -175,6 +176,7 @@ export const EventColumnView = React.memo( , ] : grouped.icon; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [button, ecsData, timelineActions, isPopoverOpen]); // , isPopoverOpen, closePopover, onButtonClick]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx index 61c5809518928..cf76cd3ddb8d4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_event.tsx @@ -174,6 +174,7 @@ const StatefulEventComponent: React.FC = ({ return () => { _isMounted = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Number of current columns plus one for actions. diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx index 351465dd45137..2d5e64fb09ffc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/stateful_body.tsx @@ -94,6 +94,7 @@ const StatefulBodyComponent = React.memo( const onAddNoteToEvent: AddNoteToEvent = useCallback( ({ eventId, noteId }: { eventId: string; noteId: string }) => addNoteToEvent!({ id, eventId, noteId }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -131,27 +132,34 @@ const StatefulBodyComponent = React.memo( (sorted) => { updateSort!({ id, sort: sorted }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); const onColumnRemoved: OnColumnRemoved = useCallback( (columnId) => removeColumn!({ id, columnId }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); const onColumnResized: OnColumnResized = useCallback( ({ columnId, delta }) => applyDeltaToColumnWidth!({ id, columnId, delta }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const onPinEvent: OnPinEvent = useCallback((eventId) => pinEvent!({ id, eventId }), [id]); + // eslint-disable-next-line react-hooks/exhaustive-deps const onUnPinEvent: OnUnPinEvent = useCallback((eventId) => unPinEvent!({ id, eventId }), [id]); + // eslint-disable-next-line react-hooks/exhaustive-deps const onUpdateNote: UpdateNote = useCallback((note: Note) => updateNote!({ note }), []); const onUpdateColumns: OnUpdateColumns = useCallback( (columns) => updateColumns!({ id, columns }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -160,6 +168,7 @@ const StatefulBodyComponent = React.memo( if (selectAll) { onSelectAll({ isSelected: true }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectAll]); // onSelectAll dependency not necessary return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx index aaf73487c4878..1f6fe998a44e9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/provider_item_badge.tsx @@ -71,11 +71,13 @@ export const ProviderItemBadge = React.memo( const onToggleEnabledProvider = useCallback(() => { toggleEnabledProvider(); closePopover(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [toggleEnabledProvider]); const onToggleExcludedProvider = useCallback(() => { toggleExcludedProvider(); closePopover(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [toggleExcludedProvider]); const [providerRegistered, setProviderRegistered] = useState(false); @@ -100,6 +102,7 @@ export const ProviderItemBadge = React.memo( () => () => { unRegisterProvider(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx index 77bd9aeba3ed2..cec889fe6ee34 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/fetch_kql_timeline.tsx @@ -39,6 +39,7 @@ const TimelineKqlFetchComponent = memo( timelineId: id, }), }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [kueryFilterQueryDraft, kueryFilterQuery, id]); return null; }, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx index 607e004a8294e..594bf6d43e285 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx @@ -266,6 +266,7 @@ export const FooterComponent = ({ if (updatedAt === null || !isLoading) { setUpdatedAt(getUpdatedAt()); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isLoading]); if (isLoading && !paginationLoading) { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx index 42fd6422d3a38..b53a34041a689 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.tsx @@ -78,6 +78,7 @@ const StatefulTimelineComponent = React.memo( const onDataProviderRemoved: OnDataProviderRemoved = useCallback( (providerId: string, andProviderId?: string) => removeProvider!({ id, providerId, andProviderId }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -89,6 +90,7 @@ const StatefulTimelineComponent = React.memo( providerId, andProviderId, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -100,6 +102,7 @@ const StatefulTimelineComponent = React.memo( providerId, andProviderId, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -114,11 +117,13 @@ const StatefulTimelineComponent = React.memo( providerId, value, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); const onChangeItemsPerPage: OnChangeItemsPerPage = useCallback( (itemsChangedPerPage) => updateItemsPerPage!({ id, itemsPerPage: itemsChangedPerPage }), + // eslint-disable-next-line react-hooks/exhaustive-deps [id] ); @@ -141,6 +146,7 @@ const StatefulTimelineComponent = React.memo( }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [columns, id] ); @@ -148,6 +154,7 @@ const StatefulTimelineComponent = React.memo( if (createTimeline != null) { createTimeline({ id, columns: defaultHeaders, show: false }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx index 2a673427d906c..ed4d742bb8b4d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx @@ -52,6 +52,7 @@ export const InsertTimelinePopoverComponent: React.FC = ({ ); setRouterState(null); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [routerState]); const handleClosePopover = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx index 1a81c131de015..0f9e64082a603 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx @@ -28,12 +28,14 @@ export const useInsertTimeline = (form: FormHook, fieldNa ].join(''); form.setFieldValue(fieldName, newValue); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [form] ); const handleCursorChange = useCallback( (cp: CursorPosition) => { setCursorPosition(cp); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [cursorPosition] ); return { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 3ef10d394bc7b..38a85a7a92631 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -142,6 +142,7 @@ export const NewCase = React.memo( }, }, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [onClosePopover, history, timelineId, timelineTitle]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index d8966a58748ed..1532a64e4083e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -87,6 +87,7 @@ export const Properties = React.memo( const onOpenTimelineModal = useCallback(() => { onClosePopover(); setShowTimelineModal(true); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const datePickerWidth = useMemo( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx index 9852fc7dd300a..80729eda051b1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx @@ -120,6 +120,7 @@ export const QueryBarTimeline = memo( isSubscribed = false; subscriptions.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -129,6 +130,7 @@ export const QueryBarTimeline = memo( if (!deepEqual(filters, filterWithoutDropArea)) { filterManager.setFilters(filters); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filters]); useEffect(() => { @@ -188,6 +190,7 @@ export const QueryBarTimeline = memo( return () => { isSubscribed = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [savedQueryId]); const onChangedQuery = useCallback( @@ -203,6 +206,7 @@ export const QueryBarTimeline = memo( ); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterQueryDraft] ); @@ -232,6 +236,7 @@ export const QueryBarTimeline = memo( }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [filterQuery, timelineId] ); @@ -274,6 +279,7 @@ export const QueryBarTimeline = memo( setSavedQueryId(null); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [dataProvidersDsl, savedQueryId, savedQueryServices] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx index 22fbaadf2e816..5f35bc5212d37 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx @@ -78,6 +78,7 @@ const StatefulSearchOrFilterComponent = React.memo( serializedQuery: convertKueryToElasticSearchQuery(expression, indexPattern), }, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [indexPattern, timelineId] ); @@ -90,6 +91,7 @@ const StatefulSearchOrFilterComponent = React.memo( expression, }, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); @@ -99,6 +101,7 @@ const StatefulSearchOrFilterComponent = React.memo( id: timelineId, filters: newFilters, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); @@ -108,6 +111,7 @@ const StatefulSearchOrFilterComponent = React.memo( id: timelineId, savedQueryId: newSavedQueryId, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); @@ -117,6 +121,7 @@ const StatefulSearchOrFilterComponent = React.memo( id: timelineId, eventType: newEventType, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [timelineId] ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx index 2d215267d8382..2e12ebad2f99d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx @@ -258,6 +258,7 @@ const SelectableTimelineComponent: React.FC = ({ onlyUserFavorite: onlyFavorites, timelineType, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [onlyFavorites, pageSize, searchTimelineValue, timelineType]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx index 340818efa5514..884d693ca6ade 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx @@ -171,12 +171,15 @@ export const TimelineComponent: React.FC = ({ } = useManageTimeline(); useEffect(() => { initializeTimeline({ id, indexToAdd }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { setIsTimelineLoading({ id, isLoading: isQueryLoading || loadingIndexName }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loadingIndexName, isQueryLoading]); useEffect(() => { setTimelineFilterManager({ id, filterManager }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterManager]); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx index 3bca7ce5f1c08..19112221cbfd0 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx @@ -48,7 +48,7 @@ export interface AllTimelinesVariables { export const ALL_TIMELINE_QUERY_ID = 'FETCH_ALL_TIMELINES'; export const getAllTimeline = memoizeOne( - (variables: string, timelines: TimelineResult[]): OpenTimelineResult[] => + (_variables: string, timelines: TimelineResult[]): OpenTimelineResult[] => timelines.map((timeline) => ({ created: timeline.created, description: timeline.description, @@ -168,6 +168,7 @@ export const useGetAllTimeline = (): AllTimelinesArgs => { abortCtrl.abort(); }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [apolloClient, allTimelines] ); From e2f11e9fe93bdf1e5d0ef63f8f4e3ae5fd4ff617 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Mon, 8 Jun 2020 11:19:01 -0400 Subject: [PATCH 14/65] [ML] DFAnalytics results: ensure ml result fields are shown in data grid (#68305) * wip: ensure top classes and influencer result col show up correctly * ensure ml subFields columns are populated --- .../components/data_grid/common.ts | 6 ++++- .../data_frame_analytics/common/analytics.ts | 10 +++++++++ .../data_frame_analytics/common/constants.ts | 1 + .../data_frame_analytics/common/fields.ts | 22 ++++++++++++++++--- .../use_exploration_results.ts | 11 +++++++--- 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/ml/public/application/components/data_grid/common.ts b/x-pack/plugins/ml/public/application/components/data_grid/common.ts index 44a2473f75937..7d0559c215114 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/common.ts +++ b/x-pack/plugins/ml/public/application/components/data_grid/common.ts @@ -29,6 +29,7 @@ import { FEATURE_IMPORTANCE, FEATURE_INFLUENCE, OUTLIER_SCORE, + TOP_CLASSES, } from '../../data_frame_analytics/common/constants'; import { formatHumanReadableDateTimeSeconds } from '../../util/date_utils'; import { getNestedProperty } from '../../util/object_utils'; @@ -110,7 +111,10 @@ export const getDataGridSchemasFromFieldTypes = (fieldTypes: FieldTypes, results schema = 'numeric'; } - if (field.includes(`${resultsField}.${FEATURE_IMPORTANCE}`)) { + if ( + field.includes(`${resultsField}.${FEATURE_IMPORTANCE}`) || + field.includes(`${resultsField}.${TOP_CLASSES}`) + ) { schema = 'json'; } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts index 0b4e6d27b96e5..16d888a9da27b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts @@ -228,6 +228,16 @@ export const getPredictionFieldName = ( return predictionFieldName; }; +export const getNumTopClasses = ( + analysis: AnalysisConfig +): ClassificationAnalysis['classification']['num_top_classes'] => { + let numTopClasses; + if (isClassificationAnalysis(analysis) && analysis.classification.num_top_classes !== undefined) { + numTopClasses = analysis.classification.num_top_classes; + } + return numTopClasses; +}; + export const getNumTopFeatureImportanceValues = ( analysis: AnalysisConfig ): diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts index 51b2918012c8d..2f14dfdfdfca3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/constants.ts @@ -7,4 +7,5 @@ export const DEFAULT_RESULTS_FIELD = 'ml'; export const FEATURE_IMPORTANCE = 'feature_importance'; export const FEATURE_INFLUENCE = 'feature_influence'; +export const TOP_CLASSES = 'top_classes'; export const OUTLIER_SCORE = 'outlier_score'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts index 8db349b395cfc..0a64886c80a63 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts @@ -5,6 +5,7 @@ */ import { + getNumTopClasses, getNumTopFeatureImportanceValues, getPredictedFieldName, getDependentVar, @@ -18,7 +19,7 @@ import { Field } from '../../../../common/types/fields'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '../../../../../../../src/plugins/data/public'; import { newJobCapsService } from '../../services/new_job_capabilities_service'; -import { FEATURE_IMPORTANCE, FEATURE_INFLUENCE, OUTLIER_SCORE } from './constants'; +import { FEATURE_IMPORTANCE, FEATURE_INFLUENCE, OUTLIER_SCORE, TOP_CLASSES } from './constants'; export type EsId = string; export type EsDocSource = Record; @@ -177,6 +178,7 @@ export const getDefaultFieldsFromJobCaps = ( const featureImportanceFields = []; const featureInfluenceFields = []; + const topClassesFields = []; const allFields: any = []; let type: ES_FIELD_TYPES | undefined; let predictedField: string | undefined; @@ -207,13 +209,14 @@ export const getDefaultFieldsFromJobCaps = ( type = newJobCapsService.getFieldById(dependentVariable)?.type; const predictionFieldName = getPredictionFieldName(jobConfig.analysis); const numTopFeatureImportanceValues = getNumTopFeatureImportanceValues(jobConfig.analysis); + const numTopClasses = getNumTopClasses(jobConfig.analysis); const defaultPredictionField = `${dependentVariable}_prediction`; predictedField = `${resultsField}.${ predictionFieldName ? predictionFieldName : defaultPredictionField }`; - if ((numTopFeatureImportanceValues ?? 0) > 0 && needsDestIndexFields === true) { + if ((numTopFeatureImportanceValues ?? 0) > 0) { featureImportanceFields.push({ id: `${resultsField}.${FEATURE_IMPORTANCE}`, name: `${resultsField}.${FEATURE_IMPORTANCE}`, @@ -221,6 +224,14 @@ export const getDefaultFieldsFromJobCaps = ( }); } + if ((numTopClasses ?? 0) > 0) { + topClassesFields.push({ + id: `${resultsField}.${TOP_CLASSES}`, + name: `${resultsField}.${TOP_CLASSES}`, + type: KBN_FIELD_TYPES.UNKNOWN, + }); + } + // Only need to add these fields if we didn't use dest index pattern to get the fields if (needsDestIndexFields === true) { allFields.push( @@ -234,7 +245,12 @@ export const getDefaultFieldsFromJobCaps = ( } } - allFields.push(...fields, ...featureImportanceFields, ...featureInfluenceFields); + allFields.push( + ...fields, + ...featureImportanceFields, + ...featureInfluenceFields, + ...topClassesFields + ); allFields.sort(({ name: a }: { name: string }, { name: b }: { name: string }) => sortExplorationResultsFields(a, b, jobConfig) ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts index e391b90e6eb96..b8b5a16c84e85 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts @@ -19,7 +19,11 @@ import { import { SavedSearchQuery } from '../../../../../contexts/ml'; import { getIndexData, getIndexFields, DataFrameAnalyticsConfig } from '../../../../common'; -import { DEFAULT_RESULTS_FIELD, FEATURE_IMPORTANCE } from '../../../../common/constants'; +import { + DEFAULT_RESULTS_FIELD, + FEATURE_IMPORTANCE, + TOP_CLASSES, +} from '../../../../common/constants'; import { sortExplorationResultsFields, ML__ID_COPY } from '../../../../common/fields'; export const useExplorationResults = ( @@ -47,8 +51,9 @@ export const useExplorationResults = ( 25, // reduce default selected rows from 20 to 8 for performance reasons. 8, - // by default, hide feature-importance columns and the doc id copy - (d) => !d.includes(`.${FEATURE_IMPORTANCE}.`) && d !== ML__ID_COPY + // by default, hide feature-importance and top-classes columns and the doc id copy + (d) => + !d.includes(`.${FEATURE_IMPORTANCE}.`) && !d.includes(`.${TOP_CLASSES}.`) && d !== ML__ID_COPY ); useEffect(() => { From 0189ae5c3ff7d3d49a8f182138de743ad748eb78 Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Mon, 8 Jun 2020 11:51:04 -0400 Subject: [PATCH 15/65] [Maps] Enable gridding/clustering/heatmaps for geo_shape fields (#67886) Enables heatmap, clusters, and grid layers for index-patterns with geo_shape field. This feature is only available for Gold+ users. --- .../create_source_editor.js | 4 +- .../es_geo_grid_source/es_geo_grid_source.js | 7 ++ .../es_pew_pew_source/create_source_editor.js | 5 +- .../maps/public/elasticsearch_geo_utils.js | 45 +++++---- .../public/elasticsearch_geo_utils.test.js | 93 +++++++++++++++++++ .../plugins/maps/public/index_pattern_util.js | 13 ++- .../maps/public/index_pattern_util.test.js | 81 +++++++++++++++- .../plugins/maps/public/kibana_services.d.ts | 2 + x-pack/plugins/maps/public/kibana_services.js | 9 ++ x-pack/plugins/maps/public/plugin.ts | 25 +++-- .../apps/maps/es_geo_grid_source.js | 33 +++++++ .../es_archives/maps/kibana/data.json | 33 ++++++- 12 files changed, 308 insertions(+), 42 deletions(-) diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js index 7661ad7020194..91dcb057dd837 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js @@ -14,7 +14,7 @@ import { NoIndexPatternCallout } from '../../../components/no_index_pattern_call import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiSpacer } from '@elastic/eui'; -import { AGGREGATABLE_GEO_FIELD_TYPES, getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; +import { getAggregatableGeoFieldTypes, getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; import { RenderAsSelect } from './render_as_select'; export class CreateSourceEditor extends Component { @@ -176,7 +176,7 @@ export class CreateSourceEditor extends Component { placeholder={i18n.translate('xpack.maps.source.esGeoGrid.indexPatternPlaceholder', { defaultMessage: 'Select index pattern', })} - fieldTypes={AGGREGATABLE_GEO_FIELD_TYPES} + fieldTypes={getAggregatableGeoFieldTypes()} onNoIndexPatterns={this._onNoIndexPatterns} /> diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js index e77fd93872612..c05c1f2dd7c1e 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js @@ -21,6 +21,7 @@ import { getDataSourceLabel } from '../../../../common/i18n_getters'; import { AbstractESAggSource } from '../es_agg_source'; import { DataRequestAbortError } from '../../util/data_request'; import { registerSource } from '../source_registry'; +import { makeESBbox } from '../../../elasticsearch_geo_utils'; export const MAX_GEOTILE_LEVEL = 29; @@ -146,6 +147,7 @@ export class ESGeoGridSource extends AbstractESAggSource { registerCancelCallback, bucketsPerGrid, isRequestStillActive, + bufferedExtent, }) { const gridsPerRequest = Math.floor(DEFAULT_MAX_BUCKETS_LIMIT / bucketsPerGrid); const aggs = { @@ -156,6 +158,7 @@ export class ESGeoGridSource extends AbstractESAggSource { { gridSplit: { geotile_grid: { + bounds: makeESBbox(bufferedExtent), field: this._descriptor.geoField, precision, }, @@ -234,10 +237,12 @@ export class ESGeoGridSource extends AbstractESAggSource { precision, layerName, registerCancelCallback, + bufferedExtent, }) { searchSource.setField('aggs', { gridSplit: { geotile_grid: { + bounds: makeESBbox(bufferedExtent), field: this._descriptor.geoField, precision, }, @@ -282,6 +287,7 @@ export class ESGeoGridSource extends AbstractESAggSource { precision: searchFilters.geogridPrecision, layerName, registerCancelCallback, + bufferedExtent: searchFilters.buffer, }) : await this._compositeAggRequest({ searchSource, @@ -291,6 +297,7 @@ export class ESGeoGridSource extends AbstractESAggSource { registerCancelCallback, bucketsPerGrid, isRequestStillActive, + bufferedExtent: searchFilters.buffer, }); return { diff --git a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js index f599ba93d40d6..38a5850537200 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js +++ b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js @@ -14,7 +14,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiFormRow, EuiCallOut } from '@elastic/eui'; -import { AGGREGATABLE_GEO_FIELD_TYPES, getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; +import { getFieldsWithGeoTileAgg } from '../../../index_pattern_util'; +import { ES_GEO_FIELD_TYPE } from '../../../../common/constants'; export class CreateSourceEditor extends Component { static propTypes = { @@ -177,7 +178,7 @@ export class CreateSourceEditor extends Component { placeholder={i18n.translate('xpack.maps.source.pewPew.indexPatternPlaceholder', { defaultMessage: 'Select index pattern', })} - fieldTypes={AGGREGATABLE_GEO_FIELD_TYPES} + fieldTypes={[ES_GEO_FIELD_TYPE.GEO_POINT]} /> ); diff --git a/x-pack/plugins/maps/public/elasticsearch_geo_utils.js b/x-pack/plugins/maps/public/elasticsearch_geo_utils.js index b89fda29554ee..efd243595db3e 100644 --- a/x-pack/plugins/maps/public/elasticsearch_geo_utils.js +++ b/x-pack/plugins/maps/public/elasticsearch_geo_utils.js @@ -225,39 +225,36 @@ export function geoShapeToGeometry(value, accumulator) { accumulator.push(geoJson); } -function createGeoBoundBoxFilter({ maxLat, maxLon, minLat, minLon }, geoFieldName) { - const top = clampToLatBounds(maxLat); +export function makeESBbox({ maxLat, maxLon, minLat, minLon }) { const bottom = clampToLatBounds(minLat); - - // geo_bounding_box does not support ranges outside of -180 and 180 - // When the area crosses the 180° meridian, - // the value of the lower left longitude will be greater than the value of the upper right longitude. - // http://docs.opengeospatial.org/is/12-063r5/12-063r5.html#30 - let boundingBox; + const top = clampToLatBounds(maxLat); + let esBbox; if (maxLon - minLon >= 360) { - boundingBox = { + esBbox = { top_left: [-180, top], bottom_right: [180, bottom], }; - } else if (maxLon > 180) { - const overflow = maxLon - 180; - boundingBox = { - top_left: [minLon, top], - bottom_right: [-180 + overflow, bottom], - }; - } else if (minLon < -180) { - const overflow = Math.abs(minLon) - 180; - boundingBox = { - top_left: [180 - overflow, top], - bottom_right: [maxLon, bottom], - }; } else { - boundingBox = { - top_left: [minLon, top], - bottom_right: [maxLon, bottom], + // geo_bounding_box does not support ranges outside of -180 and 180 + // When the area crosses the 180° meridian, + // the value of the lower left longitude will be greater than the value of the upper right longitude. + // http://docs.opengeospatial.org/is/12-063r5/12-063r5.html#30 + // + // This ensures bbox goes West->East in the happy case, + // but will be formatted East->West in case it crosses the date-line + const newMinlon = ((minLon + 180 + 360) % 360) - 180; + const newMaxlon = ((maxLon + 180 + 360) % 360) - 180; + esBbox = { + top_left: [newMinlon, top], + bottom_right: [newMaxlon, bottom], }; } + return esBbox; +} + +function createGeoBoundBoxFilter({ maxLat, maxLon, minLat, minLon }, geoFieldName) { + const boundingBox = makeESBbox({ maxLat, maxLon, minLat, minLon }); return { geo_bounding_box: { [geoFieldName]: boundingBox, diff --git a/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js b/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js index 05f6a9eec5bd5..a1e4e43f3ab75 100644 --- a/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js +++ b/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js @@ -19,6 +19,7 @@ import { createExtentFilter, roundCoordinates, extractFeaturesFromFilters, + makeESBbox, } from './elasticsearch_geo_utils'; import { indexPatterns } from '../../../../src/plugins/data/public'; @@ -594,3 +595,95 @@ describe('extractFeaturesFromFilters', () => { expect(extractFeaturesFromFilters([spatialFilter])).toEqual([]); }); }); + +describe('makeESBbox', () => { + it('Should invert Y-axis', () => { + const bbox = makeESBbox({ + minLon: 10, + maxLon: 20, + minLat: 0, + maxLat: 1, + }); + expect(bbox).toEqual({ bottom_right: [20, 0], top_left: [10, 1] }); + }); + + it('Should snap to 360 width', () => { + const bbox = makeESBbox({ + minLon: 10, + maxLon: 400, + minLat: 0, + maxLat: 1, + }); + expect(bbox).toEqual({ bottom_right: [180, 0], top_left: [-180, 1] }); + }); + + it('Should clamp latitudes', () => { + const bbox = makeESBbox({ + minLon: 10, + maxLon: 400, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [180, -89], top_left: [-180, 89] }); + }); + + it('Should swap West->East orientation to East->West orientation when crossing dateline (West extension)', () => { + const bbox = makeESBbox({ + minLon: -190, + maxLon: 20, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [20, -89], top_left: [170, 89] }); + }); + + it('Should swap West->East orientation to East->West orientation when crossing dateline (West extension) (overrated)', () => { + const bbox = makeESBbox({ + minLon: -190 + 360 + 360, + maxLon: 20 + 360 + 360, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [20, -89], top_left: [170, 89] }); + }); + + it('Should swap West->East orientation to East->West orientation when crossing dateline (east extension)', () => { + const bbox = makeESBbox({ + minLon: 175, + maxLon: 190, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [-170, -89], top_left: [175, 89] }); + }); + + it('Should preserve West->East orientation when _not_ crossing dateline', () => { + const bbox = makeESBbox({ + minLon: 20, + maxLon: 170, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [170, -89], top_left: [20, 89] }); + }); + + it('Should preserve West->East orientation when _not_ crossing dateline _and_ snap longitudes (west extension)', () => { + const bbox = makeESBbox({ + minLon: -190, + maxLon: -185, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [175, -89], top_left: [170, 89] }); + }); + + it('Should preserve West->East orientation when _not_ crossing dateline _and_ snap longitudes (east extension)', () => { + const bbox = makeESBbox({ + minLon: 185, + maxLon: 190, + minLat: -100, + maxLat: 100, + }); + expect(bbox).toEqual({ bottom_right: [-170, -89], top_left: [-175, 89] }); + }); +}); diff --git a/x-pack/plugins/maps/public/index_pattern_util.js b/x-pack/plugins/maps/public/index_pattern_util.js index d695d1087a38d..514feeaa22072 100644 --- a/x-pack/plugins/maps/public/index_pattern_util.js +++ b/x-pack/plugins/maps/public/index_pattern_util.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getIndexPatternService } from './kibana_services'; +import { getIndexPatternService, getIsGoldPlus } from './kibana_services'; import { indexPatterns } from '../../../../src/plugins/data/public'; import { ES_GEO_FIELD_TYPE } from '../common/constants'; @@ -30,19 +30,24 @@ export function getTermsFields(fields) { }); } -export const AGGREGATABLE_GEO_FIELD_TYPES = [ES_GEO_FIELD_TYPE.GEO_POINT]; +export function getAggregatableGeoFieldTypes() { + const aggregatableFieldTypes = [ES_GEO_FIELD_TYPE.GEO_POINT]; + if (getIsGoldPlus()) { + aggregatableFieldTypes.push(ES_GEO_FIELD_TYPE.GEO_SHAPE); + } + return aggregatableFieldTypes; +} export function getFieldsWithGeoTileAgg(fields) { return fields.filter(supportsGeoTileAgg); } export function supportsGeoTileAgg(field) { - // TODO add geo_shape support with license check return ( field && field.aggregatable && !indexPatterns.isNestedField(field) && - field.type === ES_GEO_FIELD_TYPE.GEO_POINT + getAggregatableGeoFieldTypes().includes(field.type) ); } diff --git a/x-pack/plugins/maps/public/index_pattern_util.test.js b/x-pack/plugins/maps/public/index_pattern_util.test.js index 7f8f1c175cf15..4fa9eb3cadb49 100644 --- a/x-pack/plugins/maps/public/index_pattern_util.test.js +++ b/x-pack/plugins/maps/public/index_pattern_util.test.js @@ -6,7 +6,12 @@ jest.mock('./kibana_services', () => ({})); -import { getSourceFields } from './index_pattern_util'; +import { + getSourceFields, + getAggregatableGeoFieldTypes, + supportsGeoTileAgg, +} from './index_pattern_util'; +import { ES_GEO_FIELD_TYPE } from '../common/constants'; describe('getSourceFields', () => { test('Should remove multi fields from field list', () => { @@ -27,3 +32,77 @@ describe('getSourceFields', () => { expect(sourceFields).toEqual([{ name: 'agent' }]); }); }); + +describe('Gold+ licensing', () => { + const testStubs = [ + { + field: { + type: 'geo_point', + aggregatable: true, + }, + supportedInBasic: true, + supportedInGold: true, + }, + { + field: { + type: 'geo_shape', + aggregatable: false, + }, + supportedInBasic: false, + supportedInGold: false, + }, + { + field: { + type: 'geo_shape', + aggregatable: true, + }, + supportedInBasic: false, + supportedInGold: true, + }, + ]; + + describe('basic license', () => { + beforeEach(() => { + require('./kibana_services').getIsGoldPlus = () => false; + }); + + describe('getAggregatableGeoFieldTypes', () => { + test('Should only include geo_point fields ', () => { + const aggregatableGeoFieldTypes = getAggregatableGeoFieldTypes(); + expect(aggregatableGeoFieldTypes).toEqual([ES_GEO_FIELD_TYPE.GEO_POINT]); + }); + }); + + describe('supportsGeoTileAgg', () => { + testStubs.forEach((stub, index) => { + test(`stub: ${index}`, () => { + const supported = supportsGeoTileAgg(stub.field); + expect(supported).toEqual(stub.supportedInBasic); + }); + }); + }); + }); + + describe('gold license', () => { + beforeEach(() => { + require('./kibana_services').getIsGoldPlus = () => true; + }); + describe('getAggregatableGeoFieldTypes', () => { + test('Should add geo_shape field', () => { + const aggregatableGeoFieldTypes = getAggregatableGeoFieldTypes(); + expect(aggregatableGeoFieldTypes).toEqual([ + ES_GEO_FIELD_TYPE.GEO_POINT, + ES_GEO_FIELD_TYPE.GEO_SHAPE, + ]); + }); + }); + describe('supportsGeoTileAgg', () => { + testStubs.forEach((stub, index) => { + test(`stub: ${index}`, () => { + const supported = supportsGeoTileAgg(stub.field); + expect(supported).toEqual(stub.supportedInGold); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/maps/public/kibana_services.d.ts b/x-pack/plugins/maps/public/kibana_services.d.ts index 45a4ace8e27a5..d45d7286ebf68 100644 --- a/x-pack/plugins/maps/public/kibana_services.d.ts +++ b/x-pack/plugins/maps/public/kibana_services.d.ts @@ -48,6 +48,7 @@ export function getShowMapsInspectorAdapter(): boolean; export function getPreserveDrawingBuffer(): boolean; export function getEnableVectorTiles(): boolean; export function getProxyElasticMapsServiceInMaps(): boolean; +export function getIsGoldPlus(): boolean; export function setLicenseId(args: unknown): void; export function setInspector(args: unknown): void; @@ -74,3 +75,4 @@ export function setSearchService(args: DataPublicPluginStart['search']): void; export function setKibanaCommonConfig(config: MapsLegacyConfigType): void; export function setMapAppConfig(config: MapsConfigType): void; export function setKibanaVersion(version: string): void; +export function setIsGoldPlus(isGoldPlus: boolean): void; diff --git a/x-pack/plugins/maps/public/kibana_services.js b/x-pack/plugins/maps/public/kibana_services.js index ba7be7a3b2464..1684acfb0f463 100644 --- a/x-pack/plugins/maps/public/kibana_services.js +++ b/x-pack/plugins/maps/public/kibana_services.js @@ -166,3 +166,12 @@ export const getProxyElasticMapsServiceInMaps = () => getKibanaCommonConfig().proxyElasticMapsServiceInMaps; export const getRegionmapLayers = () => _.get(getKibanaCommonConfig(), 'regionmap.layers', []); export const getTilemap = () => _.get(getKibanaCommonConfig(), 'tilemap', []); + +let isGoldPlus = false; +export const setIsGoldPlus = (igp) => { + isGoldPlus = igp; +}; + +export const getIsGoldPlus = () => { + return isGoldPlus; +}; diff --git a/x-pack/plugins/maps/public/plugin.ts b/x-pack/plugins/maps/public/plugin.ts index 3a20f6738a05a..319be46870ebc 100644 --- a/x-pack/plugins/maps/public/plugin.ts +++ b/x-pack/plugins/maps/public/plugin.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Plugin, CoreSetup, CoreStart, PluginInitializerContext } from 'src/core/public'; +import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; import { Setup as InspectorSetupContract } from 'src/plugins/inspector/public'; // @ts-ignore import { MapView } from './inspector/views/map_view'; @@ -21,29 +21,31 @@ import { setIndexPatternSelect, setIndexPatternService, setInspector, + setIsGoldPlus, + setKibanaCommonConfig, + setKibanaVersion, setLicenseId, + setMapAppConfig, setMapsCapabilities, setNavigation, setSavedObjectsClient, + setSearchService, setTimeFilter, setToasts, setUiActions, setUiSettings, setVisualizations, - setSearchService, - setMapAppConfig, - setKibanaCommonConfig, - setKibanaVersion, } from './kibana_services'; import { featureCatalogueEntry } from './feature_catalogue_entry'; // @ts-ignore import { getMapsVisTypeAlias } from './maps_vis_type_alias'; import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; import { VisualizationsSetup } from '../../../../src/plugins/visualizations/public'; -import { MAP_SAVED_OBJECT_TYPE } from '../common/constants'; +import { APP_ID, MAP_SAVED_OBJECT_TYPE } from '../common/constants'; import { MapEmbeddableFactory } from './embeddable/map_embeddable_factory'; import { EmbeddableSetup } from '../../../../src/plugins/embeddable/public'; -import { MapsXPackConfig, MapsConfigType } from '../config'; +import { MapsConfigType, MapsXPackConfig } from '../config'; +import { ILicense } from '../../licensing/common/types'; export interface MapsPluginSetupDependencies { inspector: InspectorSetupContract; @@ -76,7 +78,14 @@ export const bindSetupCoreAndPlugins = ( }; export const bindStartCoreAndPlugins = (core: CoreStart, plugins: any) => { - const { fileUpload, data, inspector } = plugins; + const { fileUpload, data, inspector, licensing } = plugins; + if (licensing) { + licensing.license$.subscribe((license: ILicense) => { + const gold = license.check(APP_ID, 'gold'); + setIsGoldPlus(gold.state === 'valid'); + }); + } + setInspector(inspector); setFileUpload(fileUpload); setIndexPatternSelect(data.ui.IndexPatternSelect); diff --git a/x-pack/test/functional/apps/maps/es_geo_grid_source.js b/x-pack/test/functional/apps/maps/es_geo_grid_source.js index 7346ab842ff59..f5a603742c89a 100644 --- a/x-pack/test/functional/apps/maps/es_geo_grid_source.js +++ b/x-pack/test/functional/apps/maps/es_geo_grid_source.js @@ -241,5 +241,38 @@ export default function ({ getPageObjects, getService }) { }); }); }); + + describe('vector grid with geo_shape', () => { + before(async () => { + await PageObjects.maps.loadSavedMap('geo grid vector grid example with shape'); + }); + + const LAYER_ID = 'g1xkv'; + it('should get expected number of grid cells', async () => { + const mapboxStyle = await PageObjects.maps.getMapboxStyle(); + expect(mapboxStyle.sources[LAYER_ID].data.features.length).to.equal(13); + }); + + describe('inspector', () => { + afterEach(async () => { + await inspector.close(); + }); + + it('should contain geotile_grid aggregation elasticsearch request', async () => { + await inspector.open(); + await inspector.openInspectorRequestsView(); + const requestStats = await inspector.getTableData(); + const totalHits = PageObjects.maps.getInspectorStatRowHit(requestStats, 'Hits (total)'); + expect(totalHits).to.equal('4'); //4 geometries result in 13 cells due to way they overlap geotile_grid cells + const hits = PageObjects.maps.getInspectorStatRowHit(requestStats, 'Hits'); + expect(hits).to.equal('0'); // aggregation requests do not return any documents + const indexPatternName = PageObjects.maps.getInspectorStatRowHit( + requestStats, + 'Index pattern' + ); + expect(indexPatternName).to.equal('geo_shapes*'); + }); + }); + }); }); } diff --git a/x-pack/test/functional/es_archives/maps/kibana/data.json b/x-pack/test/functional/es_archives/maps/kibana/data.json index d313fd2046c03..c173d75075041 100644 --- a/x-pack/test/functional/es_archives/maps/kibana/data.json +++ b/x-pack/test/functional/es_archives/maps/kibana/data.json @@ -36,7 +36,7 @@ "index": ".kibana", "source": { "index-pattern": { - "fields" : "[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"geometry\",\"type\":\"geo_shape\",\"esTypes\":[\"geo_shape\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"prop1\",\"type\":\"number\",\"esTypes\":[\"byte\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", + "fields" : "[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"geometry\",\"type\":\"geo_shape\",\"esTypes\":[\"geo_shape\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"prop1\",\"type\":\"number\",\"esTypes\":[\"byte\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", "title": "geo_shapes*" }, "type": "index-pattern" @@ -553,6 +553,37 @@ } } +{ + "type": "doc", + "value": { + "id": "map:0c86d024-a767-11ea-bb37-0242ac130002", + "index": ".kibana", + "source": { + "map": { + "bounds": { + "coordinates": [ + [ + -160, + 60 + ], + [ + 160, + -60 + ] + ], + "type": "envelope" + }, + "description": "", + "layerListJSON": "[{\"id\":\"g1xkv\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"sourceDescriptor\":{\"resolution\": \"COARSE\",\"type\":\"ES_GEO_GRID\",\"id\":\"64ddd934-a767-11ea-bb37-0242ac130002\",\"indexPatternId\":\"561253e0-f731-11e8-8487-11b9dd924f96\",\"geoField\":\"geometry\",\"requestType\":\"grid\",\"metrics\":[{\"type\":\"count\"}]},\"visible\":true,\"temporary\":false,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"color\":\"Blues\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#cccccc\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"minSize\":4,\"maxSize\":32}}},\"temporary\":true,\"previousStyle\":null},\"type\":\"VECTOR\"}]", + "mapStateJSON": "{\"zoom\":3,\"center\":{\"lon\":76,\"lat\":4},\"timeFilters\":{\"from\":\"2015-09-20T00:00:00.000Z\",\"to\":\"2015-09-20T01:00:00.000Z\"},\"refreshConfig\":{\"isPaused\":true,\"interval\":1000}}", + "title": "geo grid vector grid example with shape", + "uiStateJSON": "{\"isDarkMode\":false}" + }, + "type": "map" + } + } +} + { "type": "doc", "value": { From 16fbbf434550645d7386da34c00716f73274f224 Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Mon, 8 Jun 2020 14:11:51 -0400 Subject: [PATCH 16/65] [Canvas] Tear down history instances (#68277) * [Canvas] Tear down history instances * Always create history on Canvas startup Co-authored-by: Poff Poffenberger Co-authored-by: Elastic Machine --- x-pack/plugins/canvas/public/application.tsx | 5 +++- .../canvas/public/lib/history_provider.js | 26 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/canvas/public/application.tsx b/x-pack/plugins/canvas/public/application.tsx index 8751d8102ad37..c799f36a283c1 100644 --- a/x-pack/plugins/canvas/public/application.tsx +++ b/x-pack/plugins/canvas/public/application.tsx @@ -33,7 +33,7 @@ import { CapabilitiesStrings } from '../i18n'; import { startServices, services } from './services'; // @ts-ignore Untyped local -import { destroyHistory } from './lib/history_provider'; +import { createHistory, destroyHistory } from './lib/history_provider'; // @ts-ignore Untyped local import { stopRouter } from './lib/router_provider'; import { initFunctions } from './functions'; @@ -97,6 +97,9 @@ export const initializeCanvas = async ( services.expressions.getService().registerFunction(fn); } + // Re-initialize our history + createHistory(); + // Create Store const canvasStore = await createStore(coreSetup, setupPlugins); diff --git a/x-pack/plugins/canvas/public/lib/history_provider.js b/x-pack/plugins/canvas/public/lib/history_provider.js index 649f101126012..396372eeb85c1 100644 --- a/x-pack/plugins/canvas/public/lib/history_provider.js +++ b/x-pack/plugins/canvas/public/lib/history_provider.js @@ -134,7 +134,7 @@ function wrapHistoryInstance(history) { return wrappedHistory; } -let instances = new WeakMap(); +const instances = new WeakMap(); const getHistoryInstance = (win) => { // if no window object, use memory module @@ -144,6 +144,15 @@ const getHistoryInstance = (win) => { return createHashStateHistory(); }; +export const createHistory = (win = getWindow()) => { + // create and cache wrapped history instance + const historyInstance = getHistoryInstance(win); + const wrappedInstance = wrapHistoryInstance(historyInstance); + instances.set(win, wrappedInstance); + + return wrappedInstance; +}; + export const historyProvider = (win = getWindow()) => { // return cached instance if one exists const instance = instances.get(win); @@ -151,14 +160,13 @@ export const historyProvider = (win = getWindow()) => { return instance; } - // create and cache wrapped history instance - const historyInstance = getHistoryInstance(win); - const wrappedInstance = wrapHistoryInstance(historyInstance); - instances.set(win, wrappedInstance); - - return wrappedInstance; + return createHistory(win); }; -export const destroyHistory = () => { - instances = new WeakMap(); +export const destroyHistory = (win = getWindow()) => { + const instance = instances.get(win); + + if (instance) { + instance.resetOnChange(); + } }; From 8174b5ce29e7a4e24b3b78e0d1b89be17e2efd09 Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Mon, 8 Jun 2020 11:22:09 -0700 Subject: [PATCH 17/65] [Search] Refactor service to register search strategies, not providers (#60342) * Add async search strategy * Add async search * Fix async strategy and add tests * Move types to separate file * Revert changes to demo search * Update demo search strategy to use async * Add async es search strategy * Return response as rawResponse * Poll after initial request * Add cancellation to search strategies * Add tests * Simplify async search strategy * Move loadingCount to search strategy * Update abort controller library * Bootstrap * Abort when the request is aborted * Add utility and update value suggestions route * Fix bad merge conflict * Update tests * Move to data_enhanced plugin * Remove bad merge * Revert switching abort controller libraries * Revert package.json in lib * Move to previous abort controller * Add support for frozen indices * Fix test to use fake timers to run debounced handlers * Revert changes to example plugin * Fix loading bar not going away when cancelling * Call getSearchStrategy instead of passing directly * Add async demo search strategy * Fix error with setting state * Update how aborting works * Fix type checks * Add test for loading count * Attempt to fix broken example test * Revert changes to test * Fix test * Update name to camelCase * Fix failing test * Don't require data_enhanced in example plugin * Actually send DELETE request * Use waitForCompletion parameter * Use default search params * Add support for rollups * Only make changes needed for frozen indices/rollups * Only make changes needed for frozen indices/rollups * Add back in async functionality * Fix tests/types * Fix issue with sending empty body in GET * Don't include skipped in loaded/total * Don't wait before polling the next time * Add search interceptor for bulk managing searches * Simplify search logic * Fix merge error * Review feedback * UI to stop async searches * Add service for running beyond timeout * Refactor abort utils * Remove unneeded changes * Add tests * Refactor search service to register strategies directly * Remove accidental change * re-generate docs * Fix merge * types * doc * eslint * Fix async strategy jest test * type fix * Use getStartServices in search strategies * Code review + snapshot * eslint * Type script Co-authored-by: Elastic Machine Co-authored-by: Liza K --- ...plugins-data-public.isearchcontext.core.md | 11 -- ...public.isearchcontext.getsearchstrategy.md | 11 -- ...ugin-plugins-data-public.isearchcontext.md | 19 ---- .../kibana-plugin-plugins-data-public.md | 2 - ...ins-data-public.tsearchstrategyprovider.md | 13 --- .../public/async_demo_search_strategy.ts | 68 ++++------- .../public/demo_search_strategy.ts | 43 +++---- examples/demo_search/public/plugin.ts | 23 ++-- examples/demo_search/public/types.ts | 28 +++++ src/plugins/data/public/index.ts | 2 - src/plugins/data/public/mocks.ts | 12 +- src/plugins/data/public/public.api.md | 43 +++---- .../es_search/es_search_strategy.test.ts | 25 ++-- .../search/es_search/es_search_strategy.ts | 35 +++--- src/plugins/data/public/search/index.ts | 8 +- src/plugins/data/public/search/mocks.ts | 10 +- .../data/public/search/search_service.test.ts | 2 +- .../data/public/search/search_service.ts | 47 ++++---- .../search/sync_search_strategy.test.ts | 33 ++---- .../public/search/sync_search_strategy.ts | 21 ++-- src/plugins/data/public/search/types.ts | 34 +++--- .../saved_objects_table.test.tsx.snap | 1 + x-pack/plugins/data_enhanced/public/plugin.ts | 19 ++-- .../search/async_search_strategy.test.ts | 89 ++++----------- .../public/search/async_search_strategy.ts | 107 +++++++++--------- .../public/search/es_search_strategy.test.ts | 35 ++++++ .../public/search/es_search_strategy.ts | 22 ++-- 27 files changed, 329 insertions(+), 434 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md create mode 100644 examples/demo_search/public/types.ts create mode 100644 x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md deleted file mode 100644 index 7a7ea43bd3d40..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.core.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) > [core](./kibana-plugin-plugins-data-public.isearchcontext.core.md) - -## ISearchContext.core property - -Signature: - -```typescript -core: CoreStart; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md deleted file mode 100644 index 93ac88d200bb8..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) > [getSearchStrategy](./kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md) - -## ISearchContext.getSearchStrategy property - -Signature: - -```typescript -getSearchStrategy: (name: T) => TSearchStrategyProvider; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md deleted file mode 100644 index 9b89f71434119..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchcontext.md +++ /dev/null @@ -1,19 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) - -## ISearchContext interface - -Signature: - -```typescript -export interface ISearchContext -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [core](./kibana-plugin-plugins-data-public.isearchcontext.core.md) | CoreStart | | -| [getSearchStrategy](./kibana-plugin-plugins-data-public.isearchcontext.getsearchstrategy.md) | <T extends TStrategyTypes>(name: T) => TSearchStrategyProvider<T> | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index 75d3abefc74b9..e818fb009fb19 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -67,7 +67,6 @@ | [IndexPatternTypeMeta](./kibana-plugin-plugins-data-public.indexpatterntypemeta.md) | | | [IRequestTypesMap](./kibana-plugin-plugins-data-public.irequesttypesmap.md) | | | [IResponseTypesMap](./kibana-plugin-plugins-data-public.iresponsetypesmap.md) | | -| [ISearchContext](./kibana-plugin-plugins-data-public.isearchcontext.md) | | | [ISearchOptions](./kibana-plugin-plugins-data-public.isearchoptions.md) | | | [ISearchStrategy](./kibana-plugin-plugins-data-public.isearchstrategy.md) | Search strategy interface contains a search method that takes in a request and returns a promise that resolves to a response. | | [ISyncSearchRequest](./kibana-plugin-plugins-data-public.isyncsearchrequest.md) | | @@ -157,5 +156,4 @@ | [TabbedAggRow](./kibana-plugin-plugins-data-public.tabbedaggrow.md) | \* | | [TimefilterContract](./kibana-plugin-plugins-data-public.timefiltercontract.md) | | | [TimeHistoryContract](./kibana-plugin-plugins-data-public.timehistorycontract.md) | | -| [TSearchStrategyProvider](./kibana-plugin-plugins-data-public.tsearchstrategyprovider.md) | Search strategy provider creates an instance of a search strategy with the request handler context bound to it. This way every search strategy can use whatever information they require from the request context. | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md deleted file mode 100644 index 3233bb48cea2c..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.tsearchstrategyprovider.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [TSearchStrategyProvider](./kibana-plugin-plugins-data-public.tsearchstrategyprovider.md) - -## TSearchStrategyProvider type - -Search strategy provider creates an instance of a search strategy with the request handler context bound to it. This way every search strategy can use whatever information they require from the request context. - -Signature: - -```typescript -export declare type TSearchStrategyProvider = (context: ISearchContext) => ISearchStrategy; -``` diff --git a/examples/demo_search/public/async_demo_search_strategy.ts b/examples/demo_search/public/async_demo_search_strategy.ts index 7a3f33ce05a75..862324002840c 100644 --- a/examples/demo_search/public/async_demo_search_strategy.ts +++ b/examples/demo_search/public/async_demo_search_strategy.ts @@ -17,53 +17,27 @@ * under the License. */ -import { Observable } from 'rxjs'; -import { - ISearchContext, - TSearchStrategyProvider, - ISearchStrategy, -} from '../../../src/plugins/data/public'; - -import { ASYNC_DEMO_SEARCH_STRATEGY, IAsyncDemoResponse } from '../common'; +import { Observable, from } from 'rxjs'; +import { CoreSetup } from 'kibana/public'; +import { flatMap } from 'rxjs/operators'; +import { ISearch } from '../../../src/plugins/data/public'; import { ASYNC_SEARCH_STRATEGY } from '../../../x-pack/plugins/data_enhanced/public'; +import { ASYNC_DEMO_SEARCH_STRATEGY, IAsyncDemoResponse } from '../common'; +import { DemoDataSearchStartDependencies } from './types'; -/** - * This demo search strategy provider simply provides a shortcut for calling the DEMO_ASYNC_SEARCH_STRATEGY - * on the server side, without users having to pass it in explicitly, and it takes advantage of the - * already registered ASYNC_SEARCH_STRATEGY that exists on the client. - * - * so instead of callers having to do: - * - * ``` - * search( - * { ...request, serverStrategy: DEMO_ASYNC_SEARCH_STRATEGY }, - * options, - * ASYNC_SEARCH_STRATEGY - * ) as Observable, - *``` - - * They can instead just do - * - * ``` - * search(request, options, DEMO_ASYNC_SEARCH_STRATEGY); - * ``` - * - * and are ensured type safety in regard to the request and response objects. - * - * @param context - context supplied by other plugins. - * @param search - a search function to access other strategies that have already been registered. - */ -export const asyncDemoClientSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const asyncStrategyProvider = context.getSearchStrategy(ASYNC_SEARCH_STRATEGY); - const { search } = asyncStrategyProvider(context); - return { - search: (request, options) => { - return search( - { ...request, serverStrategy: ASYNC_DEMO_SEARCH_STRATEGY }, - options - ) as Observable; - }, +export function asyncDemoClientSearchStrategyProvider(core: CoreSetup) { + const search: ISearch = (request, options) => { + return from(core.getStartServices()).pipe( + flatMap((startServices) => { + const asyncStrategy = (startServices[1] as DemoDataSearchStartDependencies).data.search.getSearchStrategy( + ASYNC_SEARCH_STRATEGY + ); + return asyncStrategy.search( + { ...request, serverStrategy: ASYNC_DEMO_SEARCH_STRATEGY }, + options + ) as Observable; + }) + ); }; -}; + return { search }; +} diff --git a/examples/demo_search/public/demo_search_strategy.ts b/examples/demo_search/public/demo_search_strategy.ts index 8dc2779a8544c..d56d827a5c0f8 100644 --- a/examples/demo_search/public/demo_search_strategy.ts +++ b/examples/demo_search/public/demo_search_strategy.ts @@ -17,11 +17,12 @@ * under the License. */ -import { Observable } from 'rxjs'; -import { ISearchContext, SYNC_SEARCH_STRATEGY } from '../../../src/plugins/data/public'; -import { TSearchStrategyProvider, ISearchStrategy } from '../../../src/plugins/data/public'; - +import { Observable, from } from 'rxjs'; +import { flatMap } from 'rxjs/operators'; +import { CoreSetup } from 'kibana/public'; +import { ISearch, SYNC_SEARCH_STRATEGY } from '../../../src/plugins/data/public'; import { DEMO_SEARCH_STRATEGY, IDemoResponse } from '../common'; +import { DemoDataSearchStartDependencies } from './types'; /** * This demo search strategy provider simply provides a shortcut for calling the DEMO_SEARCH_STRATEGY @@ -31,7 +32,7 @@ import { DEMO_SEARCH_STRATEGY, IDemoResponse } from '../common'; * so instead of callers having to do: * * ``` - * context.search( + * data.search.search( * { ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, * options, * SYNC_SEARCH_STRATEGY @@ -41,24 +42,24 @@ import { DEMO_SEARCH_STRATEGY, IDemoResponse } from '../common'; * They can instead just do * * ``` - * context.search(request, options, DEMO_SEARCH_STRATEGY); + * data.search.search(request, options, DEMO_SEARCH_STRATEGY); * ``` * * and are ensured type safety in regard to the request and response objects. - * - * @param context - context supplied by other plugins. - * @param search - a search function to access other strategies that have already been registered. */ -export const demoClientSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const syncStrategyProvider = context.getSearchStrategy(SYNC_SEARCH_STRATEGY); - const { search } = syncStrategyProvider(context); - return { - search: (request, options) => { - return search({ ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, options) as Observable< - IDemoResponse - >; - }, +export function demoClientSearchStrategyProvider(core: CoreSetup) { + const search: ISearch = (request, options) => { + return from(core.getStartServices()).pipe( + flatMap((startServices) => { + const syncStrategy = (startServices[1] as DemoDataSearchStartDependencies).data.search.getSearchStrategy( + SYNC_SEARCH_STRATEGY + ); + return syncStrategy.search( + { ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, + options + ) as Observable; + }) + ); }; -}; + return { search }; +} diff --git a/examples/demo_search/public/plugin.ts b/examples/demo_search/public/plugin.ts index a2539cc7a21c5..5d074c19903e2 100644 --- a/examples/demo_search/public/plugin.ts +++ b/examples/demo_search/public/plugin.ts @@ -17,7 +17,6 @@ * under the License. */ -import { DataPublicPluginSetup } from '../../../src/plugins/data/public'; import { Plugin, CoreSetup } from '../../../src/core/public'; import { DEMO_SEARCH_STRATEGY, @@ -29,10 +28,7 @@ import { } from '../common'; import { demoClientSearchStrategyProvider } from './demo_search_strategy'; import { asyncDemoClientSearchStrategyProvider } from './async_demo_search_strategy'; - -interface DemoDataSearchSetupDependencies { - data: DataPublicPluginSetup; -} +import { DemoDataSearchSetupDependencies, DemoDataSearchStartDependencies } from './types'; /** * Add the typescript mappings for our search strategy to the request and @@ -55,16 +51,13 @@ declare module '../../../src/plugins/data/public' { } } -export class DemoDataPlugin implements Plugin { - public setup(core: CoreSetup, deps: DemoDataSearchSetupDependencies) { - deps.data.search.registerSearchStrategyProvider( - DEMO_SEARCH_STRATEGY, - demoClientSearchStrategyProvider - ); - deps.data.search.registerSearchStrategyProvider( - ASYNC_DEMO_SEARCH_STRATEGY, - asyncDemoClientSearchStrategyProvider - ); +export class DemoDataPlugin + implements Plugin { + public setup(core: CoreSetup, { data }: DemoDataSearchSetupDependencies) { + const demoClientSearchStrategy = demoClientSearchStrategyProvider(core); + const asyncDemoClientSearchStrategy = asyncDemoClientSearchStrategyProvider(core); + data.search.registerSearchStrategy(DEMO_SEARCH_STRATEGY, demoClientSearchStrategy); + data.search.registerSearchStrategy(ASYNC_DEMO_SEARCH_STRATEGY, asyncDemoClientSearchStrategy); } public start() {} diff --git a/examples/demo_search/public/types.ts b/examples/demo_search/public/types.ts new file mode 100644 index 0000000000000..64725da7df870 --- /dev/null +++ b/examples/demo_search/public/types.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import { DataPublicPluginStart, DataPublicPluginSetup } from '../../../src/plugins/data/public'; + +export interface DemoDataSearchSetupDependencies { + data: DataPublicPluginSetup; +} + +export interface DemoDataSearchStartDependencies { + data: DataPublicPluginStart; +} diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 5540039323756..eb3f937a4168b 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -341,8 +341,6 @@ export { SYNC_SEARCH_STRATEGY, getEsPreference, getSearchErrorType, - ISearchContext, - TSearchStrategyProvider, ISearchStrategy, ISearch, ISearchOptions, diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 7307c93139d59..d544d3c800bbe 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -21,11 +21,17 @@ import { Plugin, IndexPatternsContract } from '.'; import { fieldFormatsServiceMock } from './field_formats/mocks'; import { searchSetupMock, searchStartMock } from './search/mocks'; import { queryServiceMock } from './query/mocks'; +import { AutocompleteStart, AutocompleteSetup } from './autocomplete'; export type Setup = jest.Mocked>; export type Start = jest.Mocked>; -const autocompleteMock: any = { +const automcompleteSetupMock: jest.Mocked = { + addQuerySuggestionProvider: jest.fn(), + getQuerySuggestions: jest.fn(), +}; + +const autocompleteStartMock: jest.Mocked = { getValueSuggestions: jest.fn(), getQuerySuggestions: jest.fn(), hasQuerySuggestions: jest.fn(), @@ -34,7 +40,7 @@ const autocompleteMock: any = { const createSetupContract = (): Setup => { const querySetupMock = queryServiceMock.createSetupContract(); return { - autocomplete: autocompleteMock, + autocomplete: automcompleteSetupMock, search: searchSetupMock, fieldFormats: fieldFormatsServiceMock.createSetupContract(), query: querySetupMock, @@ -48,7 +54,7 @@ const createStartContract = (): Start => { createFiltersFromValueClickAction: jest.fn().mockResolvedValue(['yes']), createFiltersFromRangeSelectAction: jest.fn(), }, - autocomplete: autocompleteMock, + autocomplete: autocompleteStartMock, search: searchStartMock, fieldFormats: fieldFormatsServiceMock.createStartContract(), query: queryStartMock, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index e6f6ba0c1bd12..7054575e8ef9e 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1116,16 +1116,6 @@ export interface IResponseTypesMap { // @public (undocumented) export type ISearch = (request: IRequestTypesMap[T], options?: ISearchOptions) => Observable; -// Warning: (ae-missing-release-tag) "ISearchContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface ISearchContext { - // (undocumented) - core: CoreStart; - // (undocumented) - getSearchStrategy: (name: T) => TSearchStrategyProvider; -} - // Warning: (ae-missing-release-tag) "ISearchGeneric" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1788,11 +1778,6 @@ export interface TimeRange { to: string; } -// Warning: (ae-missing-release-tag) "TSearchStrategyProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export type TSearchStrategyProvider = (context: ISearchContext) => ISearchStrategy; - // Warning: (ae-missing-release-tag) "UI_SETTINGS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1866,20 +1851,20 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:379:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:380:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:403:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:377:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/es_search/es_search_strategy.test.ts b/src/plugins/data/public/search/es_search/es_search_strategy.test.ts index de1835f09f3bf..b580c5170aad7 100644 --- a/src/plugins/data/public/search/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/public/search/es_search/es_search_strategy.test.ts @@ -17,40 +17,31 @@ * under the License. */ +import { CoreSetup } from '../../../../../core/public'; import { coreMock } from '../../../../../core/public/mocks'; import { esSearchStrategyProvider } from './es_search_strategy'; -import { CoreStart } from 'kibana/public'; import { ES_SEARCH_STRATEGY } from '../../../common/search/es_search'; describe('ES search strategy', () => { - let mockCoreStart: MockedKeys; - const mockSearch = jest.fn(); + let mockCoreSetup: MockedKeys; + const mockSearch = { search: jest.fn() }; beforeEach(() => { - mockCoreStart = coreMock.createStart(); - mockSearch.mockClear(); + mockCoreSetup = coreMock.createSetup(); + mockSearch.search.mockClear(); }); it('returns a strategy with `search` that calls the sync search `search`', () => { const request = { params: {} }; const options = {}; - const esSearch = esSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const esSearch = esSearchStrategyProvider(mockCoreSetup, mockSearch); esSearch.search(request, options); - expect(mockSearch.mock.calls[0][0]).toEqual({ + expect(mockSearch.search.mock.calls[0][0]).toEqual({ ...request, serverStrategy: ES_SEARCH_STRATEGY, }); - expect(mockSearch.mock.calls[0][1]).toBe(options); + expect(mockSearch.search.mock.calls[0][1]).toBe(options); }); }); diff --git a/src/plugins/data/public/search/es_search/es_search_strategy.ts b/src/plugins/data/public/search/es_search/es_search_strategy.ts index a61428c998157..82f8bf21ee57b 100644 --- a/src/plugins/data/public/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/public/search/es_search/es_search_strategy.ts @@ -18,25 +18,26 @@ */ import { Observable } from 'rxjs'; +import { CoreSetup } from '../../../../../core/public'; import { ES_SEARCH_STRATEGY, IEsSearchResponse } from '../../../common/search'; +import { ISearch } from '../i_search'; +import { ISearchStrategy } from '../types'; import { SYNC_SEARCH_STRATEGY } from '../sync_search_strategy'; import { getEsPreference } from './get_es_preference'; -import { ISearchContext, TSearchStrategyProvider, ISearchStrategy } from '../types'; -export const esSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const syncStrategyProvider = context.getSearchStrategy(SYNC_SEARCH_STRATEGY); - const { search } = syncStrategyProvider(context); - return { - search: (request, options) => { - request.params = { - preference: getEsPreference(context.core.uiSettings), - ...request.params, - }; - return search({ ...request, serverStrategy: ES_SEARCH_STRATEGY }, options) as Observable< - IEsSearchResponse - >; - }, +export function esSearchStrategyProvider( + core: CoreSetup, + syncStrategy: ISearchStrategy +) { + const search: ISearch = (request, options) => { + request.params = { + preference: getEsPreference(core.uiSettings), + ...request.params, + }; + return syncStrategy.search( + { ...request, serverStrategy: ES_SEARCH_STRATEGY }, + options + ) as Observable; }; -}; + return { search }; +} diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 26149432f6117..53686f9be9b4d 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -21,13 +21,7 @@ export * from './aggs'; export * from './expressions'; export * from './tabify'; -export { - ISearchSetup, - ISearchStart, - ISearchContext, - TSearchStrategyProvider, - ISearchStrategy, -} from './types'; +export { ISearchSetup, ISearchStart, ISearchStrategy } from './types'; export { ISearch, diff --git a/src/plugins/data/public/search/mocks.ts b/src/plugins/data/public/search/mocks.ts index 44082040b5b0b..fcdbeb515423d 100644 --- a/src/plugins/data/public/search/mocks.ts +++ b/src/plugins/data/public/search/mocks.ts @@ -18,18 +18,20 @@ */ import { searchAggsSetupMock, searchAggsStartMock } from './aggs/mocks'; -import { ISearchStart } from './types'; +import { ISearchSetup, ISearchStart } from './types'; import { searchSourceMock, createSearchSourceMock } from './search_source/mocks'; -const searchSetupMock = { +export * from './search_source/mocks'; + +const searchSetupMock: jest.Mocked = { aggs: searchAggsSetupMock(), - registerSearchStrategyContext: jest.fn(), - registerSearchStrategyProvider: jest.fn(), + registerSearchStrategy: jest.fn(), }; const searchStartMock: jest.Mocked = { aggs: searchAggsStartMock(), setInterceptor: jest.fn(), + getSearchStrategy: jest.fn(), search: jest.fn(), searchSource: searchSourceMock, __LEGACY: { diff --git a/src/plugins/data/public/search/search_service.test.ts b/src/plugins/data/public/search/search_service.test.ts index b1f7925bec4bb..fa138cef1a4a0 100644 --- a/src/plugins/data/public/search/search_service.test.ts +++ b/src/plugins/data/public/search/search_service.test.ts @@ -38,7 +38,7 @@ describe('Search service', () => { packageInfo: { version: '8' }, expressions: expressionsPluginMock.createSetupContract(), } as any); - expect(setup).toHaveProperty('registerSearchStrategyProvider'); + expect(setup).toHaveProperty('registerSearchStrategy'); }); }); }); diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 1615aac9e7b7d..d5997c15817f6 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -18,11 +18,11 @@ */ import { Plugin, CoreSetup, CoreStart, PackageInfo } from '../../../../core/public'; +import { SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider } from './sync_search_strategy'; +import { ISearchSetup, ISearchStart, TSearchStrategiesMap, ISearchStrategy } from './types'; import { ExpressionsSetup } from '../../../../plugins/expressions/public'; -import { SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider } from './sync_search_strategy'; import { createSearchSource, SearchSource, SearchSourceDependencies } from './search_source'; -import { ISearchSetup, ISearchStart, TSearchStrategyProvider, TSearchStrategiesMap } from './types'; import { TStrategyTypes } from './strategy_types'; import { getEsClient, LegacyApiCaller } from './legacy'; import { ES_SEARCH_STRATEGY, DEFAULT_SEARCH_STRATEGY } from '../../common/search'; @@ -54,11 +54,8 @@ interface SearchServiceStartDependencies { } /** - * The search plugin exposes two registration methods for other plugins: - * - registerSearchStrategyProvider for plugins to add their own custom - * search strategies - * - registerSearchStrategyContext for plugins to expose information - * and/or functionality for other search strategies to use + * The search plugin exposes a method `registerSearchStrategy` for other plugins + * to add their own custom search strategies. * * It also comes with two search strategy implementations - SYNC_SEARCH_STRATEGY and ES_SEARCH_STRATEGY. */ @@ -73,17 +70,19 @@ export class SearchService implements Plugin { private readonly aggTypesRegistry = new AggTypesRegistry(); private searchInterceptor!: SearchInterceptor; - private registerSearchStrategyProvider = ( + private registerSearchStrategy = ( name: T, - strategyProvider: TSearchStrategyProvider + strategy: ISearchStrategy ) => { - this.searchStrategies[name] = strategyProvider; + this.searchStrategies[name] = strategy; }; - private getSearchStrategy = (name: T): TSearchStrategyProvider => { - const strategyProvider = this.searchStrategies[name]; - if (!strategyProvider) throw new Error(`Search strategy ${name} not found`); - return strategyProvider; + private getSearchStrategy = (name: T): ISearchStrategy => { + const strategy = this.searchStrategies[name]; + if (!strategy) { + throw new Error(`Search strategy ${name} not found`); + } + return strategy; }; public setup( @@ -91,8 +90,11 @@ export class SearchService implements Plugin { { expressions, packageInfo, query, getInternalStartServices }: SearchServiceSetupDependencies ): ISearchSetup { this.esClient = getEsClient(core.injectedMetadata, core.http, packageInfo); - this.registerSearchStrategyProvider(SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider); - this.registerSearchStrategyProvider(ES_SEARCH_STRATEGY, esSearchStrategyProvider); + + const syncSearchStrategy = syncSearchStrategyProvider(core); + const esSearchStrategy = esSearchStrategyProvider(core, syncSearchStrategy); + this.registerSearchStrategy(SYNC_SEARCH_STRATEGY, syncSearchStrategy); + this.registerSearchStrategy(ES_SEARCH_STRATEGY, esSearchStrategy); const aggTypesSetup = this.aggTypesRegistry.setup(); @@ -114,7 +116,7 @@ export class SearchService implements Plugin { calculateAutoTimeExpression: getCalculateAutoTimeExpression(core.uiSettings), types: aggTypesSetup, }, - registerSearchStrategyProvider: this.registerSearchStrategyProvider, + registerSearchStrategy: this.registerSearchStrategy, }; } @@ -134,12 +136,10 @@ export class SearchService implements Plugin { const aggTypesStart = this.aggTypesRegistry.start(); const search: ISearchGeneric = (request, options, strategyName) => { - const strategyProvider = this.getSearchStrategy(strategyName || DEFAULT_SEARCH_STRATEGY); - const searchStrategy = strategyProvider({ - core, - getSearchStrategy: this.getSearchStrategy, - }); - return this.searchInterceptor.search(searchStrategy.search as any, request, options); + const { search: defaultSearch } = this.getSearchStrategy( + strategyName || DEFAULT_SEARCH_STRATEGY + ); + return this.searchInterceptor.search(defaultSearch as any, request, options); }; const legacySearch = { @@ -164,6 +164,7 @@ export class SearchService implements Plugin { }, types: aggTypesStart, }, + getSearchStrategy: this.getSearchStrategy, search, searchSource: { create: createSearchSource(dependencies.indexPatterns, searchSourceDependencies), diff --git a/src/plugins/data/public/search/sync_search_strategy.test.ts b/src/plugins/data/public/search/sync_search_strategy.test.ts index 6197980314b86..383a312fffad9 100644 --- a/src/plugins/data/public/search/sync_search_strategy.test.ts +++ b/src/plugins/data/public/search/sync_search_strategy.test.ts @@ -19,26 +19,23 @@ import { coreMock } from '../../../../core/public/mocks'; import { SYNC_SEARCH_STRATEGY, syncSearchStrategyProvider } from './sync_search_strategy'; -import { CoreStart } from 'kibana/public'; +import { CoreSetup } from 'kibana/public'; describe('Sync search strategy', () => { - let mockCoreStart: MockedKeys; + let mockCoreSetup: MockedKeys; beforeEach(() => { - mockCoreStart = coreMock.createStart(); + mockCoreSetup = coreMock.createSetup(); }); it('returns a strategy with `search` that calls the backend API', () => { - mockCoreStart.http.fetch.mockImplementationOnce(() => Promise.resolve()); + mockCoreSetup.http.fetch.mockImplementationOnce(() => Promise.resolve()); - const syncSearch = syncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn(), - }); + const syncSearch = syncSearchStrategyProvider(mockCoreSetup); const request = { serverStrategy: SYNC_SEARCH_STRATEGY }; syncSearch.search(request, {}); - expect(mockCoreStart.http.fetch.mock.calls[0][0]).toEqual({ + expect(mockCoreSetup.http.fetch.mock.calls[0][0]).toEqual({ path: `/internal/search/${SYNC_SEARCH_STRATEGY}`, body: JSON.stringify({ serverStrategy: 'SYNC_SEARCH_STRATEGY', @@ -52,15 +49,12 @@ describe('Sync search strategy', () => { const expectedLoadingCountValues = [0, 1, 0]; const receivedLoadingCountValues: number[] = []; - mockCoreStart.http.fetch.mockResolvedValueOnce('response'); + mockCoreSetup.http.fetch.mockResolvedValueOnce('response'); - const syncSearch = syncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn(), - }); + const syncSearch = syncSearchStrategyProvider(mockCoreSetup); const request = { serverStrategy: SYNC_SEARCH_STRATEGY }; - const loadingCount$ = mockCoreStart.http.addLoadingCountSource.mock.calls[0][0]; + const loadingCount$ = mockCoreSetup.http.addLoadingCountSource.mock.calls[0][0]; loadingCount$.subscribe((value) => receivedLoadingCountValues.push(value)); await syncSearch.search(request, {}).toPromise(); @@ -73,15 +67,12 @@ describe('Sync search strategy', () => { const expectedLoadingCountValues = [0, 1, 0]; const receivedLoadingCountValues: number[] = []; - mockCoreStart.http.fetch.mockRejectedValueOnce('error'); + mockCoreSetup.http.fetch.mockRejectedValueOnce('error'); - const syncSearch = syncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn(), - }); + const syncSearch = syncSearchStrategyProvider(mockCoreSetup); const request = { serverStrategy: SYNC_SEARCH_STRATEGY }; - const loadingCount$ = mockCoreStart.http.addLoadingCountSource.mock.calls[0][0]; + const loadingCount$ = mockCoreSetup.http.addLoadingCountSource.mock.calls[0][0]; loadingCount$.subscribe((value) => receivedLoadingCountValues.push(value)); try { diff --git a/src/plugins/data/public/search/sync_search_strategy.ts b/src/plugins/data/public/search/sync_search_strategy.ts index 860ce593ae217..25d2731df7d5c 100644 --- a/src/plugins/data/public/search/sync_search_strategy.ts +++ b/src/plugins/data/public/search/sync_search_strategy.ts @@ -19,9 +19,9 @@ import { BehaviorSubject, from } from 'rxjs'; import { finalize } from 'rxjs/operators'; +import { CoreSetup } from '../../../../core/public'; import { IKibanaSearchRequest } from '../../common/search'; -import { ISearch, ISearchOptions } from './i_search'; -import { TSearchStrategyProvider, ISearchStrategy, ISearchContext } from './types'; +import { ISearch } from './i_search'; export const SYNC_SEARCH_STRATEGY = 'SYNC_SEARCH_STRATEGY'; @@ -29,27 +29,22 @@ export interface ISyncSearchRequest extends IKibanaSearchRequest { serverStrategy: string; } -export const syncSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { +export function syncSearchStrategyProvider(core: CoreSetup) { const loadingCount$ = new BehaviorSubject(0); - context.core.http.addLoadingCountSource(loadingCount$); + core.http.addLoadingCountSource(loadingCount$); - const search: ISearch = ( - request: ISyncSearchRequest, - options: ISearchOptions = {} - ) => { + const search: ISearch = (request, options) => { loadingCount$.next(loadingCount$.getValue() + 1); return from( - context.core.http.fetch({ + core.http.fetch({ path: `/internal/search/${request.serverStrategy}`, method: 'POST', body: JSON.stringify(request), - signal: options.signal, + signal: options?.signal, }) ).pipe(finalize(() => loadingCount$.next(loadingCount$.getValue() - 1))); }; return { search }; -}; +} diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts index 64b4f1c5c2983..135974b697739 100644 --- a/src/plugins/data/public/search/types.ts +++ b/src/plugins/data/public/search/types.ts @@ -17,7 +17,6 @@ * under the License. */ -import { CoreStart } from 'kibana/public'; import { SearchAggsSetup, SearchAggsStart } from './aggs'; import { ISearch, ISearchGeneric } from './i_search'; import { TStrategyTypes } from './strategy_types'; @@ -25,11 +24,6 @@ import { LegacyApiCaller } from './legacy/es_client'; import { SearchInterceptor } from './search_interceptor'; import { ISearchSource, SearchSourceFields } from './search_source'; -export interface ISearchContext { - core: CoreStart; - getSearchStrategy: (name: T) => TSearchStrategyProvider; -} - /** * Search strategy interface contains a search method that takes in * a request and returns a promise that resolves to a response. @@ -39,27 +33,23 @@ export interface ISearchStrategy { } export type TSearchStrategiesMap = { - [K in TStrategyTypes]?: TSearchStrategyProvider; + [K in TStrategyTypes]?: ISearchStrategy; }; -/** - * Search strategy provider creates an instance of a search strategy with the request - * handler context bound to it. This way every search strategy can use - * whatever information they require from the request context. - */ -export type TSearchStrategyProvider = ( - context: ISearchContext -) => ISearchStrategy; - /** * Extension point exposed for other plugins to register their own search * strategies. */ -export type TRegisterSearchStrategyProvider = ( +export type TRegisterSearchStrategy = ( name: T, - searchStrategyProvider: TSearchStrategyProvider + searchStrategy: ISearchStrategy ) => void; +/** + * Used if a plugin needs access to an already registered search strategy. + */ +export type TGetSearchStrategy = (name: T) => ISearchStrategy; + export interface ISearchStartLegacy { esClient: LegacyApiCaller; } @@ -74,12 +64,18 @@ export interface ISearchSetup { * Extension point exposed for other plugins to register their own search * strategies. */ - registerSearchStrategyProvider: TRegisterSearchStrategyProvider; + registerSearchStrategy: TRegisterSearchStrategy; } export interface ISearchStart { aggs: SearchAggsStart; setInterceptor: (searchInterceptor: SearchInterceptor) => void; + + /** + * Used if a plugin needs access to an already registered search strategy. + */ + getSearchStrategy: TGetSearchStrategy; + search: ISearchGeneric; searchSource: { create: (fields?: SearchSourceFields) => Promise; diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap index 26ddb0809d24b..707e65d60870c 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/__snapshots__/saved_objects_table.test.tsx.snap @@ -277,6 +277,7 @@ exports[`SavedObjectsTable import should show the flyout 1`] = ` "getMetrics": [Function], }, }, + "getSearchStrategy": [MockFunction], "search": [MockFunction], "searchSource": Object { "create": [MockFunction], diff --git a/x-pack/plugins/data_enhanced/public/plugin.ts b/x-pack/plugins/data_enhanced/public/plugin.ts index 72e0817eea8df..879c73587ed96 100644 --- a/x-pack/plugins/data_enhanced/public/plugin.ts +++ b/x-pack/plugins/data_enhanced/public/plugin.ts @@ -29,19 +29,20 @@ export interface DataEnhancedStartDependencies { export type DataEnhancedSetup = ReturnType; export type DataEnhancedStart = ReturnType; -export class DataEnhancedPlugin implements Plugin { - constructor() {} - - public setup(core: CoreSetup, { data }: DataEnhancedSetupDependencies) { +export class DataEnhancedPlugin + implements Plugin { + public setup( + core: CoreSetup, + { data }: DataEnhancedSetupDependencies + ) { data.autocomplete.addQuerySuggestionProvider( KUERY_LANGUAGE_NAME, setupKqlQuerySuggestionProvider(core) ); - data.search.registerSearchStrategyProvider(ASYNC_SEARCH_STRATEGY, asyncSearchStrategyProvider); - data.search.registerSearchStrategyProvider( - ES_SEARCH_STRATEGY, - enhancedEsSearchStrategyProvider - ); + const asyncSearchStrategy = asyncSearchStrategyProvider(core); + const esSearchStrategy = enhancedEsSearchStrategyProvider(core, asyncSearchStrategy); + data.search.registerSearchStrategy(ASYNC_SEARCH_STRATEGY, asyncSearchStrategy); + data.search.registerSearchStrategy(ES_SEARCH_STRATEGY, esSearchStrategy); } public start(core: CoreStart, plugins: DataEnhancedStartDependencies) { diff --git a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts index 6c635cc5b4489..3013f9966f068 100644 --- a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts @@ -6,35 +6,37 @@ import { of } from 'rxjs'; import { AbortController } from 'abort-controller'; +import { CoreSetup } from '../../../../../src/core/public'; import { coreMock } from '../../../../../src/core/public/mocks'; +import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; +import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; import { asyncSearchStrategyProvider } from './async_search_strategy'; -import { IAsyncSearchOptions } from './types'; -import { CoreStart } from 'kibana/public'; +import { IAsyncSearchOptions } from '.'; +import { DataEnhancedStartDependencies } from '../plugin'; describe('Async search strategy', () => { - let mockCoreStart: MockedKeys; + let mockCoreSetup: jest.Mocked>; + let mockDataStart: jest.Mocked; const mockSearch = jest.fn(); const mockRequest = { params: {}, serverStrategy: 'foo' }; const mockOptions: IAsyncSearchOptions = { pollInterval: 0 }; beforeEach(() => { - mockCoreStart = coreMock.createStart(); + mockCoreSetup = coreMock.createSetup(); + mockDataStart = dataPluginMock.createStartContract(); + (mockDataStart.search.getSearchStrategy as jest.Mock).mockReturnValue({ search: mockSearch }); + mockCoreSetup.getStartServices.mockResolvedValue([ + undefined as any, + { data: mockDataStart }, + undefined, + ]); mockSearch.mockReset(); }); it('only sends one request if the first response is complete', async () => { mockSearch.mockReturnValueOnce(of({ id: 1, total: 1, loaded: 1 })); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); await asyncSearch.search(mockRequest, mockOptions).toPromise(); @@ -51,17 +53,7 @@ describe('Async search strategy', () => { of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) ); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); - + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); await asyncSearch.search(mockRequest, mockOptions).toPromise(); @@ -75,17 +67,7 @@ describe('Async search strategy', () => { .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: true })) .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: true })); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); - + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); await asyncSearch @@ -104,16 +86,7 @@ describe('Async search strategy', () => { of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) ); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); @@ -131,16 +104,7 @@ describe('Async search strategy', () => { of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) ); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); expect(mockSearch).toBeCalledTimes(0); @@ -157,16 +121,7 @@ describe('Async search strategy', () => { .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2 })) .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2 })); - const asyncSearch = asyncSearchStrategyProvider({ - core: mockCoreStart, - getSearchStrategy: jest.fn().mockImplementation(() => { - return () => { - return { - search: mockSearch, - }; - }; - }), - }); + const asyncSearch = asyncSearchStrategyProvider(mockCoreSetup); const abortController = new AbortController(); const options = { ...mockOptions, signal: abortController.signal }; @@ -178,7 +133,7 @@ describe('Async search strategy', () => { } catch (e) { expect(e.name).toBe('AbortError'); expect(mockSearch).toBeCalledTimes(1); - expect(mockCoreStart.http.delete).toBeCalled(); + expect(mockCoreSetup.http.delete).toBeCalled(); } }); }); diff --git a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts index 18b5b976b3c1b..7de4dd28ad3d7 100644 --- a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts @@ -4,17 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EMPTY, fromEvent, NEVER, Observable, throwError, timer } from 'rxjs'; -import { mergeMap, expand, takeUntil } from 'rxjs/operators'; +import { EMPTY, fromEvent, NEVER, throwError, timer, Observable, from } from 'rxjs'; +import { mergeMap, expand, takeUntil, share, flatMap } from 'rxjs/operators'; +import { CoreSetup } from '../../../../../src/core/public'; import { AbortError } from '../../../../../src/plugins/data/common'; import { - IKibanaSearchResponse, - ISearchContext, + ISearch, ISearchStrategy, + ISyncSearchRequest, SYNC_SEARCH_STRATEGY, - TSearchStrategyProvider, } from '../../../../../src/plugins/data/public'; -import { IAsyncSearchRequest, IAsyncSearchOptions, IAsyncSearchResponse } from './types'; +import { IAsyncSearchOptions, IAsyncSearchResponse, IAsyncSearchRequest } from './types'; +import { DataEnhancedStartDependencies } from '../plugin'; export const ASYNC_SEARCH_STRATEGY = 'ASYNC_SEARCH_STRATEGY'; @@ -24,55 +25,59 @@ declare module '../../../../../src/plugins/data/public' { } } -export const asyncSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -): ISearchStrategy => { - const syncStrategyProvider = context.getSearchStrategy(SYNC_SEARCH_STRATEGY); - const { search } = syncStrategyProvider(context); - return { - search: ( - request: IAsyncSearchRequest, - { pollInterval = 1000, ...options }: IAsyncSearchOptions = {} - ): Observable => { - const { serverStrategy } = request; - let id: string | undefined = request.id; +export function asyncSearchStrategyProvider( + core: CoreSetup +): ISearchStrategy { + const startServices$ = from(core.getStartServices()).pipe(share()); - const aborted$ = options.signal - ? fromEvent(options.signal, 'abort').pipe( - mergeMap(() => { - // If we haven't received the response to the initial request, including the ID, then - // we don't need to send a follow-up request to delete this search. Otherwise, we - // send the follow-up request to delete this search, then throw an abort error. - if (id !== undefined) { - context.core.http.delete(`/internal/search/${request.serverStrategy}/${id}`); - } - return throwError(new AbortError()); - }) - ) - : NEVER; + const search: ISearch = ( + request: ISyncSearchRequest, + { pollInterval = 1000, ...options }: IAsyncSearchOptions = {} + ) => { + const { serverStrategy } = request; + let { id } = request; - return search(request, options).pipe( - expand((response: IAsyncSearchResponse) => { - // If the response indicates of an error, stop polling and complete the observable - if (!response || (response.is_partial && !response.is_running)) { + const aborted$ = options.signal + ? fromEvent(options.signal, 'abort').pipe( + mergeMap(() => { + // If we haven't received the response to the initial request, including the ID, then + // we don't need to send a follow-up request to delete this search. Otherwise, we + // send the follow-up request to delete this search, then throw an abort error. + if (id !== undefined) { + core.http.delete(`/internal/search/${request.serverStrategy}/${id}`); + } return throwError(new AbortError()); - } + }) + ) + : NEVER; + + return startServices$.pipe( + flatMap((startServices) => { + const syncSearch = startServices[1].data.search.getSearchStrategy(SYNC_SEARCH_STRATEGY); + return (syncSearch.search(request, options) as Observable).pipe( + expand((response) => { + // If the response indicates of an error, stop polling and complete the observable + if (!response || (response.is_partial && !response.is_running)) { + return throwError(new AbortError()); + } - // If the response indicates it is complete, stop polling and complete the observable - if (!response.is_running) return EMPTY; + // If the response indicates it is complete, stop polling and complete the observable + if (!response.is_running) return EMPTY; - id = response.id; + id = response.id; - // Delay by the given poll interval - return timer(pollInterval).pipe( - // Send future requests using just the ID from the response - mergeMap(() => { - return search({ id, serverStrategy }, options); - }) - ); - }), - takeUntil(aborted$) - ); - }, + // Delay by the given poll interval + return timer(pollInterval).pipe( + // Send future requests using just the ID from the response + mergeMap(() => { + return search({ id, serverStrategy }, options); + }) + ); + }), + takeUntil(aborted$) + ); + }) + ); }; -}; + return { search }; +} diff --git a/x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts new file mode 100644 index 0000000000000..5d6bd53e2c945 --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CoreSetup } from '../../../../../src/core/public'; +import { coreMock } from '../../../../../src/core/public/mocks'; +import { ES_SEARCH_STRATEGY } from '../../../../../src/plugins/data/common'; +import { enhancedEsSearchStrategyProvider } from './es_search_strategy'; +import { IAsyncSearchOptions } from '.'; + +describe('Enhanced ES search strategy', () => { + let mockCoreSetup: jest.Mocked; + const mockSearch = { search: jest.fn() }; + + beforeEach(() => { + mockCoreSetup = coreMock.createSetup(); + mockSearch.search.mockClear(); + }); + + it('returns a strategy with `search` that calls the async search `search`', () => { + const request = { params: {} }; + const options: IAsyncSearchOptions = { pollInterval: 0 }; + + const esSearch = enhancedEsSearchStrategyProvider(mockCoreSetup, mockSearch); + esSearch.search(request, options); + + expect(mockSearch.search.mock.calls[0][0]).toEqual({ + ...request, + serverStrategy: ES_SEARCH_STRATEGY, + }); + expect(mockSearch.search.mock.calls[0][1]).toEqual(options); + }); +}); diff --git a/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts index 3a511c7b5a176..c4b293a52a104 100644 --- a/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts @@ -5,42 +5,40 @@ */ import { Observable } from 'rxjs'; +import { CoreSetup } from '../../../../../src/core/public'; import { ES_SEARCH_STRATEGY, IEsSearchResponse } from '../../../../../src/plugins/data/common'; import { - TSearchStrategyProvider, - ISearchContext, ISearch, getEsPreference, + ISearchStrategy, UI_SETTINGS, } from '../../../../../src/plugins/data/public'; import { IEnhancedEsSearchRequest, EnhancedSearchParams } from '../../common'; import { ASYNC_SEARCH_STRATEGY } from './async_search_strategy'; import { IAsyncSearchOptions } from './types'; -export const enhancedEsSearchStrategyProvider: TSearchStrategyProvider = ( - context: ISearchContext -) => { - const asyncStrategyProvider = context.getSearchStrategy(ASYNC_SEARCH_STRATEGY); - const { search: asyncSearch } = asyncStrategyProvider(context); - +export function enhancedEsSearchStrategyProvider( + core: CoreSetup, + asyncStrategy: ISearchStrategy +) { const search: ISearch = ( request: IEnhancedEsSearchRequest, options ) => { const params: EnhancedSearchParams = { - ignoreThrottled: !context.core.uiSettings.get(UI_SETTINGS.SEARCH_INCLUDE_FROZEN), - preference: getEsPreference(context.core.uiSettings), + ignoreThrottled: !core.uiSettings.get(UI_SETTINGS.SEARCH_INCLUDE_FROZEN), + preference: getEsPreference(core.uiSettings), ...request.params, }; request.params = params; const asyncOptions: IAsyncSearchOptions = { pollInterval: 0, ...options }; - return asyncSearch( + return asyncStrategy.search( { ...request, serverStrategy: ES_SEARCH_STRATEGY }, asyncOptions ) as Observable; }; return { search }; -}; +} From 23be466c977e9f0b6367de7f5693a4ea1f6387f7 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Mon, 8 Jun 2020 20:24:54 +0200 Subject: [PATCH 18/65] [Discover] Replace EuiTooltip by native title for better performance (#68280) --- .../components/sidebar/discover_field.tsx | 18 ++++++++---------- .../components/sidebar/discover_sidebar.scss | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/plugins/discover/public/application/components/sidebar/discover_field.tsx b/src/plugins/discover/public/application/components/sidebar/discover_field.tsx index 9e5429882e3c3..5f40c55e30e7e 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_field.tsx +++ b/src/plugins/discover/public/application/components/sidebar/discover_field.tsx @@ -17,7 +17,7 @@ * under the License. */ import React from 'react'; -import { EuiButton, EuiToolTip, EuiText } from '@elastic/eui'; +import { EuiButton, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { DiscoverFieldDetails } from './discover_field_details'; import { FieldIcon } from '../../../../../kibana_react/public'; @@ -125,16 +125,14 @@ export function DiscoverField({ /> - - - {useShortDots ? shortenDottedString(field.name) : field.displayName} - - + {useShortDots ? shortenDottedString(field.name) : field.displayName} + {field.name !== '_source' && !selected && ( diff --git a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss index fe04d42d614ff..9f7700c7f395c 100644 --- a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss +++ b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.scss @@ -107,6 +107,7 @@ */ .dscSidebarItem__action { opacity: 0; /* 1 */ + transition: none; &:focus { opacity: 1; /* 2 */ From 25e71c10963f8cc959b63bfc83da9e4b3a09fd5e Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 8 Jun 2020 11:29:09 -0700 Subject: [PATCH 19/65] upgrade npm-run-path (#68539) Co-authored-by: spalger --- package.json | 2 +- packages/kbn-dev-utils/package.json | 2 +- packages/kbn-es/package.json | 2 +- packages/kbn-plugin-generator/package.json | 2 +- packages/kbn-plugin-helpers/package.json | 2 +- packages/kbn-pm/dist/index.js | 2 +- packages/kbn-pm/package.json | 2 +- x-pack/package.json | 2 +- yarn.lock | 8 ++++---- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 0873ab8c158e1..9423ee31c8bbe 100644 --- a/package.json +++ b/package.json @@ -179,7 +179,7 @@ "elastic-apm-node": "^3.6.0", "elasticsearch": "^16.7.0", "elasticsearch-browser": "^16.7.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "expiry-js": "0.1.7", "fast-deep-equal": "^3.1.1", "file-loader": "4.2.0", diff --git a/packages/kbn-dev-utils/package.json b/packages/kbn-dev-utils/package.json index 08b2e5b226967..5000d8b7490be 100644 --- a/packages/kbn-dev-utils/package.json +++ b/packages/kbn-dev-utils/package.json @@ -13,7 +13,7 @@ "axios": "^0.19.0", "chalk": "^2.4.2", "dedent": "^0.7.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "exit-hook": "^2.2.0", "getopts": "^2.2.5", "load-json-file": "^6.2.0", diff --git a/packages/kbn-es/package.json b/packages/kbn-es/package.json index 8b964d8399904..271b4a3dc661b 100644 --- a/packages/kbn-es/package.json +++ b/packages/kbn-es/package.json @@ -11,7 +11,7 @@ "chalk": "^2.4.2", "dedent": "^0.7.0", "del": "^5.1.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "getopts": "^2.2.4", "glob": "^7.1.2", "node-fetch": "^2.6.0", diff --git a/packages/kbn-plugin-generator/package.json b/packages/kbn-plugin-generator/package.json index b3b1eff41e4b5..b9df67b32e5d3 100644 --- a/packages/kbn-plugin-generator/package.json +++ b/packages/kbn-plugin-generator/package.json @@ -6,7 +6,7 @@ "dependencies": { "chalk": "^2.4.2", "dedent": "^0.7.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "getopts": "^2.2.4", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", diff --git a/packages/kbn-plugin-helpers/package.json b/packages/kbn-plugin-helpers/package.json index 040b779a69951..362e8302c3bec 100644 --- a/packages/kbn-plugin-helpers/package.json +++ b/packages/kbn-plugin-helpers/package.json @@ -16,7 +16,7 @@ "argv-split": "^2.0.1", "commander": "^3.0.0", "del": "^5.1.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "globby": "^8.0.1", "gulp-babel": "^8.0.0", "gulp-rename": "1.4.0", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 21fff4d85ece6..7b233ef010653 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -34655,7 +34655,7 @@ const npmRunPath = options => { // Ensure the running `node` binary is used const execPathDir = path.resolve(options.cwd, options.execPath, '..'); - result.unshift(execPathDir); + result.push(execPathDir); return result.concat(options.path).join(path.delimiter); }; diff --git a/packages/kbn-pm/package.json b/packages/kbn-pm/package.json index 234877e9ae626..5938d15573d63 100644 --- a/packages/kbn-pm/package.json +++ b/packages/kbn-pm/package.json @@ -42,7 +42,7 @@ "cpy": "^8.0.0", "dedent": "^0.7.0", "del": "^5.1.0", - "execa": "^4.0.0", + "execa": "^4.0.2", "getopts": "^2.2.4", "glob": "^7.1.2", "globby": "^8.0.1", diff --git a/x-pack/package.json b/x-pack/package.json index 227547ce15fd1..b3dcde2194d3f 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -134,7 +134,7 @@ "enzyme-adapter-react-16": "^1.15.2", "enzyme-adapter-utils": "^1.13.0", "enzyme-to-json": "^3.4.4", - "execa": "^4.0.0", + "execa": "^4.0.2", "fancy-log": "^1.3.2", "fetch-mock": "^7.3.9", "graphql-code-generator": "^0.18.2", diff --git a/yarn.lock b/yarn.lock index e47af2c6fe284..df478e79d2bf6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13078,7 +13078,7 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.0.0, execa@^4.0.2: +execa@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== @@ -21741,9 +21741,9 @@ npm-run-path@^2.0.0: path-key "^2.0.0" npm-run-path@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" - integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" From 891342a76fce54192785f89e548c5144983e5ee5 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 8 Jun 2020 13:05:00 -0600 Subject: [PATCH 20/65] [Maps] fix regression in adding TMS layer (#68471) * [Maps] fix regression in adding TMS layer * simplify endDataLoad signature * rename * review feedback Co-authored-by: Elastic Machine --- .../maps/public/actions/data_request_actions.ts | 17 ++++------------- .../classes/layers/tile_layer/tile_layer.js | 9 +++++---- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/maps/public/actions/data_request_actions.ts b/x-pack/plugins/maps/public/actions/data_request_actions.ts index 13b658af6a0f3..a0c484a82e530 100644 --- a/x-pack/plugins/maps/public/actions/data_request_actions.ts +++ b/x-pack/plugins/maps/public/actions/data_request_actions.ts @@ -42,12 +42,7 @@ import { DataRequestAbortError } from '../classes/util/data_request'; export type DataRequestContext = { startLoading(dataId: string, requestToken: symbol, meta: DataMeta): void; - stopLoading( - dataId: string, - requestToken: symbol, - data: FeatureCollection | object, - meta: DataMeta - ): void; + stopLoading(dataId: string, requestToken: symbol, data: object, meta: DataMeta): void; onLoadError(dataId: string, requestToken: symbol, errorMessage: string): void; updateSourceData(newData: unknown): void; isRequestStillActive(dataId: string, requestToken: symbol): boolean; @@ -106,12 +101,8 @@ function getDataRequestContext( dataFilters: getDataFilters(getState()), startLoading: (dataId: string, requestToken: symbol, meta: DataMeta) => dispatch(startDataLoad(layerId, dataId, requestToken, meta)), - stopLoading: ( - dataId: string, - requestToken: symbol, - data: FeatureCollection | object, - meta: DataMeta - ) => dispatch(endDataLoad(layerId, dataId, requestToken, data, meta)), + stopLoading: (dataId: string, requestToken: symbol, data: object, meta: DataMeta) => + dispatch(endDataLoad(layerId, dataId, requestToken, data, meta)), onLoadError: (dataId: string, requestToken: symbol, errorMessage: string) => dispatch(onDataLoadError(layerId, dataId, requestToken, errorMessage)), updateSourceData: (newData: unknown) => { @@ -197,7 +188,7 @@ function endDataLoad( layerId: string, dataId: string, requestToken: symbol, - data: FeatureCollection | object, + data: object, meta: DataMeta ) { return async (dispatch: Dispatch, getState: () => MapStoreState) => { diff --git a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js index cd8ca44d4478b..02df8acbfffad 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js +++ b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js @@ -34,7 +34,7 @@ export class TileLayer extends AbstractLayer { startLoading(SOURCE_DATA_REQUEST_ID, requestToken, dataFilters); try { const url = await this.getSource().getUrlTemplate(); - stopLoading(SOURCE_DATA_REQUEST_ID, requestToken, url, {}); + stopLoading(SOURCE_DATA_REQUEST_ID, requestToken, { url }, {}); } catch (error) { onLoadError(SOURCE_DATA_REQUEST_ID, requestToken, error.message); } @@ -68,15 +68,16 @@ export class TileLayer extends AbstractLayer { //when turning the layer back into visible, it's possible the url has not been resovled yet. return; } - const url = sourceDataRequest.getData(); - if (!url) { + + const tmsSourceData = sourceDataRequest.getData(); + if (!tmsSourceData || !tmsSourceData.url) { return; } const sourceId = this.getId(); mbMap.addSource(sourceId, { type: 'raster', - tiles: [url], + tiles: [tmsSourceData.url], tileSize: 256, scheme: 'xyz', }); From 858523eac6fd801a7b1a2227306e70ec9bdd27d3 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Mon, 8 Jun 2020 15:15:47 -0400 Subject: [PATCH 21/65] [Uptime] Edit uptime alerts (#68005) * Extract store creation to plugin start, add redux providers to alert registration. * Update unit test. * Move alert registration to `setup` function. * Allow external editing of uptime client alert types. * Move alert initialization back to `start`. * Clean up interfaces for alert types. * Add code that will work for settings link even outside uptime app. * Create new atomic params type for status alerts. * Update executor params typing to support both alert params types. * Update snapshot for alert factory function. * Fix broken types and refresh snapshots. * Allow edits of filters for monitor alerts. * Support default parameter value for numTimes. * Support default parameter values for timerange. * Modify kuery bar to work for alert edits, fix some filter issues. * Clean up tests and fix types. * Fix types and add a test. * Add callout and validation handling for old alerts while editing. * Add a test for updated validation function. * Define window for overview filters fetch action. * Revert store initialization. * Make monitor counter function while editing alerts. * Refresh snapshot. * Move snapshot count in monitor status alert to callout. * Add new state for selected filters. * Add basic functional tests for uptime alert flyouts. * Fix broken types. * Update unit tests with mock provider. * Remove unneeded params from hook. * Add more unit tests. * Reducing functional test flakiness. * Alert flyout controls update url only within Uptime app. * Extract context interaction to container component, update snapshots. * Add missing parameter to test file. * Remove flaky functional test. Co-authored-by: Elastic Machine Co-authored-by: Shahzad --- x-pack/plugins/uptime/public/apps/plugin.ts | 32 ++- .../__tests__/uptime_date_picker.test.tsx | 8 +- .../__tests__/monitor_bar_series.test.tsx | 8 +- .../charts/__tests__/ping_histogram.test.tsx | 9 +- .../alerts/__tests__/add_filter_btn.test.tsx | 180 +++++++++++++ .../__tests__/alert_field_number.test.tsx | 145 +++++++++++ .../__tests__/alert_monitor_status.test.tsx | 241 ++++++++---------- .../__tests__/old_alert_callout.test.tsx | 36 +++ .../overview/alerts/add_filter_btn.tsx | 8 +- .../overview/alerts/alert_monitor_status.tsx | 76 +++++- .../alert_monitor_status.tsx | 99 ++++++- .../__tests__/down_number_select.test.tsx | 8 +- .../filters_expression_select.test.tsx | 176 +++++++++++++ .../down_number_select.tsx | 13 +- .../filters_expression_select.tsx | 74 +++--- .../filters_expression_select_container.tsx | 38 +++ .../alerts/monitor_expressions/index.ts | 1 + .../time_expression_select.tsx | 19 +- .../overview/alerts/old_alert_call_out.tsx | 33 +++ .../settings_message_expression_popover.tsx | 11 +- .../overview/kuery_bar/kuery_bar.tsx | 18 +- .../__tests__/filter_status_button.test.tsx | 8 +- .../__tests__/status_filter.test.tsx | 20 +- .../use_url_params.test.tsx.snap | 210 ++++++++++++--- .../hooks/__tests__/use_breadcrumbs.test.tsx | 14 +- .../hooks/__tests__/use_url_params.test.tsx | 46 ++-- .../uptime/public/hooks/use_filter_update.ts | 8 +- .../uptime/public/hooks/use_url_params.ts | 36 +++ .../framework/new_platform_adapter.tsx | 13 - .../__tests__/monitor_status.test.ts | 51 +++- .../uptime/public/lib/alert_types/index.ts | 7 +- .../public/lib/alert_types/monitor_status.tsx | 42 ++- .../lib/alert_types/monitor_status_title.tsx | 25 +- .../uptime/public/lib/alert_types/tls.tsx | 19 +- .../public/lib/helper/helper_with_redux.tsx | 21 ++ .../plugins/uptime/public/lib/helper/index.ts | 1 + x-pack/plugins/uptime/public/lib/index.ts | 1 + .../pages/__tests__/page_header.test.tsx | 28 +- .../public/state/actions/overview_filters.ts | 14 +- .../public/state/actions/selected_filters.ts | 21 ++ x-pack/plugins/uptime/public/state/index.ts | 4 +- .../state/reducers/__tests__/ui.test.ts | 31 ++- .../uptime/public/state/reducers/index.ts | 2 + .../public/state/reducers/overview_filters.ts | 6 + .../public/state/reducers/selected_filters.ts | 32 +++ .../state/selectors/__tests__/index.test.ts | 1 + .../uptime/public/state/selectors/index.ts | 2 + x-pack/plugins/uptime/public/uptime_app.tsx | 5 +- 48 files changed, 1518 insertions(+), 383 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx create mode 100644 x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx create mode 100644 x-pack/plugins/uptime/public/state/actions/selected_filters.ts create mode 100644 x-pack/plugins/uptime/public/state/reducers/selected_filters.ts diff --git a/x-pack/plugins/uptime/public/apps/plugin.ts b/x-pack/plugins/uptime/public/apps/plugin.ts index d3a67f81004da..26810a9b1cda3 100644 --- a/x-pack/plugins/uptime/public/apps/plugin.ts +++ b/x-pack/plugins/uptime/public/apps/plugin.ts @@ -3,6 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { CoreSetup, CoreStart, @@ -16,8 +17,16 @@ import { PLUGIN } from '../../common/constants'; import { FeatureCatalogueCategory } from '../../../../../src/plugins/home/public'; import { HomePublicPluginSetup } from '../../../../../src/plugins/home/public'; import { EmbeddableStart } from '../../../../../src/plugins/embeddable/public'; -import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; -import { DataPublicPluginSetup } from '../../../../../src/plugins/data/public'; +import { + TriggersAndActionsUIPublicPluginSetup, + TriggersAndActionsUIPublicPluginStart, +} from '../../../triggers_actions_ui/public'; +import { + DataPublicPluginSetup, + DataPublicPluginStart, +} from '../../../../../src/plugins/data/public'; +import { alertTypeInitializers } from '../lib/alert_types'; +import { kibanaService } from '../state/kibana_service'; export interface ClientPluginsSetup { data: DataPublicPluginSetup; @@ -27,6 +36,8 @@ export interface ClientPluginsSetup { export interface ClientPluginsStart { embeddable: EmbeddableStart; + data: DataPublicPluginStart; + triggers_actions_ui: TriggersAndActionsUIPublicPluginStart; } export type ClientSetup = void; @@ -66,6 +77,7 @@ export class UptimePlugin ); const { element } = params; + const libs: UMFrontendLibs = { framework: getKibanaFrameworkAdapter(coreStart, plugins, corePlugins), }; @@ -74,7 +86,21 @@ export class UptimePlugin }); } - public start(_start: CoreStart, _plugins: {}): void {} + public start(start: CoreStart, plugins: ClientPluginsStart): void { + kibanaService.core = start; + alertTypeInitializers.forEach((init) => { + const alertInitializer = init({ + core: start, + plugins, + }); + if ( + plugins.triggers_actions_ui && + !plugins.triggers_actions_ui.alertTypeRegistry.has(alertInitializer.id) + ) { + plugins.triggers_actions_ui.alertTypeRegistry.register(alertInitializer); + } + }); + } public stop(): void {} } diff --git a/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx b/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx index 445d9302e3a9d..16853211433ca 100644 --- a/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { UptimeDatePicker } from '../uptime_date_picker'; -import { renderWithRouter, shallowWithRouter } from '../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../lib'; describe('UptimeDatePicker component', () => { it('validates props with shallow render', () => { @@ -15,7 +15,11 @@ describe('UptimeDatePicker component', () => { }); it('renders properly with mock data', () => { - const component = renderWithRouter(); + const component = renderWithRouter( + + + + ); expect(component).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx index 4522f8d633fa6..5e49d303c5c66 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { MonitorBarSeries, MonitorBarSeriesProps } from '../monitor_bar_series'; -import { renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../../lib'; import { HistogramPoint } from '../../../../../common/runtime_types'; describe('MonitorBarSeries component', () => { @@ -197,7 +197,11 @@ describe('MonitorBarSeries component', () => { }); it('renders if the data series is present', () => { - const component = renderWithRouter(); + const component = renderWithRouter( + + + + ); expect(component).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx index 21c1fa86eeee4..57a38f2a949e7 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { PingHistogramComponent, PingHistogramComponentProps } from '../ping_histogram'; -import { renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../../lib'; describe('PingHistogram component', () => { const props: PingHistogramComponentProps = { @@ -49,7 +49,12 @@ describe('PingHistogram component', () => { }); it('renders the component without errors', () => { - const component = renderWithRouter(); + const component = renderWithRouter( + + + + ); + expect(component).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx new file mode 100644 index 0000000000000..ac465eca4c5e5 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/add_filter_btn.test.tsx @@ -0,0 +1,180 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallowWithIntl, mountWithIntl } from 'test_utils/enzyme_helpers'; +import { AddFilterButton } from '../add_filter_btn'; +import { EuiButtonEmpty, EuiContextMenuItem } from '@elastic/eui'; + +describe('AddFilterButton component', () => { + it('provides all filter choices', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + Add filter + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="singlePanel" + isOpen={false} + ownFocus={false} + panelPaddingSize="none" + > + + Location + , + + Tag + , + + Port + , + + Type + , + ] + } + /> + + `); + }); + + it('excludes filters that already have selected values', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + Add filter + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="singlePanel" + isOpen={false} + ownFocus={false} + panelPaddingSize="none" + > + + Type + , + ] + } + /> + + `); + }); + + it('popover is disabled if no values are available', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + Add filter + + } + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="singlePanel" + isOpen={false} + ownFocus={false} + panelPaddingSize="none" + > + + + `); + }); + + it('filter select', () => { + const mockOnNewFilter = jest.fn(); + const component = mountWithIntl( + + ); + component.find(EuiButtonEmpty).simulate('click', { target: { value: '0' } }); + component + .find(EuiContextMenuItem) + .first() + .simulate('click', { target: { value: '0' } }); + expect(mockOnNewFilter).toHaveBeenCalled(); + expect(mockOnNewFilter.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + "observer.geo.name", + ], + ] + `); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx new file mode 100644 index 0000000000000..e2564992c76d2 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_field_number.test.tsx @@ -0,0 +1,145 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { AlertFieldNumber, handleAlertFieldNumberChange } from '../alert_field_number'; + +describe('AlertFieldNumber', () => { + describe('handleAlertFieldNumberChange', () => { + let mockSetIsInvalid: jest.Mock; + let mockSetFieldValue: jest.Mock; + + beforeEach(() => { + mockSetIsInvalid = jest.fn(); + mockSetFieldValue = jest.fn(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('sets a valid number', () => { + handleAlertFieldNumberChange( + // @ts-ignore no need to implement this entire type here + { target: { value: '23' } }, + false, + mockSetIsInvalid, + mockSetFieldValue + ); + expect(mockSetIsInvalid).not.toHaveBeenCalled(); + expect(mockSetFieldValue).toHaveBeenCalledTimes(1); + expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + 23, + ], + ] + `); + }); + + it('sets invalid for NaN value', () => { + handleAlertFieldNumberChange( + // @ts-ignore no need to implement this entire type here + { target: { value: 'foo' } }, + false, + mockSetIsInvalid, + mockSetFieldValue + ); + expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); + expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + true, + ], + ] + `); + expect(mockSetFieldValue).not.toHaveBeenCalled(); + }); + + it('sets invalid to false when a valid value is received and invalid is true', () => { + handleAlertFieldNumberChange( + // @ts-ignore no need to implement this entire type here + { target: { value: '23' } }, + true, + mockSetIsInvalid, + mockSetFieldValue + ); + expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); + expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + false, + ], + ] + `); + expect(mockSetFieldValue).toHaveBeenCalledTimes(1); + expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + 23, + ], + ] + `); + }); + }); + + describe('AlertFieldNumber', () => { + it('responds with correct number value when a valid number is specified', () => { + const mockValueHandler = jest.fn(); + const component = mountWithIntl( + + ); + component.find('input').simulate('change', { target: { value: '45' } }); + expect(mockValueHandler).toHaveBeenCalled(); + expect(mockValueHandler.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + 45, + ], + ] + `); + }); + + it('does not set an invalid number value', () => { + const mockValueHandler = jest.fn(); + const component = mountWithIntl( + + ); + component.find('input').simulate('change', { target: { value: 'not a number' } }); + expect(mockValueHandler).not.toHaveBeenCalled(); + expect(mockValueHandler.mock.calls).toEqual([]); + }); + + it('does not set a number value less than 1', () => { + const mockValueHandler = jest.fn(); + const component = mountWithIntl( + + ); + component.find('input').simulate('change', { target: { value: '0' } }); + expect(mockValueHandler).not.toHaveBeenCalled(); + expect(mockValueHandler.mock.calls).toEqual([]); + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx index aa17086f49034..b955667ea7400 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx @@ -5,141 +5,120 @@ */ import React from 'react'; -import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { AlertFieldNumber, handleAlertFieldNumberChange } from '../alert_field_number'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { AlertMonitorStatusComponent, AlertMonitorStatusProps } from '../alert_monitor_status'; describe('alert monitor status component', () => { - describe('handleAlertFieldNumberChange', () => { - let mockSetIsInvalid: jest.Mock; - let mockSetFieldValue: jest.Mock; + describe('AlertMonitorStatus', () => { + const defaultProps: AlertMonitorStatusProps = { + alertParams: { + numTimes: 3, + search: 'monitor.id: foo', + timerangeUnit: 'h', + timerangeCount: 21, + }, + autocomplete: { + addQuerySuggestionProvider: jest.fn(), + getQuerySuggestions: jest.fn(), + }, + enabled: true, + hasFilters: false, + isOldAlert: true, + locations: [], + shouldUpdateUrl: false, + snapshotCount: 0, + snapshotLoading: false, + numTimes: 14, + setAlertParams: jest.fn(), + timerange: { from: 'now-12h', to: 'now' }, + }; - beforeEach(() => { - mockSetIsInvalid = jest.fn(); - mockSetFieldValue = jest.fn(); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it('sets a valid number', () => { - handleAlertFieldNumberChange( - // @ts-ignore no need to implement this entire type here - { target: { value: '23' } }, - false, - mockSetIsInvalid, - mockSetFieldValue - ); - expect(mockSetIsInvalid).not.toHaveBeenCalled(); - expect(mockSetFieldValue).toHaveBeenCalledTimes(1); - expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - 23, - ], - ] - `); - }); - - it('sets invalid for NaN value', () => { - handleAlertFieldNumberChange( - // @ts-ignore no need to implement this entire type here - { target: { value: 'foo' } }, - false, - mockSetIsInvalid, - mockSetFieldValue - ); - expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); - expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - true, - ], - ] - `); - expect(mockSetFieldValue).not.toHaveBeenCalled(); - }); - - it('sets invalid to false when a valid value is received and invalid is true', () => { - handleAlertFieldNumberChange( - // @ts-ignore no need to implement this entire type here - { target: { value: '23' } }, - true, - mockSetIsInvalid, - mockSetFieldValue - ); - expect(mockSetIsInvalid).toHaveBeenCalledTimes(1); - expect(mockSetIsInvalid.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - false, - ], - ] + it('passes default props to children', () => { + const component = shallowWithIntl(); + expect(component).toMatchInlineSnapshot(` + + + + + + + + + + + + + + + } + /> + + `); - expect(mockSetFieldValue).toHaveBeenCalledTimes(1); - expect(mockSetFieldValue.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - 23, - ], - ] - `); - }); - }); - - describe('AlertFieldNumber', () => { - it('responds with correct number value when a valid number is specified', () => { - const mockValueHandler = jest.fn(); - const component = mountWithIntl( - - ); - component.find('input').simulate('change', { target: { value: '45' } }); - expect(mockValueHandler).toHaveBeenCalled(); - expect(mockValueHandler.mock.calls).toMatchInlineSnapshot(` - Array [ - Array [ - 45, - ], - ] - `); - }); - - it('does not set an invalid number value', () => { - const mockValueHandler = jest.fn(); - const component = mountWithIntl( - - ); - component.find('input').simulate('change', { target: { value: 'not a number' } }); - expect(mockValueHandler).not.toHaveBeenCalled(); - expect(mockValueHandler.mock.calls).toEqual([]); - }); - - it('does not set a number value less than 1', () => { - const mockValueHandler = jest.fn(); - const component = mountWithIntl( - - ); - component.find('input').simulate('change', { target: { value: '0' } }); - expect(mockValueHandler).not.toHaveBeenCalled(); - expect(mockValueHandler.mock.calls).toEqual([]); }); }); }); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx new file mode 100644 index 0000000000000..e324b213548d8 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/old_alert_callout.test.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { OldAlertCallOut } from '../old_alert_call_out'; + +describe('OldAlertCallOut', () => { + it('returns null for new alert type', () => { + expect(shallowWithIntl()).toEqual({}); + }); + + it('renders the call out for old alerts', () => { + expect(shallowWithIntl()).toMatchInlineSnapshot(` + + + + } + /> + + `); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx index f633727a0af37..d9011c896ffdc 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx @@ -6,20 +6,18 @@ import React, { useState } from 'react'; import { EuiButtonEmpty, EuiContextMenuItem, EuiContextMenuPanel, EuiPopover } from '@elastic/eui'; -import { useFilterUpdate } from '../../../hooks/use_filter_update'; import * as labels from './translations'; interface Props { newFilters: string[]; onNewFilter: (val: string) => void; + alertFilters: { [key: string]: string[] }; } -export const AddFilterButton: React.FC = ({ newFilters, onNewFilter }) => { +export const AddFilterButton: React.FC = ({ newFilters, onNewFilter, alertFilters }) => { const [isPopoverOpen, setPopover] = useState(false); - const { selectedFilters } = useFilterUpdate(); - - const getSelectedItems = (fieldName: string) => selectedFilters.get(fieldName) || []; + const getSelectedItems = (fieldName: string) => alertFilters?.[fieldName] ?? []; const onButtonClick = () => { setPopover(!isPopoverOpen); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx index e2e44124ec659..a1b4762627e7c 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx @@ -5,25 +5,31 @@ */ import React, { useState } from 'react'; -import { EuiSpacer } from '@elastic/eui'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { DataPublicPluginSetup } from 'src/plugins/data/public'; import * as labels from './translations'; import { DownNoExpressionSelect, TimeExpressionSelect, - FiltersExpressionsSelect, + FiltersExpressionSelectContainer, } from './monitor_expressions'; - import { AddFilterButton } from './add_filter_btn'; +import { OldAlertCallOut } from './old_alert_call_out'; import { KueryBar } from '..'; -interface AlertMonitorStatusProps { +export interface AlertMonitorStatusProps { + alertParams: { [key: string]: any }; autocomplete: DataPublicPluginSetup['autocomplete']; enabled: boolean; - filters: string; + hasFilters: boolean; + isOldAlert: boolean; locations: string[]; + snapshotCount: number; + snapshotLoading: boolean; numTimes: number; setAlertParams: (key: string, value: any) => void; + shouldUpdateUrl: boolean; timerange: { from: string; to: string; @@ -31,42 +37,70 @@ interface AlertMonitorStatusProps { } export const AlertMonitorStatusComponent: React.FC = (props) => { - const { filters, setAlertParams } = props; + const { + alertParams, + hasFilters, + isOldAlert, + setAlertParams, + shouldUpdateUrl, + snapshotCount, + snapshotLoading, + } = props; - const [newFilters, setNewFilters] = useState([]); + const alertFilters = alertParams?.filters ?? {}; + const [newFilters, setNewFilters] = useState( + Object.keys(alertFilters).filter((f) => alertFilters[f].length) + ); return ( <> + + + setAlertParams('search', value)} data-test-subj="xpack.uptime.alerts.monitorStatus.filterBar" /> - + - + - { - if (newFilters.includes(removeFiler)) { - setNewFilters(newFilters.filter((item) => item !== removeFiler)); + onRemoveFilter={(removeFilter: string) => { + if (newFilters.includes(removeFilter)) { + setNewFilters(newFilters.filter((item) => item !== removeFilter)); } }} + setAlertParams={setAlertParams} + shouldUpdateUrl={shouldUpdateUrl} /> { setNewFilters([...newFilters, newFilter]); @@ -74,6 +108,20 @@ export const AlertMonitorStatusComponent: React.FC = (p /> + + + } + iconType="iInCircle" + /> + + ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx index 973a3e1d477b6..ac87dbfcd13aa 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx @@ -4,13 +4,31 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect } from 'react'; -import { useSelector } from 'react-redux'; +import React, { useMemo, useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; +import { useSelector, useDispatch } from 'react-redux'; import { DataPublicPluginSetup } from 'src/plugins/data/public'; -import { selectMonitorStatusAlert, searchTextSelector } from '../../../../state/selectors'; +import { isRight } from 'fp-ts/lib/Either'; +import { + selectMonitorStatusAlert, + overviewFiltersSelector, + snapshotDataSelector, + esKuerySelector, + selectedFiltersSelector, +} from '../../../../state/selectors'; import { AlertMonitorStatusComponent } from '../index'; +import { + fetchOverviewFilters, + setSearchTextAction, + setEsKueryString, + getSnapshotCountAction, +} from '../../../../state/actions'; +import { AtomicStatusCheckParamsType } from '../../../../../common/runtime_types'; +import { useIndexPattern } from '../../kuery_bar/use_index_pattern'; +import { useUpdateKueryString } from '../../../../hooks'; interface Props { + alertParams: { [key: string]: any }; autocomplete: DataPublicPluginSetup['autocomplete']; enabled: boolean; numTimes: number; @@ -27,22 +45,87 @@ export const AlertMonitorStatus: React.FC = ({ numTimes, setAlertParams, timerange, + alertParams, }) => { - const { filters, locations } = useSelector(selectMonitorStatusAlert); - const searchText = useSelector(searchTextSelector); + const dispatch = useDispatch(); + useEffect(() => { + dispatch( + fetchOverviewFilters({ + dateRangeStart: 'now-24h', + dateRangeEnd: 'now', + locations: alertParams.filters?.['observer.geo.name'] ?? [], + ports: alertParams.filters?.['url.port'] ?? [], + tags: alertParams.filters?.tags ?? [], + schemes: alertParams.filters?.['monitor.type'] ?? [], + }) + ); + }, [alertParams, dispatch]); + + const overviewFilters = useSelector(overviewFiltersSelector); + const { locations } = useSelector(selectMonitorStatusAlert); + useEffect(() => { + if (alertParams.search) { + dispatch(setSearchTextAction(alertParams.search)); + } + }, [alertParams, dispatch]); + const { index_pattern: indexPattern } = useIndexPattern(); + + const { count, loading } = useSelector(snapshotDataSelector); + const esKuery = useSelector(esKuerySelector); + const [esFilters] = useUpdateKueryString( + indexPattern, + alertParams.search, + alertParams.filters === undefined || typeof alertParams.filters === 'string' + ? '' + : JSON.stringify(Array.from(Object.entries(alertParams.filters))) + ); useEffect(() => { - setAlertParams('search', searchText); - }, [setAlertParams, searchText]); + dispatch(setEsKueryString(esFilters ?? '')); + }, [dispatch, esFilters]); + + const isOldAlert = React.useMemo( + () => !isRight(AtomicStatusCheckParamsType.decode(alertParams)), + [alertParams] + ); + useEffect(() => { + dispatch( + getSnapshotCountAction({ dateRangeStart: 'now-24h', dateRangeEnd: 'now', filters: esKuery }) + ); + }, [dispatch, esKuery]); + + const selectedFilters = useSelector(selectedFiltersSelector); + useEffect(() => { + if (!alertParams.filters && selectedFilters !== null) { + setAlertParams('filters', { + // @ts-ignore + 'url.port': selectedFilters?.ports ?? [], + // @ts-ignore + 'observer.geo.name': selectedFilters?.locations ?? [], + // @ts-ignore + 'monitor.type': selectedFilters?.schemes ?? [], + // @ts-ignore + tags: selectedFilters?.tags ?? [], + }); + } + }, [alertParams, setAlertParams, selectedFilters]); + + const { pathname } = useLocation(); + const shouldUpdateUrl = useMemo(() => pathname.indexOf('app/uptime') !== -1, [pathname]); return ( ); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx index ff3f4e5a20417..31503252a8990 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/down_number_select.test.tsx @@ -9,20 +9,16 @@ import { renderWithIntl, shallowWithIntl } from 'test_utils/enzyme_helpers'; import { DownNoExpressionSelect } from '../down_number_select'; describe('DownNoExpressionSelect component', () => { - const filters = - '"{"bool":{"filter":[{"bool":{"should":[{"match":{"observer.geo.name":"US-West"}}],"minimum_should_match":1}},' + - '{"bool":{"should":[{"match":{"url.port":443}}],"minimum_should_match":1}}]}}"'; - it('should shallow renders against props', function () { const component = shallowWithIntl( - + ); expect(component).toMatchSnapshot(); }); it('should renders against props', function () { const component = renderWithIntl( - + ); expect(component).toMatchSnapshot(); }); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx new file mode 100644 index 0000000000000..e41dfea82c2fb --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/__tests__/filters_expression_select.test.tsx @@ -0,0 +1,176 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallowWithIntl } from 'test_utils/enzyme_helpers'; +import { FiltersExpressionsSelect } from '../filters_expression_select'; + +describe('filters expression select component', () => { + it('is empty when no filters available', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + + + `); + }); + + it('contains provided new filter values', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + + + + } + disabled={true} + fieldName="observer.geo.name" + forceOpen={false} + id="filter_location" + items={Array []} + loading={false} + onFilterFieldChange={[Function]} + selectedItems={Array []} + setForceOpen={[Function]} + title="Scheme" + /> + + + + + + + + + `); + }); + + it('contains provided selected filter values', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchInlineSnapshot(` + + + + + } + disabled={false} + fieldName="tags" + forceOpen={false} + id="filter_tags" + items={ + Array [ + "foo", + "bar", + ] + } + loading={false} + onFilterFieldChange={[Function]} + selectedItems={Array []} + setForceOpen={[Function]} + title="Tags" + /> + + + + + + + + + `); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx index 7f68aef8e179c..0eb53eb044bc5 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/down_number_select.tsx @@ -10,12 +10,17 @@ import * as labels from '../translations'; import { AlertFieldNumber } from '../alert_field_number'; interface Props { + defaultNumTimes?: number; + hasFilters: boolean; setAlertParams: (key: string, value: any) => void; - filters: string; } -export const DownNoExpressionSelect: React.FC = ({ filters, setAlertParams }) => { - const [numTimes, setNumTimes] = useState(5); +export const DownNoExpressionSelect: React.FC = ({ + defaultNumTimes, + hasFilters, + setAlertParams, +}) => { + const [numTimes, setNumTimes] = useState(defaultNumTimes ?? 5); useEffect(() => { setAlertParams('numTimes', numTimes); @@ -34,7 +39,7 @@ export const DownNoExpressionSelect: React.FC = ({ filters, setAlertParam /> } data-test-subj="xpack.uptime.alerts.monitorStatus.numTimesExpression" - description={filters ? labels.MATCHING_MONITORS_DOWN : labels.ANY_MONITOR_DOWN} + description={hasFilters ? labels.MATCHING_MONITORS_DOWN : labels.ANY_MONITOR_DOWN} id="ping-count" value={`${numTimes} times`} /> diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx index bc742343d5dd9..64862a8b748d8 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx @@ -4,57 +4,55 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect, useState } from 'react'; -import { useSelector } from 'react-redux'; +import React, { useState } from 'react'; import { EuiButtonIcon, EuiExpression, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { FilterPopover } from '../../filter_group/filter_popover'; -import { overviewFiltersSelector } from '../../../../state/selectors'; -import { useFilterUpdate } from '../../../../hooks/use_filter_update'; import { filterLabels } from '../../filter_group/translations'; import { alertFilterLabels } from './translations'; -import { StatusCheckFilters } from '../../../../../common/runtime_types'; +import { FilterExpressionsSelectProps } from './filters_expression_select_container'; +import { OverviewFiltersState } from '../../../../state/reducers/overview_filters'; -interface Props { - newFilters: string[]; - onRemoveFilter: (val: string) => void; - setAlertParams: (key: string, value: any) => void; +type FilterFieldUpdate = (updateTarget: { fieldName: string; values: string[] }) => void; + +interface OwnProps { + setUpdatedFieldValues: FilterFieldUpdate; } +type Props = FilterExpressionsSelectProps & Pick & OwnProps; + export const FiltersExpressionsSelect: React.FC = ({ - setAlertParams, + alertParams, + filters: overviewFilters, newFilters, onRemoveFilter, + setAlertParams, + setUpdatedFieldValues, }) => { - const { - filters: { tags, ports, schemes, locations }, - } = useSelector(overviewFiltersSelector); - - const [updatedFieldValues, setUpdatedFieldValues] = useState<{ - fieldName: string; - values: string[]; - }>({ fieldName: '', values: [] }); - - const { selectedLocations, selectedPorts, selectedSchemes, selectedTags } = useFilterUpdate( - updatedFieldValues.fieldName, - updatedFieldValues.values - ); - - const [filters, setFilters] = useState({ - 'observer.geo.name': selectedLocations, - 'url.port': selectedPorts, - tags: selectedTags, - 'monitor.type': selectedSchemes, - }); - - useEffect(() => { - setAlertParams('filters', filters); - }, [filters, setAlertParams]); + const { tags, ports, schemes, locations } = overviewFilters; + const selectedPorts = alertParams?.filters?.['url.port'] ?? []; + const selectedLocations = alertParams?.filters?.['observer.geo.name'] ?? []; + const selectedSchemes = alertParams?.filters?.['monitor.type'] ?? []; + const selectedTags = alertParams?.filters?.tags ?? []; const onFilterFieldChange = (fieldName: string, values: string[]) => { - setFilters({ - ...filters, - [fieldName]: values, - }); + // the `filters` field is no longer a string + if (alertParams.filters && typeof alertParams.filters !== 'string') { + setAlertParams('filters', { ...alertParams.filters, [fieldName]: values }); + } else { + setAlertParams( + 'filters', + Object.assign( + {}, + { + tags: [], + 'url.port': [], + 'observer.geo.name': [], + 'monitor.type': [], + }, + { [fieldName]: values } + ) + ); + } setUpdatedFieldValues({ fieldName, values }); }; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx new file mode 100644 index 0000000000000..6605f653d7f5c --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select_container.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import { useSelector } from 'react-redux'; +import { FiltersExpressionsSelect } from './filters_expression_select'; +import { overviewFiltersSelector } from '../../../../state/selectors'; +import { useFilterUpdate } from '../../../../hooks/use_filter_update'; + +export interface FilterExpressionsSelectProps { + alertParams: { [key: string]: any }; + newFilters: string[]; + onRemoveFilter: (val: string) => void; + setAlertParams: (key: string, value: any) => void; + shouldUpdateUrl: boolean; +} + +export const FiltersExpressionSelectContainer: React.FC = (props) => { + const [updatedFieldValues, setUpdatedFieldValues] = useState<{ + fieldName: string; + values: string[]; + }>({ fieldName: '', values: [] }); + + useFilterUpdate(updatedFieldValues.fieldName, updatedFieldValues.values, props.shouldUpdateUrl); + + const overviewFilters = useSelector(overviewFiltersSelector); + + return ( + + ); +}; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts index acc19dfbc8f8b..e6f47e744f5ea 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/index.ts @@ -6,4 +6,5 @@ export { DownNoExpressionSelect } from './down_number_select'; export { FiltersExpressionsSelect } from './filters_expression_select'; +export { FiltersExpressionSelectContainer } from './filters_expression_select_container'; export { TimeExpressionSelect } from './time_expression_select'; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx index e3893845862fb..44bfbff6817c4 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/time_expression_select.tsx @@ -13,9 +13,13 @@ import { AlertFieldNumber } from '../alert_field_number'; import { timeExpLabels } from './translations'; interface Props { + defaultTimerangeCount?: number; + defaultTimerangeUnit?: string; setAlertParams: (key: string, value: any) => void; } +const DEFAULT_TIMERANGE_UNIT = 'm'; + const TimeRangeOptions = [ { 'aria-label': labels.SECONDS_TIME_RANGE, @@ -26,7 +30,6 @@ const TimeRangeOptions = [ { 'aria-label': labels.MINUTES_TIME_RANGE, 'data-test-subj': 'xpack.uptime.alerts.monitorStatus.timerangeUnitSelectable.minutesOption', - checked: 'on', key: 'm', label: labels.MINUTES, }, @@ -44,10 +47,18 @@ const TimeRangeOptions = [ }, ]; -export const TimeExpressionSelect: React.FC = ({ setAlertParams }) => { - const [numUnits, setNumUnits] = useState(15); +export const TimeExpressionSelect: React.FC = ({ + defaultTimerangeCount, + defaultTimerangeUnit, + setAlertParams, +}) => { + const [numUnits, setNumUnits] = useState(defaultTimerangeCount ?? 15); - const [timerangeUnitOptions, setTimerangeUnitOptions] = useState(TimeRangeOptions); + const [timerangeUnitOptions, setTimerangeUnitOptions] = useState( + TimeRangeOptions.map((opt) => + opt.key === (defaultTimerangeUnit ?? DEFAULT_TIMERANGE_UNIT) ? { ...opt, checked: 'on' } : opt + ) + ); useEffect(() => { const timerangeUnit = timerangeUnitOptions.find(({ checked }) => checked === 'on')?.key ?? 'm'; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx new file mode 100644 index 0000000000000..eba66f7bfd570 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/alerts/old_alert_call_out.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiSpacer, EuiCallOut } from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +interface Props { + isOldAlert: boolean; +} + +export const OldAlertCallOut: React.FC = ({ isOldAlert }) => { + if (!isOldAlert) return null; + return ( + <> + + + + } + iconType="alert" + /> + + ); +}; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx index 8fd4586830684..cf6d2547d9c0c 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/settings_message_expression_popover.tsx @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ +import { EuiLink } from '@elastic/eui'; import { EuiExpression, EuiPopover } from '@elastic/eui'; -import { Link } from 'react-router-dom'; import React, { useState } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { SETTINGS_ROUTE } from '../../../../common/constants'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; interface SettingsMessageExpressionPopoverProps { 'aria-label': string; @@ -25,9 +25,12 @@ export const SettingsMessageExpressionPopover: React.FC { + const kibana = useKibana(); + const path = kibana.services?.application?.getUrlForApp('uptime', { path: 'settings' }); const [isOpen, setIsOpen] = useState(false); return ( + { setAlertFlyoutVisible(false); @@ -63,7 +66,7 @@ export const SettingsMessageExpressionPopover: React.FC settings page - + ), }} /> diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx index 5c0ee632a2bda..03c8e919ebbf1 100644 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx @@ -36,13 +36,19 @@ function convertKueryToEsQuery(kuery: string, indexPattern: IIndexPattern) { interface Props { 'aria-label': string; autocomplete: DataPublicPluginSetup['autocomplete']; + defaultKuery?: string; 'data-test-subj': string; + shouldUpdateUrl?: boolean; + updateDefaultKuery?: (value: string) => void; } export function KueryBar({ 'aria-label': ariaLabel, autocomplete: autocompleteService, + defaultKuery, 'data-test-subj': dataTestSubj, + shouldUpdateUrl, + updateDefaultKuery, }: Props) { const { loading, index_pattern: indexPattern } = useIndexPattern(); const { updateSearchText } = useSearchText(); @@ -68,8 +74,6 @@ export function KueryBar({ return; } - updateSearchText(inputValue); - setIsLoadingSuggestions(true); setState({ ...state, suggestions: [] }); @@ -112,7 +116,13 @@ export function KueryBar({ return; } - updateUrlParams({ search: inputValue.trim() }); + if (shouldUpdateUrl !== false) { + updateUrlParams({ search: inputValue.trim() }); + } + updateSearchText(inputValue); + if (updateDefaultKuery) { + updateDefaultKuery(inputValue); + } } catch (e) { console.log('Invalid kuery syntax'); // eslint-disable-line no-console } @@ -125,7 +135,7 @@ export function KueryBar({ data-test-subj={dataTestSubj} disabled={indexPatternMissing} isLoading={isLoadingSuggestions || loading} - initialValue={kuery} + initialValue={defaultKuery || kuery} onChange={onChange} onSubmit={onSubmit} suggestions={state.suggestions} diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx index 58c305f0d15a0..612ede2c556e7 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/filter_status_button.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { FilterStatusButton, FilterStatusButtonProps } from '../filter_status_button'; -import { renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../../lib'; describe('FilterStatusButton', () => { let props: FilterStatusButtonProps; @@ -26,7 +26,11 @@ describe('FilterStatusButton', () => { }); it('renders without errors for valid props', () => { - const wrapper = renderWithRouter(); + const wrapper = renderWithRouter( + + + + ); expect(wrapper).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx index a1288513eb785..d09bbad5cb9e0 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/status_filter.test.tsx @@ -5,7 +5,12 @@ */ import React from 'react'; -import { mountWithRouter, renderWithRouter, shallowWithRouter } from '../../../../lib'; +import { + mountWithRouter, + renderWithRouter, + shallowWithRouter, + MountWithReduxProvider, +} from '../../../../lib'; import { createMemoryHistory } from 'history'; import { StatusFilter } from '../status_filter'; import { FilterStatusButton } from '../filter_status_button'; @@ -18,7 +23,12 @@ describe('StatusFilterComponent', () => { initialEntries: [`/?g=%22%22&statusFilter=${status}`], }); - const wrapper = mountWithRouter(, history); + const wrapper = mountWithRouter( + + + , + history + ); const filterBtns = wrapper.find(FilterStatusButton); const allBtn = filterBtns.at(0); @@ -34,7 +44,11 @@ describe('StatusFilterComponent', () => { }); it('renders without errors for valid props', () => { - const wrapper = renderWithRouter(); + const wrapper = renderWithRouter( + + + + ); expect(wrapper).toMatchSnapshot(); }); diff --git a/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap b/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap index 827c9257893ad..5d2565b7210da 100644 --- a/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap +++ b/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap @@ -137,30 +137,95 @@ exports[`useUrlParams deletes keys that do not have truthy values 1`] = ` } } > - + -
- {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-12","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":"","pagination":"foo"} -
- - -
+ +
+ {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-12","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":"","pagination":"foo"} +
+ + +
+ + `; @@ -301,24 +366,89 @@ exports[`useUrlParams gets the expected values using the context 1`] = ` } } > - -
- {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-15m","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":""} -
- - -
+ +
+ {"absoluteDateRangeStart":20,"absoluteDateRangeEnd":20,"autorefreshInterval":60000,"autorefreshIsPaused":false,"dateRangeStart":"now-15m","dateRangeEnd":"now","filters":"","search":"","selectedPingStatus":"","statusFilter":""} +
+ + +
+ + `; diff --git a/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx b/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx index 306919015fcb1..d688660f564ca 100644 --- a/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx +++ b/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx @@ -10,7 +10,7 @@ import { Route } from 'react-router-dom'; import { mountWithRouter } from '../../lib'; import { OVERVIEW_ROUTE } from '../../../common/constants'; import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; -import { UptimeUrlParams, getSupportedUrlParams } from '../../lib/helper'; +import { UptimeUrlParams, getSupportedUrlParams, MountWithReduxProvider } from '../../lib/helper'; import { makeBaseBreadcrumb, useBreadcrumbs } from '../use_breadcrumbs'; describe('useBreadcrumbs', () => { @@ -34,11 +34,13 @@ describe('useBreadcrumbs', () => { }; mountWithRouter( - - - - - + + + + + + + ); const urlParams: UptimeUrlParams = getSupportedUrlParams({}); diff --git a/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx b/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx index deb1f163c1326..af5c113a02834 100644 --- a/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx +++ b/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx @@ -8,7 +8,7 @@ import DateMath from '@elastic/datemath'; import React, { useState, Fragment } from 'react'; import { useUrlParams, UptimeUrlParamsHook } from '../use_url_params'; import { UptimeRefreshContext } from '../../contexts'; -import { mountWithRouter } from '../../lib'; +import { mountWithRouter, MountWithReduxProvider } from '../../lib'; import { createMemoryHistory } from 'history'; interface MockUrlParamsComponentProps { @@ -52,9 +52,11 @@ describe('useUrlParams', () => { jest.spyOn(history, 'push'); const component = mountWithRouter( - - - , + + + + + , history ); @@ -68,14 +70,16 @@ describe('useUrlParams', () => { it('gets the expected values using the context', () => { const component = mountWithRouter( - - - + + + + + ); const getUrlParamsButton = component.find('#getUrlParams'); @@ -92,14 +96,16 @@ describe('useUrlParams', () => { jest.spyOn(history, 'push'); const component = mountWithRouter( - - - , + + + + + , history ); diff --git a/x-pack/plugins/uptime/public/hooks/use_filter_update.ts b/x-pack/plugins/uptime/public/hooks/use_filter_update.ts index 550de134c49bc..fefb676e6e2b5 100644 --- a/x-pack/plugins/uptime/public/hooks/use_filter_update.ts +++ b/x-pack/plugins/uptime/public/hooks/use_filter_update.ts @@ -20,14 +20,18 @@ interface SelectedFilters { selectedFilters: Map; } -export const useFilterUpdate = (fieldName?: string, values?: string[]): SelectedFilters => { +export const useFilterUpdate = ( + fieldName?: string, + values?: string[], + shouldUpdateUrl: boolean = true +): SelectedFilters => { const [getUrlParams, updateUrl] = useUrlParams(); const { filters: currentFilters } = getUrlParams(); // update filters in the URL from filter group const onFilterUpdate = (filtersKuery: string) => { - if (currentFilters !== filtersKuery) { + if (currentFilters !== filtersKuery && shouldUpdateUrl) { updateUrl({ filters: filtersKuery, pagination: '' }); } }; diff --git a/x-pack/plugins/uptime/public/hooks/use_url_params.ts b/x-pack/plugins/uptime/public/hooks/use_url_params.ts index c706b92ff3616..0981da20a7a07 100644 --- a/x-pack/plugins/uptime/public/hooks/use_url_params.ts +++ b/x-pack/plugins/uptime/public/hooks/use_url_params.ts @@ -4,9 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ +import { useEffect } from 'react'; import { parse, stringify } from 'query-string'; import { useLocation, useHistory } from 'react-router-dom'; +import { useDispatch, useSelector } from 'react-redux'; import { UptimeUrlParams, getSupportedUrlParams } from '../lib/helper'; +import { selectedFiltersSelector } from '../state/selectors'; +import { setSelectedFilters } from '../state/actions/selected_filters'; export type GetUrlParams = () => UptimeUrlParams; export type UpdateUrlParams = (updatedParams: { @@ -27,9 +31,35 @@ export const useGetUrlParams: GetUrlParams = () => { return getSupportedUrlParams(params); }; +const getMapFromFilters = (value: any): Map | undefined => { + try { + return new Map(JSON.parse(value)); + } catch { + return undefined; + } +}; + +const mapMapToObject = (map: Map) => ({ + locations: map.get('observer.geo.name') ?? [], + ports: map.get('url.port') ?? [], + schemes: map.get('monitor.type') ?? [], + tags: map.get('tags') ?? [], +}); + export const useUrlParams: UptimeUrlParamsHook = () => { const location = useLocation(); const history = useHistory(); + const dispatch = useDispatch(); + const selectedFilters = useSelector(selectedFiltersSelector); + const { filters } = useGetUrlParams(); + useEffect(() => { + if (selectedFilters === null) { + const filterMap = getMapFromFilters(filters); + if (filterMap) { + dispatch(setSelectedFilters(mapMapToObject(filterMap))); + } + } + }, [dispatch, filters, selectedFilters]); const updateUrlParams: UpdateUrlParams = (updatedParams) => { if (!history || !location) return; @@ -57,6 +87,12 @@ export const useUrlParams: UptimeUrlParamsHook = () => { { sort: false } ), }); + const filterMap = getMapFromFilters(mergedParams.filters); + if (!filterMap) { + dispatch(setSelectedFilters(null)); + } else { + dispatch(setSelectedFilters(mapMapToObject(filterMap))); + } }; return [useGetUrlParams, updateUrlParams]; diff --git a/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx b/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx index c83a04e4e9939..3a940b4655b19 100644 --- a/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx +++ b/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx @@ -9,7 +9,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { get } from 'lodash'; import { i18n as i18nFormatter } from '@kbn/i18n'; -import { alertTypeInitializers } from '../../alert_types'; import { UptimeApp, UptimeAppProps } from '../../../uptime_app'; import { getIntegratedAppAvailability } from './capabilities_adapter'; import { @@ -34,18 +33,6 @@ export const getKibanaFrameworkAdapter = ( i18n, } = core; - const { - data: { autocomplete }, - triggers_actions_ui, - } = plugins; - - alertTypeInitializers.forEach((init) => { - const alertInitializer = init({ autocomplete }); - if (!triggers_actions_ui.alertTypeRegistry.has(alertInitializer.id)) { - triggers_actions_ui.alertTypeRegistry.register(init({ autocomplete })); - } - }); - const { apm, infrastructure, logs } = getIntegratedAppAvailability( capabilities, INTEGRATED_SOLUTIONS diff --git a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts index 098a999b0d89c..7ca5e7438d28a 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts +++ b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts @@ -33,6 +33,24 @@ describe('monitor status alert type', () => { `); }); + it('accepts original alert params', () => { + expect( + validate({ + locations: ['fairbanks'], + numTimes: 3, + timerange: { + from: 'now-15m', + to: 'now', + }, + filters: '{foo: "bar"}', + }) + ).toMatchInlineSnapshot(` + Object { + "errors": Object {}, + } + `); + }); + describe('timerange', () => { it('has invalid timerangeCount value', () => { expect(validate({ ...params, timerangeCount: 0 })).toMatchInlineSnapshot(` @@ -96,7 +114,22 @@ describe('monitor status alert type', () => { }); describe('initMonitorStatusAlertType', () => { - expect(initMonitorStatusAlertType({ autocomplete: {} })).toMatchInlineSnapshot(` + expect( + initMonitorStatusAlertType({ + store: { + dispatch: jest.fn(), + getState: jest.fn(), + replaceReducer: jest.fn(), + subscribe: jest.fn(), + [Symbol.observable]: jest.fn(), + }, + // @ts-ignore we don't need to test this functionality here because + // it's not used by the code this file tests + core: {}, + // @ts-ignore + plugins: {}, + }) + ).toMatchInlineSnapshot(` Object { "alertParamsExpression": [Function], "defaultActionMessage": "{{context.message}} @@ -104,8 +137,20 @@ describe('monitor status alert type', () => { {{context.downMonitorsWithGeo}}", "iconClass": "uptimeApp", "id": "xpack.uptime.alerts.monitorStatus", - "name": , - "requiresAppContext": true, + "name": + + , + "requiresAppContext": false, "validate": [Function], } `); diff --git a/x-pack/plugins/uptime/public/lib/alert_types/index.ts b/x-pack/plugins/uptime/public/lib/alert_types/index.ts index 9a0151e95748c..f2f72311d2262 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/index.ts +++ b/x-pack/plugins/uptime/public/lib/alert_types/index.ts @@ -4,11 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { CoreStart } from 'kibana/public'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; import { initMonitorStatusAlertType } from './monitor_status'; import { initTlsAlertType } from './tls'; +import { ClientPluginsStart } from '../../apps/plugin'; -export type AlertTypeInitializer = (dependenies: { autocomplete: any }) => AlertTypeModel; +export type AlertTypeInitializer = (dependenies: { + core: CoreStart; + plugins: ClientPluginsStart; +}) => AlertTypeModel; export const alertTypeInitializers: AlertTypeInitializer[] = [ initMonitorStatusAlertType, diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx index a39317f8db1ed..9906519865bdc 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx @@ -4,24 +4,33 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Provider as ReduxProvider } from 'react-redux'; import React from 'react'; import { isRight } from 'fp-ts/lib/Either'; import { PathReporter } from 'io-ts/lib/PathReporter'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; import { AlertTypeInitializer } from '.'; -import { AtomicStatusCheckParamsType } from '../../../common/runtime_types'; +import { AtomicStatusCheckParamsType, StatusCheckParamsType } from '../../../common/runtime_types'; import { MonitorStatusTitle } from './monitor_status_title'; import { CLIENT_ALERT_TYPES } from '../../../common/constants'; import { MonitorStatusTranslations } from './translations'; +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; +import { store } from '../../state'; export const validate = (alertParams: unknown) => { const errors: Record = {}; const decoded = AtomicStatusCheckParamsType.decode(alertParams); + const oldDecoded = StatusCheckParamsType.decode(alertParams); - if (!isRight(decoded)) { - errors.typeCheckFailure = 'Provided parameters do not conform to the expected type.'; - errors.typeCheckParsingMessage = PathReporter.report(decoded); - } else { + if (!isRight(decoded) && !isRight(oldDecoded)) { + return { + errors: { + typeCheckFailure: 'Provided parameters do not conform to the expected type.', + typeCheckParsingMessage: PathReporter.report(decoded), + }, + }; + } + if (isRight(decoded)) { const { numTimes, timerangeCount } = decoded.right; if (numTimes < 1) { errors.invalidNumTimes = 'Number of alert check down times must be an integer greater than 0'; @@ -44,15 +53,26 @@ const AlertMonitorStatus = React.lazy(() => ); export const initMonitorStatusAlertType: AlertTypeInitializer = ({ - autocomplete, + core, + plugins, }): AlertTypeModel => ({ id: CLIENT_ALERT_TYPES.MONITOR_STATUS, - name: , - iconClass: 'uptimeApp', - alertParamsExpression: (params: any) => ( - + name: ( + + + ), + iconClass: 'uptimeApp', + alertParamsExpression: (params: any) => { + return ( + + + + + + ); + }, validate, defaultActionMessage, - requiresAppContext: true, + requiresAppContext: false, }); diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx index 3fe497f9e88bc..1e2751a4ac388 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx @@ -5,30 +5,13 @@ */ import React from 'react'; -import { useSelector } from 'react-redux'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, EuiText } from '@elastic/eui'; -import { snapshotDataSelector } from '../../state/selectors'; export const MonitorStatusTitle = () => { - const { count, loading } = useSelector(snapshotDataSelector); return ( - - - {' '} - - - {!loading ? ( - - {count.total} monitors - - ) : ( - - )} - - + ); }; diff --git a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx index 15ac849fe871d..c541ea4ae1331 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx @@ -5,21 +5,30 @@ */ import React from 'react'; +import { Provider as ReduxProvider } from 'react-redux'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; import { CLIENT_ALERT_TYPES } from '../../../common/constants'; import { TlsTranslations } from './translations'; import { AlertTypeInitializer } from '.'; +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; +import { store } from '../../state'; const { name, defaultActionMessage } = TlsTranslations; - -export const initTlsAlertType: AlertTypeInitializer = (): AlertTypeModel => ({ +const TlsAlertExpression = React.lazy(() => + import('../../components/overview/alerts/alerts_containers/alert_tls') +); +export const initTlsAlertType: AlertTypeInitializer = ({ core, plugins }): AlertTypeModel => ({ id: CLIENT_ALERT_TYPES.TLS, iconClass: 'uptimeApp', - alertParamsExpression: React.lazy(() => - import('../../components/overview/alerts/alerts_containers/alert_tls') + alertParamsExpression: (_params: any) => ( + + + + + ), name, validate: () => ({ errors: {} }), defaultActionMessage, - requiresAppContext: true, + requiresAppContext: false, }); diff --git a/x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx b/x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx new file mode 100644 index 0000000000000..a68184dbdff97 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/helper/helper_with_redux.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Provider as ReduxProvider } from 'react-redux'; + +export const MountWithReduxProvider: React.FC = ({ children }) => ( + + {children} + +); diff --git a/x-pack/plugins/uptime/public/lib/helper/index.ts b/x-pack/plugins/uptime/public/lib/helper/index.ts index cf49328141b83..10663163e8fda 100644 --- a/x-pack/plugins/uptime/public/lib/helper/index.ts +++ b/x-pack/plugins/uptime/public/lib/helper/index.ts @@ -9,3 +9,4 @@ export * from './observability_integration'; export { getChartDateLabel } from './charts'; export { seriesHasDownValues } from './series_has_down_values'; export { UptimeUrlParams, getSupportedUrlParams } from './url_params'; +export { MountWithReduxProvider } from './helper_with_redux'; diff --git a/x-pack/plugins/uptime/public/lib/index.ts b/x-pack/plugins/uptime/public/lib/index.ts index 06ac06e647adc..92787737d579f 100644 --- a/x-pack/plugins/uptime/public/lib/index.ts +++ b/x-pack/plugins/uptime/public/lib/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ +export { MountWithReduxProvider } from './helper'; export { renderWithRouter, shallowWithRouter, mountWithRouter } from './helper/helper_with_router'; diff --git a/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx b/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx index c9e4eef386764..63d4c24f965d9 100644 --- a/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx +++ b/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx @@ -6,47 +6,33 @@ import React from 'react'; import { PageHeader } from '../page_header'; -import { renderWithRouter } from '../../lib'; -import { Provider } from 'react-redux'; +import { renderWithRouter, MountWithReduxProvider } from '../../lib'; describe('PageHeader', () => { it('shallow renders with the date picker', () => { const component = renderWithRouter( - + - + ); expect(component).toMatchSnapshot('page_header_with_date_picker'); }); it('shallow renders without the date picker', () => { const component = renderWithRouter( - + - + ); expect(component).toMatchSnapshot('page_header_no_date_picker'); }); it('shallow renders extra links', () => { const component = renderWithRouter( - + - + ); expect(component).toMatchSnapshot('page_header_with_extra_links'); }); }); - -const MockReduxProvider = ({ children }: { children: React.ReactElement }) => ( - - {children} - -); diff --git a/x-pack/plugins/uptime/public/state/actions/overview_filters.ts b/x-pack/plugins/uptime/public/state/actions/overview_filters.ts index dbbd01e34b4d4..8eefa701a240a 100644 --- a/x-pack/plugins/uptime/public/state/actions/overview_filters.ts +++ b/x-pack/plugins/uptime/public/state/actions/overview_filters.ts @@ -9,6 +9,7 @@ import { OverviewFilters } from '../../../common/runtime_types'; export const FETCH_OVERVIEW_FILTERS = 'FETCH_OVERVIEW_FILTERS'; export const FETCH_OVERVIEW_FILTERS_FAIL = 'FETCH_OVERVIEW_FILTERS_FAIL'; export const FETCH_OVERVIEW_FILTERS_SUCCESS = 'FETCH_OVERVIEW_FILTERS_SUCCESS'; +export const SET_OVERVIEW_FILTERS = 'SET_OVERVIEW_FILTERS'; export interface GetOverviewFiltersPayload { dateRangeStart: string; @@ -36,10 +37,16 @@ interface GetOverviewFiltersFailAction { payload: Error; } +interface SetOverviewFiltersAction { + type: typeof SET_OVERVIEW_FILTERS; + payload: OverviewFilters; +} + export type OverviewFiltersAction = | GetOverviewFiltersFetchAction | GetOverviewFiltersSuccessAction - | GetOverviewFiltersFailAction; + | GetOverviewFiltersFailAction + | SetOverviewFiltersAction; export const fetchOverviewFilters = ( payload: GetOverviewFiltersPayload @@ -59,3 +66,8 @@ export const fetchOverviewFiltersSuccess = ( type: FETCH_OVERVIEW_FILTERS_SUCCESS, payload: filters, }); + +export const setOverviewFilters = (filters: OverviewFilters): SetOverviewFiltersAction => ({ + type: SET_OVERVIEW_FILTERS, + payload: filters, +}); diff --git a/x-pack/plugins/uptime/public/state/actions/selected_filters.ts b/x-pack/plugins/uptime/public/state/actions/selected_filters.ts new file mode 100644 index 0000000000000..11c159b09a157 --- /dev/null +++ b/x-pack/plugins/uptime/public/state/actions/selected_filters.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { createAction } from 'redux-actions'; + +export interface SelectedFilters { + locations: string[]; + ports: number[]; + schemes: string[]; + tags: string[]; +} + +export type SelectedFiltersPayload = SelectedFilters; + +export const getSelectedFilters = createAction('GET SELECTED FILTERS'); +export const setSelectedFilters = createAction( + 'SET_SELECTED_FILTERS' +); diff --git a/x-pack/plugins/uptime/public/state/index.ts b/x-pack/plugins/uptime/public/state/index.ts index e3563c74294d2..1f4ce7103afbc 100644 --- a/x-pack/plugins/uptime/public/state/index.ts +++ b/x-pack/plugins/uptime/public/state/index.ts @@ -9,12 +9,12 @@ import createSagaMiddleware from 'redux-saga'; import { rootEffect } from './effects'; import { rootReducer } from './reducers'; +export type AppState = ReturnType; + const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const sagaMW = createSagaMiddleware(); export const store = createStore(rootReducer, composeEnhancers(applyMiddleware(sagaMW))); -export type AppState = ReturnType; - sagaMW.run(rootEffect); diff --git a/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts b/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts index 3b8447ec2d713..4683c654270db 100644 --- a/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts +++ b/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts @@ -4,7 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { setBasePath, toggleIntegrationsPopover, setAlertFlyoutVisible } from '../../actions'; +import { + setBasePath, + toggleIntegrationsPopover, + setAlertFlyoutVisible, + setSearchTextAction, +} from '../../actions'; import { uiReducer } from '../ui'; import { Action } from 'redux-actions'; @@ -67,4 +72,28 @@ describe('ui reducer', () => { } `); }); + + it('sets the search text', () => { + const action = setSearchTextAction('lorem ipsum') as Action; + expect( + uiReducer( + { + alertFlyoutVisible: false, + basePath: '', + esKuery: '', + integrationsPopoverOpen: null, + searchText: '', + }, + action + ) + ).toMatchInlineSnapshot(` + Object { + "alertFlyoutVisible": false, + "basePath": "", + "esKuery": "", + "integrationsPopoverOpen": null, + "searchText": "lorem ipsum", + } + `); + }); }); diff --git a/x-pack/plugins/uptime/public/state/reducers/index.ts b/x-pack/plugins/uptime/public/state/reducers/index.ts index ead7f5b46431b..c05c740ab8ebf 100644 --- a/x-pack/plugins/uptime/public/state/reducers/index.ts +++ b/x-pack/plugins/uptime/public/state/reducers/index.ts @@ -19,6 +19,7 @@ import { monitorDurationReducer } from './monitor_duration'; import { indexStatusReducer } from './index_status'; import { mlJobsReducer } from './ml_anomaly'; import { certificatesReducer } from '../certificates/certificates'; +import { selectedFiltersReducer } from './selected_filters'; export const rootReducer = combineReducers({ monitor: monitorReducer, @@ -35,4 +36,5 @@ export const rootReducer = combineReducers({ monitorDuration: monitorDurationReducer, indexStatus: indexStatusReducer, certificates: certificatesReducer, + selectedFilters: selectedFiltersReducer, }); diff --git a/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts b/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts index 0b67d8b0e7689..4548627d9dcb8 100644 --- a/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts +++ b/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts @@ -10,6 +10,7 @@ import { FETCH_OVERVIEW_FILTERS_FAIL, FETCH_OVERVIEW_FILTERS_SUCCESS, OverviewFiltersAction, + SET_OVERVIEW_FILTERS, } from '../actions'; export interface OverviewFiltersState { @@ -51,6 +52,11 @@ export function overviewFiltersReducer( errors: [...state.errors, action.payload], loading: false, }; + case SET_OVERVIEW_FILTERS: + return { + ...state, + filters: action.payload, + }; default: return state; } diff --git a/x-pack/plugins/uptime/public/state/reducers/selected_filters.ts b/x-pack/plugins/uptime/public/state/reducers/selected_filters.ts new file mode 100644 index 0000000000000..921754c93078a --- /dev/null +++ b/x-pack/plugins/uptime/public/state/reducers/selected_filters.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Action } from 'redux-actions'; +import { + getSelectedFilters, + setSelectedFilters, + SelectedFilters, +} from '../actions/selected_filters'; + +const initialState: SelectedFilters | null = null; + +export function selectedFiltersReducer( + state = initialState, + action: Action +): SelectedFilters | null { + switch (action.type) { + case String(getSelectedFilters): + return state; + case String(setSelectedFilters): + if (state === null) return { ...action.payload }; + return { + ...(state || {}), + ...action.payload, + }; + default: + return state; + } +} diff --git a/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts b/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts index 2eb0f1e8cb0ee..b1885ddeeba3f 100644 --- a/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts +++ b/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts @@ -107,6 +107,7 @@ describe('state selectors', () => { loading: false, }, }, + selectedFilters: null, }; it('selects base path from state', () => { diff --git a/x-pack/plugins/uptime/public/state/selectors/index.ts b/x-pack/plugins/uptime/public/state/selectors/index.ts index b088c346ad811..d08db2ccf5f2d 100644 --- a/x-pack/plugins/uptime/public/state/selectors/index.ts +++ b/x-pack/plugins/uptime/public/state/selectors/index.ts @@ -86,3 +86,5 @@ export const overviewFiltersSelector = ({ overviewFilters }: AppState) => overvi export const esKuerySelector = ({ ui: { esKuery } }: AppState) => esKuery; export const searchTextSelector = ({ ui: { searchText } }: AppState) => searchText; + +export const selectedFiltersSelector = ({ selectedFilters }: AppState) => selectedFilters; diff --git a/x-pack/plugins/uptime/public/uptime_app.tsx b/x-pack/plugins/uptime/public/uptime_app.tsx index cc6475d6c9d90..4208d79e761ed 100644 --- a/x-pack/plugins/uptime/public/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/uptime_app.tsx @@ -20,14 +20,13 @@ import { UptimeStartupPluginsContextProvider, } from './contexts'; import { CommonlyUsedRange } from './components/common/uptime_date_picker'; -import { store } from './state'; import { setBasePath } from './state/actions'; import { PageRouter } from './routes'; import { UptimeAlertsContextProvider, UptimeAlertsFlyoutWrapper, } from './components/overview/alerts'; -import { kibanaService } from './state/kibana_service'; +import { store } from './state'; export interface UptimeAppColors { danger: string; @@ -87,8 +86,6 @@ const Application = (props: UptimeAppProps) => { ); }, [canSave, renderGlobalHelpControls, setBadge]); - kibanaService.core = core; - store.dispatch(setBasePath(basePath)); return ( From 1e45e988e84ce4b3a944c52366ce436306c82a1f Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Mon, 8 Jun 2020 14:25:27 -0500 Subject: [PATCH 22/65] [deb/rpm] manage pid folder (#68262) * [deb/rpm] manage pid folder This adds a tmpfiles.d configuration file for systemd users, and changes the path for both systemd and sysv to /var/run/kibana/kibana.pid. pid file generation is left unmodified for a future pr. * cleanup Co-authored-by: Elastic Machine --- src/dev/build/tasks/os_packages/run_fpm.js | 6 +++--- .../systemd/usr/lib/tmpfiles.d/kibana.conf | 1 + .../service_templates/sysv/etc/init.d/kibana | 12 ++++-------- 3 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf diff --git a/src/dev/build/tasks/os_packages/run_fpm.js b/src/dev/build/tasks/os_packages/run_fpm.js index c49ff01b24086..0496bcf08fb91 100644 --- a/src/dev/build/tasks/os_packages/run_fpm.js +++ b/src/dev/build/tasks/os_packages/run_fpm.js @@ -123,9 +123,9 @@ export async function runFpm(config, log, build, type, pkgSpecificFlags) { // copy the data directory at /var/lib/kibana `${resolveWithTrailingSlash(fromBuild('data'))}=/var/lib/kibana/`, - // copy the generated pleaserun services for systemd and sysv into /etc/ - `${resolveWithTrailingSlash(__dirname, 'service_templates/sysv/etc')}=/etc/`, - `${resolveWithTrailingSlash(__dirname, 'service_templates/systemd/etc')}=/etc/`, + // copy package configurations + `${resolveWithTrailingSlash(__dirname, 'service_templates/sysv/')}=/`, + `${resolveWithTrailingSlash(__dirname, 'service_templates/systemd/')}=/`, ]; log.debug('calling fpm with args:', args); diff --git a/src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf b/src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf new file mode 100644 index 0000000000000..b5422df52fe11 --- /dev/null +++ b/src/dev/build/tasks/os_packages/service_templates/systemd/usr/lib/tmpfiles.d/kibana.conf @@ -0,0 +1 @@ +d /var/run/kibana 0755 kibana kibana - - \ No newline at end of file diff --git a/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana b/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana index ce29fd12b8e3c..d935dc6e31f80 100755 --- a/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana +++ b/src/dev/build/tasks/os_packages/service_templates/sysv/etc/init.d/kibana @@ -17,7 +17,7 @@ name=kibana program=/usr/share/kibana/bin/kibana -pidfile="/var/run/$name.pid" +pidfile="/var/run/kibana/$name.pid" [ -r /etc/default/$name ] && . /etc/default/$name [ -r /etc/sysconfig/$name ] && . /etc/sysconfig/$name @@ -37,17 +37,13 @@ emit() { } start() { - - # Ensure the log directory is setup correctly. [ ! -d "/var/log/kibana/" ] && mkdir "/var/log/kibana/" chown "$user":"$group" "/var/log/kibana/" chmod 755 "/var/log/kibana/" - - # Setup any environmental stuff beforehand - - - # Run the program! + [ ! -d "/var/run/kibana/" ] && mkdir "/var/run/kibana/" + chown "$user":"$group" "/var/run/kibana/" + chmod 755 "/var/run/kibana/" chroot --userspec "$user":"$group" "$chroot" sh -c " From f090775280a2afd1340033ab870d4c881f1d4499 Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Mon, 8 Jun 2020 15:03:41 -0600 Subject: [PATCH 23/65] Add url overflow handling to KP (#67899) --- .../core/public/kibana-plugin-core-public.md | 6 + ...ibana-plugin-core-public.url_max_length.md | 13 ++ .../application/application_service.mock.ts | 24 ++++ .../application/application_service.tsx | 1 + src/core/public/application/index.ts | 1 + src/core/public/application/types.ts | 7 + .../header/__snapshots__/header.test.tsx.snap | 76 +++++++++++ src/core/public/core_app/core_app.mock.ts | 31 +++++ src/core/public/core_app/core_app.ts | 83 ++++++++++++ .../core_app/errors/error_application.test.ts | 61 +++++++++ .../core_app/errors/error_application.tsx | 102 ++++++++++++++ src/core/public/core_app/errors/index.ts | 21 +++ .../core_app/errors/url_overflow.test.ts | 127 ++++++++++++++++++ .../public/core_app/errors/url_overflow.tsx | 96 +++++++++++++ .../core_app/errors/url_overflow_ui.tsx | 73 ++++++++++ .../public/core_app/index.ts} | 4 +- src/core/public/core_system.test.mocks.ts | 7 + src/core/public/core_system.test.ts | 23 +++- src/core/public/core_system.ts | 7 + src/core/public/index.ts | 2 + src/core/public/public.api.md | 3 + src/legacy/ui/public/_index.scss | 1 - .../error_url_overflow/__tests__/ie_regex.js | 81 ----------- .../_error_url_overflow.scss | 3 - .../ui/public/error_url_overflow/_index.scss | 1 - .../error_url_overflow.html | 55 -------- .../error_url_overflow/error_url_overflow.js | 58 -------- .../public/angular/angular_config.tsx | 77 +---------- .../kibana_legacy/public/utils/index.ts | 1 - .../public/utils/url_overflow_service.ts | 86 ------------ .../feature_geometry_filter_form.js | 6 +- .../translations/translations/ja-JP.json | 16 +-- .../translations/translations/zh-CN.json | 16 +-- 33 files changed, 774 insertions(+), 395 deletions(-) create mode 100644 docs/development/core/public/kibana-plugin-core-public.url_max_length.md create mode 100644 src/core/public/core_app/core_app.mock.ts create mode 100644 src/core/public/core_app/core_app.ts create mode 100644 src/core/public/core_app/errors/error_application.test.ts create mode 100644 src/core/public/core_app/errors/error_application.tsx create mode 100644 src/core/public/core_app/errors/index.ts create mode 100644 src/core/public/core_app/errors/url_overflow.test.ts create mode 100644 src/core/public/core_app/errors/url_overflow.tsx create mode 100644 src/core/public/core_app/errors/url_overflow_ui.tsx rename src/{legacy/ui/public/error_url_overflow/index.js => core/public/core_app/index.ts} (87%) delete mode 100644 src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js delete mode 100644 src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss delete mode 100644 src/legacy/ui/public/error_url_overflow/_index.scss delete mode 100644 src/legacy/ui/public/error_url_overflow/error_url_overflow.html delete mode 100644 src/legacy/ui/public/error_url_overflow/error_url_overflow.js delete mode 100644 src/plugins/kibana_legacy/public/utils/url_overflow_service.ts diff --git a/docs/development/core/public/kibana-plugin-core-public.md b/docs/development/core/public/kibana-plugin-core-public.md index 9e4afe0f5133c..7c7c9729504de 100644 --- a/docs/development/core/public/kibana-plugin-core-public.md +++ b/docs/development/core/public/kibana-plugin-core-public.md @@ -132,6 +132,12 @@ The plugin integrates with the core system via lifecycle events: `setup` | [URLMeaningfulParts](./kibana-plugin-core-public.urlmeaningfulparts.md) | We define our own typings because the current version of @types/node declares properties to be optional "hostname?: string". Although, parse call returns "hostname: null \| string". | | [UserProvidedValues](./kibana-plugin-core-public.userprovidedvalues.md) | Describes the values explicitly set by user. | +## Variables + +| Variable | Description | +| --- | --- | +| [URL\_MAX\_LENGTH](./kibana-plugin-core-public.url_max_length.md) | The max URL length allowed by the current browser. Should be used to display warnings to users when query parameters cause URL to exceed this limit. | + ## Type Aliases | Type Alias | Description | diff --git a/docs/development/core/public/kibana-plugin-core-public.url_max_length.md b/docs/development/core/public/kibana-plugin-core-public.url_max_length.md new file mode 100644 index 0000000000000..993320d51909a --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.url_max_length.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [URL\_MAX\_LENGTH](./kibana-plugin-core-public.url_max_length.md) + +## URL\_MAX\_LENGTH variable + +The max URL length allowed by the current browser. Should be used to display warnings to users when query parameters cause URL to exceed this limit. + +Signature: + +```typescript +URL_MAX_LENGTH: number +``` diff --git a/src/core/public/application/application_service.mock.ts b/src/core/public/application/application_service.mock.ts index 300b09e17d15d..47a8a01d917eb 100644 --- a/src/core/public/application/application_service.mock.ts +++ b/src/core/public/application/application_service.mock.ts @@ -17,6 +17,7 @@ * under the License. */ +import { History } from 'history'; import { BehaviorSubject, Subject } from 'rxjs'; import { capabilitiesServiceMock } from './capabilities/capabilities_service.mock'; @@ -57,6 +58,28 @@ const createStartContractMock = (): jest.Mocked => { }; }; +const createHistoryMock = (): jest.Mocked => { + return { + block: jest.fn(), + createHref: jest.fn(), + go: jest.fn(), + goBack: jest.fn(), + goForward: jest.fn(), + listen: jest.fn(), + push: jest.fn(), + replace: jest.fn(), + action: 'PUSH', + length: 1, + location: { + pathname: '/', + search: '', + hash: '', + key: '', + state: undefined, + }, + }; +}; + const createInternalStartContractMock = (): jest.Mocked => { const currentAppId$ = new Subject(); @@ -69,6 +92,7 @@ const createInternalStartContractMock = (): jest.Mocked currentAppId$.next(appId)), navigateToUrl: jest.fn(), registerMountContext: jest.fn(), + history: createHistoryMock(), }; }; diff --git a/src/core/public/application/application_service.tsx b/src/core/public/application/application_service.tsx index 2224f72e2bd91..850422a61bde7 100644 --- a/src/core/public/application/application_service.tsx +++ b/src/core/public/application/application_service.tsx @@ -301,6 +301,7 @@ export class ApplicationService { distinctUntilChanged(), takeUntil(this.stop$) ), + history: this.history, registerMountContext: this.mountContext.registerContext, getUrlForApp: ( appId, diff --git a/src/core/public/application/index.ts b/src/core/public/application/index.ts index d51a4c0d69d42..74356cbd88b34 100644 --- a/src/core/public/application/index.ts +++ b/src/core/public/application/index.ts @@ -43,5 +43,6 @@ export { PublicAppInfo, PublicLegacyAppInfo, // Internal types + InternalApplicationSetup, InternalApplicationStart, } from './types'; diff --git a/src/core/public/application/types.ts b/src/core/public/application/types.ts index 8006ec846138f..7c83c684ac73d 100644 --- a/src/core/public/application/types.ts +++ b/src/core/public/application/types.ts @@ -18,6 +18,7 @@ */ import { Observable } from 'rxjs'; +import { History } from 'history'; import { Capabilities } from './capabilities'; import { ChromeStart } from '../chrome'; @@ -766,6 +767,12 @@ export interface InternalApplicationStart extends Omit | undefined; } /** @internal */ diff --git a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap index b563c6d2a4ec4..305a4b2ed5b30 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap @@ -42,6 +42,25 @@ exports[`Header renders 1`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], @@ -657,6 +676,25 @@ exports[`Header renders 2`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], @@ -4741,6 +4779,25 @@ exports[`Header renders 3`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], @@ -9897,6 +9954,25 @@ exports[`Header renders 4`] = ` }, "getComponent": [MockFunction], "getUrlForApp": [MockFunction], + "history": Object { + "action": "PUSH", + "block": [MockFunction], + "createHref": [MockFunction], + "go": [MockFunction], + "goBack": [MockFunction], + "goForward": [MockFunction], + "length": 1, + "listen": [MockFunction], + "location": Object { + "hash": "", + "key": "", + "pathname": "/", + "search": "", + "state": undefined, + }, + "push": [MockFunction], + "replace": [MockFunction], + }, "navigateToApp": [MockFunction], "navigateToUrl": [MockFunction], "registerMountContext": [MockFunction], diff --git a/src/core/public/core_app/core_app.mock.ts b/src/core/public/core_app/core_app.mock.ts new file mode 100644 index 0000000000000..b0e3871a40bf5 --- /dev/null +++ b/src/core/public/core_app/core_app.mock.ts @@ -0,0 +1,31 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import { CoreApp } from './core_app'; + +type CoreAppContract = PublicMethodsOf; +const createMock = (): jest.Mocked => ({ + setup: jest.fn(), + start: jest.fn(), + stop: jest.fn(), +}); + +export const coreAppMock = { + create: createMock, +}; diff --git a/src/core/public/core_app/core_app.ts b/src/core/public/core_app/core_app.ts new file mode 100644 index 0000000000000..04d58b7c3c65c --- /dev/null +++ b/src/core/public/core_app/core_app.ts @@ -0,0 +1,83 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import { UnregisterCallback } from 'history'; +import { + InternalApplicationSetup, + InternalApplicationStart, + AppNavLinkStatus, + AppMountParameters, +} from '../application'; +import { HttpSetup, HttpStart } from '../http'; +import { CoreContext } from '../core_system'; +import { renderApp, setupUrlOverflowDetection } from './errors'; +import { NotificationsStart } from '../notifications'; +import { IUiSettingsClient } from '../ui_settings'; + +interface SetupDeps { + application: InternalApplicationSetup; + http: HttpSetup; +} + +interface StartDeps { + application: InternalApplicationStart; + http: HttpStart; + notifications: NotificationsStart; + uiSettings: IUiSettingsClient; +} + +export class CoreApp { + private stopHistoryListening?: UnregisterCallback; + + constructor(private readonly coreContext: CoreContext) {} + + public setup({ http, application }: SetupDeps) { + application.register(this.coreContext.coreId, { + id: 'error', + title: 'App Error', + navLinkStatus: AppNavLinkStatus.hidden, + mount(params: AppMountParameters) { + // Do not use an async import here in order to ensure that network failures + // cannot prevent the error UI from displaying. This UI is tiny so an async + // import here is probably not useful anyways. + return renderApp(params, { basePath: http.basePath }); + }, + }); + } + + public start({ application, http, notifications, uiSettings }: StartDeps) { + if (!application.history) { + return; + } + + this.stopHistoryListening = setupUrlOverflowDetection({ + basePath: http.basePath, + history: application.history, + toasts: notifications.toasts, + uiSettings, + }); + } + + public stop() { + if (this.stopHistoryListening) { + this.stopHistoryListening(); + this.stopHistoryListening = undefined; + } + } +} diff --git a/src/core/public/core_app/errors/error_application.test.ts b/src/core/public/core_app/errors/error_application.test.ts new file mode 100644 index 0000000000000..ec3992330008f --- /dev/null +++ b/src/core/public/core_app/errors/error_application.test.ts @@ -0,0 +1,61 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import { act } from 'react-dom/test-utils'; +import { History, createMemoryHistory } from 'history'; +import { IBasePath } from '../../http'; +import { BasePath } from '../../http/base_path'; + +import { renderApp } from './error_application'; + +describe('renderApp', () => { + let basePath: IBasePath; + let element: HTMLDivElement; + let history: History; + let unmount: any; + + beforeEach(() => { + basePath = new BasePath(); + element = document.createElement('div'); + history = createMemoryHistory(); + unmount = renderApp({ element, history } as any, { basePath }); + }); + + afterEach(() => unmount()); + + it('renders generic errors', () => { + act(() => { + history.push('/app/error'); + }); + // innerText not working in jsdom, so use innerHTML + expect(element.querySelector('.euiTitle')!.innerHTML).toMatchInlineSnapshot( + `"Application error"` + ); + }); + + it('renders urlOverflow errors', () => { + act(() => { + history.push('/app/error?errorType=urlOverflow'); + }); + expect(element.querySelector('.euiTitle')!.innerHTML).toMatchInlineSnapshot( + `"The URL for this object is too long, and we can't display it"` + ); + expect(element.innerHTML).toMatch('Things to try'); + }); +}); diff --git a/src/core/public/core_app/errors/error_application.tsx b/src/core/public/core_app/errors/error_application.tsx new file mode 100644 index 0000000000000..7124776d7086a --- /dev/null +++ b/src/core/public/core_app/errors/error_application.tsx @@ -0,0 +1,102 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import React, { ReactChild, useState, useLayoutEffect } from 'react'; +import ReactDOM from 'react-dom'; +import { History } from 'history'; +import { i18n } from '@kbn/i18n'; +import { I18nProvider } from '@kbn/i18n/react'; + +import { EuiEmptyPrompt, EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; +import { UrlOverflowUi } from './url_overflow_ui'; +import { IBasePath } from '../../http'; +import { AppMountParameters } from '../../application'; + +interface Props { + title?: string; + children?: ReactChild; +} + +const ErrorPage: React.FC = ({ title, children }) => { + title = + title ?? + i18n.translate('core.application.appRenderError.defaultTitle', { + defaultMessage: 'Application error', + }); + + return ( + + + + {title}
} + body={children} + /> + + + + ); +}; + +const ErrorApp: React.FC<{ basePath: IBasePath; history: History }> = ({ basePath, history }) => { + const [currentLocation, setCurrentLocation] = useState(history.location); + useLayoutEffect(() => { + return history.listen((location) => setCurrentLocation(location)); + }, [history]); + + const searchParams = new URLSearchParams(currentLocation.search); + const errorType = searchParams.get('errorType'); + + if (errorType === 'urlOverflow') { + return ( + + + + ); + } + + return ; +}; + +interface Deps { + basePath: IBasePath; +} + +/** + * Renders UI for displaying error messages. + * @internal + */ +export const renderApp = ({ element, history }: AppMountParameters, { basePath }: Deps) => { + ReactDOM.render( + + + , + element + ); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; diff --git a/src/core/public/core_app/errors/index.ts b/src/core/public/core_app/errors/index.ts new file mode 100644 index 0000000000000..a8da0d98b3962 --- /dev/null +++ b/src/core/public/core_app/errors/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +export { renderApp } from './error_application'; +export { setupUrlOverflowDetection, URL_MAX_LENGTH } from './url_overflow'; diff --git a/src/core/public/core_app/errors/url_overflow.test.ts b/src/core/public/core_app/errors/url_overflow.test.ts new file mode 100644 index 0000000000000..115bf53aa2a84 --- /dev/null +++ b/src/core/public/core_app/errors/url_overflow.test.ts @@ -0,0 +1,127 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import { createMemoryHistory, History } from 'history'; + +import { BasePath } from '../../http/base_path'; +import { notificationServiceMock } from '../../notifications/notifications_service.mock'; +import { uiSettingsServiceMock } from '../../ui_settings/ui_settings_service.mock'; +import { IBasePath } from '../../http'; +import { IToasts } from '../../notifications'; +import { IUiSettingsClient } from '../../ui_settings'; + +import { setupUrlOverflowDetection, URL_MAX_LENGTH, URL_WARNING_LENGTH } from './url_overflow'; + +const longUrl = '/' + 'a'.repeat(URL_MAX_LENGTH); + +describe('url overflow detection', () => { + let basePath: IBasePath; + let history: History; + let toasts: jest.Mocked; + let uiSettings: jest.Mocked; + let assignSpy: jest.SpyInstance; + let unlisten: any; + + beforeEach(() => { + basePath = new BasePath('/test-123'); + history = createMemoryHistory(); + toasts = notificationServiceMock.createStartContract().toasts; + uiSettings = uiSettingsServiceMock.createStartContract(); + + // No-op mock impl to avoid jsdom warning about navigation not being implemented + assignSpy = jest.spyOn(window.location, 'assign').mockImplementation(() => {}); + + unlisten = setupUrlOverflowDetection({ + basePath, + history, + toasts, + uiSettings, + }); + }); + + afterEach(() => { + unlisten(); + assignSpy.mockRestore(); + }); + + it('redirects to error page when URL is too long', () => { + history.push(longUrl); + expect(assignSpy).toHaveBeenCalledWith('/app/error?errorType=urlOverflow'); + }); + + it('displays a toast if URL exceeds warning threshold', () => { + const warningUrl = '/' + 'a'.repeat(URL_WARNING_LENGTH); + history.push(warningUrl); + expect(history.location.pathname).toEqual(warningUrl); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).toHaveBeenCalledWith( + expect.objectContaining({ + title: 'The URL is big and Kibana might stop working', + text: expect.any(Function), + }) + ); + + // Verify toast can be rendered correctly + const { text: mountToast } = toasts.addWarning.mock.calls[0][0] as any; + const element = document.createElement('div'); + const unmount = mountToast(element); + expect(element).toMatchInlineSnapshot(` + + `); + unmount(); + }); + + it('does not redirect or show warning if URL is not too long', () => { + history.push('/regular-length-url'); + expect(history.location.pathname).toEqual('/regular-length-url'); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).not.toHaveBeenCalled(); + }); + + it('does not redirect or show warning if state:storeInSessionStorage is set', () => { + uiSettings.get.mockReturnValue(true); + history.push(longUrl); + expect(history.location.pathname).toEqual(longUrl); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).not.toHaveBeenCalled(); + }); + + it('does not redirect or show warning if already on the error page', () => { + history.push('/app/error'); + const longQueryParam = 'a'.repeat(URL_MAX_LENGTH); + const longErrorUrl = `/app/error?q=${longQueryParam}`; + history.push(longErrorUrl); + expect(history.location.pathname).toEqual('/app/error'); + expect(history.location.search).toEqual(`?q=${longQueryParam}`); + expect(assignSpy).not.toHaveBeenCalled(); + expect(toasts.addWarning).not.toHaveBeenCalled(); + }); +}); diff --git a/src/core/public/core_app/errors/url_overflow.tsx b/src/core/public/core_app/errors/url_overflow.tsx new file mode 100644 index 0000000000000..da287a74d09ae --- /dev/null +++ b/src/core/public/core_app/errors/url_overflow.tsx @@ -0,0 +1,96 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import React from 'react'; +import { History, Location } from 'history'; + +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { mountReactNode } from '../../utils'; +import { IToasts } from '../../notifications'; +import { IBasePath } from '../../http'; +import { IUiSettingsClient } from '../../ui_settings'; + +const IE_REGEX = /(; ?MSIE |Edge\/\d|Trident\/[\d+\.]+;.*rv:*11\.\d+)/; +export const IS_IE = IE_REGEX.test(window.navigator.userAgent); +/** + * The max URL length allowed by the current browser. Should be used to display warnings to users when query parameters + * cause URL to exceed this limit. + * @public + */ +export const URL_MAX_LENGTH = IS_IE ? 2000 : 25000; +export const URL_WARNING_LENGTH = IS_IE ? 1000 : 24000; +const ERROR_ROUTE = '/app/error'; + +interface Deps { + basePath: IBasePath; + history: History; + toasts: IToasts; + uiSettings: IUiSettingsClient; +} + +export const setupUrlOverflowDetection = ({ basePath, history, toasts, uiSettings }: Deps) => + history.listen((location: Location) => { + // Bail if storeInSessionStorage is set or we're already on the error page + if ( + uiSettings.get('state:storeInSessionStorage') || + history.location.pathname.startsWith(ERROR_ROUTE) + ) { + return; + } + + const absUrl = history.createHref(location); + const absUrlLength = absUrl.length; + + if (absUrlLength > URL_MAX_LENGTH) { + const href = history.createHref({ + pathname: ERROR_ROUTE, + search: `errorType=urlOverflow`, + }); + // Force the browser to reload so that any potentially unstable state is unloaded + window.location.assign(href); + // window.location.href = href; + // window.location.reload(); + } else if (absUrlLength >= URL_WARNING_LENGTH) { + toasts.addWarning({ + title: i18n.translate('core.ui.errorUrlOverflow.bigUrlWarningNotificationTitle', { + defaultMessage: 'The URL is big and Kibana might stop working', + }), + text: mountReactNode( + state:storeInSessionStorage, + advancedSettingsLink: ( + + + + ), + }} + /> + ), + }); + } + }); diff --git a/src/core/public/core_app/errors/url_overflow_ui.tsx b/src/core/public/core_app/errors/url_overflow_ui.tsx new file mode 100644 index 0000000000000..30ee0f4ac41e5 --- /dev/null +++ b/src/core/public/core_app/errors/url_overflow_ui.tsx @@ -0,0 +1,73 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import React from 'react'; + +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiText } from '@elastic/eui'; + +import { IBasePath } from '../../http'; +import { IS_IE } from './url_overflow'; + +export const UrlOverflowUi: React.FC<{ basePath: IBasePath }> = ({ basePath }) => { + return ( + +

+ +

+ +
    +
  • + state:storeInSessionStorage, + kibanaSettingsLink: ( + + + + ), + }} + /> +
  • +
  • + +
  • + {IS_IE && ( +
  • + +
  • + )} +
+
+ ); +}; diff --git a/src/legacy/ui/public/error_url_overflow/index.js b/src/core/public/core_app/index.ts similarity index 87% rename from src/legacy/ui/public/error_url_overflow/index.js rename to src/core/public/core_app/index.ts index 06a98789349f8..9876be1575ffd 100644 --- a/src/legacy/ui/public/error_url_overflow/index.js +++ b/src/core/public/core_app/index.ts @@ -17,5 +17,5 @@ * under the License. */ -import './error_url_overflow'; -export { UrlOverflowService } from '../../../../plugins/kibana_legacy/public'; +export { CoreApp } from './core_app'; +export { URL_MAX_LENGTH } from './errors'; diff --git a/src/core/public/core_system.test.mocks.ts b/src/core/public/core_system.test.mocks.ts index 75ab6cdb628f7..b5b99418b44b4 100644 --- a/src/core/public/core_system.test.mocks.ts +++ b/src/core/public/core_system.test.mocks.ts @@ -32,6 +32,7 @@ import { docLinksServiceMock } from './doc_links/doc_links_service.mock'; import { renderingServiceMock } from './rendering/rendering_service.mock'; import { contextServiceMock } from './context/context_service.mock'; import { integrationsServiceMock } from './integrations/integrations_service.mock'; +import { coreAppMock } from './core_app/core_app.mock'; export const MockLegacyPlatformService = legacyPlatformServiceMock.create(); export const LegacyPlatformServiceConstructor = jest @@ -136,3 +137,9 @@ export const IntegrationsServiceConstructor = jest jest.doMock('./integrations', () => ({ IntegrationsService: IntegrationsServiceConstructor, })); + +export const MockCoreApp = coreAppMock.create(); +export const CoreAppConstructor = jest.fn().mockImplementation(() => MockCoreApp); +jest.doMock('./core_app', () => ({ + CoreApp: CoreAppConstructor, +})); diff --git a/src/core/public/core_system.test.ts b/src/core/public/core_system.test.ts index 2979dd7661e59..4c1993c90a2e1 100644 --- a/src/core/public/core_system.test.ts +++ b/src/core/public/core_system.test.ts @@ -44,6 +44,8 @@ import { MockContextService, IntegrationsServiceConstructor, MockIntegrationsService, + CoreAppConstructor, + MockCoreApp, } from './core_system.test.mocks'; import { CoreSystem } from './core_system'; @@ -88,6 +90,7 @@ describe('constructor', () => { expect(OverlayServiceConstructor).toHaveBeenCalledTimes(1); expect(RenderingServiceConstructor).toHaveBeenCalledTimes(1); expect(IntegrationsServiceConstructor).toHaveBeenCalledTimes(1); + expect(CoreAppConstructor).toHaveBeenCalledTimes(1); }); it('passes injectedMetadata param to InjectedMetadataService', () => { @@ -231,6 +234,11 @@ describe('#setup()', () => { await setupCore(); expect(MockIntegrationsService.setup).toHaveBeenCalledTimes(1); }); + + it('calls coreApp#setup()', async () => { + await setupCore(); + expect(MockCoreApp.setup).toHaveBeenCalledTimes(1); + }); }); describe('#start()', () => { @@ -315,10 +323,15 @@ describe('#start()', () => { }); }); - it('calls start#setup()', async () => { + it('calls integrations#start()', async () => { await startCore(); expect(MockIntegrationsService.start).toHaveBeenCalledTimes(1); }); + + it('calls coreApp#start()', async () => { + await startCore(); + expect(MockCoreApp.start).toHaveBeenCalledTimes(1); + }); }); describe('#stop()', () => { @@ -377,6 +390,14 @@ describe('#stop()', () => { expect(MockIntegrationsService.stop).toHaveBeenCalled(); }); + it('calls coreApp.stop()', () => { + const coreSystem = createCoreSystem(); + + expect(MockCoreApp.stop).not.toHaveBeenCalled(); + coreSystem.stop(); + expect(MockCoreApp.stop).toHaveBeenCalled(); + }); + it('clears the rootDomElement', async () => { const rootDomElement = document.createElement('div'); const coreSystem = createCoreSystem({ diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts index 46e1ecb83e9e4..aa52212344f4d 100644 --- a/src/core/public/core_system.ts +++ b/src/core/public/core_system.ts @@ -43,6 +43,7 @@ import { SavedObjectsService } from './saved_objects'; import { ContextService } from './context'; import { IntegrationsService } from './integrations'; import { InternalApplicationSetup, InternalApplicationStart } from './application/types'; +import { CoreApp } from './core_app'; interface Params { rootDomElement: HTMLElement; @@ -99,6 +100,7 @@ export class CoreSystem { private readonly rendering: RenderingService; private readonly context: ContextService; private readonly integrations: IntegrationsService; + private readonly coreApp: CoreApp; private readonly rootDomElement: HTMLElement; private readonly coreContext: CoreContext; @@ -142,6 +144,7 @@ export class CoreSystem { this.context = new ContextService(this.coreContext); this.plugins = new PluginsService(this.coreContext, injectedMetadata.uiPlugins); + this.coreApp = new CoreApp(this.coreContext); this.legacy = new LegacyPlatformService({ requireLegacyFiles, @@ -177,6 +180,7 @@ export class CoreSystem { ]), }); const application = this.application.setup({ context, http, injectedMetadata }); + this.coreApp.setup({ application, http }); const core: InternalCoreSetup = { application, @@ -245,6 +249,8 @@ export class CoreSystem { uiSettings, }); + this.coreApp.start({ application, http, notifications, uiSettings }); + application.registerMountContext(this.coreContext.coreId, 'core', () => ({ application: pick(application, ['capabilities', 'navigateToApp']), chrome, @@ -308,6 +314,7 @@ export class CoreSystem { public stop() { this.legacy.stop(); this.plugins.stop(); + this.coreApp.stop(); this.notifications.stop(); this.http.stop(); this.integrations.stop(); diff --git a/src/core/public/index.ts b/src/core/public/index.ts index bd275ca1d4565..40f614ebc3bea 100644 --- a/src/core/public/index.ts +++ b/src/core/public/index.ts @@ -191,6 +191,8 @@ export { export { MountPoint, UnmountCallback, PublicUiSettingsParams } from './types'; +export { URL_MAX_LENGTH } from './core_app'; + /** * Core services exposed to the `Plugin` setup lifecycle * diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 74c41d010ca8d..b44eb48b9ffa9 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -1424,6 +1424,9 @@ export type UiSettingsType = 'undefined' | 'json' | 'markdown' | 'number' | 'sel // @public export type UnmountCallback = () => void; +// @public +export const URL_MAX_LENGTH: number; + // @public export interface URLMeaningfulParts { // (undocumented) diff --git a/src/legacy/ui/public/_index.scss b/src/legacy/ui/public/_index.scss index d258ef190a100..323de2ea7d263 100644 --- a/src/legacy/ui/public/_index.scss +++ b/src/legacy/ui/public/_index.scss @@ -10,4 +10,3 @@ @import './accessibility/index'; @import './directives/index'; -@import './error_url_overflow/index'; diff --git a/src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js b/src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js deleted file mode 100644 index 3d770c13a81aa..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/__tests__/ie_regex.js +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ - -import expect from '@kbn/expect'; -import { IE_REGEX } from '../../../../../plugins/kibana_legacy/public'; - -describe('IE_REGEX', () => { - it('should detect IE 9', () => { - const userAgent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should detect IE 10', () => { - const userAgent = - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should detect IE 11', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; ' + - '.NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; rv:11.0) like Gecko'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should detect Edge', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + - '(KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586'; - expect(IE_REGEX.test(userAgent)).to.be(true); - }); - - it('should not detect Chrome on MacOS', () => { - const userAgent = - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 ' + - '(KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Chrome on Windows', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + - '(KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Safari on MacOS', () => { - const userAgent = - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 ' + - '(KHTML, like Gecko) Version/10.1.1 Safari/603.2.4'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Firefox on MacOS', () => { - const userAgent = - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:46.0) Gecko/20100101 Firefox/46.0'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); - - it('should not detect Firefox on Windows', () => { - const userAgent = - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0'; - expect(IE_REGEX.test(userAgent)).to.be(false); - }); -}); diff --git a/src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss b/src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss deleted file mode 100644 index df96d72521a5a..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/_error_url_overflow.scss +++ /dev/null @@ -1,3 +0,0 @@ -.kbnError--url-overflow-app { - padding: $euiSizeL; -} diff --git a/src/legacy/ui/public/error_url_overflow/_index.scss b/src/legacy/ui/public/error_url_overflow/_index.scss deleted file mode 100644 index 15e2f77798268..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './error_url_overflow'; diff --git a/src/legacy/ui/public/error_url_overflow/error_url_overflow.html b/src/legacy/ui/public/error_url_overflow/error_url_overflow.html deleted file mode 100644 index 643c39ffed08d..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/error_url_overflow.html +++ /dev/null @@ -1,55 +0,0 @@ -
-

- - - -

- -

- -

-

- -
    -
  1. -
  2. -
  3. -
-
-
-

- -

-
diff --git a/src/legacy/ui/public/error_url_overflow/error_url_overflow.js b/src/legacy/ui/public/error_url_overflow/error_url_overflow.js deleted file mode 100644 index 223b81fa36fde..0000000000000 --- a/src/legacy/ui/public/error_url_overflow/error_url_overflow.js +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ - -import { i18n } from '@kbn/i18n'; -import uiRoutes from '../routes'; -import { KbnUrlProvider } from '../url'; - -import template from './error_url_overflow.html'; -import { UrlOverflowService } from '../../../../plugins/kibana_legacy/public'; - -export { UrlOverflowService }; - -uiRoutes.when('/error/url-overflow', { - template, - k7Breadcrumbs: () => [ - { - text: i18n.translate('common.ui.errorUrlOverflow.breadcrumbs.errorText', { - defaultMessage: 'Error', - }), - }, - ], - controllerAs: 'controller', - controller: class OverflowController { - constructor(Private, $scope) { - const kbnUrl = Private(KbnUrlProvider); - const urlOverflow = new UrlOverflowService(); - - if (!urlOverflow.get()) { - kbnUrl.redirectPath('/'); - return; - } - - this.url = urlOverflow.get(); - this.limit = urlOverflow.failLength(); - this.advancedSettingsLabel = i18n.translate( - 'common.ui.errorUrlOverflow.howTofixError.enableOptionText.advancedSettingsLinkText', - { defaultMessage: 'advanced settings' } - ); - $scope.$on('$destroy', () => urlOverflow.clear()); - } - }, -}); diff --git a/src/plugins/kibana_legacy/public/angular/angular_config.tsx b/src/plugins/kibana_legacy/public/angular/angular_config.tsx index fcfe2bc7f86a2..25cbb0631a652 100644 --- a/src/plugins/kibana_legacy/public/angular/angular_config.tsx +++ b/src/plugins/kibana_legacy/public/angular/angular_config.tsx @@ -18,32 +18,23 @@ */ import { - auto, ICompileProvider, IHttpProvider, IHttpService, ILocationProvider, - ILocationService, IModule, IRootScopeService, } from 'angular'; import $ from 'jquery'; import { cloneDeep, forOwn, get, set } from 'lodash'; -import React, { Fragment } from 'react'; import * as Rx from 'rxjs'; import { ChromeBreadcrumb, EnvironmentMode, PackageInfo } from 'kibana/public'; import { History } from 'history'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; import { CoreStart, LegacyCoreStart } from 'kibana/public'; -import { modifyUrl } from '../../../../core/public'; -import { toMountPoint } from '../../../kibana_react/public'; -import { isSystemApiRequest, UrlOverflowService } from '../utils'; +import { isSystemApiRequest } from '../utils'; import { formatAngularHttpError, isAngularHttpError } from '../notify/lib'; -const URL_LIMIT_WARN_WITHIN = 1000; - export interface RouteConfiguration { controller?: string | ((...args: any[]) => void); redirectTo?: string; @@ -127,7 +118,6 @@ export const configureAppAngularModule = ( .run($setupBreadcrumbsAutoClear(core, isLocalAngular)) .run($setupBadgeAutoClear(core, isLocalAngular)) .run($setupHelpExtensionAutoClear(core, isLocalAngular)) - .run($setupUrlOverflowHandling(core, isLocalAngular)) .run($setupUICapabilityRedirect(core)); }; @@ -390,68 +380,3 @@ const $setupHelpExtensionAutoClear = (newPlatform: CoreStart, isLocalAngular: bo newPlatform.chrome.setHelpExtension(current.helpExtension); }); }; - -const $setupUrlOverflowHandling = (newPlatform: CoreStart, isLocalAngular: boolean) => ( - $location: ILocationService, - $rootScope: IRootScopeService, - $injector: auto.IInjectorService -) => { - const $route = $injector.has('$route') ? $injector.get('$route') : {}; - const urlOverflow = new UrlOverflowService(); - const check = () => { - if (isDummyRoute($route, isLocalAngular)) { - return; - } - // disable long url checks when storing state in session storage - if (newPlatform.uiSettings.get('state:storeInSessionStorage')) { - return; - } - - if ($location.path() === '/error/url-overflow') { - return; - } - - try { - if (urlOverflow.check($location.absUrl()) <= URL_LIMIT_WARN_WITHIN) { - newPlatform.notifications.toasts.addWarning({ - title: i18n.translate('kibana_legacy.bigUrlWarningNotificationTitle', { - defaultMessage: 'The URL is big and Kibana might stop working', - }), - text: toMountPoint( - - state:storeInSessionStorage, - advancedSettingsLink: ( - - - - ), - }} - /> - - ), - }); - } - } catch (e) { - window.location.href = modifyUrl(window.location.href, (parts: any) => { - parts.hash = '#/error/url-overflow'; - }); - // force the browser to reload to that Kibana's potentially unstable state is unloaded - window.location.reload(); - } - }; - - $rootScope.$on('$routeUpdate', check); - $rootScope.$on('$routeChangeStart', check); -}; diff --git a/src/plugins/kibana_legacy/public/utils/index.ts b/src/plugins/kibana_legacy/public/utils/index.ts index 886ae0e877c38..339079d3ac352 100644 --- a/src/plugins/kibana_legacy/public/utils/index.ts +++ b/src/plugins/kibana_legacy/public/utils/index.ts @@ -19,7 +19,6 @@ export * from './migrate_legacy_query'; export * from './system_api'; -export * from './url_overflow_service'; // @ts-ignore export { KbnAccessibleClickProvider } from './kbn_accessible_click'; // @ts-ignore diff --git a/src/plugins/kibana_legacy/public/utils/url_overflow_service.ts b/src/plugins/kibana_legacy/public/utils/url_overflow_service.ts deleted file mode 100644 index e0c0f93bf36cd..0000000000000 --- a/src/plugins/kibana_legacy/public/utils/url_overflow_service.ts +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ - -const URL_MAX_IE = 2000; -const URL_MAX_OTHERS = 25000; -export const IE_REGEX = /(; ?MSIE |Edge\/\d|Trident\/[\d+\.]+;.*rv:*11\.\d+)/; - -export class UrlOverflowService { - private readonly _ieLike: boolean; - private _val?: string | null; - private readonly _sync: () => void; - constructor() { - const key = 'error/url-overflow/url'; - const store = window.sessionStorage || { - getItem() {}, - setItem() {}, - removeItem() {}, - }; - - // FIXME: Couldn't find a way to test for browser compatibility without - // complex redirect and cookie based "feature-detection" page, so going - // with user-agent detection for now. - this._ieLike = IE_REGEX.test(window.navigator.userAgent); - - this._val = store.getItem(key); - this._sync = () => { - if (typeof this._val === 'string') { - store.setItem(key, this._val); - } else { - store.removeItem(key); - } - }; - } - - failLength() { - return this._ieLike ? URL_MAX_IE : URL_MAX_OTHERS; - } - - set(v: string) { - this._val = v; - this._sync(); - } - - get() { - return this._val; - } - - check(absUrl: string) { - if (!this.get()) { - const urlLength = absUrl.length; - const remaining = this.failLength() - urlLength; - - if (remaining > 0) { - return remaining; - } - - this.set(absUrl); - } - - throw new Error(` - The URL has gotten too big and kibana can no longer - continue. Please refresh to return to your previous state. - `); - } - - clear() { - this._val = undefined; - this._sync(); - } -} diff --git a/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js b/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js index b103fb43af97c..e1779c1afbf47 100644 --- a/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js +++ b/x-pack/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js @@ -9,18 +9,16 @@ import { EuiIcon } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; +import { URL_MAX_LENGTH } from '../../../../../../../src/core/public'; import { createSpatialFilterWithGeometry } from '../../../elasticsearch_geo_utils'; import { GEO_JSON_TYPE } from '../../../../common/constants'; import { GeometryFilterForm } from '../../../components/geometry_filter_form'; -import { UrlOverflowService } from '../../../../../../../src/plugins/kibana_legacy/public'; import rison from 'rison-node'; // over estimated and imprecise value to ensure filter has additional room for any meta keys added when filter is mapped. const META_OVERHEAD = 100; -const urlOverflow = new UrlOverflowService(); - export class FeatureGeometryFilterForm extends Component { state = { isLoading: false, @@ -82,7 +80,7 @@ export class FeatureGeometryFilterForm extends Component { // No elasticsearch support for pre-indexed shapes and geo_point spatial queries. if ( window.location.href.length + rison.encode(filter).length + META_OVERHEAD > - urlOverflow.failLength() + URL_MAX_LENGTH ) { this.setState({ errorMsg: i18n.translate('xpack.maps.tooltip.geometryFilterForm.filterTooLargeMessage', { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index aa45fd4bcb292..ba0e0ca532d90 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -138,16 +138,6 @@ "charts.controls.rangeErrorMessage": "値は{min}と{max}の間でなければなりません", "charts.controls.vislibBasicOptions.legendPositionLabel": "凡例位置", "charts.controls.vislibBasicOptions.showTooltipLabel": "ツールヒントを表示", - "common.ui.errorUrlOverflow.breadcrumbs.errorText": "エラー", - "common.ui.errorUrlOverflow.errorDescription": "とても長い URL ですね。残念なお知らせがあります。ご使用のブラウザは Kibana の超巨大 URL に対応していません。問題を避けるため、Kibana はご使用のブラウザでの URL を {urlCharacterLimit} 文字に制限します。", - "common.ui.errorUrlOverflow.errorTitle": "おっと!", - "common.ui.errorUrlOverflow.footnoteText": "脚注:パーティーサイズのキャンディバーはほんのちょこっと。パーティーサイズのロールサンドイッチは巨大。不思議なものですね。", - "common.ui.errorUrlOverflow.howTofixError.doNotUseIEText": "IE は避けましょう。他の対応ブラウザにはこの制限がありません。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText": "{kibanaSettingsLink} の {storeInSessionStorageConfig} オプションを有効にしてください。これにより URL が長くなるのを避けられますが、若干ポータビリティが損なわれます。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText.advancedSettingsLinkText": "高度な設定", - "common.ui.errorUrlOverflow.howTofixError.removeStuffFromDashboardText": "ダッシュボードからいくつか項目を取り除きましょう。これにより URL が短くなり、IE の動作が改善されます。", - "common.ui.errorUrlOverflow.howTofixErrorDescription": "これは大抵大規模で複雑なダッシュボードで起こるため、いくつかのオプションがあります。", - "common.ui.errorUrlOverflow.howTofixErrorTitle": "どうすれば良いのでしょう?", "common.ui.flotCharts.aprLabel": "4 月", "common.ui.flotCharts.augLabel": "8 月", "common.ui.flotCharts.decLabel": "12 月", @@ -2177,9 +2167,9 @@ "kbn.advancedSettings.visualization.tileMap.wmsDefaultsTitle": "デフォルトの WMS プロパティ", "visualizations.advancedSettings.visualizeEnableLabsText": "ユーザーが実験的なビジュアライゼーションを作成、表示、編集できるようになります。無効の場合、\n ユーザーは本番準備が整ったビジュアライゼーションのみを利用できます。", "visualizations.advancedSettings.visualizeEnableLabsTitle": "実験的なビジュアライゼーションを有効にする", - "kibana_legacy.bigUrlWarningNotificationMessage": "{advancedSettingsLink}で{storeInSessionStorageParam}オプションを有効にするか、オンスクリーンビジュアルを簡素化してください。", - "kibana_legacy.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高度な設定", - "kibana_legacy.bigUrlWarningNotificationTitle": "URLが大きく、Kibanaの動作が停止する可能性があります", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage": "{advancedSettingsLink}で{storeInSessionStorageParam}オプションを有効にするか、オンスクリーンビジュアルを簡素化してください。", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高度な設定", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationTitle": "URLが大きく、Kibanaの動作が停止する可能性があります", "kibana_legacy.notify.fatalError.errorStatusMessage": "エラー {errStatus} {errStatusText}: {errMessage}", "kibana_legacy.notify.fatalError.unavailableServerErrorMessage": "HTTP リクエストで接続に失敗しました。Kibana サーバーが実行されていて、ご使用のブラウザの接続が正常に動作していることを確認するか、システム管理者にお問い合わせください。", "kibana_legacy.notify.toaster.errorMessage": "エラー: {errorMessage}\n {errorStack}", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 56d373a6fcd2f..6aaf592a87e78 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -138,16 +138,6 @@ "charts.controls.rangeErrorMessage": "值必须是在 {min} 到 {max} 的范围内", "charts.controls.vislibBasicOptions.legendPositionLabel": "图例位置", "charts.controls.vislibBasicOptions.showTooltipLabel": "显示工具提示", - "common.ui.errorUrlOverflow.breadcrumbs.errorText": "错误", - "common.ui.errorUrlOverflow.errorDescription": "您的 URL 真不小。我有一些不幸的消息:您的浏览器与 Kibana 的超长 URL 不太兼容。为了避免您遇到问题,Kibana 在您的浏览器中将 URL 长度限制在 {urlCharacterLimit} 个字符。", - "common.ui.errorUrlOverflow.errorTitle": "喔哦!", - "common.ui.errorUrlOverflow.footnoteText": "脚注:聚会供应的糖果真够小的。聚会供应的小三明治真够大的。确实得让您好好想一想。", - "common.ui.errorUrlOverflow.howTofixError.doNotUseIEText": "切勿使用 IE。我们了解的所有其他受支持浏览器都没有这个限制。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText": "在 {kibanaSettingsLink} 中启用 {storeInSessionStorageConfig} 选项。这会阻止 URL 变长,但会使它们的可移植性差点。", - "common.ui.errorUrlOverflow.howTofixError.enableOptionText.advancedSettingsLinkText": "高级设置", - "common.ui.errorUrlOverflow.howTofixError.removeStuffFromDashboardText": "从您的仪表板中删除一些内容。这回减小 URL 的长度,使 IE 能够处理它。", - "common.ui.errorUrlOverflow.howTofixErrorDescription": "通常只有较大的、复杂的仪表板会发生此问题,因此您会有一些选项:", - "common.ui.errorUrlOverflow.howTofixErrorTitle": "那么,我如何解决此问题?", "common.ui.flotCharts.aprLabel": "四月", "common.ui.flotCharts.augLabel": "八月", "common.ui.flotCharts.decLabel": "十二月", @@ -2180,9 +2170,9 @@ "kbn.advancedSettings.visualization.tileMap.wmsDefaultsTitle": "默认 WMS 属性", "visualizations.advancedSettings.visualizeEnableLabsText": "允许用户创建、查看和编辑实验性可视化。如果禁用,\n 仅被视为生产就绪的可视化可供用户使用。", "visualizations.advancedSettings.visualizeEnableLabsTitle": "启用实验性可视化", - "kibana_legacy.bigUrlWarningNotificationMessage": "在{advancedSettingsLink}中启用“{storeInSessionStorageParam}”选项或简化屏幕视觉效果。", - "kibana_legacy.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高级设置", - "kibana_legacy.bigUrlWarningNotificationTitle": "URL 过长,Kibana 可能无法工作", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage": "在{advancedSettingsLink}中启用“{storeInSessionStorageParam}”选项或简化屏幕视觉效果。", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高级设置", + "core.ui.errorUrlOverflow.bigUrlWarningNotificationTitle": "URL 过长,Kibana 可能无法工作", "kibana_legacy.notify.fatalError.errorStatusMessage": "错误 {errStatus} {errStatusText}:{errMessage}", "kibana_legacy.notify.fatalError.unavailableServerErrorMessage": "HTTP 请求无法连接。请检查 Kibana 服务器是否正在运行以及您的浏览器是否具有有效的连接,或请联系您的系统管理员。", "kibana_legacy.notify.toaster.errorMessage": "错误:{errorMessage}\n {errorStack}", From de62abbd4e16d42875b27a0653f72a9d065136f4 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Mon, 8 Jun 2020 14:45:55 -0700 Subject: [PATCH 24/65] [DOCS] Fixes typo in Console docs (#68536) --- docs/dev-tools/console/console.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev-tools/console/console.asciidoc b/docs/dev-tools/console/console.asciidoc index caffef7995fbf..9f225986d5df0 100644 --- a/docs/dev-tools/console/console.asciidoc +++ b/docs/dev-tools/console/console.asciidoc @@ -44,7 +44,7 @@ curl -XGET "http://localhost:9200/_search" -d' ---------------------------------- When you paste the command into Console, {kib} automatically converts it -to Console syntax. Alternatively, if you want to want to see Console syntax in cURL, +to Console syntax. Alternatively, if you want to see Console syntax in cURL, click the action icon (image:dev-tools/console/images/wrench.png[]) and select *Copy as cURL*. [float] From 56ed61e303352f28fc4cb9a625b7ab6393cbe162 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Mon, 8 Jun 2020 14:46:26 -0700 Subject: [PATCH 25/65] [DOCS] Edits titles in Setup section for consistency (#68451) * [DOCS] Fixes titles in Setup section for consistency * [DOCS] Fixes to titles and orders of docs in Set up --- docs/settings/alert-action-settings.asciidoc | 2 +- docs/settings/apm-settings.asciidoc | 2 +- docs/settings/dev-settings.asciidoc | 4 +- docs/settings/graph-settings.asciidoc | 2 +- docs/settings/i18n-settings.asciidoc | 7 +- .../infrastructure-ui-settings.asciidoc | 4 +- docs/settings/logs-ui-settings.asciidoc | 2 +- docs/settings/ml-settings.asciidoc | 6 +- docs/settings/monitoring-settings.asciidoc | 2 +- docs/settings/reporting-settings.asciidoc | 2 +- docs/settings/security-settings.asciidoc | 2 +- docs/settings/settings-xkb.asciidoc | 4 +- docs/settings/telemetry-settings.asciidoc | 2 +- docs/setup/access.asciidoc | 4 +- docs/setup/connect-to-elasticsearch.asciidoc | 2 +- docs/setup/docker.asciidoc | 8 +- docs/setup/install.asciidoc | 10 +- docs/setup/install/brew-running.asciidoc | 4 +- docs/setup/install/deb-init.asciidoc | 3 +- docs/setup/install/deb.asciidoc | 26 ++--- docs/setup/install/rpm-init.asciidoc | 2 +- docs/setup/install/rpm.asciidoc | 22 ++--- docs/setup/install/systemd.asciidoc | 2 +- docs/setup/install/targz-running.asciidoc | 2 +- docs/setup/install/targz.asciidoc | 4 +- docs/setup/install/windows-running.asciidoc | 2 +- docs/setup/install/windows.asciidoc | 18 ++-- docs/setup/production.asciidoc | 10 +- docs/setup/secure-settings.asciidoc | 8 +- docs/setup/settings.asciidoc | 2 +- docs/setup/start-stop.asciidoc | 14 +-- docs/setup/upgrade.asciidoc | 47 +++++---- .../setup/upgrade/upgrade-migrations.asciidoc | 14 ++- docs/setup/upgrade/upgrade-standard.asciidoc | 8 +- .../configuring-monitoring.asciidoc | 10 +- .../monitoring/monitoring-kibana.asciidoc | 56 +++++------ .../monitoring/monitoring-metricbeat.asciidoc | 96 +++++++++---------- docs/user/monitoring/viewing-metrics.asciidoc | 78 +++++++-------- .../securing-communications/index.asciidoc | 8 +- docs/user/security/securing-kibana.asciidoc | 4 +- docs/user/setup.asciidoc | 6 +- 41 files changed, 255 insertions(+), 256 deletions(-) diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 547b4fdedcec6..e02c7f212277e 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[alert-action-settings-kb]] -=== Alerting and action settings in Kibana +=== Alerting and action settings in {kib} ++++ Alerting and action settings ++++ diff --git a/docs/settings/apm-settings.asciidoc b/docs/settings/apm-settings.asciidoc index b781930485243..f78b0642f7fa3 100644 --- a/docs/settings/apm-settings.asciidoc +++ b/docs/settings/apm-settings.asciidoc @@ -12,7 +12,7 @@ It is enabled by default. [float] [[apm-indices-settings-kb]] -==== APM Indices +==== APM indices // This content is reused in the APM app documentation. // Any changes made in this file will be seen there as well. diff --git a/docs/settings/dev-settings.asciidoc b/docs/settings/dev-settings.asciidoc index c43b96a8668e0..e92e9c2928793 100644 --- a/docs/settings/dev-settings.asciidoc +++ b/docs/settings/dev-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[dev-settings-kb]] -=== Development tools settings in Kibana +=== Development tools settings in {kib} ++++ Development tools settings ++++ @@ -21,7 +21,7 @@ They are enabled by default. [float] [[profiler-settings]] -==== {searchprofiler} Settings +==== {searchprofiler} settings [cols="2*<"] |=== diff --git a/docs/settings/graph-settings.asciidoc b/docs/settings/graph-settings.asciidoc index 8ccff21a26f74..a66785242c19a 100644 --- a/docs/settings/graph-settings.asciidoc +++ b/docs/settings/graph-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[graph-settings-kb]] -=== Graph settings in Kibana +=== Graph settings in {kib} ++++ Graph settings ++++ diff --git a/docs/settings/i18n-settings.asciidoc b/docs/settings/i18n-settings.asciidoc index 6d92e74f17cb2..8f498c507a8c2 100644 --- a/docs/settings/i18n-settings.asciidoc +++ b/docs/settings/i18n-settings.asciidoc @@ -1,12 +1,15 @@ [role="xpack"] [[i18n-settings-kb]] -=== i18n settings in Kibana +=== i18n settings in {kib} +++++ +i18n settings +++++ You do not need to configure any settings to run Kibana in English. [float] [[general-i18n-settings-kb]] -==== General i18n Settings +==== General i18n settings `i18n.locale`:: {kib} supports the following locales: diff --git a/docs/settings/infrastructure-ui-settings.asciidoc b/docs/settings/infrastructure-ui-settings.asciidoc index ed69c27feab72..c29ed567531d5 100644 --- a/docs/settings/infrastructure-ui-settings.asciidoc +++ b/docs/settings/infrastructure-ui-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[infrastructure-ui-settings-kb]] -=== Metrics settings in Kibana +=== Metrics settings in {kib} ++++ Metrics settings ++++ @@ -11,4 +11,4 @@ You do not need to configure any settings to use the Metrics app in {kib}. It is [[general-infra-ui-settings-kb]] ==== General Metrics settings -include::general-infra-logs-ui-settings.asciidoc[] \ No newline at end of file +include::general-infra-logs-ui-settings.asciidoc[] diff --git a/docs/settings/logs-ui-settings.asciidoc b/docs/settings/logs-ui-settings.asciidoc index 5b6dd902091ae..e7321b7f0768c 100644 --- a/docs/settings/logs-ui-settings.asciidoc +++ b/docs/settings/logs-ui-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[logs-ui-settings-kb]] -=== Logs app settings in Kibana +=== Logs settings in {kib} ++++ Logs settings ++++ diff --git a/docs/settings/ml-settings.asciidoc b/docs/settings/ml-settings.asciidoc index 83443636fa633..92d0c0b491ce7 100644 --- a/docs/settings/ml-settings.asciidoc +++ b/docs/settings/ml-settings.asciidoc @@ -1,12 +1,12 @@ [role="xpack"] [[ml-settings-kb]] -=== Machine learning settings in Kibana +=== Machine learning settings in {kib} ++++ Machine learning settings ++++ You do not need to configure any settings to use {kib} {ml-features}. They are -enabled by default. +enabled by default. [[general-ml-settings-kb]] ==== General {ml} settings @@ -26,4 +26,4 @@ enabled by default. [[advanced-ml-settings-kb]] ==== Advanced {ml} settings -Refer to <>. \ No newline at end of file +Refer to <>. diff --git a/docs/settings/monitoring-settings.asciidoc b/docs/settings/monitoring-settings.asciidoc index f180f2c3ecc97..48b5b5eb5d0c0 100644 --- a/docs/settings/monitoring-settings.asciidoc +++ b/docs/settings/monitoring-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[monitoring-settings-kb]] -=== Monitoring settings in Kibana +=== Monitoring settings in {kib} ++++ Monitoring settings ++++ diff --git a/docs/settings/reporting-settings.asciidoc b/docs/settings/reporting-settings.asciidoc index da109331ae0fb..928878fdcdb03 100644 --- a/docs/settings/reporting-settings.asciidoc +++ b/docs/settings/reporting-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[reporting-settings-kb]] -=== Reporting settings in Kibana +=== Reporting settings in {kib} ++++ Reporting settings ++++ diff --git a/docs/settings/security-settings.asciidoc b/docs/settings/security-settings.asciidoc index 8f6905d643139..4eaa4dfa55c4d 100644 --- a/docs/settings/security-settings.asciidoc +++ b/docs/settings/security-settings.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[security-settings-kb]] -=== Security settings in Kibana +=== Security settings in {kib} ++++ Security settings ++++ diff --git a/docs/settings/settings-xkb.asciidoc b/docs/settings/settings-xkb.asciidoc index f9727db838d55..4d594b4113e69 100644 --- a/docs/settings/settings-xkb.asciidoc +++ b/docs/settings/settings-xkb.asciidoc @@ -1,9 +1,9 @@ [role="xpack"] [[settings-xpack-kb]] -== {xpack} Settings in {kib} +== {xpack} settings in {kib} [subs="attributes"] ++++ -{xpack} Settings +{xpack} settings ++++ include::{asciidoc-dir}/../../shared/settings.asciidoc[] diff --git a/docs/settings/telemetry-settings.asciidoc b/docs/settings/telemetry-settings.asciidoc index 33f167b13b310..a5f5d1c44ffac 100644 --- a/docs/settings/telemetry-settings.asciidoc +++ b/docs/settings/telemetry-settings.asciidoc @@ -1,5 +1,5 @@ [[telemetry-settings-kbn]] -=== Telemetry settings in Kibana +=== Telemetry settings in {kib} ++++ Telemetry settings ++++ diff --git a/docs/setup/access.asciidoc b/docs/setup/access.asciidoc index a7374a37ddaec..49aa411e91512 100644 --- a/docs/setup/access.asciidoc +++ b/docs/setup/access.asciidoc @@ -1,5 +1,5 @@ [[access]] -== Accessing Kibana +== Access {kib} Kibana is a web application that you access through port 5601. All you need to do is point your web browser at the machine where Kibana is running and specify the port number. For example, `localhost:5601` or `http://YOURDOMAIN.com:5601`. @@ -13,7 +13,7 @@ If you still don't see any results, it's possible that you don't *have* any docu [float] [[status]] -=== Checking Kibana Status +=== Check {kib} status You can reach the Kibana server's status page by navigating to the status endpoint, for example, `localhost:5601/status`. The status page displays information about the server's resource usage and lists the installed plugins. diff --git a/docs/setup/connect-to-elasticsearch.asciidoc b/docs/setup/connect-to-elasticsearch.asciidoc index 6137e028db3fd..6d6996c2094c6 100644 --- a/docs/setup/connect-to-elasticsearch.asciidoc +++ b/docs/setup/connect-to-elasticsearch.asciidoc @@ -1,5 +1,5 @@ [[connect-to-elasticsearch]] -== Adding data +== Add data to {kib} To start working with your data in {kib}, you can: diff --git a/docs/setup/docker.asciidoc b/docs/setup/docker.asciidoc index e8029ed1bbe9b..fb4cbbada9a33 100644 --- a/docs/setup/docker.asciidoc +++ b/docs/setup/docker.asciidoc @@ -1,5 +1,5 @@ [[docker]] -== Running Kibana on Docker +=== Install Kibana with Docker Docker images for Kibana are available from the Elastic Docker registry. The base image is https://hub.docker.com/_/centos/[centos:7]. @@ -16,7 +16,7 @@ Elastic license levels. [float] [[pull-image]] -=== Pulling the image +=== Pull the image Obtaining Kibana for Docker is as simple as issuing a +docker pull+ command against the Elastic Docker registry. @@ -40,7 +40,7 @@ available under the Apache 2.0 license. To download the images, go to https://www.docker.elastic.co[www.docker.elastic.co]. [float] -=== Running Kibana on Docker for development +=== Run Kibana on Docker for development Kibana can be quickly started and connected to a local Elasticsearch container for development or testing use with the following command: -------------------------------------------- @@ -50,7 +50,7 @@ endif::[] [float] [[configuring-kibana-docker]] -=== Configuring Kibana on Docker +=== Configure Kibana on Docker The Docker images provide several methods for configuring Kibana. The conventional approach is to provide a `kibana.yml` file as described in diff --git a/docs/setup/install.asciidoc b/docs/setup/install.asciidoc index f557dd2280e4c..73036da8f1390 100644 --- a/docs/setup/install.asciidoc +++ b/docs/setup/install.asciidoc @@ -1,13 +1,13 @@ [[install]] -== Installing Kibana +== Install {kib} [float] -=== Hosted Kibana +=== Hosted {kib} If you are running our hosted Elasticsearch Service on Elastic Cloud, you access Kibana with a single click. (You can {ess-trial}[sign up for a free trial] and start exploring data in minutes.) [float] -=== Installing Kibana Yourself +=== Install {kib} yourself NOTE: Starting with version 6.0.0, Kibana only supports 64 bit operating systems. @@ -59,10 +59,12 @@ additional setup instructions. include::install/targz.asciidoc[] +include::install/windows.asciidoc[] + include::install/deb.asciidoc[] include::install/rpm.asciidoc[] -include::install/windows.asciidoc[] +include::{kib-repo-dir}/setup/docker.asciidoc[] include::install/brew.asciidoc[] diff --git a/docs/setup/install/brew-running.asciidoc b/docs/setup/install/brew-running.asciidoc index ba78dd1659d04..d73102b098ec1 100644 --- a/docs/setup/install/brew-running.asciidoc +++ b/docs/setup/install/brew-running.asciidoc @@ -1,6 +1,6 @@ -==== Running Kibana with `brew services` +==== Run {kib} with `brew services` -With Homebrew, Kibana can be started and stopped as follows: +With Homebrew, Kibana can be started and stopped as follows: [source,sh] -------------------------------------------------- diff --git a/docs/setup/install/deb-init.asciidoc b/docs/setup/install/deb-init.asciidoc index 1b92eeadd2efb..6e21b8f97cf7e 100644 --- a/docs/setup/install/deb-init.asciidoc +++ b/docs/setup/install/deb-init.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana with SysV `init` +==== Run {kib} with SysV `init` Use the `update-rc.d` command to configure Kibana to start automatically when the system boots up: @@ -18,4 +18,3 @@ sudo -i service kibana stop If Kibana fails to start for any reason, it will print the reason for failure to `STDOUT`. Log files can be found in `/var/log/kibana/`. - diff --git a/docs/setup/install/deb.asciidoc b/docs/setup/install/deb.asciidoc index 62ab661d9a66c..8193a088c8b7e 100644 --- a/docs/setup/install/deb.asciidoc +++ b/docs/setup/install/deb.asciidoc @@ -1,15 +1,15 @@ [[deb]] -=== Install Kibana with Debian Package +=== Install {kib} with Debian package The Debian package for Kibana can be <> or from our <>. It can be used to install Kibana on any Debian-based system such as Debian and Ubuntu. -This package is free to use under the Elastic license. It contains open source -and free commercial features and access to paid commercial features. -{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the -paid commercial features. See the -https://www.elastic.co/subscriptions[Subscriptions] page for information about +This package is free to use under the Elastic license. It contains open source +and free commercial features and access to paid commercial features. +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the +paid commercial features. See the +https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. The latest stable version of Kibana can be found on the @@ -17,7 +17,7 @@ link:/downloads/kibana[Download Kibana] page. Other versions can be found on the link:/downloads/past-releases[Past Releases page]. [[deb-key]] -==== Import the Elastic PGP Key +==== Import the Elastic PGP key include::key.asciidoc[] @@ -27,7 +27,7 @@ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add ------------------------- [[deb-repo]] -==== Installing from the APT repository +==== Install from the APT repository ifeval::["{release-state}"=="unreleased"] @@ -151,9 +151,9 @@ sudo dpkg -i kibana-{version}-amd64.deb <1> Compare the SHA produced by `shasum` with the https://artifacts.elastic.co/downloads/kibana/kibana-{version}-amd64.deb.sha512[published SHA]. -Alternatively, you can download the following package, which contains only -features that are available under the Apache 2.0 license: -https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-amd64.deb +Alternatively, you can download the following package, which contains only +features that are available under the Apache 2.0 license: +https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-amd64.deb endif::[] @@ -169,7 +169,7 @@ include::deb-init.asciidoc[] include::systemd.asciidoc[] [[deb-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `/etc/kibana/kibana.yml` file by default. The format of this config file is explained in @@ -205,7 +205,7 @@ locations for a Debian-based system: | The location of the data files written to disk by Kibana and its plugins | /var/lib/kibana | path.data - + | logs | Logs files location | /var/log/kibana diff --git a/docs/setup/install/rpm-init.asciidoc b/docs/setup/install/rpm-init.asciidoc index 6b3d6d49a4ead..08282635a014f 100644 --- a/docs/setup/install/rpm-init.asciidoc +++ b/docs/setup/install/rpm-init.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana with SysV `init` +==== Run {kib} with SysV `init` Use the `chkconfig` command to configure Kibana to start automatically when the system boots up: diff --git a/docs/setup/install/rpm.asciidoc b/docs/setup/install/rpm.asciidoc index 77a16e67cf2a4..c3922ffba1efa 100644 --- a/docs/setup/install/rpm.asciidoc +++ b/docs/setup/install/rpm.asciidoc @@ -1,5 +1,5 @@ [[rpm]] -=== Install Kibana with RPM +=== Install {kib} with RPM The RPM for Kibana can be <> or from our <>. It can be used to install @@ -9,11 +9,11 @@ and Oracle Enterprise. NOTE: RPM install is not supported on distributions with old versions of RPM, such as SLES 11 and CentOS 5. Please see <> instead. -This package is free to use under the Elastic license. It contains open source -and free commercial features and access to paid commercial features. -{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the -paid commercial features. See the -https://www.elastic.co/subscriptions[Subscriptions] page for information about +This package is free to use under the Elastic license. It contains open source +and free commercial features and access to paid commercial features. +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the +paid commercial features. See the +https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. The latest stable version of Kibana can be found on the @@ -21,7 +21,7 @@ link:/downloads/kibana[Download Kibana] page. Other versions can be found on the link:/downloads/past-releases[Past Releases page]. [[rpm-key]] -==== Import the Elastic PGP Key +==== Import the Elastic PGP key include::key.asciidoc[] @@ -143,9 +143,9 @@ sudo rpm --install kibana-{version}-x86_64.rpm <1> Compare the SHA produced by `shasum` with the https://artifacts.elastic.co/downloads/kibana/kibana-{version}-x86_64.rpm.sha512[published SHA]. -Alternatively, you can download the following package, which contains only +Alternatively, you can download the following package, which contains only features that are available under the Apache 2.0 license: -https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-x86_64.rpm +https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-x86_64.rpm endif::[] @@ -160,7 +160,7 @@ include::rpm-init.asciidoc[] include::systemd.asciidoc[] [[rpm-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `/etc/kibana/kibana.yml` file by default. The format of this config file is explained in @@ -196,7 +196,7 @@ locations for an RPM-based system: | The location of the data files written to disk by Kibana and its plugins | /var/lib/kibana | path.data - + | logs | Logs files location | /var/log/kibana diff --git a/docs/setup/install/systemd.asciidoc b/docs/setup/install/systemd.asciidoc index 3053972f9e384..6fcb82217affc 100644 --- a/docs/setup/install/systemd.asciidoc +++ b/docs/setup/install/systemd.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana with `systemd` +==== Run {kib} with `systemd` To configure Kibana to start automatically when the system boots up, run the following commands: diff --git a/docs/setup/install/targz-running.asciidoc b/docs/setup/install/targz-running.asciidoc index dd4fd722e127e..d3813d9811b13 100644 --- a/docs/setup/install/targz-running.asciidoc +++ b/docs/setup/install/targz-running.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana from the command line +==== Run {kib} from the command line Kibana can be started from the command line as follows: diff --git a/docs/setup/install/targz.asciidoc b/docs/setup/install/targz.asciidoc index 31970888a976b..a53360900657e 100644 --- a/docs/setup/install/targz.asciidoc +++ b/docs/setup/install/targz.asciidoc @@ -1,5 +1,5 @@ [[targz]] -=== Install {kib} from archive on Linux or MacOS +=== Install {kib} from archive on Linux or macOS Kibana is provided for Linux and Darwin as a `.tar.gz` package. These packages are the easiest formats to use when trying out Kibana. @@ -101,7 +101,7 @@ include::targz-running.asciidoc[] [[targz-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `$KIBANA_HOME/config/kibana.yml` file by default. The format of this config file is explained in diff --git a/docs/setup/install/windows-running.asciidoc b/docs/setup/install/windows-running.asciidoc index 57d756a07c13d..832284edc8f39 100644 --- a/docs/setup/install/windows-running.asciidoc +++ b/docs/setup/install/windows-running.asciidoc @@ -1,4 +1,4 @@ -==== Running Kibana from the command line +==== Run {kib} from the command line Kibana can be started from the command line as follows: diff --git a/docs/setup/install/windows.asciidoc b/docs/setup/install/windows.asciidoc index db55451f01aae..1cfbaaa0eda2f 100644 --- a/docs/setup/install/windows.asciidoc +++ b/docs/setup/install/windows.asciidoc @@ -1,13 +1,13 @@ [[windows]] -=== Install Kibana on Windows +=== Install {kib} on Windows Kibana can be installed on Windows using the `.zip` package. -This package is free to use under the Elastic license. It contains open source -and free commercial features and access to paid commercial features. -{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the -paid commercial features. See the -https://www.elastic.co/subscriptions[Subscriptions] page for information about +This package is free to use under the Elastic license. It contains open source +and free commercial features and access to paid commercial features. +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the +paid commercial features. See the +https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. The latest stable version of Kibana can be found on the @@ -39,9 +39,9 @@ terminal window, `CD` to the `$KIBANA_HOME` directory, for instance: CD c:\kibana-{version}-windows-x86_64 ---------------------------- -Alternatively, you can download the following package, which contains only +Alternatively, you can download the following package, which contains only features that are available under the Apache 2.0 license: -https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-windows-x86_64.zip +https://artifacts.elastic.co/downloads/kibana/kibana-oss-{version}-windows-x86_64.zip endif::[] @@ -49,7 +49,7 @@ endif::[] include::windows-running.asciidoc[] [[windows-configuring]] -==== Configuring Kibana via config file +==== Configure {kib} via the config file Kibana loads its configuration from the `$KIBANA_HOME/config/kibana.yml` file by default. The format of this config file is explained in diff --git a/docs/setup/production.asciidoc b/docs/setup/production.asciidoc index 19f9d64d13623..72f275e237490 100644 --- a/docs/setup/production.asciidoc +++ b/docs/setup/production.asciidoc @@ -1,5 +1,5 @@ [[production]] -== Using Kibana in a production environment +== Use {kib} in a production environment * <> * <> @@ -23,7 +23,7 @@ and an Elasticsearch client node on the same machine. For more information, see [float] [[configuring-kibana-shield]] -=== Using {stack} {security-features} +=== Use {stack} {security-features} You can use {stack} {security-features} to control what {es} data users can access through Kibana. @@ -59,13 +59,13 @@ csp.strict: true [float] [[enabling-ssl]] -=== Enabling SSL +=== Enable SSL See <>. [float] [[load-balancing-es]] -=== Load Balancing Across Multiple Elasticsearch Nodes +=== Load Balancing across multiple {es} nodes If you have multiple nodes in your Elasticsearch cluster, the easiest way to distribute Kibana requests across the nodes is to run an Elasticsearch _Coordinating only_ node on the same machine as Kibana. Elasticsearch Coordinating only nodes are essentially smart load balancers that are part of the cluster. They @@ -145,7 +145,7 @@ bin/kibana -c config/instance2.yml [float] [[high-availability]] -=== High availability across multiple Elasticsearch nodes +=== High availability across multiple {es} nodes Kibana can be configured to connect to multiple Elasticsearch nodes in the same cluster. In situations where a node becomes unavailable, Kibana will transparently connect to an available node and continue operating. Requests to available hosts will be routed in a round robin fashion. diff --git a/docs/setup/secure-settings.asciidoc b/docs/setup/secure-settings.asciidoc index a7ccd3f77405e..10380eb5d8fa4 100644 --- a/docs/setup/secure-settings.asciidoc +++ b/docs/setup/secure-settings.asciidoc @@ -9,7 +9,7 @@ NOTE: All commands here should be run as the user which will run Kibana. [float] [[creating-keystore]] -=== Creating the keystore +=== Create the keystore To create the `kibana.keystore`, use the `create` command: @@ -23,7 +23,7 @@ The file `kibana.keystore` will be created in the directory defined by the [float] [[list-settings]] -=== Listing settings in the keystore +=== List settings in the keystore A list of the settings in the keystore is available with the `list` command: @@ -34,7 +34,7 @@ bin/kibana-keystore list [float] [[add-string-to-keystore]] -=== Adding string settings +=== Add string settings Sensitive string settings, like authentication credentials for Elasticsearch can be added using the `add` command: @@ -65,7 +65,7 @@ cat /file/containing/setting/value | bin/kibana-keystore add the.setting.name.to [float] [[remove-settings]] -=== Removing settings +=== Remove settings To remove a setting from the keystore, use the `remove` command: diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 1be9d5b1ef35b..c4f5439e25489 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -1,5 +1,5 @@ [[settings]] -== Configuring {kib} +== Configure {kib} The {kib} server reads properties from the `kibana.yml` file on startup. The location of this file differs depending on how you installed {kib}. For example, diff --git a/docs/setup/start-stop.asciidoc b/docs/setup/start-stop.asciidoc index 2fcc440680f12..198bc76bbb400 100644 --- a/docs/setup/start-stop.asciidoc +++ b/docs/setup/start-stop.asciidoc @@ -1,15 +1,15 @@ [[start-stop]] -== Starting and stopping Kibana +== Start and stop {kib} -The method for starting and stopping {kib} varies depending on how you installed -it. +The method for starting and stopping {kib} varies depending on how you installed +it. [float] [[start-start-targz]] === Archive packages (`.tar.gz`) -If you installed {kib} on Linux or Darwin with a `.tar.gz` package, you can -start and stop {kib} from the command line. +If you installed {kib} on Linux or Darwin with a `.tar.gz` package, you can +start and stop {kib} from the command line. [float] include::install/targz-running.asciidoc[] @@ -18,8 +18,8 @@ include::install/targz-running.asciidoc[] [[start-stop-zip]] === Archive packages (`.zip`) -If you installed {kib} on Windows with a `.zip` package, you can -stop and start {kib} from the command line. +If you installed {kib} on Windows with a `.zip` package, you can +stop and start {kib} from the command line. [float] include::install/windows-running.asciidoc[] diff --git a/docs/setup/upgrade.asciidoc b/docs/setup/upgrade.asciidoc index 982f1167f3871..6d69b6921b612 100644 --- a/docs/setup/upgrade.asciidoc +++ b/docs/setup/upgrade.asciidoc @@ -1,15 +1,15 @@ [[upgrade]] -== Upgrading {kib} +== Upgrade {kib} Depending on the {kib} version you're upgrading from, the upgrade process to 7.0 -varies. +varies. -NOTE: {kib} upgrades automatically when starting a new version, as described in +NOTE: {kib} upgrades automatically when starting a new version, as described in <>. Although you do not need to manually back up {kib} before upgrading, we recommend -that you have a backup on hand. You can use +that you have a backup on hand. You can use <> to back up {kib} -data by targeting `.kibana*` indices. If you are using the Reporting plugin, +data by targeting `.kibana*` indices. If you are using the Reporting plugin, you can also target `.reporting*` indices. [float] @@ -23,44 +23,44 @@ Before you upgrade {kib}: * Back up your data with {es} {ref}/modules-snapshots.html[snapshots]. To roll back to an earlier version, you **must** have a backup of your data. * If you are using custom plugins, check that a compatible version is - available. -* Shut down all {kib} nodes. Running more than one {kib} version against the - same Elasticseach index is unsupported. If you upgrade while older {kib} nodes are + available. +* Shut down all {kib} nodes. Running more than one {kib} version against the + same Elasticseach index is unsupported. If you upgrade while older {kib} nodes are running, the upgrade can fail. -To identify the changes you need to make to upgrade, and to enable you to -perform an Elasticsearch rolling upgrade with no downtime, you must upgrade to +To identify the changes you need to make to upgrade, and to enable you to +perform an Elasticsearch rolling upgrade with no downtime, you must upgrade to 6.7 before you upgrade to 7.0. -For a comprehensive overview of the upgrade process, refer to +For a comprehensive overview of the upgrade process, refer to *{stack-ref}/upgrading-elastic-stack.html[Upgrading the Elastic Stack]*. [float] [[upgrade-5x-earlier]] -=== Upgrading from 5.x or earlier -{es} can read indices created in the previous major version. Before you upgrade -to 7.0.0, you must reindex or delete any indices created in 5.x or earlier. -For more information, refer to +=== Upgrade from 5.x or earlier +{es} can read indices created in the previous major version. Before you upgrade +to 7.0.0, you must reindex or delete any indices created in 5.x or earlier. +For more information, refer to {stack-ref}/upgrading-elastic-stack.html#oss-stack-upgrade[Upgrading the Elastic Stack]. -When your reindex is complete, follow the <> -instructions. +When your reindex is complete, follow the <> +instructions. [float] [[upgrade-6x]] -=== Upgrading from 6.x +=== Upgrade from 6.x -The recommended path is to upgrade to 6.8 before upgrading to 7.0. This makes it -easier to identify the required changes, and enables you to use the Upgrade +The recommended path is to upgrade to 6.8 before upgrading to 7.0. This makes it +easier to identify the required changes, and enables you to use the Upgrade Assistant to prepare for your upgrade to 7.0. -TIP: The ability to import {kib} 6.x saved searches, visualizations, and +TIP: The ability to import {kib} 6.x saved searches, visualizations, and dashboards is supported. [float] [[upgrade-67]] -=== Upgrading from 6.8 -To help you prepare for your upgrade to 7.0, 6.8 includes an https://www.elastic.co/guide/en/kibana/6.8/upgrade-assistant.html[Upgrade Assistant] +=== Upgrade from 6.8 +To help you prepare for your upgrade to 7.0, 6.8 includes an https://www.elastic.co/guide/en/kibana/6.8/upgrade-assistant.html[Upgrade Assistant] To access the assistant, go to *Management > 7.0 Upgrade Assistant*. After you have addressed any issues that were identified by the Upgrade @@ -70,4 +70,3 @@ Assistant, <>. include::upgrade/upgrade-standard.asciidoc[] include::upgrade/upgrade-migrations.asciidoc[] - diff --git a/docs/setup/upgrade/upgrade-migrations.asciidoc b/docs/setup/upgrade/upgrade-migrations.asciidoc index 81ff8344c4c5f..cbe56b9e65894 100644 --- a/docs/setup/upgrade/upgrade-migrations.asciidoc +++ b/docs/setup/upgrade/upgrade-migrations.asciidoc @@ -1,10 +1,10 @@ [[upgrade-migrations]] -=== Troubleshooting saved object migrations +=== Migrate saved objects Every time {kib} is upgraded it checks to see if all saved objects, such as dashboards, visualizations, and index patterns, are compatible with the new version. If any objects need to be updated, then the automatic saved object migration process is kicked off. -NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] -to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. +NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] +to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. [float] [[upgrade-migrations-process]] @@ -46,11 +46,9 @@ The first instance that triggers saved object migrations will run the entire pro [[upgrade-migrations-rolling-back]] ==== Rolling back to a previous version of {kib} -When rolling {kib} back to a previous version, point the `.kibana` alias to -the appropriate {kib} index. When you have the previous version running again, -delete the more recent `.kibana_N` index or indices so that future upgrades are +When rolling {kib} back to a previous version, point the `.kibana` alias to +the appropriate {kib} index. When you have the previous version running again, +delete the more recent `.kibana_N` index or indices so that future upgrades are based on the current {kib} index. You must restart {kib} to re-trigger the migration. WARNING: Rolling back to a previous {kib} version can result in saved object data loss if you had successfully upgraded and made changes to saved objects before rolling back. - - diff --git a/docs/setup/upgrade/upgrade-standard.asciidoc b/docs/setup/upgrade/upgrade-standard.asciidoc index 683383525a3bb..df38427881d65 100644 --- a/docs/setup/upgrade/upgrade-standard.asciidoc +++ b/docs/setup/upgrade/upgrade-standard.asciidoc @@ -1,8 +1,8 @@ [[upgrade-standard]] === Standard upgrade -NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] -to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. +NOTE: 6.7 includes an https://www.elastic.co/guide/en/kibana/6.7/upgrade-assistant.html[Upgrade Assistant] +to help you prepare for your upgrade to 7.0. To access the assistant, go to *Management > 7.0 Upgrade Assistant*. [IMPORTANT] =========================================== @@ -13,7 +13,7 @@ necessary remediation steps as per those instructions. =========================================== [float] -==== Upgrading using a `deb` or `rpm` package +==== Upgrade using a `deb` or `rpm` package . Stop the existing {kib} process using the appropriate command for your system. @@ -37,7 +37,7 @@ otherwise {kib} will fail to start. . Start the new {kib} process using the appropriate command for your system. [float] -==== Upgrading using a `zip` or `tar.gz` archive +==== Upgrade using a `zip` or `tar.gz` archive . Extract the `zip` or `tar.gz` archive to a new directory to be sure that you don't overwrite the `config` or `data` directories. + diff --git a/docs/user/monitoring/configuring-monitoring.asciidoc b/docs/user/monitoring/configuring-monitoring.asciidoc index 776a76b24c4ec..7bcddcac923b2 100644 --- a/docs/user/monitoring/configuring-monitoring.asciidoc +++ b/docs/user/monitoring/configuring-monitoring.asciidoc @@ -1,20 +1,20 @@ [role="xpack"] [[configuring-monitoring]] -== Configuring monitoring in {kib} +== Configure monitoring in {kib} ++++ -Configuring monitoring +Configure monitoring ++++ -If you enable the {monitor-features} in your cluster, there are two methods to +If you enable the {monitor-features} in your cluster, there are two methods to collect metrics about {kib}: * <> * <> -You can also use {kib} to +You can also use {kib} to <>. -To learn about monitoring in general, see +To learn about monitoring in general, see {ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. include::monitoring-metricbeat.asciidoc[] diff --git a/docs/user/monitoring/monitoring-kibana.asciidoc b/docs/user/monitoring/monitoring-kibana.asciidoc index bb619ac79e143..ba55e2d16c150 100644 --- a/docs/user/monitoring/monitoring-kibana.asciidoc +++ b/docs/user/monitoring/monitoring-kibana.asciidoc @@ -1,45 +1,45 @@ [role="xpack"] [[monitoring-kibana]] -=== Collecting monitoring data using legacy collectors +=== Collect monitoring data using legacy collectors ++++ Legacy collection methods ++++ -If you enable the Elastic {monitor-features} in your cluster, you can -optionally collect metrics about {kib}. +If you enable the Elastic {monitor-features} in your cluster, you can +optionally collect metrics about {kib}. -The following method involves sending the metrics to the production cluster, -which ultimately routes them to the monitoring cluster. For the recommended -method, see <>. +The following method involves sending the metrics to the production cluster, +which ultimately routes them to the monitoring cluster. For the recommended +method, see <>. -To learn about monitoring in general, see -{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. +To learn about monitoring in general, see +{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. . Set the `xpack.monitoring.collection.enabled` setting to `true` on each -node in the production cluster. By default, it is is disabled (`false`). -+ +node in the production cluster. By default, it is is disabled (`false`). ++ -- -NOTE: You can specify this setting in either the `elasticsearch.yml` on each -node or across the cluster as a dynamic cluster setting. If {es} -{security-features} are enabled, you must have `monitor` cluster privileges to +NOTE: You can specify this setting in either the `elasticsearch.yml` on each +node or across the cluster as a dynamic cluster setting. If {es} +{security-features} are enabled, you must have `monitor` cluster privileges to view the cluster settings and `manage` cluster privileges to change them. -- ** To update the cluster settings in {kib}: -... Open {kib} in your web browser. +... Open {kib} in your web browser. + -- -By default, if you are running {kib} locally, go to `http://localhost:5601/`. +By default, if you are running {kib} locally, go to `http://localhost:5601/`. -If {es} {security-features} are enabled, log in. +If {es} {security-features} are enabled, log in. -- ... In the side navigation, click *Stack Monitoring*. If data collection is -disabled, you are prompted to turn it on. +disabled, you are prompted to turn it on. -** From the Console or command line, set `xpack.monitoring.collection.enabled` +** From the Console or command line, set `xpack.monitoring.collection.enabled` to `true` on the production cluster. + + -- @@ -57,13 +57,13 @@ PUT _cluster/settings } ---------------------------------- -For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] +For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] and {ref}/cluster-update-settings.html[Cluster update settings]. -- . Verify that `monitoring.enabled` and -`monitoring.kibana.collection.enabled` are set to `true` in the -`kibana.yml` file. These are the default values. For +`monitoring.kibana.collection.enabled` are set to `true` in the +`kibana.yml` file. These are the default values. For more information, see <>. . Identify where to send monitoring data. {kib} automatically @@ -72,13 +72,13 @@ in the `kibana.yml` file. This property has a default value of `http://localhost:9200`. + + -- -[TIP] +[TIP] =============================== -In production environments, we strongly recommend using a separate cluster -(referred to as the _monitoring cluster_) to store the data. Using a separate -monitoring cluster prevents production cluster outages from impacting your -ability to access your monitoring data. It also prevents monitoring activities -from impacting the performance of your production cluster. +In production environments, we strongly recommend using a separate cluster +(referred to as the _monitoring cluster_) to store the data. Using a separate +monitoring cluster prevents production cluster outages from impacting your +ability to access your monitoring data. It also prevents monitoring activities +from impacting the performance of your production cluster. If {security} is enabled on the production cluster, use an HTTPS URL such as `https://:9200` in this setting. @@ -97,4 +97,4 @@ used when {kib} sends monitoring data to the production cluster. . <>. -. <>. +. <>. diff --git a/docs/user/monitoring/monitoring-metricbeat.asciidoc b/docs/user/monitoring/monitoring-metricbeat.asciidoc index 61aeaf21d3a4b..f2b32ba1de5dd 100644 --- a/docs/user/monitoring/monitoring-metricbeat.asciidoc +++ b/docs/user/monitoring/monitoring-metricbeat.asciidoc @@ -1,19 +1,19 @@ [role="xpack"] [[monitoring-metricbeat]] -=== Collecting {kib} monitoring data with {metricbeat} +=== Collect {kib} monitoring data with {metricbeat} [subs="attributes"] ++++ -Collecting monitoring data with {metricbeat} +Collect monitoring data with {metricbeat} ++++ -In 6.4 and later, you can use {metricbeat} to collect data about {kib} -and ship it to the monitoring cluster, rather than routing it through the -production cluster as described in <>. +In 6.4 and later, you can use {metricbeat} to collect data about {kib} +and ship it to the monitoring cluster, rather than routing it through the +production cluster as described in <>. image::user/monitoring/images/metricbeat.png[Example monitoring architecture] -To learn about monitoring in general, see -{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. +To learn about monitoring in general, see +{ref}/monitor-elasticsearch-cluster.html[Monitor a cluster]. //NOTE: The tagged regions are re-used in the Stack Overview. @@ -21,46 +21,46 @@ To learn about monitoring in general, see + -- // tag::disable-kibana-collection[] -Add the following setting in the {kib} configuration file (`kibana.yml`): +Add the following setting in the {kib} configuration file (`kibana.yml`): [source,yaml] ---------------------------------- monitoring.kibana.collection.enabled: false ---------------------------------- -Leave the `monitoring.enabled` set to its default value (`true`). +Leave the `monitoring.enabled` set to its default value (`true`). // end::disable-kibana-collection[] -For more information, see +For more information, see <>. -- . <>. -. Set the `xpack.monitoring.collection.enabled` setting to `true` on +. Set the `xpack.monitoring.collection.enabled` setting to `true` on each node in the production cluster. By default, it is disabled (`false`). + -- -NOTE: You can specify this setting in either the `elasticsearch.yml` on each -node or across the cluster as a dynamic cluster setting. If {es} -{security-features} are enabled, you must have `monitor` cluster privileges to +NOTE: You can specify this setting in either the `elasticsearch.yml` on each +node or across the cluster as a dynamic cluster setting. If {es} +{security-features} are enabled, you must have `monitor` cluster privileges to view the cluster settings and `manage` cluster privileges to change them. -- ** In {kib}: -... Open {kib} in your web browser. +... Open {kib} in your web browser. + -- -If you are running {kib} locally, go to `http://localhost:5601/`. +If you are running {kib} locally, go to `http://localhost:5601/`. -If the Elastic {security-features} are enabled, log in. +If the Elastic {security-features} are enabled, log in. -- ... In the side navigation, click *Stack Monitoring*. If data collection is -disabled, you are prompted to turn it on. +disabled, you are prompted to turn it on. -** From the Console or command line, set `xpack.monitoring.collection.enabled` +** From the Console or command line, set `xpack.monitoring.collection.enabled` to `true` on the production cluster. + + -- @@ -78,7 +78,7 @@ PUT _cluster/settings } ---------------------------------- -For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] +For more information, see {ref}/monitoring-settings.html[Monitoring settings in {es}] and {ref}/cluster-update-settings.html[Cluster update settings]. -- @@ -89,7 +89,7 @@ same server as {kib}. + -- // tag::enable-kibana-module[] -For example, to enable the default configuration in the `modules.d` directory, +For example, to enable the default configuration in the `modules.d` directory, run the following command: ["source","sh",subs="attributes,callouts"] @@ -97,9 +97,9 @@ run the following command: metricbeat modules enable kibana-xpack ---------------------------------------------------------------------- -For more information, see -{metricbeat-ref}/configuration-metricbeat.html[Specify which modules to run] and -{metricbeat-ref}/metricbeat-module-kibana.html[{kib} module]. +For more information, see +{metricbeat-ref}/configuration-metricbeat.html[Specify which modules to run] and +{metricbeat-ref}/metricbeat-module-kibana.html[{kib} module]. // end::enable-kibana-module[] -- @@ -130,15 +130,15 @@ access it via HTTPS. For example, use a `hosts` setting like // end::configure-kibana-module[] // tag::remote-monitoring-user[] -If the Elastic {security-features} are enabled, you must also provide a user -ID and password so that {metricbeat} can collect metrics successfully: +If the Elastic {security-features} are enabled, you must also provide a user +ID and password so that {metricbeat} can collect metrics successfully: -.. Create a user on the production cluster that has the -`remote_monitoring_collector` {ref}/built-in-roles.html[built-in role]. -Alternatively, use the `remote_monitoring_user` +.. Create a user on the production cluster that has the +`remote_monitoring_collector` {ref}/built-in-roles.html[built-in role]. +Alternatively, use the `remote_monitoring_user` {ref}/built-in-users.html[built-in user]. -.. Add the `username` and `password` settings to the {kib} module configuration +.. Add the `username` and `password` settings to the {kib} module configuration file. // end::remote-monitoring-user[] -- @@ -156,19 +156,19 @@ the following command: ---------------------------------------------------------------------- metricbeat modules disable system ---------------------------------------------------------------------- -// end::disable-system-module[] +// end::disable-system-module[] -- . Identify where to send the monitoring data. + + -- -TIP: In production environments, we strongly recommend using a separate cluster -(referred to as the _monitoring cluster_) to store the data. Using a separate -monitoring cluster prevents production cluster outages from impacting your -ability to access your monitoring data. It also prevents monitoring activities +TIP: In production environments, we strongly recommend using a separate cluster +(referred to as the _monitoring cluster_) to store the data. Using a separate +monitoring cluster prevents production cluster outages from impacting your +ability to access your monitoring data. It also prevents monitoring activities from impacting the performance of your production cluster. -For example, specify the {es} output information in the {metricbeat} +For example, specify the {es} output information in the {metricbeat} configuration file (`metricbeat.yml`): [source,yaml] @@ -176,13 +176,13 @@ configuration file (`metricbeat.yml`): output.elasticsearch: # Array of hosts to connect to. hosts: ["http://es-mon-1:9200", "http://es-mon2:9200"] <1> - + # Optional protocol and basic auth credentials. #protocol: "https" #username: "elastic" #password: "changeme" ---------------------------------- -<1> In this example, the data is stored on a monitoring cluster with nodes +<1> In this example, the data is stored on a monitoring cluster with nodes `es-mon-1` and `es-mon-2`. If you configured the monitoring cluster to use encrypted communications, you @@ -192,22 +192,22 @@ must access it via HTTPS. For example, use a `hosts` setting like IMPORTANT: The {es} {monitor-features} use ingest pipelines, therefore the cluster that stores the monitoring data must have at least one ingest node. -If the {es} {security-features} are enabled on the monitoring cluster, you -must provide a valid user ID and password so that {metricbeat} can send metrics -successfully: +If the {es} {security-features} are enabled on the monitoring cluster, you +must provide a valid user ID and password so that {metricbeat} can send metrics +successfully: -.. Create a user on the monitoring cluster that has the -`remote_monitoring_agent` {ref}/built-in-roles.html[built-in role]. -Alternatively, use the `remote_monitoring_user` +.. Create a user on the monitoring cluster that has the +`remote_monitoring_agent` {ref}/built-in-roles.html[built-in role]. +Alternatively, use the `remote_monitoring_user` {ref}/built-in-users.html[built-in user]. -.. Add the `username` and `password` settings to the {es} output information in +.. Add the `username` and `password` settings to the {es} output information in the {metricbeat} configuration file. -For more information about these configuration options, see +For more information about these configuration options, see {metricbeat-ref}/elasticsearch-output.html[Configure the {es} output]. -- -. {metricbeat-ref}/metricbeat-starting.html[Start {metricbeat}]. +. {metricbeat-ref}/metricbeat-starting.html[Start {metricbeat}]. -. <>. +. <>. diff --git a/docs/user/monitoring/viewing-metrics.asciidoc b/docs/user/monitoring/viewing-metrics.asciidoc index 0a5535e6e1a91..48dd2be9ee6a2 100644 --- a/docs/user/monitoring/viewing-metrics.asciidoc +++ b/docs/user/monitoring/viewing-metrics.asciidoc @@ -1,96 +1,96 @@ [role="xpack"] [[monitoring-data]] -=== Viewing monitoring data in {kib} +=== View monitoring data in {kib} ++++ -Viewing monitoring data +View monitoring data ++++ -After you collect monitoring data for one or more products in the {stack}, you -can configure {kib} to retrieve that information and display it in on the +After you collect monitoring data for one or more products in the {stack}, you +can configure {kib} to retrieve that information and display it in on the *Stack Monitoring* page. At a minimum, you must have monitoring data for the {es} production cluster. Once that data exists, {kib} can display monitoring data for other products in the cluster. -. Identify where to retrieve monitoring data from. +. Identify where to retrieve monitoring data from. + -- -The cluster that contains the monitoring data is referred to -as the _monitoring cluster_. +The cluster that contains the monitoring data is referred to +as the _monitoring cluster_. -TIP: If the monitoring data is stored on a *dedicated* monitoring cluster, it is -accessible even when the cluster you're monitoring is not. If you have at least -a gold license, you can send data from multiple clusters to the same monitoring -cluster and view them all through the same instance of {kib}. +TIP: If the monitoring data is stored on a *dedicated* monitoring cluster, it is +accessible even when the cluster you're monitoring is not. If you have at least +a gold license, you can send data from multiple clusters to the same monitoring +cluster and view them all through the same instance of {kib}. -By default, data is retrieved from the cluster specified in the +By default, data is retrieved from the cluster specified in the `elasticsearch.hosts` value in the `kibana.yml` file. If you want to retrieve it from a different cluster, set `monitoring.ui.elasticsearch.hosts`. -To learn more about typical monitoring architectures, -see {ref}/how-monitoring-works.html[How monitoring works] and +To learn more about typical monitoring architectures, +see {ref}/how-monitoring-works.html[How monitoring works] and {ref}/monitoring-production.html[Monitoring in a production environment]. -- . Verify that `monitoring.ui.enabled` is set to `true`, which is the -default value, in the `kibana.yml` file. For more information, see +default value, in the `kibana.yml` file. For more information, see <>. -. If the Elastic {security-features} are enabled on the monitoring cluster, you -must provide a user ID and password so {kib} can retrieve the data. +. If the Elastic {security-features} are enabled on the monitoring cluster, you +must provide a user ID and password so {kib} can retrieve the data. -.. Create a user that has the `monitoring_user` +.. Create a user that has the `monitoring_user` {ref}/built-in-roles.html[built-in role] on the monitoring cluster. -.. Add the `monitoring.ui.elasticsearch.username` and +.. Add the `monitoring.ui.elasticsearch.username` and `monitoring.ui.elasticsearch.password` settings in the `kibana.yml` file. If these settings are omitted, {kib} uses the `elasticsearch.username` and -`elasticsearch.password` setting values. For more +`elasticsearch.password` setting values. For more information, see {kibana-ref}/using-kibana-with-security.html[Configuring security in {kib}]. -. (Optional) Configure {kib} to encrypt communications between the {kib} server -and the monitoring cluster. See <>. +. (Optional) Configure {kib} to encrypt communications between the {kib} server +and the monitoring cluster. See <>. -. If the Elastic {security-features} are enabled on the {kib} server, only users -that have the authority to access {kib} indices and to read the monitoring indices -can use the monitoring dashboards. +. If the Elastic {security-features} are enabled on the {kib} server, only users +that have the authority to access {kib} indices and to read the monitoring indices +can use the monitoring dashboards. + -- -NOTE: These users must exist on the monitoring cluster. If you are accessing a -remote monitoring cluster, you must use credentials that are valid on both the +NOTE: These users must exist on the monitoring cluster. If you are accessing a +remote monitoring cluster, you must use credentials that are valid on both the {kib} server and the monitoring cluster. -- -.. Create users that have the `monitoring_user` and `kibana_admin` +.. Create users that have the `monitoring_user` and `kibana_admin` {ref}/built-in-roles.html[built-in roles]. -. Open {kib} in your web browser. +. Open {kib} in your web browser. + -- -By default, if you are running {kib} locally, go to `http://localhost:5601/`. +By default, if you are running {kib} locally, go to `http://localhost:5601/`. -If the Elastic {security-features} are enabled, log in. +If the Elastic {security-features} are enabled, log in. -- -. In the side navigation, click *Stack Monitoring*. +. In the side navigation, click *Stack Monitoring*. + -- -If data collection is disabled, you are prompted to turn on data collection. -If {es} {security-features} are enabled, you must have `manage` cluster -privileges to turn on data collection. +If data collection is disabled, you are prompted to turn on data collection. +If {es} {security-features} are enabled, you must have `manage` cluster +privileges to turn on data collection. -NOTE: If you are using a separate monitoring cluster, you do not need to turn on -data collection. The dashboards appear when there is data in the monitoring -cluster. +NOTE: If you are using a separate monitoring cluster, you do not need to turn on +data collection. The dashboards appear when there is data in the monitoring +cluster. -- You'll see cluster alerts that require your attention and a summary of the available monitoring metrics for {es}, Logstash, {kib}, and Beats. To view additional information, click the -Overview, Nodes, Indices, or Instances links. See <>. +Overview, Nodes, Indices, or Instances links. See <>. [role="screenshot"] image::images/monitoring-dashboard.png[Monitoring dashboard] diff --git a/docs/user/security/securing-communications/index.asciidoc b/docs/user/security/securing-communications/index.asciidoc index 3bdc59b90b3fd..0509c6b13d54a 100644 --- a/docs/user/security/securing-communications/index.asciidoc +++ b/docs/user/security/securing-communications/index.asciidoc @@ -1,7 +1,7 @@ [[configuring-tls]] -=== Encrypting communications in {kib} +=== Encrypt communications in {kib} ++++ -Encrypting communications +Encrypt communications ++++ Secure Sockets Layer (SSL) and Transport Layer Security (TLS) provide encryption for data-in-transit. While these terms are often used @@ -14,7 +14,7 @@ contains a public key and has an associated -- but separate -- private key; thes supports certificates and private keys in PEM or PKCS#12 format. [[configuring-tls-browser-kib]] -==== Encrypting traffic between the browser and {kib} +==== Encrypt traffic between the browser and {kib} NOTE: You do not need to enable the {es} {security-features} for this type of encryption. @@ -106,7 +106,7 @@ server.ssl.enabled: true After making these changes, you must always access {kib} via HTTPS. For example, https://.com. [[configuring-tls-kib-es]] -==== Encrypting traffic between {kib} and {es} +==== Encrypt traffic between {kib} and {es} NOTE: To perform this step, you must {ref}/configuring-security.html[enable the {es} {security-features}] or you must have a proxy that provides an HTTPS endpoint for {es}. diff --git a/docs/user/security/securing-kibana.asciidoc b/docs/user/security/securing-kibana.asciidoc index f4178bacb111e..33c81961fcd7b 100644 --- a/docs/user/security/securing-kibana.asciidoc +++ b/docs/user/security/securing-kibana.asciidoc @@ -1,8 +1,8 @@ [role="xpack"] [[using-kibana-with-security]] -== Configuring security in {kib} +== Configure security in {kib} ++++ -Configuring security +Configure security ++++ {kib} users have to log in when {security} is enabled on your cluster. You diff --git a/docs/user/setup.asciidoc b/docs/user/setup.asciidoc index 53e2de66c5287..31e7d157d1bc7 100644 --- a/docs/user/setup.asciidoc +++ b/docs/user/setup.asciidoc @@ -1,5 +1,5 @@ [[setup]] -= Set Up Kibana += Set up Kibana [partintro] -- @@ -48,11 +48,9 @@ the patch version. include::{kib-repo-dir}/setup/install.asciidoc[] -include::{kib-repo-dir}/setup/start-stop.asciidoc[] - include::{kib-repo-dir}/setup/settings.asciidoc[] -include::{kib-repo-dir}/setup/docker.asciidoc[] +include::{kib-repo-dir}/setup/start-stop.asciidoc[] include::{kib-repo-dir}/setup/access.asciidoc[] From e591aa99d3b581cfee11d4151816a9c79ec278c1 Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Mon, 8 Jun 2020 17:16:01 -0500 Subject: [PATCH 26/65] Add timestamp context variable (#67482) Co-authored-by: Elastic Machine --- .../metric_threshold/metric_threshold_executor.ts | 2 ++ .../register_metric_threshold_alert_type.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index a282a742d614c..00a1d97dec811 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -5,6 +5,7 @@ */ import { mapValues, first } from 'lodash'; import { i18n } from '@kbn/i18n'; +import moment from 'moment'; import { InfraDatabaseSearchResponse } from '../../adapters/framework/adapter_types'; import { createAfterKeyHandler } from '../../../utils/create_afterkey_handler'; import { getAllCompositeData } from '../../../utils/get_all_composite_data'; @@ -336,6 +337,7 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs, alertId: s group, alertState: stateToAlertMessage[nextState], reason, + timestamp: moment().toISOString(), value: mapToConditionsLookup(alertResults, (result) => result[group].currentValue), threshold: mapToConditionsLookup(criteria, (c) => c.threshold), metric: mapToConditionsLookup(criteria, (c) => c.metric), diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts index 2c98a568d16de..02d9ca3e5f0c9 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts @@ -55,6 +55,13 @@ export function registerMetricThresholdAlertType(libs: InfraBackendLibs) { } ); + const timestampActionVariableDescription = i18n.translate( + 'xpack.infra.metrics.alerting.threshold.alerting.timestampDescription', + { + defaultMessage: 'A timestamp of when the alert was detected.', + } + ); + const valueActionVariableDescription = i18n.translate( 'xpack.infra.metrics.alerting.threshold.alerting.valueActionVariableDescription', { @@ -106,6 +113,7 @@ export function registerMetricThresholdAlertType(libs: InfraBackendLibs) { { name: 'group', description: groupActionVariableDescription }, { name: 'alertState', description: alertStateActionVariableDescription }, { name: 'reason', description: reasonActionVariableDescription }, + { name: 'timestamp', description: timestampActionVariableDescription }, { name: 'value', description: valueActionVariableDescription }, { name: 'metric', description: metricActionVariableDescription }, { name: 'threshold', description: thresholdActionVariableDescription }, From b39234ce808696113d374d60bcace6a5ef281e23 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 8 Jun 2020 15:20:36 -0700 Subject: [PATCH 27/65] #68163 Make footer messaging sticky to bottom of page (#68327) Co-authored-by: Elastic Machine --- .../components/alpha_messaging.tsx | 1 + .../ingest_manager/layouts/default.tsx | 146 +++++++++--------- 2 files changed, 76 insertions(+), 71 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx index 2b80ab9f0068e..f43419fc52ef0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/alpha_messaging.tsx @@ -15,6 +15,7 @@ const Message = styled(EuiText).attrs((props) => ({ size: 's', }))` padding: ${(props) => props.theme.eui.paddingSizes.m}; + margin-top: auto; `; export const AlphaMessaging: React.FC<{}> = () => { diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx index 72b12260a1a12..978c74f72d7aa 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx @@ -20,6 +20,8 @@ interface Props { const Container = styled.div` min-height: calc(100vh - ${(props) => props.theme.eui.euiHeaderChildSize}); background: ${(props) => props.theme.eui.euiColorEmptyShade}; + display: flex; + flex-direction: column; `; const Nav = styled.nav` @@ -52,85 +54,87 @@ export const DefaultLayout: React.FunctionComponent = ({ /> )} - + {children} +
From ab226f02ae12f0f8a2ec1ff5ba604569cd8d4b68 Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 8 Jun 2020 15:53:16 -0700 Subject: [PATCH 28/65] [kbn/pm] log levels (#68203) Co-authored-by: spalger --- .../kbn-dev-utils/src/tooling_log/index.ts | 2 +- .../tooling_log_collecting_writer.ts | 5 +- .../tooling_log/tooling_log_text_writer.ts | 2 +- packages/kbn-pm/dist/index.js | 100216 +++++++-------- packages/kbn-pm/package.json | 4 - packages/kbn-pm/src/cli.ts | 62 +- .../__snapshots__/bootstrap.test.ts.snap | 111 +- .../kbn-pm/src/commands/bootstrap.test.ts | 44 +- packages/kbn-pm/src/commands/bootstrap.ts | 48 +- packages/kbn-pm/src/commands/clean.ts | 11 +- packages/kbn-pm/src/commands/run.ts | 20 +- packages/kbn-pm/src/commands/watch.ts | 23 +- .../production/build_production_projects.ts | 2 +- packages/kbn-pm/src/run.test.ts | 9 +- packages/kbn-pm/src/run.ts | 47 +- .../link_project_executables.test.ts.snap | 11 - packages/kbn-pm/src/utils/child_process.ts | 47 +- .../utils/link_project_executables.test.ts | 20 +- .../src/utils/link_project_executables.ts | 5 +- packages/kbn-pm/src/utils/log.ts | 37 +- packages/kbn-pm/src/utils/project.ts | 27 +- .../kbn-pm/src/utils/project_checksums.ts | 10 +- packages/kbn-pm/src/utils/scripts.ts | 13 +- renovate.json5 | 16 - yarn.lock | 10 - 25 files changed, 50209 insertions(+), 50593 deletions(-) diff --git a/packages/kbn-dev-utils/src/tooling_log/index.ts b/packages/kbn-dev-utils/src/tooling_log/index.ts index f8009a255f010..acf944f23a816 100644 --- a/packages/kbn-dev-utils/src/tooling_log/index.ts +++ b/packages/kbn-dev-utils/src/tooling_log/index.ts @@ -19,5 +19,5 @@ export { ToolingLog } from './tooling_log'; export { ToolingLogTextWriter, ToolingLogTextWriterConfig } from './tooling_log_text_writer'; -export { pickLevelFromFlags, parseLogLevel, LogLevel } from './log_levels'; +export { pickLevelFromFlags, parseLogLevel, LogLevel, ParsedLogLevel } from './log_levels'; export { ToolingLogCollectingWriter } from './tooling_log_collecting_writer'; diff --git a/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts b/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts index 7e79077032156..fd59ebe5c46dc 100644 --- a/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts +++ b/packages/kbn-dev-utils/src/tooling_log/tooling_log_collecting_writer.ts @@ -18,13 +18,14 @@ */ import { ToolingLogTextWriter } from './tooling_log_text_writer'; +import { LogLevel } from './log_levels'; export class ToolingLogCollectingWriter extends ToolingLogTextWriter { messages: string[] = []; - constructor() { + constructor(level: LogLevel = 'verbose') { super({ - level: 'verbose', + level, writeTo: { write: (msg) => { // trim trailing new line diff --git a/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts b/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts index b8c12433a0ebb..28ccc60428ae3 100644 --- a/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts +++ b/packages/kbn-dev-utils/src/tooling_log/tooling_log_text_writer.ts @@ -47,7 +47,7 @@ export interface ToolingLogTextWriterConfig { function shouldWriteType(level: ParsedLogLevel, type: MessageTypes) { if (type === 'write') { - return true; + return level.name !== 'silent'; } return Boolean(level.flags[type === 'success' ? 'info' : type]); diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 7b233ef010653..93152ef1b71dc 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -94,7 +94,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _cli__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "run", function() { return _cli__WEBPACK_IMPORTED_MODULE_0__["run"]; }); -/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(705); +/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(697); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildProductionProjects"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); @@ -105,10 +105,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(517); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return _utils_project__WEBPACK_IMPORTED_MODULE_3__["Project"]; }); -/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(578); +/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(573); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__["copyWorkspacePackages"]; }); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(579); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(574); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjectPaths", function() { return _config__WEBPACK_IMPORTED_MODULE_5__["getProjectPaths"]; }); /* @@ -143,17 +143,17 @@ __webpack_require__.r(__webpack_exports__); "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "run", function() { return run; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(14); -/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(15); -/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(getopts__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17); +/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); +/* harmony import */ var getopts__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(getopts__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(488); /* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(689); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(34); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(500); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -181,37 +181,43 @@ __webpack_require__.r(__webpack_exports__); function help() { - const availableCommands = Object.keys(_commands__WEBPACK_IMPORTED_MODULE_4__["commands"]).map(commandName => _commands__WEBPACK_IMPORTED_MODULE_4__["commands"][commandName]).map(command => `${command.name} - ${command.description}`); - _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].write(dedent__WEBPACK_IMPORTED_MODULE_1___default.a` - usage: kbn [] + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].info(dedent__WEBPACK_IMPORTED_MODULE_0___default.a` + usage: kbn [] - By default commands are run for Kibana itself, all packages in the 'packages/' - folder and for all plugins in './plugins' and '../kibana-extra'. + By default commands are run for Kibana itself, all packages in the 'packages/' + folder and for all plugins in './plugins' and '../kibana-extra'. - Available commands: + Available commands: - ${availableCommands.join('\n ')} + ${Object.values(_commands__WEBPACK_IMPORTED_MODULE_4__["commands"]).map(command => `${command.name} - ${command.description}`).join('\n ')} - Global options: + Global options: - -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. - -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. - --oss Do not include the x-pack when running command. - --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. - --no-cache Disable the bootstrap cache - `); + -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. + -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. + --oss Do not include the x-pack when running command. + --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. + --no-cache Disable the bootstrap cache + --verbose Set log level to verbose + --debug Set log level to debug + --quiet Set log level to error + --silent Disable log output + ` + '\n'); } async function run(argv) { - // We can simplify this setup (and remove this extra handling) once Yarn + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].setLogLevel(Object(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_3__["pickLevelFromFlags"])(getopts__WEBPACK_IMPORTED_MODULE_1___default()(argv, { + boolean: ['verbose', 'debug', 'quiet', 'silent'] + }))); // We can simplify this setup (and remove this extra handling) once Yarn // starts forwarding the `--` directly to this script, see // https://github.com/yarnpkg/yarn/blob/b2d3e1a8fe45ef376b716d597cc79b38702a9320/src/cli/index.js#L174-L182 + if (argv.includes('--')) { - _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`)); + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].error(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`); process.exit(1); } - const options = getopts__WEBPACK_IMPORTED_MODULE_2___default()(argv, { + const options = getopts__WEBPACK_IMPORTED_MODULE_1___default()(argv, { alias: { e: 'exclude', h: 'help', @@ -231,7 +237,7 @@ async function run(argv) { // built version of this tool. - const rootPath = Object(path__WEBPACK_IMPORTED_MODULE_3__["resolve"])(__dirname, '../../../'); + const rootPath = Object(path__WEBPACK_IMPORTED_MODULE_2__["resolve"])(__dirname, '../../../'); const commandName = args[0]; const extraArgs = args.slice(1); const commandOptions = { @@ -242,7 +248,7 @@ async function run(argv) { const command = _commands__WEBPACK_IMPORTED_MODULE_4__["commands"][commandName]; if (command === undefined) { - _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`[${commandName}] is not a valid command, see 'kbn --help'`)); + _utils_log__WEBPACK_IMPORTED_MODULE_6__["log"].error(`[${commandName}] is not a valid command, see 'kbn --help'`); process.exit(1); } @@ -255,9872 +261,11181 @@ async function run(argv) { "use strict"; -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(4); -const stdoutColor = __webpack_require__(10).stdout; - -const template = __webpack_require__(13); - -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); - -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); -const styles = Object.create(null); +function dedent(strings) { -function applyOptions(obj, options) { - options = options || {}; + var raw = void 0; + if (typeof strings === "string") { + // dedent can be used as a plain function + raw = [strings]; + } else { + raw = strings.raw; + } - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} + // first, perform interpolation + var result = ""; + for (var i = 0; i < raw.length; i++) { + result += raw[i]. + // join lines when there is a suppressed newline + replace(/\\\n[ \t]*/g, ""). -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); + // handle escaped backticks + replace(/\\`/g, "`"); - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; + if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) { + result += arguments.length <= i + 1 ? undefined : arguments[i + 1]; + } + } - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + // now strip indentation + var lines = result.split("\n"); + var mindent = null; + lines.forEach(function (l) { + var m = l.match(/^(\s+)\S+/); + if (m) { + var indent = m[1].length; + if (!mindent) { + // this is the first indented line + mindent = indent; + } else { + mindent = Math.min(mindent, indent); + } + } + }); - chalk.template.constructor = Chalk; + if (mindent !== null) { + result = lines.map(function (l) { + return l[0] === " " ? l.slice(mindent) : l; + }).join("\n"); + } - return chalk.template; - } + // dedent eats leading and trailing whitespace too + result = result.trim(); - applyOptions(this, options); + // handle escaped newlines at the end to ensure they don't get stripped too + return result.replace(/\\n/g, "\n"); } -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; +if (true) { + module.exports = dedent; } -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); - } - }; -} -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } -}; +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } +"use strict"; - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } +const EMPTYARR = [] +const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g +const isArray = Array.isArray - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; +const parseValue = function(any) { + if (any === "") return "" + if (any === "false") return false + const maybe = Number(any) + return maybe * 0 === 0 ? maybe : any } -const proto = Object.defineProperties(() => {}, styles); - -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; - - builder._styles = _styles; - builder._empty = _empty; - - const self = this; - - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); +const parseAlias = function(aliases) { + let out = {}, + key, + alias, + prev, + len, + any, + i, + k - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); + for (key in aliases) { + any = aliases[key] + alias = out[key] = isArray(any) ? any : [any] - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + for (i = 0, len = alias.length; i < len; i++) { + prev = out[alias[i]] = [key] - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + for (k = 0; k < len; k++) { + if (i !== k) prev.push(alias[k]) + } + } + } - return builder; + return out } -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); +const parseDefault = function(aliases, defaults) { + let out = {}, + key, + alias, + value, + len, + i - if (argsLen === 0) { - return ''; - } + for (key in defaults) { + value = defaults[key] + alias = aliases[key] - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + out[key] = value - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (i = 0, len = alias.length; i < len; i++) { + out[alias[i]] = value + } + } + } - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + return out +} - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; +const parseOptions = function(aliases, options, value) { + let out = {}, + key, + alias, + len, + end, + i, + k - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } + if (options !== undefined) { + for (i = 0, len = options.length; i < len; i++) { + key = options[i] + alias = aliases[key] - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + out[key] = value - return str; + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (k = 0, end = alias.length; k < end; k++) { + out[alias[k]] = value + } + } + } + } + + return out } -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } +const write = function(out, key, value, aliases, unknown) { + let i, + prev, + alias = aliases[key], + len = alias === undefined ? -1 : alias.length - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + if (len >= 0 || unknown === undefined || unknown(key)) { + prev = out[key] - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } + if (prev === undefined) { + out[key] = value + } else { + if (isArray(prev)) { + prev.push(value) + } else { + out[key] = [prev, value] + } + } - return template(chalk, parts.join('')); + for (i = 0; i < len; i++) { + out[alias[i]] = out[key] + } + } } -Object.defineProperties(Chalk.prototype, styles); +const getopts = function(argv, opts) { + let unknown = (opts = opts || {}).unknown, + aliases = parseAlias(opts.alias), + strings = parseOptions(aliases, opts.string, ""), + values = parseDefault(aliases, opts.default), + bools = parseOptions(aliases, opts.boolean, false), + stopEarly = opts.stopEarly, + _ = [], + out = { _ }, + i = 0, + k = 0, + len = argv.length, + key, + arg, + end, + match, + value -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript + for (; i < len; i++) { + arg = argv[i] + if (arg[0] !== "-" || arg === "-") { + if (stopEarly) while (i < len) _.push(argv[i++]) + else _.push(arg) + } else if (arg === "--") { + while (++i < len) _.push(argv[i]) + } else if (arg[1] === "-") { + end = arg.indexOf("=", 2) + if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { + key = arg.slice(5, end >= 0 ? end : undefined) + value = false + } else if (end >= 0) { + key = arg.slice(2, end) + value = + bools[key] !== undefined || + (strings[key] === undefined + ? parseValue(arg.slice(end + 1)) + : arg.slice(end + 1)) + } else { + key = arg.slice(2) + value = + bools[key] !== undefined || + (len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined + ? true + : "" + : strings[key] === undefined + ? parseValue(argv[++i]) + : argv[++i]) + } + write(out, key, value, aliases, unknown) + } else { + SHORTSPLIT.lastIndex = 2 + match = SHORTSPLIT.exec(arg) + end = match.index + value = match[0] -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { + for (k = 1; k < end; k++) { + write( + out, + (key = arg[k]), + k + 1 < end + ? strings[key] === undefined || + arg.substring(k + 1, (k = end)) + value + : value === "" + ? len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined || "" + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(value) : value), + aliases, + unknown + ) + } + } + } -"use strict"; + for (key in values) if (out[key] === undefined) out[key] = values[key] + for (key in bools) if (out[key] === undefined) out[key] = false + for (key in strings) if (out[key] === undefined) out[key] = "" + return out +} -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +module.exports = getopts -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - return str.replace(matchOperatorsRe, '\\$&'); -}; +/***/ }), +/* 4 */ +/***/ (function(module, exports) { +module.exports = require("path"); /***/ }), -/* 4 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); - -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +var proc_runner_1 = __webpack_require__(7); +exports.withProcRunner = proc_runner_1.withProcRunner; +exports.ProcRunner = proc_runner_1.ProcRunner; +tslib_1.__exportStar(__webpack_require__(400), exports); +var serializers_1 = __webpack_require__(405); +exports.createAbsolutePathSerializer = serializers_1.createAbsolutePathSerializer; +var certs_1 = __webpack_require__(430); +exports.CA_CERT_PATH = certs_1.CA_CERT_PATH; +exports.ES_KEY_PATH = certs_1.ES_KEY_PATH; +exports.ES_CERT_PATH = certs_1.ES_CERT_PATH; +exports.ES_P12_PATH = certs_1.ES_P12_PATH; +exports.ES_P12_PASSWORD = certs_1.ES_P12_PASSWORD; +exports.ES_EMPTYPASSWORD_P12_PATH = certs_1.ES_EMPTYPASSWORD_P12_PATH; +exports.ES_NOPASSWORD_P12_PATH = certs_1.ES_NOPASSWORD_P12_PATH; +exports.KBN_KEY_PATH = certs_1.KBN_KEY_PATH; +exports.KBN_CERT_PATH = certs_1.KBN_CERT_PATH; +exports.KBN_P12_PATH = certs_1.KBN_P12_PATH; +exports.KBN_P12_PASSWORD = certs_1.KBN_P12_PASSWORD; +var run_1 = __webpack_require__(431); +exports.run = run_1.run; +exports.createFailError = run_1.createFailError; +exports.createFlagError = run_1.createFlagError; +exports.combineErrors = run_1.combineErrors; +exports.isFailError = run_1.isFailError; +var repo_root_1 = __webpack_require__(407); +exports.REPO_ROOT = repo_root_1.REPO_ROOT; +var kbn_client_1 = __webpack_require__(436); +exports.KbnClient = kbn_client_1.KbnClient; +tslib_1.__exportStar(__webpack_require__(479), exports); +tslib_1.__exportStar(__webpack_require__(486), exports); -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], +/***/ }), +/* 6 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; - - // Fix humans - styles.color.grey = styles.color.gray; - - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; - - for (const styleName of Object.keys(group)) { - const style = group[styleName]; - - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; - - group[styleName] = styles[styleName]; - - codes.set(style[0], style[1]); - } - - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } - - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; - - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; - - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; - - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } - - const suite = colorConvert[key]; - - if (key === 'ansi16') { - key = 'ansi'; - } - - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } - - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } - - return styles; -} - -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) - -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - -module.exports = function(module) { - if (!module.webpackPolyfill) { - module.deprecate = function() {}; - module.paths = []; - // module.parent = undefined by default - if (!module.children) module.children = []; - Object.defineProperty(module, "loaded", { - enumerable: true, - get: function() { - return module.l; - } - }); - Object.defineProperty(module, "id", { - enumerable: true, - get: function() { - return module.i; - } - }); - module.webpackPolyfill = 1; - } - return module; -}; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; }); +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +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 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __exportStar(m, exports) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} + +function __values(o) { + var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + if (m) return m.call(o); + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result.default = mod; + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} /***/ }), -/* 6 */ +/* 7 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(7); -var route = __webpack_require__(9); - -var convert = {}; - -var models = Object.keys(conversions); - -function wrapRaw(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } - - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } - - return fn(args); - }; - - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } - - return wrappedFn; -} - -function wrapRounded(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } - - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } +"use strict"; - var result = fn(args); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var with_proc_runner_1 = __webpack_require__(8); +exports.withProcRunner = with_proc_runner_1.withProcRunner; +var proc_runner_1 = __webpack_require__(9); +exports.ProcRunner = proc_runner_1.ProcRunner; - // we're assuming the result is an array here. - // see notice in conversions.js; don't use box types - // in conversion functions. - if (typeof result === 'object') { - for (var len = result.length, i = 0; i < len; i++) { - result[i] = Math.round(result[i]); - } - } - return result; - }; +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } +"use strict"; - return wrappedFn; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const proc_runner_1 = __webpack_require__(9); +/** + * Create a ProcRunner and pass it to an async function. When + * the async function finishes the ProcRunner is torn-down + * automatically + * + * @param {ToolingLog} log + * @param {async Function} fn + * @return {Promise} + */ +async function withProcRunner(log, fn) { + const procs = new proc_runner_1.ProcRunner(log); + try { + await fn(procs); + } + finally { + await procs.teardown(); + } } - -models.forEach(function (fromModel) { - convert[fromModel] = {}; - - Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); - Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - - var routes = route(fromModel); - var routeModels = Object.keys(routes); - - routeModels.forEach(function (toModel) { - var fn = routes[toModel]; - - convert[fromModel][toModel] = wrapRounded(fn); - convert[fromModel][toModel].raw = wrapRaw(fn); - }); -}); - -module.exports = convert; +exports.withProcRunner = withProcRunner; /***/ }), -/* 7 */ +/* 9 */ /***/ (function(module, exports, __webpack_require__) { -/* MIT license */ -var cssKeywords = __webpack_require__(8); - -// NOTE: conversions should only return primitive values (i.e. arrays, or -// values that give correct `typeof` results). -// do not use box values types (i.e. Number(), String(), etc.) - -var reverseKeywords = {}; -for (var key in cssKeywords) { - if (cssKeywords.hasOwnProperty(key)) { - reverseKeywords[cssKeywords[key]] = key; - } -} +"use strict"; -var convert = module.exports = { - rgb: {channels: 3, labels: 'rgb'}, - hsl: {channels: 3, labels: 'hsl'}, - hsv: {channels: 3, labels: 'hsv'}, - hwb: {channels: 3, labels: 'hwb'}, - cmyk: {channels: 4, labels: 'cmyk'}, - xyz: {channels: 3, labels: 'xyz'}, - lab: {channels: 3, labels: 'lab'}, - lch: {channels: 3, labels: 'lch'}, - hex: {channels: 1, labels: ['hex']}, - keyword: {channels: 1, labels: ['keyword']}, - ansi16: {channels: 1, labels: ['ansi16']}, - ansi256: {channels: 1, labels: ['ansi256']}, - hcg: {channels: 3, labels: ['h', 'c', 'g']}, - apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, - gray: {channels: 1, labels: ['gray']} -}; - -// hide .channels and .labels properties -for (var model in convert) { - if (convert.hasOwnProperty(model)) { - if (!('channels' in convert[model])) { - throw new Error('missing channels property: ' + model); - } - - if (!('labels' in convert[model])) { - throw new Error('missing channel labels property: ' + model); - } - - if (convert[model].labels.length !== convert[model].channels) { - throw new Error('channel and label counts mismatch: ' + model); - } - - var channels = convert[model].channels; - var labels = convert[model].labels; - delete convert[model].channels; - delete convert[model].labels; - Object.defineProperty(convert[model], 'channels', {value: channels}); - Object.defineProperty(convert[model], 'labels', {value: labels}); - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const moment_1 = tslib_1.__importDefault(__webpack_require__(10)); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(339)); +const errors_1 = __webpack_require__(340); +const proc_1 = __webpack_require__(341); +const SECOND = 1000; +const MINUTE = 60 * SECOND; +const noop = () => { }; +/** + * Helper for starting and managing processes. In many ways it resembles the + * API from `grunt_run`, processes are named and can be started, waited for, + * backgrounded once they log something matching a RegExp... + * + * @class ProcRunner + */ +class ProcRunner { + constructor(log) { + this.log = log; + this.closing = false; + this.procs = []; + this.signalUnsubscribe = exit_hook_1.default(() => { + this.teardown().catch((error) => { + log.error(`ProcRunner teardown error: ${error.stack}`); + }); + }); + } + /** + * Start a process, tracking it by `name` + * @param {String} name + * @param {Object} options + * @property {String} options.cmd executable to run + * @property {Array?} options.args arguments to provide the executable + * @property {String?} options.cwd current working directory for the process + * @property {RegExp|Boolean} options.wait Should start() wait for some time? Use + * `true` will wait until the proc exits, + * a `RegExp` will wait until that log line + * is found + * @return {Promise} + */ + async run(name, options) { + const { cmd, args = [], cwd = process.cwd(), stdin = undefined, wait = false, waitTimeout = 15 * MINUTE, env = process.env, } = options; + if (this.closing) { + throw new Error('ProcRunner is closing'); + } + if (wait && !(wait instanceof RegExp) && wait !== true) { + throw new TypeError('wait param should either be a RegExp or `true`'); + } + if (!!this.getProc(name)) { + throw new Error(`Process with name "${name}" already running`); + } + const proc = this.startProc(name, { + cmd, + args, + cwd, + env, + stdin, + }); + try { + if (wait instanceof RegExp) { + // wait for process to log matching line + await Rx.race(proc.lines$.pipe(operators_1.filter((line) => wait.test(line)), operators_1.first(), operators_1.catchError((err) => { + if (err.name !== 'EmptyError') { + throw errors_1.createCliError(`[${name}] exited without matching pattern: ${wait}`); + } + else { + throw err; + } + })), waitTimeout === false + ? Rx.NEVER + : Rx.timer(waitTimeout).pipe(operators_1.map(() => { + const sec = waitTimeout / SECOND; + throw errors_1.createCliError(`[${name}] failed to match pattern within ${sec} seconds [pattern=${wait}]`); + }))).toPromise(); + } + if (wait === true) { + // wait for process to complete + await proc.outcomePromise; + } + } + finally { + // while the procRunner closes promises will resolve/reject because + // processes and stopping, but consumers of run() shouldn't have to + // prepare for that, so just return a never-resolving promise + if (this.closing) { + await new Promise(noop); + } + } + } + /** + * Stop a named proc + */ + async stop(name, signal = 'SIGTERM') { + const proc = this.getProc(name); + if (proc) { + await proc.stop(signal); + } + else { + this.log.warning('[%s] already stopped', name); + } + } + /** + * Wait for all running processes to stop naturally + * @return {Promise} + */ + async waitForAllToStop() { + await Promise.all(this.procs.map((proc) => proc.outcomePromise)); + } + /** + * Close the ProcRunner and stop all running + * processes with `signal` + * + * @param {String} [signal=undefined] + * @return {Promise} + */ + async teardown(signal = 'exit') { + if (this.closing) { + return; + } + this.closing = true; + this.signalUnsubscribe(); + if (!signal && this.procs.length > 0) { + this.log.warning('%d processes left running, stop them with procs.stop(name):', this.procs.length, this.procs.map((proc) => proc.name)); + } + await Promise.all(this.procs.map(async (proc) => { + await proc.stop(signal === 'exit' ? 'SIGKILL' : signal); + })); + } + getProc(name) { + return this.procs.find((proc) => { + return proc.name === name; + }); + } + startProc(name, options) { + const startMs = Date.now(); + const proc = proc_1.startProc(name, options, this.log); + this.procs.push(proc); + const remove = () => { + this.procs.splice(this.procs.indexOf(proc), 1); + }; + // tie into proc outcome$, remove from _procs on compete + proc.outcome$.subscribe({ + next: (code) => { + const duration = moment_1.default.duration(Date.now() - startMs); + this.log.info('[%s] exited with %s after %s', name, code, duration.humanize()); + }, + complete: () => { + remove(); + }, + error: (error) => { + if (this.closing) { + this.log.error(error); + } + remove(); + }, + }); + return proc; + } } +exports.ProcRunner = ProcRunner; -convert.rgb.hsl = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var l; - - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } - - h = Math.min(h * 60, 360); - - if (h < 0) { - h += 360; - } - l = (min + max) / 2; +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { - if (max === min) { - s = 0; - } else if (l <= 0.5) { - s = delta / (max + min); - } else { - s = delta / (2 - max - min); - } +/* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js - return [h, s * 100, l * 100]; -}; +;(function (global, factory) { + true ? module.exports = factory() : + undefined +}(this, (function () { 'use strict'; -convert.rgb.hsv = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var v; + var hookCallback; - if (max === 0) { - s = 0; - } else { - s = (delta / max * 1000) / 10; - } + function hooks () { + return hookCallback.apply(null, arguments); + } - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } - h = Math.min(h * 60, 360); + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } - if (h < 0) { - h += 360; - } + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } - v = ((max / 255) * 1000) / 10; + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } + } - return [h, s, v]; -}; + function isUndefined(input) { + return input === void 0; + } -convert.rgb.hwb = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var h = convert.rgb.hsl(rgb)[0]; - var w = 1 / 255 * Math.min(r, Math.min(g, b)); + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } - b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } - return [h, w * 100, b * 100]; -}; + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } -convert.rgb.cmyk = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var c; - var m; - var y; - var k; + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } - return [c * 100, m * 100, y * 100, k * 100]; -}; + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } -/** - * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance - * */ -function comparativeDistance(x, y) { - return ( - Math.pow(x[0] - y[0], 2) + - Math.pow(x[1] - y[1], 2) + - Math.pow(x[2] - y[2], 2) - ); -} + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } -convert.rgb.keyword = function (rgb) { - var reversed = reverseKeywords[rgb]; - if (reversed) { - return reversed; - } + return a; + } - var currentClosestDistance = Infinity; - var currentClosestKeyword; + function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } - for (var keyword in cssKeywords) { - if (cssKeywords.hasOwnProperty(keyword)) { - var value = cssKeywords[keyword]; + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; + } - // Compute comparative distance - var distance = comparativeDistance(rgb, value); + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } - // Check if its less, if so set as closest - if (distance < currentClosestDistance) { - currentClosestDistance = distance; - currentClosestKeyword = keyword; - } - } - } + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; - return currentClosestKeyword; -}; + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } -convert.keyword.rgb = function (keyword) { - return cssKeywords[keyword]; -}; + return false; + }; + } -convert.rgb.xyz = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; + } - return [x * 100, y * 100, z * 100]; -}; + function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } -convert.rgb.lab = function (rgb) { - var xyz = convert.rgb.xyz(rgb); - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + return m; + } - x /= 95.047; - y /= 100; - z /= 108.883; + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + function copyConfig(to, from) { + var i, prop, val; - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - - return [l, a, b]; -}; + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } -convert.hsl.rgb = function (hsl) { - var h = hsl[0] / 360; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var t1; - var t2; - var t3; - var rgb; - var val; + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } - if (s === 0) { - val = l * 255; - return [val, val, val]; - } + return to; + } - if (l < 0.5) { - t2 = l * (1 + s); - } else { - t2 = l + s - l * s; - } + var updateInProgress = false; - t1 = 2 * l - t2; + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * -(i - 1); - if (t3 < 0) { - t3++; - } - if (t3 > 1) { - t3--; - } + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } - if (6 * t3 < 1) { - val = t1 + (t2 - t1) * 6 * t3; - } else if (2 * t3 < 1) { - val = t2; - } else if (3 * t3 < 2) { - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - } else { - val = t1; - } + function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } - rgb[i] = val * 255; - } + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; - return rgb; -}; + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } -convert.hsl.hsv = function (hsl) { - var h = hsl[0]; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var smin = s; - var lmin = Math.max(l, 0.01); - var sv; - var v; + return value; + } - l *= 2; - s *= (l <= 1) ? l : 2 - l; - smin *= lmin <= 1 ? lmin : 2 - lmin; - v = (l + s) / 2; - sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } - return [h, sv * 100, v * 100]; -}; + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } -convert.hsv.rgb = function (hsv) { - var h = hsv[0] / 60; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var hi = Math.floor(h) % 6; + function deprecate(msg, fn) { + var firstTime = true; - var f = h - Math.floor(h); - var p = 255 * v * (1 - s); - var q = 255 * v * (1 - (s * f)); - var t = 255 * v * (1 - (s * (1 - f))); - v *= 255; + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } - switch (hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -}; + var deprecations = {}; -convert.hsv.hsl = function (hsv) { - var h = hsv[0]; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var vmin = Math.max(v, 0.01); - var lmin; - var sl; - var l; + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } - l = (2 - s) * v; - lmin = (2 - s) * vmin; - sl = s * vmin; - sl /= (lmin <= 1) ? lmin : 2 - lmin; - sl = sl || 0; - l /= 2; + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; - return [h, sl * 100, l * 100]; -}; + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -convert.hwb.rgb = function (hwb) { - var h = hwb[0] / 360; - var wh = hwb[1] / 100; - var bl = hwb[2] / 100; - var ratio = wh + bl; - var i; - var v; - var f; - var n; + function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); + } - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; + function Locale(config) { + if (config != null) { + this.set(config); + } + } - if ((i & 0x01) !== 0) { - f = 1 - f; - } + var keys; - n = wh + f * (v - wh); // linear interpolation + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } - var r; - var g; - var b; - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; - return [r * 255, g * 255, b * 255]; -}; + function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } -convert.cmyk.rgb = function (cmyk) { - var c = cmyk[0] / 100; - var m = cmyk[1] / 100; - var y = cmyk[2] / 100; - var k = cmyk[3] / 100; - var r; - var g; - var b; + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; - return [r * 255, g * 255, b * 255]; -}; + if (format || !formatUpper) { + return format; + } -convert.xyz.rgb = function (xyz) { - var x = xyz[0] / 100; - var y = xyz[1] / 100; - var z = xyz[2] / 100; - var r; - var g; - var b; + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + return this._longDateFormat[key]; + } - // assume sRGB - r = r > 0.0031308 - ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r * 12.92; + var defaultInvalidDate = 'Invalid date'; - g = g > 0.0031308 - ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g * 12.92; + function invalidDate () { + return this._invalidDate; + } - b = b > 0.0031308 - ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b * 12.92; + var defaultOrdinal = '%d'; + var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); + function ordinal (number) { + return this._ordinal.replace('%d', number); + } - return [r * 255, g * 255, b * 255]; -}; + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; -convert.xyz.lab = function (xyz) { - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } - x /= 95.047; - y /= 100; - z /= 108.883; + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + var aliases = {}; - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } - return [l, a, b]; -}; + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } -convert.lab.xyz = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var x; - var y; - var z; + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; - y = (l + 16) / 116; - x = a / 500 + y; - z = y - b / 200; + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } - var y2 = Math.pow(y, 3); - var x2 = Math.pow(x, 3); - var z2 = Math.pow(z, 3); - y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; - x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; - z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + return normalizedInput; + } - x *= 95.047; - y *= 100; - z *= 108.883; + var priorities = {}; - return [x, y, z]; -}; + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } -convert.lab.lch = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var hr; - var h; - var c; - - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } - if (h < 0) { - h += 360; - } + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } - c = Math.sqrt(a * a + b * b); + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - return [l, c, h]; -}; + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; -convert.lch.lab = function (lch) { - var l = lch[0]; - var c = lch[1]; - var h = lch[2]; - var a; - var b; - var hr; + var formatFunctions = {}; - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); + var formatTokenFunctions = {}; - return [l, a, b]; -}; + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } -convert.rgb.ansi16 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } - value = Math.round(value / 50); + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; - if (value === 0) { - return 30; - } + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } - var ansi = 30 - + ((Math.round(b / 255) << 2) - | (Math.round(g / 255) << 1) - | Math.round(r / 255)); + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } - if (value === 2) { - ansi += 60; - } + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } - return ansi; -}; + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); -convert.hsv.ansi16 = function (args) { - // optimization here; we already know the value and don't need to get - // it converted for us. - return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); -}; + return formatFunctions[format](m); + } -convert.rgb.ansi256 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; + function expandFormat(format, locale) { + var i = 5; - // we use the extended greyscale palette here, with the exception of - // black and white. normal palette only has 4 greyscale shades. - if (r === g && g === b) { - if (r < 8) { - return 16; - } + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } - if (r > 248) { - return 231; - } + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } - return Math.round(((r - 8) / 247) * 24) + 232; - } + return format; + } - var ansi = 16 - + (36 * Math.round(r / 255 * 5)) - + (6 * Math.round(g / 255 * 5)) - + Math.round(b / 255 * 5); + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - return ansi; -}; + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf -convert.ansi16.rgb = function (args) { - var color = args % 10; + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - // handle greyscale - if (color === 0 || color === 7) { - if (args > 50) { - color += 3.5; - } + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - color = color / 10.5 * 255; + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; - return [color, color, color]; - } + var regexes = {}; - var mult = (~~(args > 50) + 1) * 0.5; - var r = ((color & 1) * mult) * 255; - var g = (((color >> 1) & 1) * mult) * 255; - var b = (((color >> 2) & 1) * mult) * 255; + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } - return [r, g, b]; -}; + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } -convert.ansi256.rgb = function (args) { - // handle greyscale - if (args >= 232) { - var c = (args - 232) * 10 + 8; - return [c, c, c]; - } + return regexes[token](config._strict, config._locale); + } - args -= 16; + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } - var rem; - var r = Math.floor(args / 36) / 5 * 255; - var g = Math.floor((rem = args % 36) / 6) / 5 * 255; - var b = (rem % 6) / 5 * 255; + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } - return [r, g, b]; -}; + var tokens = {}; -convert.rgb.hex = function (args) { - var integer = ((Math.round(args[0]) & 0xFF) << 16) - + ((Math.round(args[1]) & 0xFF) << 8) - + (Math.round(args[2]) & 0xFF); + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } -convert.hex.rgb = function (args) { - var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); - if (!match) { - return [0, 0, 0]; - } + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } - var colorString = match[0]; + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; - if (match[0].length === 3) { - colorString = colorString.split('').map(function (char) { - return char + char; - }).join(''); - } + // FORMATTING - var integer = parseInt(colorString, 16); - var r = (integer >> 16) & 0xFF; - var g = (integer >> 8) & 0xFF; - var b = integer & 0xFF; + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); - return [r, g, b]; -}; + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); -convert.rgb.hcg = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var max = Math.max(Math.max(r, g), b); - var min = Math.min(Math.min(r, g), b); - var chroma = (max - min); - var grayscale; - var hue; + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - if (chroma < 1) { - grayscale = min / (1 - chroma); - } else { - grayscale = 0; - } + // ALIASES - if (chroma <= 0) { - hue = 0; - } else - if (max === r) { - hue = ((g - b) / chroma) % 6; - } else - if (max === g) { - hue = 2 + (b - r) / chroma; - } else { - hue = 4 + (r - g) / chroma + 4; - } + addUnitAlias('year', 'y'); - hue /= 6; - hue %= 1; + // PRIORITIES - return [hue * 360, chroma * 100, grayscale * 100]; -}; + addUnitPriority('year', 1); -convert.hsl.hcg = function (hsl) { - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var c = 1; - var f = 0; + // PARSING - if (l < 0.5) { - c = 2.0 * s * l; - } else { - c = 2.0 * s * (1.0 - l); - } + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); - if (c < 1.0) { - f = (l - 0.5 * c) / (1.0 - c); - } + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); - return [hsl[0], c * 100, f * 100]; -}; + // HELPERS -convert.hsv.hcg = function (hsv) { - var s = hsv[1] / 100; - var v = hsv[2] / 100; + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } - var c = s * v; - var f = 0; + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } - if (c < 1.0) { - f = (v - c) / (1 - c); - } + // HOOKS - return [hsv[0], c * 100, f * 100]; -}; + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; -convert.hcg.rgb = function (hcg) { - var h = hcg[0] / 360; - var c = hcg[1] / 100; - var g = hcg[2] / 100; + // MOMENTS - if (c === 0.0) { - return [g * 255, g * 255, g * 255]; - } + var getSetYear = makeGetSet('FullYear', true); - var pure = [0, 0, 0]; - var hi = (h % 1) * 6; - var v = hi % 1; - var w = 1 - v; - var mg = 0; + function getIsLeapYear () { + return isLeapYear(this.year()); + } - switch (Math.floor(hi)) { - case 0: - pure[0] = 1; pure[1] = v; pure[2] = 0; break; - case 1: - pure[0] = w; pure[1] = 1; pure[2] = 0; break; - case 2: - pure[0] = 0; pure[1] = 1; pure[2] = v; break; - case 3: - pure[0] = 0; pure[1] = w; pure[2] = 1; break; - case 4: - pure[0] = v; pure[1] = 0; pure[2] = 1; break; - default: - pure[0] = 1; pure[1] = 0; pure[2] = w; - } + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } - mg = (1.0 - c) * g; + function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } - return [ - (c * pure[0] + mg) * 255, - (c * pure[1] + mg) * 255, - (c * pure[2] + mg) * 255 - ]; -}; + function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } -convert.hcg.hsv = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + // MOMENTS - var v = c + g * (1.0 - c); - var f = 0; + function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } - if (v > 0.0) { - f = c / v; - } - return [hcg[0], f * 100, v * 100]; -}; + function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } -convert.hcg.hsl = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + function mod(n, x) { + return ((n % x) + x) % x; + } - var l = g * (1.0 - c) + 0.5 * c; - var s = 0; + var indexOf; - if (l > 0.0 && l < 0.5) { - s = c / (2 * l); - } else - if (l >= 0.5 && l < 1.0) { - s = c / (2 * (1 - l)); - } + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } - return [hcg[0], s * 100, l * 100]; -}; + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); + } -convert.hcg.hwb = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - var v = c + g * (1.0 - c); - return [hcg[0], (v - c) * 100, (1 - v) * 100]; -}; + // FORMATTING -convert.hwb.hcg = function (hwb) { - var w = hwb[1] / 100; - var b = hwb[2] / 100; - var v = 1 - b; - var c = v - w; - var g = 0; + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); - if (c < 1) { - g = (v - c) / (1 - c); - } + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); - return [hwb[0], c * 100, g * 100]; -}; + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); -convert.apple.rgb = function (apple) { - return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; -}; + // ALIASES -convert.rgb.apple = function (rgb) { - return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; -}; + addUnitAlias('month', 'M'); -convert.gray.rgb = function (args) { - return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; -}; + // PRIORITY -convert.gray.hsl = convert.gray.hsv = function (args) { - return [0, 0, args[0]]; -}; + addUnitPriority('month', 8); -convert.gray.hwb = function (gray) { - return [0, 100, gray[0]]; -}; + // PARSING -convert.gray.cmyk = function (gray) { - return [0, 0, 0, gray[0]]; -}; + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); -convert.gray.lab = function (gray) { - return [gray[0], 0, 0]; -}; + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); -convert.gray.hex = function (gray) { - var val = Math.round(gray[0] / 100 * 255) & 0xFF; - var integer = (val << 16) + (val << 8) + val; + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; + // LOCALES -convert.rgb.gray = function (rgb) { - var val = (rgb[0] + rgb[1] + rgb[2]) / 3; - return [val / 255 * 100]; -}; + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { + function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } -"use strict"; - - -module.exports = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } -var conversions = __webpack_require__(7); + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } -/* - this function routes a model to all other models. + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } - all functions that are routed have a property `.conversion` attached - to the returned synthetic function. This property is an array - of strings, each with the steps in between the 'from' and 'to' - color models (inclusive). + // MOMENTS - conversions that are not possible simply are not included. -*/ + function setMonth (mom, value) { + var dayOfMonth; -function buildGraph() { - var graph = {}; - // https://jsperf.com/object-keys-vs-for-in-with-closure/3 - var models = Object.keys(conversions); + if (!mom.isValid()) { + // No op + return mom; + } - for (var len = models.length, i = 0; i < len; i++) { - graph[models[i]] = { - // http://jsperf.com/1-vs-infinity - // micro-opt, but this is simple. - distance: -1, - parent: null - }; - } + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } - return graph; -} + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } -// https://en.wikipedia.org/wiki/Breadth-first_search -function deriveBFS(fromModel) { - var graph = buildGraph(); - var queue = [fromModel]; // unshift -> queue -> pop + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } - graph[fromModel].distance = 0; + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } - while (queue.length) { - var current = queue.pop(); - var adjacents = Object.keys(conversions[current]); + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } - for (var len = adjacents.length, i = 0; i < len; i++) { - var adjacent = adjacents[i]; - var node = graph[adjacent]; + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } - if (node.distance === -1) { - node.distance = graph[current].distance + 1; - node.parent = current; - queue.unshift(adjacent); - } - } - } + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } - return graph; -} + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } -function link(from, to) { - return function (args) { - return to(from(args)); - }; -} + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } -function wrapConversion(toModel, graph) { - var path = [graph[toModel].parent, toModel]; - var fn = conversions[graph[toModel].parent][toModel]; + function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date; + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + date = new Date(y + 400, m, d, h, M, s, ms); + if (isFinite(date.getFullYear())) { + date.setFullYear(y); + } + } else { + date = new Date(y, m, d, h, M, s, ms); + } - var cur = graph[toModel].parent; - while (graph[cur].parent) { - path.unshift(graph[cur].parent); - fn = link(conversions[graph[cur].parent][cur], fn); - cur = graph[cur].parent; - } - - fn.conversion = path; - return fn; -} - -module.exports = function (fromModel) { - var graph = deriveBFS(fromModel); - var conversion = {}; - - var models = Object.keys(graph); - for (var len = models.length, i = 0; i < len; i++) { - var toModel = models[i]; - var node = graph[toModel]; + return date; + } - if (node.parent === null) { - // no possible conversion, or this node is the source model. - continue; - } + function createUTCDate (y) { + var date; + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + var args = Array.prototype.slice.call(arguments); + // preserve leap years using a full 400 year cycle, then reset + args[0] = y + 400; + date = new Date(Date.UTC.apply(null, args)); + if (isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + } else { + date = new Date(Date.UTC.apply(null, arguments)); + } - conversion[toModel] = wrapConversion(toModel, graph); - } + return date; + } - return conversion; -}; + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + return -fwdlw + fwd - 1; + } + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } -"use strict"; + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; -const env = process.env; + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} + return { + week: resWeek, + year: resYear + }; + } -function translateLevel(level) { - if (level === 0) { - return false; - } + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} + // FORMATTING -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + // ALIASES - if (hasFlag('color=256')) { - return 2; - } + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } + // PRIORITIES - const min = forceColor ? 1 : 0; + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } + // PARSING - return 1; - } + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); - return min; - } + // HELPERS - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } + // LOCALES - if (env.COLORTERM === 'truecolor') { - return 3; - } + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. + }; - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } + function localeFirstDayOfWeek () { + return this._week.dow; + } - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } + function localeFirstDayOfYear () { + return this._week.doy; + } - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } + // MOMENTS - if ('COLORTERM' in env) { - return 1; - } + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } - if (env.TERM === 'dumb') { - return min; - } + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } - return min; -} + // FORMATTING -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} + addFormatToken('d', 0, 'do', 'day'); -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); -/***/ }), -/* 11 */ -/***/ (function(module, exports) { + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); -module.exports = require("os"); + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { + // ALIASES -"use strict"; + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); -module.exports = (flag, argv) => { - argv = argv || process.argv; - const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); - const pos = argv.indexOf(prefix + flag); - const terminatorPos = argv.indexOf('--'); - return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); -}; + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + // PARSING -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); -"use strict"; + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); + // HELPERS -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } - return ESCAPES.get(c) || c; -} + if (!isNaN(input)) { + return parseInt(input, 10); + } -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } + return null; + } - return results; -} + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; + // LOCALES + function shiftWeekdays (ws, n) { + return ws.slice(n, 7).concat(ws.slice(0, n)); + } - const results = []; - let matches; + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + var weekdays = isArray(this._weekdays) ? this._weekdays : + this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone']; + return (m === true) ? shiftWeekdays(weekdays, this._week.dow) + : (m) ? weekdays[m.day()] : weekdays; + } - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow) + : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow) + : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } - return results; -} + function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; -function buildStyle(chalk, styles) { - const enabled = {}; + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } - return current; -} + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); + // MOMENTS - chunks.push(chunk.join('')); + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } - return chunks.join(''); -}; + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } -"use strict"; + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } -function dedent(strings) { + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } - var raw = void 0; - if (typeof strings === "string") { - // dedent can be used as a plain function - raw = [strings]; - } else { - raw = strings.raw; - } - // first, perform interpolation - var result = ""; - for (var i = 0; i < raw.length; i++) { - result += raw[i]. - // join lines when there is a suppressed newline - replace(/\\\n[ \t]*/g, ""). + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } - // handle escaped backticks - replace(/\\`/g, "`"); + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } - if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) { - result += arguments.length <= i + 1 ? undefined : arguments[i + 1]; - } - } + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; - // now strip indentation - var lines = result.split("\n"); - var mindent = null; - lines.forEach(function (l) { - var m = l.match(/^(\s+)\S+/); - if (m) { - var indent = m[1].length; - if (!mindent) { - // this is the first indented line - mindent = indent; - } else { - mindent = Math.min(mindent, indent); - } + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); } - }); - if (mindent !== null) { - result = lines.map(function (l) { - return l[0] === " " ? l.slice(mindent) : l; - }).join("\n"); - } + // FORMATTING - // dedent eats leading and trailing whitespace too - result = result.trim(); + function hFormat() { + return this.hours() % 12 || 12; + } - // handle escaped newlines at the end to ensure they don't get stripped too - return result.replace(/\\n/g, "\n"); -} + function kFormat() { + return this.hours() || 24; + } -if (true) { - module.exports = dedent; -} + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); -"use strict"; + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); -const EMPTYARR = [] -const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g -const isArray = Array.isArray + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } -const parseValue = function(any) { - if (any === "") return "" - if (any === "false") return false - const maybe = Number(any) - return maybe * 0 === 0 ? maybe : any -} + meridiem('a', true); + meridiem('A', false); -const parseAlias = function(aliases) { - let out = {}, - key, - alias, - prev, - len, - any, - i, - k + // ALIASES - for (key in aliases) { - any = aliases[key] - alias = out[key] = isArray(any) ? any : [any] + addUnitAlias('hour', 'h'); - for (i = 0, len = alias.length; i < len; i++) { - prev = out[alias[i]] = [key] + // PRIORITY + addUnitPriority('hour', 13); - for (k = 0; k < len; k++) { - if (i !== k) prev.push(alias[k]) - } + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; } - } - return out -} + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); -const parseDefault = function(aliases, defaults) { - let out = {}, - key, - alias, - value, - len, - i + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); - for (key in defaults) { - value = defaults[key] - alias = aliases[key] + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); - out[key] = value + // LOCALES - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (i = 0, len = alias.length; i < len; i++) { - out[alias[i]] = value - } + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); } - } - return out -} + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } -const parseOptions = function(aliases, options, value) { - let out = {}, - key, - alias, - len, - end, - i, - k - if (options !== undefined) { - for (i = 0, len = options.length; i < len; i++) { - key = options[i] - alias = aliases[key] + // MOMENTS - out[key] = value + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (k = 0, end = alias.length; k < end; k++) { - out[alias[k]] = value - } - } - } - } + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, - return out -} + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, -const write = function(out, key, value, aliases, unknown) { - let i, - prev, - alias = aliases[key], - len = alias === undefined ? -1 : alias.length + week: defaultLocaleWeek, - if (len >= 0 || unknown === undefined || unknown(key)) { - prev = out[key] + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, - if (prev === undefined) { - out[key] = value - } else { - if (isArray(prev)) { - prev.push(value) - } else { - out[key] = [prev, value] - } - } + meridiemParse: defaultLocaleMeridiemParse + }; - for (i = 0; i < len; i++) { - out[alias[i]] = out[key] + // internal storage for locale config files + var locales = {}; + var localeFamilies = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; } - } -} -const getopts = function(argv, opts) { - let unknown = (opts = opts || {}).unknown, - aliases = parseAlias(opts.alias), - strings = parseOptions(aliases, opts.string, ""), - values = parseDefault(aliases, opts.default), - bools = parseOptions(aliases, opts.boolean, false), - stopEarly = opts.stopEarly, - _ = [], - out = { _ }, - i = 0, - k = 0, - len = argv.length, - key, - arg, - end, - match, - value + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; - for (; i < len; i++) { - arg = argv[i] + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; + } - if (arg[0] !== "-" || arg === "-") { - if (stopEarly) while (i < len) _.push(argv[i++]) - else _.push(arg) - } else if (arg === "--") { - while (++i < len) _.push(argv[i]) - } else if (arg[1] === "-") { - end = arg.indexOf("=", 2) - if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { - key = arg.slice(5, end >= 0 ? end : undefined) - value = false - } else if (end >= 0) { - key = arg.slice(2, end) - value = - bools[key] !== undefined || - (strings[key] === undefined - ? parseValue(arg.slice(end + 1)) - : arg.slice(end + 1)) - } else { - key = arg.slice(2) - value = - bools[key] !== undefined || - (len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined - ? true - : "" - : strings[key] === undefined - ? parseValue(argv[++i]) - : argv[++i]) - } - write(out, key, value, aliases, unknown) - } else { - SHORTSPLIT.lastIndex = 2 - match = SHORTSPLIT.exec(arg) - end = match.index - value = match[0] - - for (k = 1; k < end; k++) { - write( - out, - (key = arg[k]), - k + 1 < end - ? strings[key] === undefined || - arg.substring(k + 1, (k = end)) + value - : value === "" - ? len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined || "" - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(value) : value), - aliases, - unknown - ) - } + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + __webpack_require__(12)("./" + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; } - } - - for (key in values) if (out[key] === undefined) out[key] = values[key] - for (key in bools) if (out[key] === undefined) out[key] = false - for (key in strings) if (out[key] === undefined) out[key] = "" - return out -} + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } -module.exports = getopts + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } + } + return globalLocale._abbr; + } -/***/ }), -/* 16 */ -/***/ (function(module, exports) { + function defineLocale (name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); -module.exports = require("path"); + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } -/***/ }), -/* 17 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); -/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); -/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(586); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(686); -/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(687); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } -const commands = { - bootstrap: _bootstrap__WEBPACK_IMPORTED_MODULE_0__["BootstrapCommand"], - clean: _clean__WEBPACK_IMPORTED_MODULE_1__["CleanCommand"], - run: _run__WEBPACK_IMPORTED_MODULE_2__["RunCommand"], - watch: _watch__WEBPACK_IMPORTED_MODULE_3__["WatchCommand"] -}; + // returns locale data + function getLocale (key) { + var locale; -/***/ }), -/* 18 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCommand", function() { return BootstrapCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(501); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(502); -/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(580); -/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(585); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ + if (!key) { + return globalLocale; + } + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + return chooseLocale(key); + } + function listLocales() { + return keys(locales); + } + function checkOverflow (m) { + var overflow; + var a = m._a; + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } -const BootstrapCommand = { - description: 'Install dependencies and crosslink projects', - name: 'bootstrap', + getParsingFlags(m).overflow = overflow; + } - async run(projects, projectGraph, { - options, - kbn - }) { - const batchedProjectsByWorkspace = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_4__["topologicallyBatchProjects"])(projects, projectGraph, { - batchByWorkspace: true - }); - const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_4__["topologicallyBatchProjects"])(projects, projectGraph); - const extraArgs = [...(options['frozen-lockfile'] === true ? ['--frozen-lockfile'] : []), ...(options['prefer-offline'] === true ? ['--prefer-offline'] : [])]; - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nRunning installs in topological order:')); + return m; + } - for (const batch of batchedProjectsByWorkspace) { - for (const project of batch) { - if (project.isWorkspaceProject) { - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(`Skipping workspace project: ${project.name}`); - continue; + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; } - - if (project.hasDependencies()) { - await project.installDependencies({ - extraArgs - }); + if (b != null) { + return b; } - } + return c; } - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nInstalls completed, linking package executables:\n')); - await Object(_utils_link_project_executables__WEBPACK_IMPORTED_MODULE_1__["linkProjectExecutables"])(projects, projectGraph); - /** - * At the end of the bootstrapping process we call all `kbn:bootstrap` scripts - * in the list of projects. We do this because some projects need to be - * transpiled before they can be used. Ideally we shouldn't do this unless we - * have to, as it will slow down the bootstrapping process. - */ + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nLinking executables completed, running `kbn:bootstrap` scripts\n')); - const checksums = options.cache ? await Object(_utils_project_checksums__WEBPACK_IMPORTED_MODULE_5__["getAllChecksums"])(kbn, _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"]) : false; - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_3__["parallelizeBatches"])(batchedProjects, async project => { - if (project.hasScript('kbn:bootstrap')) { - const cacheFile = new _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_6__["BootstrapCacheFile"](kbn, project, checksums); + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; - if (cacheFile.isValid()) { - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].success(`[${project.name}] cache up to date`); - } else { - cacheFile.delete(); - await project.runScriptStreaming('kbn:bootstrap'); - cacheFile.write(); + if (config._d) { + return; } - } - }); - _utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green.bold('\nBootstrapping completed!\n')); - } -}; - -/***/ }), -/* 19 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + currentDate = currentDateArray(config); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkProjectExecutables", function() { return linkProjectExecutables; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(20); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } -/** - * Yarn does not link the executables from dependencies that are installed - * using `link:` https://github.com/yarnpkg/yarn/pull/5046 - * - * We simulate this functionality by walking through each project's project - * dependencies, and manually linking their executables if defined. The logic - * for linking was mostly adapted from lerna: https://github.com/lerna/lerna/blob/1d7eb9eeff65d5a7de64dea73613b1bf6bfa8d57/src/PackageUtilities.js#L348 - */ -async function linkProjectExecutables(projectsByName, projectGraph) { - for (const [projectName, projectDeps] of projectGraph) { - const project = projectsByName.get(projectName); - const binsDir = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(project.nodeModulesLocation, '.bin'); + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } - for (const projectDep of projectDeps) { - const executables = projectDep.getExecutables(); + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } - for (const name of Object.keys(executables)) { - const srcPath = executables[name]; // existing logic from lerna -- ensure that the bin we are going to - // point to exists or ignore it + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); - if (!(await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["isFile"])(srcPath))) { - continue; + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } - const dest = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(binsDir, name); // Get relative project path with normalized path separators. + if (config._nextDay) { + config._a[HOUR] = 24; + } - const projectRelativePath = Object(path__WEBPACK_IMPORTED_MODULE_0__["relative"])(project.path, srcPath).split(path__WEBPACK_IMPORTED_MODULE_0__["sep"]).join('/'); - _log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a`{dim [${project.name}]} ${name} -> {dim ${projectRelativePath}}`); - await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["mkdirp"])(Object(path__WEBPACK_IMPORTED_MODULE_0__["dirname"])(dest)); - await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["createSymlink"])(srcPath, dest, 'exec'); - await Object(_fs__WEBPACK_IMPORTED_MODULE_2__["chmod"])(dest, '755'); - } + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } } - } -} - -/***/ }), -/* 20 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readFile", function() { return readFile; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "chmod", function() { return chmod; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mkdirp", function() { return mkdirp; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unlink", function() { return unlink; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyDirectory", function() { return copyDirectory; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSymlink", function() { return isSymlink; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDirectory", function() { return isDirectory; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFile", function() { return isFile; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSymlink", function() { return createSymlink; }); -/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(21); -/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cmd_shim__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(23); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(33); -/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ncp__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(29); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_4__); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ - - - + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; -const lstat = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.lstat); -const readFile = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.readFile); -const symlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.symlink); -const chmod = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.chmod); -const cmdShim = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(cmd_shim__WEBPACK_IMPORTED_MODULE_0___default.a); -const mkdir = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.mkdir); -const mkdirp = async path => await mkdir(path, { - recursive: true -}); -const unlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.unlink); -const copyDirectory = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(ncp__WEBPACK_IMPORTED_MODULE_2__["ncp"]); + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; -async function statTest(path, block) { - try { - return block((await lstat(path))); - } catch (e) { - if (e.code === 'ENOENT') { - return false; - } + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; - throw e; - } -} -/** - * Test if a path points to a symlink. - * @param path - */ + var curWeek = weekOfYear(createLocal(), dow, doy); + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); -async function isSymlink(path) { - return await statTest(path, stats => stats.isSymbolicLink()); -} -/** - * Test if a path points to a directory. - * @param path - */ + // Default to current week. + week = defaults(w.w, curWeek.week); -async function isDirectory(path) { - return await statTest(path, stats => stats.isDirectory()); -} -/** - * Test if a path points to a regular file. - * @param path - */ - -async function isFile(path) { - return await statTest(path, stats => stats.isFile()); -} -/** - * Create a symlink at dest that points to src. Adapted from - * https://github.com/lerna/lerna/blob/2f1b87d9e2295f587e4ac74269f714271d8ed428/src/FileSystemUtilities.js#L103. - * - * @param src - * @param dest - * @param type 'dir', 'file', 'junction', or 'exec'. 'exec' on - * windows will use the `cmd-shim` module since symlinks can't be used - * for executable files on windows. - */ - -async function createSymlink(src, dest, type) { - if (process.platform === 'win32') { - if (type === 'exec') { - await cmdShim(src, dest); - } else { - await forceCreate(src, dest, type); + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from beginning of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to beginning of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } } - } else { - const posixType = type === 'exec' ? 'file' : type; - const relativeSource = Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(Object(path__WEBPACK_IMPORTED_MODULE_3__["dirname"])(dest), src); - await forceCreate(relativeSource, dest, posixType); - } -} -async function forceCreate(src, dest, type) { - try { - // If something exists at `dest` we need to remove it first. - await unlink(dest); - } catch (error) { - if (error.code !== 'ENOENT') { - throw error; - } - } + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - await symlink(src, dest, type); -} + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; -// On windows, create a .cmd file. -// Read the #! in the file to see what it uses. The vast majority -// of the time, this will be either: -// "#!/usr/bin/env " -// or: -// "#! " -// -// Write a binroot/pkg.bin + ".cmd" file that has this line in it: -// @ %~dp0 %* + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; -module.exports = cmdShim -cmdShim.ifExists = cmdShimIfExists + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; -var fs = __webpack_require__(22) + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; -var mkdir = __webpack_require__(31) - , path = __webpack_require__(16) - , toBatchSyntax = __webpack_require__(32) - , shebangExpr = /^#\!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+=[^ \t]+\s+)*\s*([^ \t]+)(.*)$/ + if (match) { + getParsingFlags(config).iso = true; -function cmdShimIfExists (from, to, cb) { - fs.stat(from, function (er) { - if (er) return cb() - cmdShim(from, to, cb) - }) -} + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } -// Try to unlink, but ignore errors. -// Any problems will surface later. -function rm (path, cb) { - fs.unlink(path, function(er) { - cb() - }) -} + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; -function cmdShim (from, to, cb) { - fs.stat(from, function (er, stat) { - if (er) - return cb(er) + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; - cmdShim_(from, to, cb) - }) -} + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } -function cmdShim_ (from, to, cb) { - var then = times(2, next, cb) - rm(to, then) - rm(to + ".cmd", then) + return result; + } - function next(er) { - writeShim(from, to, cb) - } -} + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } -function writeShim (from, to, cb) { - // make a cmd file and a sh script - // First, check if the bin is a #! of some sort. - // If not, then assume it's something that'll be compiled, or some other - // sort of script, and just call it directly. - mkdir(path.dirname(to), function (er) { - if (er) - return cb(er) - fs.readFile(from, "utf8", function (er, data) { - if (er) return writeShim_(from, to, null, null, cb) - var firstLine = data.trim().split(/\r*\n/)[0] - , shebang = firstLine.match(shebangExpr) - if (!shebang) return writeShim_(from, to, null, null, null, cb) - var vars = shebang[1] || "" - , prog = shebang[2] - , args = shebang[3] || "" - return writeShim_(from, to, prog, args, vars, cb) - }) - }) -} + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } + var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; -function writeShim_ (from, to, prog, args, variables, cb) { - var shTarget = path.relative(path.dirname(to), from) - , target = shTarget.split("/").join("\\") - , longProg - , shProg = prog && prog.split("\\").join("/") - , shLongProg - , pwshProg = shProg && "\"" + shProg + "$exe\"" - , pwshLongProg - shTarget = shTarget.split("\\").join("/") - args = args || "" - variables = variables || "" - if (!prog) { - prog = "\"%~dp0\\" + target + "\"" - shProg = "\"$basedir/" + shTarget + "\"" - pwshProg = shProg - args = "" - target = "" - shTarget = "" - } else { - longProg = "\"%~dp0\\" + prog + ".exe\"" - shLongProg = "\"$basedir/" + prog + "\"" - pwshLongProg = "\"$basedir/" + prog + "$exe\"" - target = "\"%~dp0\\" + target + "\"" - shTarget = "\"$basedir/" + shTarget + "\"" - } + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } + } - // @SETLOCAL - // - // @IF EXIST "%~dp0\node.exe" ( - // @SET "_prog=%~dp0\node.exe" - // ) ELSE ( - // @SET "_prog=node" - // @SET PATHEXT=%PATHEXT:;.JS;=;% - // ) - // - // "%_prog%" "%~dp0\.\node_modules\npm\bin\npm-cli.js" %* - // @ENDLOCAL - var cmd - if (longProg) { - shLongProg = shLongProg.trim(); - args = args.trim(); - var variableDeclarationsAsBatch = toBatchSyntax.convertToSetCommands(variables) - cmd = "@SETLOCAL\r\n" - + variableDeclarationsAsBatch - + "\r\n" - + "@IF EXIST " + longProg + " (\r\n" - + " @SET \"_prog=" + longProg.replace(/(^")|("$)/g, '') + "\"\r\n" - + ") ELSE (\r\n" - + " @SET \"_prog=" + prog.replace(/(^")|("$)/g, '') + "\"\r\n" - + " @SET PATHEXT=%PATHEXT:;.JS;=;%\r\n" - + ")\r\n" - + "\r\n" - + "\"%_prog%\" " + args + " " + target + " %*\r\n" - + '@ENDLOCAL\r\n' - } else { - cmd = "@" + prog + " " + args + " " + target + " %*\r\n" - } + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } - // #!/bin/sh - // basedir=`dirname "$0"` - // - // case `uname` in - // *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; - // esac - // - // if [ -x "$basedir/node.exe" ]; then - // "$basedir/node.exe" "$basedir/node_modules/npm/bin/npm-cli.js" "$@" - // ret=$? - // else - // node "$basedir/node_modules/npm/bin/npm-cli.js" "$@" - // ret=$? - // fi - // exit $ret + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); - var sh = "#!/bin/sh\n" + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - sh = sh - + "basedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\,/,g')\")\n" - + "\n" - + "case `uname` in\n" - + " *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w \"$basedir\"`;;\n" - + "esac\n" - + "\n" + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } - if (shLongProg) { - sh = sh - + "if [ -x "+shLongProg+" ]; then\n" - + " " + variables + shLongProg + " " + args + " " + shTarget + " \"$@\"\n" - + " ret=$?\n" - + "else \n" - + " " + variables + shProg + " " + args + " " + shTarget + " \"$@\"\n" - + " ret=$?\n" - + "fi\n" - + "exit $ret\n" - } else { - sh = sh - + shProg + " " + args + " " + shTarget + " \"$@\"\n" - + "exit $?\n" - } + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); - // #!/usr/bin/env pwsh - // $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - // - // $ret=0 - // $exe = "" - // if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - // # Fix case when both the Windows and Linux builds of Node - // # are installed in the same directory - // $exe = ".exe" - // } - // if (Test-Path "$basedir/node") { - // & "$basedir/node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args - // $ret=$LASTEXITCODE - // } else { - // & "node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args - // $ret=$LASTEXITCODE - // } - // exit $ret - var pwsh = "#!/usr/bin/env pwsh\n" - + "$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n" - + "\n" - + "$exe=\"\"\n" - + "if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n" - + " # Fix case when both the Windows and Linux builds of Node\n" - + " # are installed in the same directory\n" - + " $exe=\".exe\"\n" - + "}\n" - if (shLongProg) { - pwsh = pwsh - + "$ret=0\n" - + "if (Test-Path " + pwshLongProg + ") {\n" - + " & " + pwshLongProg + " " + args + " " + shTarget + " $args\n" - + " $ret=$LASTEXITCODE\n" - + "} else {\n" - + " & " + pwshProg + " " + args + " " + shTarget + " $args\n" - + " $ret=$LASTEXITCODE\n" - + "}\n" - + "exit $ret\n" - } else { - pwsh = pwsh - + "& " + pwshProg + " " + args + " " + shTarget + " $args\n" - + "exit $LASTEXITCODE\n" - } + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } - var then = times(3, next, cb) - fs.writeFile(to + ".ps1", pwsh, "utf8", then) - fs.writeFile(to + ".cmd", cmd, "utf8", then) - fs.writeFile(to, sh, "utf8", then) - function next () { - chmodShim(to, cb) - } -} + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } -function chmodShim (to, cb) { - var then = times(2, cb, cb) - fs.chmod(to, "0755", then) - fs.chmod(to + ".cmd", "0755", then) - fs.chmod(to + ".ps1", "0755", then) -} + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } -function times(n, ok, cb) { - var errState = null - return function(er) { - if (!errState) { - if (er) - cb(errState = er) - else if (--n === 0) - ok() + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); } - } -} + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { + // constant that refers to the ISO standard + hooks.ISO_8601 = function () {}; -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(24) -var legacy = __webpack_require__(26) -var clone = __webpack_require__(28) + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () {}; -var util = __webpack_require__(29) + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; -/* istanbul ignore next - node 0.x polyfill */ -var gracefulQueue -var previousSymbol - -/* istanbul ignore else - node 0.x polyfill */ -if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { - gracefulQueue = Symbol.for('graceful-fs.queue') - // This is used in testing by future versions - previousSymbol = Symbol.for('graceful-fs.previous') -} else { - gracefulQueue = '___graceful-fs.queue' - previousSymbol = '___graceful-fs.previous' -} + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; -function noop () {} + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } -// Once time initialization -if (!global[gracefulQueue]) { - // This queue can be shared by multiple loaded instances - var queue = [] - Object.defineProperty(global, gracefulQueue, { - get: function() { - return queue - } - }) + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } - // Patch fs.close/closeSync to shared queue version, because we need - // to retry() whenever a close happens *anywhere* in the program. - // This is essential when multiple graceful-fs instances are - // in play at the same time. - fs.close = (function (fs$close) { - function close (fd, cb) { - return fs$close.call(fs, fd, function (err) { - // This function uses the graceful-fs shared queue - if (!err) { - retry() + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; } - if (typeof cb === 'function') - cb.apply(this, arguments) - }) + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); } - Object.defineProperty(close, previousSymbol, { - value: fs$close - }) - return close - })(fs.close) - fs.closeSync = (function (fs$closeSync) { - function closeSync (fd) { - // This function uses the graceful-fs shared queue - fs$closeSync.apply(fs, arguments) - retry() + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } } - Object.defineProperty(closeSync, previousSymbol, { - value: fs$closeSync - }) - return closeSync - })(fs.closeSync) + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, - if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(global[gracefulQueue]) - __webpack_require__(30).equal(global[gracefulQueue].length, 0) - }) - } -} + scoreToBeat, + i, + currentScore; -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null + if (!isValid(tempConfig)) { + continue; + } - return go$readFile(path, options, cb) + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } } - }) + + extend(config, bestMoment || tempConfig); } - } - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + function configFromObject(config) { + if (config._d) { + return; + } - return go$writeFile(path, data, options, cb) + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; } - }) + + return res; } - } - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + function prepareConfig (config) { + var input = config._i, + format = config._f; - return go$appendFile(path, data, options, cb) + config._locale = config._locale || getLocale(config._l); - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); } - }) - } - } - - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) - return go$readdir(args) + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) + if (!isValid(config)) { + config._d = null; + } - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } + return config; } - } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; - Object.defineProperty(fs, 'ReadStream', { - get: function () { - return ReadStream - }, - set: function (val) { - ReadStream = val - }, - enumerable: true, - configurable: true - }) - Object.defineProperty(fs, 'WriteStream', { - get: function () { - return WriteStream - }, - set: function (val) { - WriteStream = val - }, - enumerable: true, - configurable: true - }) + return createFromConfig(c); + } - // legacy names - var FileReadStream = ReadStream - Object.defineProperty(fs, 'FileReadStream', { - get: function () { - return FileReadStream - }, - set: function (val) { - FileReadStream = val - }, - enumerable: true, - configurable: true - }) - var FileWriteStream = WriteStream - Object.defineProperty(fs, 'FileWriteStream', { - get: function () { - return FileWriteStream - }, - set: function (val) { - FileWriteStream = val - }, - enumerable: true, - configurable: true - }) + function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ); - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } + return pickBy('isBefore', args); + } - function createReadStream (path, options) { - return new fs.ReadStream(path, options) - } + function max () { + var args = [].slice.call(arguments, 0); - function createWriteStream (path, options) { - return new fs.WriteStream(path, options) - } + return pickBy('isAfter', args); + } - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; - return go$open(path, flags, mode, cb) + var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } } - }) - } - } - return fs -} + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - global[gracefulQueue].push(elem) -} + return true; + } -function retry () { - var elem = global[gracefulQueue].shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + function isValid$1() { + return this._isValid; + } + function createInvalid$1() { + return createDuration(NaN); + } -/***/ }), -/* 23 */ -/***/ (function(module, exports) { + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || normalizedInput.isoWeek || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; -module.exports = require("fs"); + this._isValid = isDurationValid(normalizedInput); -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; -var constants = __webpack_require__(25) + this._data = {}; -var origCwd = process.cwd -var cwd = null + this._locale = getLocale(); -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform + this._bubble(); + } -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} + function isDuration (obj) { + return obj instanceof Duration; + } -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } -module.exports = patch + // FORMATTING -function patch (fs) { - // (re-)implement some things that are known busted or missing. + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } + offset('Z', ':'); + offset('ZZ', ''); - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } + // PARSING - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) + // HELPERS - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) + if (matches === null) { + return null; + } - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; + } - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; } - fs.lchownSync = function () {} - } - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. + // HOOKS - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () {}; - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { - function read (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) } - // This ensures `util.promisify` works as it does for native `fs.read`. - read.__proto__ = fs$read - return read - })(fs.read) + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); } - throw er - } } - }})(fs.readSync) - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); } - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } } - } - return ret + return this; } - } - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } + function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; + } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } + function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; } - return ret - } + input = input ? createLocal(input).utcOffset() : 0; - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} + return (this.utcOffset() - input) % 60 === 0; } - } - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); } - } - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; } - } + function isLocal () { + return this.isValid() ? !this._isUTC : false; + } - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; } - } - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; } - } - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - function callback (er, stats) { - if (stats) { - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - } - if (cb) cb.apply(this, arguments) - } - return options ? orig.call(fs, target, options, callback) - : orig.call(fs, target, callback) - } - } - - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, options) { - var stats = options ? orig.call(fs, target, options) - : orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; - } - } + // ASP.NET json date format regex + var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - if (er.code === "ENOSYS") - return true + function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); - return false - } -} + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + ret = new Duration(duration); -/***/ }), -/* 25 */ -/***/ (function(module, exports) { + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } -module.exports = require("constants"); + return ret; + } -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; -var Stream = __webpack_require__(27).Stream + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } -module.exports = legacy + function positiveMomentsDifference(base, other) { + var res = {}; -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - Stream.call(this); + return res; + } - var self = this; + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; + return res; + } - options = options || {}; + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; } - if (this.encoding) this.setEncoding(this.encoding); - - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } + function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); - if (this.start > this.end) { - throw new Error('start must be <= end'); - } + if (!mom.isValid()) { + // No op + return; + } - this.pos = this.start; - } + updateOffset = updateOffset == null ? true : updateOffset; - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } } - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } + var add = createAdder(1, 'add'); + var subtract = createAdder(-1, 'subtract'); - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + } - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); + function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; - Stream.call(this); + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); - this.path = path; - this.fd = null; - this.writable = true; + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); + } - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; + function clone () { + return new Moment(this); + } - options = options || {}; + function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } } - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } + function isBetween (from, to, units, inclusivity) { + var localFrom = isMoment(from) ? from : createLocal(from), + localTo = isMoment(to) ? to : createLocal(to); + if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { + return false; + } + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && + (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); + } - this.pos = this.start; + function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } } - this.busy = false; - this._queue = []; + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input, units); + } - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input, units); } - } -} + function diff (input, units, asFloat) { + var that, + zoneDelta, + output; -/***/ }), -/* 27 */ -/***/ (function(module, exports) { + if (!this.isValid()) { + return NaN; + } -module.exports = require("stream"); + that = cloneWithOffset(input, this); -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { + if (!that.isValid()) { + return NaN; + } -"use strict"; + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + units = normalizeUnits(units); -module.exports = clone + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj + return asFloat ? output : absFloor(output); + } - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } - return copy -} + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; -/***/ }), -/* 29 */ -/***/ (function(module, exports) { + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } -module.exports = require("util"); + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } -/***/ }), -/* 30 */ -/***/ (function(module, exports) { + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; -module.exports = require("assert"); + return this.format(prefix + year + datetime + suffix); + } -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { + function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } -var path = __webpack_require__(16); -var fs = __webpack_require__(23); -var _0777 = parseInt('0777', 8); + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } -function mkdirP (p, opts, f, made) { - if (typeof opts === 'function') { - f = opts; - opts = {}; + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } } - else if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; + + function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - p = path.resolve(p); - - xfs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; } - switch (er.code) { - case 'ENOENT': - if (path.dirname(p) === p) return cb(er); - mkdirP(path.dirname(p), opts, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, opts, cb, made); - }); - break; + } - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - xfs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } } - }); -} + ); -mkdirP.sync = function sync (p, opts, made) { - if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; + function localeData () { + return this._locale; } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); + + var MS_PER_SECOND = 1000; + var MS_PER_MINUTE = 60 * MS_PER_SECOND; + var MS_PER_HOUR = 60 * MS_PER_MINUTE; + var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; + + // actual modulo - handles negative numbers (for dates before 1970): + function mod$1(dividend, divisor) { + return (dividend % divisor + divisor) % divisor; } - if (!made) made = null; - p = path.resolve(p); + function localStartOfDate(y, m, d) { + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return new Date(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return new Date(y, m, d).valueOf(); + } + } - try { - xfs.mkdirSync(p, mode); - made = made || p; + function utcStartOfDate(y, m, d) { + // Date.UTC remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return Date.UTC(y, m, d); + } } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), opts, made); - sync(p, opts, made); - break; - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - var stat; - try { - stat = xfs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; + function startOf (units) { + var time; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + + var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + + switch (units) { + case 'year': + time = startOfDate(this.year(), 0, 1); + break; + case 'quarter': + time = startOfDate(this.year(), this.month() - this.month() % 3, 1); + break; + case 'month': + time = startOfDate(this.year(), this.month(), 1); + break; + case 'week': + time = startOfDate(this.year(), this.month(), this.date() - this.weekday()); + break; + case 'isoWeek': + time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date()); + break; + case 'hour': + time = this._d.valueOf(); + time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR); + break; + case 'minute': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_MINUTE); + break; + case 'second': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_SECOND); break; } + + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; } - return made; -}; + function endOf (units) { + var time; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; -/***/ }), -/* 32 */ -/***/ (function(module, exports) { + switch (units) { + case 'year': + time = startOfDate(this.year() + 1, 0, 1) - 1; + break; + case 'quarter': + time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; + break; + case 'month': + time = startOfDate(this.year(), this.month() + 1, 1) - 1; + break; + case 'week': + time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; + break; + case 'isoWeek': + time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; + break; + case 'hour': + time = this._d.valueOf(); + time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1; + break; + case 'minute': + time = this._d.valueOf(); + time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; + break; + case 'second': + time = this._d.valueOf(); + time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; + break; + } -exports.replaceDollarWithPercentPair = replaceDollarWithPercentPair -exports.convertToSetCommand = convertToSetCommand -exports.convertToSetCommands = convertToSetCommands - -function convertToSetCommand(key, value) { - var line = "" - key = key || "" - key = key.trim() - value = value || "" - value = value.trim() - if(key && value && value.length > 0) { - line = "@SET " + key + "=" + replaceDollarWithPercentPair(value) + "\r\n" - } - return line -} - -function extractVariableValuePairs(declarations) { - var pairs = {} - declarations.map(function(declaration) { - var split = declaration.split("=") - pairs[split[0]]=split[1] - }) - return pairs -} - -function convertToSetCommands(variableString) { - var variableValuePairs = extractVariableValuePairs(variableString.split(" ")) - var variableDeclarationsAsBatch = "" - Object.keys(variableValuePairs).forEach(function (key) { - variableDeclarationsAsBatch += convertToSetCommand(key, variableValuePairs[key]) - }) - return variableDeclarationsAsBatch -} - -function replaceDollarWithPercentPair(value) { - var dollarExpressions = /\$\{?([^\$@#\?\- \t{}:]+)\}?/g - var result = "" - var startIndex = 0 - value = value || "" - do { - var match = dollarExpressions.exec(value) - if(match) { - var betweenMatches = value.substring(startIndex, match.index) || "" - result += betweenMatches + "%" + match[1] + "%" - startIndex = dollarExpressions.lastIndex - } - } while (dollarExpressions.lastIndex > 0) - result += value.substr(startIndex) - return result -} - - + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { + function unix () { + return Math.floor(this.valueOf() / 1000); + } -var fs = __webpack_require__(23), - path = __webpack_require__(16); + function toDate () { + return new Date(this.valueOf()); + } -module.exports = ncp; -ncp.ncp = ncp; + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } -function ncp (source, dest, options, callback) { - var cback = callback; + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } - if (!callback) { - cback = options; - options = {}; - } + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } - var basePath = process.cwd(), - currentPath = path.resolve(basePath, source), - targetPath = path.resolve(basePath, dest), - filter = options.filter, - rename = options.rename, - transform = options.transform, - clobber = options.clobber !== false, - modified = options.modified, - dereference = options.dereference, - errs = null, - started = 0, - finished = 0, - running = 0, - limit = options.limit || ncp.limit || 16; + function isValid$2 () { + return isValid(this); + } - limit = (limit < 1) ? 1 : (limit > 512) ? 512 : limit; + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } - startCopy(currentPath); - - function startCopy(source) { - started++; - if (filter) { - if (filter instanceof RegExp) { - if (!filter.test(source)) { - return cb(true); - } - } - else if (typeof filter === 'function') { - if (!filter(source)) { - return cb(true); - } - } + function invalidAt () { + return getParsingFlags(this).overflow; } - return getStats(source); - } - function getStats(source) { - var stat = dereference ? fs.stat : fs.lstat; - if (running >= limit) { - return setImmediate(function () { - getStats(source); - }); + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; } - running++; - stat(source, function (err, stats) { - var item = {}; - if (err) { - return onError(err); - } - // We need to get the mode from the stats object and preserve it. - item.name = source; - item.mode = stats.mode; - item.mtime = stats.mtime; //modified time - item.atime = stats.atime; //access time + // FORMATTING - if (stats.isDirectory()) { - return onDir(item); - } - else if (stats.isFile()) { - return onFile(item); - } - else if (stats.isSymbolicLink()) { - // Symlinks don't really need to know about the mode. - return onLink(source); - } + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; }); - } - function onFile(file) { - var target = file.name.replace(currentPath, targetPath); - if(rename) { - target = rename(target); - } - isWritable(target, function (writable) { - if (writable) { - return copyFile(file, target); - } - if(clobber) { - rmFile(target, function () { - copyFile(file, target); - }); - } - if (modified) { - var stat = dereference ? fs.stat : fs.lstat; - stat(target, function(err, stats) { - //if souce modified time greater to target modified time copy file - if (file.mtime.getTime()>stats.mtime.getTime()) - copyFile(file, target); - else return cb(); - }); - } - else { - return cb(); - } + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; }); - } - function copyFile(file, target) { - var readStream = fs.createReadStream(file.name), - writeStream = fs.createWriteStream(target, { mode: file.mode }); - - readStream.on('error', onError); - writeStream.on('error', onError); - - if(transform) { - transform(readStream, writeStream, file); - } else { - writeStream.on('open', function() { - readStream.pipe(writeStream); - }); + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); } - writeStream.once('finish', function() { - if (modified) { - //target file modified date sync. - fs.utimesSync(target, file.atime, file.mtime); - cb(); - } - else cb(); - }); - } - function rmFile(file, done) { - fs.unlink(file, function (err) { - if (err) { - return onError(err); - } - return done(); - }); - } + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - function onDir(dir) { - var target = dir.name.replace(currentPath, targetPath); - isWritable(target, function (writable) { - if (writable) { - return mkDir(dir, target); - } - copyDir(dir.name); - }); - } + // ALIASES - function mkDir(dir, target) { - fs.mkdir(target, dir.mode, function (err) { - if (err) { - return onError(err); - } - copyDir(dir.name); - }); - } + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); - function copyDir(dir) { - fs.readdir(dir, function (err, items) { - if (err) { - return onError(err); - } - items.forEach(function (item) { - startCopy(path.join(dir, item)); - }); - return cb(); + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); }); - } - function onLink(link) { - var target = link.replace(currentPath, targetPath); - fs.readlink(link, function (err, resolvedPath) { - if (err) { - return onError(err); - } - checkLink(resolvedPath, target); + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); }); - } - function checkLink(resolvedPath, target) { - if (dereference) { - resolvedPath = path.resolve(basePath, resolvedPath); - } - isWritable(target, function (writable) { - if (writable) { - return makeLink(resolvedPath, target); - } - fs.readlink(target, function (err, targetDest) { - if (err) { - return onError(err); - } - if (dereference) { - targetDest = path.resolve(basePath, targetDest); - } - if (targetDest === resolvedPath) { - return cb(); - } - return rmFile(target, function () { - makeLink(resolvedPath, target); - }); - }); - }); - } - - function makeLink(linkPath, target) { - fs.symlink(linkPath, target, function (err) { - if (err) { - return onError(err); - } - return cb(); - }); - } - - function isWritable(path, done) { - fs.lstat(path, function (err) { - if (err) { - if (err.code === 'ENOENT') return done(true); - return done(false); - } - return done(false); - }); - } + // MOMENTS - function onError(err) { - if (options.stopOnError) { - return cback(err); + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); } - else if (!errs && options.errs) { - errs = fs.createWriteStream(options.errs); + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); } - else if (!errs) { - errs = []; + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); } - if (typeof errs.write === 'undefined') { - errs.push(err); + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } - else { - errs.write(err.stack + '\n\n'); + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } } - return cb(); - } - function cb(skipped) { - if (!skipped) running--; - finished++; - if ((started === finished) && (running === 0)) { - if (cback !== undefined ) { - return errs ? cback(errs) : cback(null); - } + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; } - } -} + // FORMATTING + addFormatToken('Q', 0, 'Qo', 'quarter'); + // ALIASES -/***/ }), -/* 34 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + addUnitAlias('quarter', 'Q'); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; }); -/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(35); -/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__); -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + // PRIORITY -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ + addUnitPriority('quarter', 7); + // PARSING -class Log extends _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["ToolingLog"] { - constructor() { - super({ - level: 'info', - writeTo: process.stdout + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; }); - _defineProperty(this, "testWriter", void 0); - } - /** - * Log something to the console. Ideally we would use a real logger in - * kbn-pm, but that's a pretty big change for now. - * @param ...args - */ - + // MOMENTS - write(...args) { - // eslint-disable-next-line no-console - console.log(...args); - } + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } -} + // FORMATTING -const log = new Log(); + addFormatToken('D', ['DD', 2], 'Do', 'date'); -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { + // ALIASES -"use strict"; + addUnitAlias('date', 'D'); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -var proc_runner_1 = __webpack_require__(37); -exports.withProcRunner = proc_runner_1.withProcRunner; -exports.ProcRunner = proc_runner_1.ProcRunner; -tslib_1.__exportStar(__webpack_require__(414), exports); -var serializers_1 = __webpack_require__(419); -exports.createAbsolutePathSerializer = serializers_1.createAbsolutePathSerializer; -var certs_1 = __webpack_require__(443); -exports.CA_CERT_PATH = certs_1.CA_CERT_PATH; -exports.ES_KEY_PATH = certs_1.ES_KEY_PATH; -exports.ES_CERT_PATH = certs_1.ES_CERT_PATH; -exports.ES_P12_PATH = certs_1.ES_P12_PATH; -exports.ES_P12_PASSWORD = certs_1.ES_P12_PASSWORD; -exports.ES_EMPTYPASSWORD_P12_PATH = certs_1.ES_EMPTYPASSWORD_P12_PATH; -exports.ES_NOPASSWORD_P12_PATH = certs_1.ES_NOPASSWORD_P12_PATH; -exports.KBN_KEY_PATH = certs_1.KBN_KEY_PATH; -exports.KBN_CERT_PATH = certs_1.KBN_CERT_PATH; -exports.KBN_P12_PATH = certs_1.KBN_P12_PATH; -exports.KBN_P12_PASSWORD = certs_1.KBN_P12_PASSWORD; -var run_1 = __webpack_require__(444); -exports.run = run_1.run; -exports.createFailError = run_1.createFailError; -exports.createFlagError = run_1.createFlagError; -exports.combineErrors = run_1.combineErrors; -exports.isFailError = run_1.isFailError; -var repo_root_1 = __webpack_require__(421); -exports.REPO_ROOT = repo_root_1.REPO_ROOT; -var kbn_client_1 = __webpack_require__(449); -exports.KbnClient = kbn_client_1.KbnClient; -tslib_1.__exportStar(__webpack_require__(492), exports); -tslib_1.__exportStar(__webpack_require__(499), exports); + // PRIORITY + addUnitPriority('date', 9); + // PARSING -/***/ }), -/* 36 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; + }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; }); -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -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 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - } - return __assign.apply(this, arguments); -} - -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) - t[p[i]] = s[p[i]]; - return t; -} - -function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} - -function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -} - -function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); -} - -function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -function __exportStar(m, exports) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} - -function __values(o) { - var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; - if (m) return m.call(o); - return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - } - }; -} - -function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } - catch (error) { e = { error: error }; } - finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } - finally { if (e) throw e.error; } - } - return ar; -} - -function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; -} - -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} - -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } -} - -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } -} - -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } -} - -function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } - return cooked; -}; - -function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result.default = mod; - return result; -} - -function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; -} + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + // MOMENTS -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { + var getSetDayOfMonth = makeGetSet('Date', true); -"use strict"; + // FORMATTING -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var with_proc_runner_1 = __webpack_require__(38); -exports.withProcRunner = with_proc_runner_1.withProcRunner; -var proc_runner_1 = __webpack_require__(39); -exports.ProcRunner = proc_runner_1.ProcRunner; + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + // ALIASES -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { + addUnitAlias('dayOfYear', 'DDD'); -"use strict"; + // PRIORITY + addUnitPriority('dayOfYear', 4); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const proc_runner_1 = __webpack_require__(39); -/** - * Create a ProcRunner and pass it to an async function. When - * the async function finishes the ProcRunner is torn-down - * automatically - * - * @param {ToolingLog} log - * @param {async Function} fn - * @return {Promise} - */ -async function withProcRunner(log, fn) { - const procs = new proc_runner_1.ProcRunner(log); - try { - await fn(procs); - } - finally { - await procs.teardown(); - } -} -exports.withProcRunner = withProcRunner; + // PARSING + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { + // HELPERS -"use strict"; + // MOMENTS -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const moment_1 = tslib_1.__importDefault(__webpack_require__(40)); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(368)); -const errors_1 = __webpack_require__(369); -const proc_1 = __webpack_require__(370); -const SECOND = 1000; -const MINUTE = 60 * SECOND; -const noop = () => { }; -/** - * Helper for starting and managing processes. In many ways it resembles the - * API from `grunt_run`, processes are named and can be started, waited for, - * backgrounded once they log something matching a RegExp... - * - * @class ProcRunner - */ -class ProcRunner { - constructor(log) { - this.log = log; - this.closing = false; - this.procs = []; - this.signalUnsubscribe = exit_hook_1.default(() => { - this.teardown().catch((error) => { - log.error(`ProcRunner teardown error: ${error.stack}`); - }); - }); - } - /** - * Start a process, tracking it by `name` - * @param {String} name - * @param {Object} options - * @property {String} options.cmd executable to run - * @property {Array?} options.args arguments to provide the executable - * @property {String?} options.cwd current working directory for the process - * @property {RegExp|Boolean} options.wait Should start() wait for some time? Use - * `true` will wait until the proc exits, - * a `RegExp` will wait until that log line - * is found - * @return {Promise} - */ - async run(name, options) { - const { cmd, args = [], cwd = process.cwd(), stdin = undefined, wait = false, waitTimeout = 15 * MINUTE, env = process.env, } = options; - if (this.closing) { - throw new Error('ProcRunner is closing'); - } - if (wait && !(wait instanceof RegExp) && wait !== true) { - throw new TypeError('wait param should either be a RegExp or `true`'); - } - if (!!this.getProc(name)) { - throw new Error(`Process with name "${name}" already running`); - } - const proc = this.startProc(name, { - cmd, - args, - cwd, - env, - stdin, - }); - try { - if (wait instanceof RegExp) { - // wait for process to log matching line - await Rx.race(proc.lines$.pipe(operators_1.filter((line) => wait.test(line)), operators_1.first(), operators_1.catchError((err) => { - if (err.name !== 'EmptyError') { - throw errors_1.createCliError(`[${name}] exited without matching pattern: ${wait}`); - } - else { - throw err; - } - })), waitTimeout === false - ? Rx.NEVER - : Rx.timer(waitTimeout).pipe(operators_1.map(() => { - const sec = waitTimeout / SECOND; - throw errors_1.createCliError(`[${name}] failed to match pattern within ${sec} seconds [pattern=${wait}]`); - }))).toPromise(); - } - if (wait === true) { - // wait for process to complete - await proc.outcomePromise; - } - } - finally { - // while the procRunner closes promises will resolve/reject because - // processes and stopping, but consumers of run() shouldn't have to - // prepare for that, so just return a never-resolving promise - if (this.closing) { - await new Promise(noop); - } - } - } - /** - * Stop a named proc - */ - async stop(name, signal = 'SIGTERM') { - const proc = this.getProc(name); - if (proc) { - await proc.stop(signal); - } - else { - this.log.warning('[%s] already stopped', name); - } - } - /** - * Wait for all running processes to stop naturally - * @return {Promise} - */ - async waitForAllToStop() { - await Promise.all(this.procs.map((proc) => proc.outcomePromise)); - } - /** - * Close the ProcRunner and stop all running - * processes with `signal` - * - * @param {String} [signal=undefined] - * @return {Promise} - */ - async teardown(signal = 'exit') { - if (this.closing) { - return; - } - this.closing = true; - this.signalUnsubscribe(); - if (!signal && this.procs.length > 0) { - this.log.warning('%d processes left running, stop them with procs.stop(name):', this.procs.length, this.procs.map((proc) => proc.name)); - } - await Promise.all(this.procs.map(async (proc) => { - await proc.stop(signal === 'exit' ? 'SIGKILL' : signal); - })); - } - getProc(name) { - return this.procs.find((proc) => { - return proc.name === name; - }); - } - startProc(name, options) { - const startMs = Date.now(); - const proc = proc_1.startProc(name, options, this.log); - this.procs.push(proc); - const remove = () => { - this.procs.splice(this.procs.indexOf(proc), 1); - }; - // tie into proc outcome$, remove from _procs on compete - proc.outcome$.subscribe({ - next: (code) => { - const duration = moment_1.default.duration(Date.now() - startMs); - this.log.info('[%s] exited with %s after %s', name, code, duration.humanize()); - }, - complete: () => { - remove(); - }, - error: (error) => { - if (this.closing) { - this.log.error(error); - } - remove(); - }, - }); - return proc; + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); } -} -exports.ProcRunner = ProcRunner; - - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(module) {var require;//! moment.js -;(function (global, factory) { - true ? module.exports = factory() : - undefined -}(this, (function () { 'use strict'; + // FORMATTING - var hookCallback; + addFormatToken('m', ['mm', 2], 0, 'minute'); - function hooks () { - return hookCallback.apply(null, arguments); - } + // ALIASES - // This is done to register the method called with moment() - // without creating circular dependencies. - function setHookCallback (callback) { - hookCallback = callback; - } + addUnitAlias('minute', 'm'); - function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; - } + // PRIORITY - function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return input != null && Object.prototype.toString.call(input) === '[object Object]'; - } + addUnitPriority('minute', 14); - function isObjectEmpty(obj) { - if (Object.getOwnPropertyNames) { - return (Object.getOwnPropertyNames(obj).length === 0); - } else { - var k; - for (k in obj) { - if (obj.hasOwnProperty(k)) { - return false; - } - } - return true; - } - } + // PARSING - function isUndefined(input) { - return input === void 0; - } + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); - function isNumber(input) { - return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; - } + // MOMENTS - function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; - } + var getSetMinute = makeGetSet('Minutes', false); - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } + // FORMATTING - function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); - } + addFormatToken('s', ['ss', 2], 0, 'second'); - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } + // ALIASES - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } + addUnitAlias('second', 's'); - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } + // PRIORITY - return a; - } + addUnitPriority('second', 15); - function createUTC (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); - } + // PARSING - function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso : false, - parsedDateParts : [], - meridiem : null, - rfc2822 : false, - weekdayMismatch : false - }; - } + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); - function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; - } + // MOMENTS - var some; - if (Array.prototype.some) { - some = Array.prototype.some; - } else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; + var getSetSecond = makeGetSet('Seconds', false); - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } + // FORMATTING - return false; - }; - } + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); - function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some.call(flags.parsedDateParts, function (i) { - return i != null; - }); - var isNowValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.weekdayMismatch && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); - if (m._strict) { - isNowValid = isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } - else { - return isNowValid; - } - } - return m._isValid; - } - function createInvalid (flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } + // ALIASES - return m; - } + addUnitAlias('millisecond', 'ms'); - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - var momentProperties = hooks.momentProperties = []; + // PRIORITY - function copyConfig(to, from) { - var i, prop, val; + addUnitPriority('millisecond', 16); - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } + // PARSING - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); - return to; + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); } - var updateInProgress = false; - - // Moment prototype object - function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); } - function isMoment (obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); } + // MOMENTS - function absFloor (number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } - } + var getSetMillisecond = makeGetSet('Milliseconds', false); - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; + // FORMATTING - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); - return value; - } + // MOMENTS - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; } - function warn(msg) { - if (hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; } - function deprecate(msg, fn) { - var firstTime = true; + var proto = Moment.prototype; - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = []; - var arg; - for (var i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (var key in arguments[0]) { - arg += key + ': ' + arguments[0][key] + ', '; - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + function createUnix (input) { + return createLocal(input * 1000); } - var deprecations = {}; + function createInZone () { + return createLocal.apply(null, arguments).parseZone(); + } - function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } + function preParsePostFormat (string) { + return string; } - hooks.suppressDeprecationWarnings = false; - hooks.deprecationHandler = null; + var proto$1 = Locale.prototype; - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; - function set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. - // TODO: Remove "ordinalParse" fallback in next major release. - this._dayOfMonthOrdinalParseLenient = new RegExp( - (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + - '|' + (/\d{1,2}/).source); + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); } - function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } + function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; } - for (prop in parentConfig) { - if (hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop])) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); } - return res; - } - function Locale(config) { - if (config != null) { - this.set(config); + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); } + return out; } - var keys; - - if (Object.keys) { - keys = Object.keys; - } else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; } - return res; - }; - } - var defaultCalendar = { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }; + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; - function calendar (key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; - } + if (isNumber(format)) { + index = format; + format = undefined; + } - var defaultLongDateFormat = { - LTS : 'h:mm:ss A', - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }; + format = format || ''; + } - function longDateFormat (key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; - if (format || !formatUpper) { - return format; + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); } - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; } - var defaultInvalidDate = 'Invalid date'; - - function invalidDate () { - return this._invalidDate; + function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); } - var defaultOrdinal = '%d'; - var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - - function ordinal (number) { - return this._ordinal.replace('%d', number); + function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); } - var defaultRelativeTime = { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }; - - function relativeTime (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); + function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } - function pastFuture (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); + function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } - var aliases = {}; - - function addUnitAlias (unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } - function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; - } + getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; + // Side effect imports - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); + hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - return normalizedInput; - } + var mathAbs = Math.abs; - var priorities = {}; + function abs () { + var data = this._data; - function addUnitPriority(unit, priority) { - priorities[unit] = priority; - } + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); - function getPrioritizedUnits(unitsObj) { - var units = []; - for (var u in unitsObj) { - units.push({unit: u, priority: priorities[u]}); - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; - } + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); - function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + return this; } - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); - var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; - var formatFunctions = {}; + return duration._bubble(); + } - var formatTokenFunctions = {}; + // supports only 2.0-style add(1, 's') or add(duration) + function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); + } - // token: 'M' - // padded: ['MM', 2] - // ordinal: 'Mo' - // callback: function () { this.month() + 1 } - function addFormatToken (token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); } - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); } - return input.replace(/\\/g, ''); } - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; } - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; - return formatFunctions[format](m); - } + hours = absFloor(minutes / 60); + data.hours = hours % 24; - function expandFormat(format, locale) { - var i = 5; + days += absFloor(hours / 24); - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - var match1 = /\d/; // 0 - 9 - var match2 = /\d\d/; // 00 - 99 - var match3 = /\d{3}/; // 000 - 999 - var match4 = /\d{4}/; // 0000 - 9999 - var match6 = /[+-]?\d{6}/; // -999999 - 999999 - var match1to2 = /\d\d?/; // 0 - 99 - var match3to4 = /\d\d\d\d?/; // 999 - 9999 - var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 - var match1to3 = /\d{1,3}/; // 0 - 999 - var match1to4 = /\d{1,4}/; // 0 - 9999 - var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - - var matchUnsigned = /\d+/; // 0 - inf - var matchSigned = /[+-]?\d+/; // -inf - inf - - var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z - var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - - var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - - // any word (or two) characters or numbers including two/three word month in arabic. - // includes scottish gaelic two word and hyphenated months - var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; - var regexes = {}; + data.days = days; + data.months = months; + data.years = years; - function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; + return this; } - function getParseRegexForToken (token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; } - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; } - function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } + function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; - var tokens = {}; + units = normalizeUnits(units); - function addParseToken (token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; + if (units === 'month' || units === 'quarter' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + switch (units) { + case 'month': return months; + case 'quarter': return months / 3; + case 'year': return months / 12; + } + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } } } - function addWeekParseToken (token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); - } - - function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); + // TODO: Use this.as('ms')? + function valueOf$1 () { + if (!this.isValid()) { + return NaN; } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); } - var YEAR = 0; - var MONTH = 1; - var DATE = 2; - var HOUR = 3; - var MINUTE = 4; - var SECOND = 5; - var MILLISECOND = 6; - var WEEK = 7; - var WEEKDAY = 8; - - // FORMATTING - - addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; - }); + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } - addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; - }); + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asQuarters = makeAs('Q'); + var asYears = makeAs('y'); - addFormatToken(0, ['YYYY', 4], 0, 'year'); - addFormatToken(0, ['YYYYY', 5], 0, 'year'); - addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + function clone$1 () { + return createDuration(this); + } - // ALIASES + function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } - addUnitAlias('year', 'y'); + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } - // PRIORITIES + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); - addUnitPriority('year', 1); + function weeks () { + return absFloor(this.days() / 7); + } - // PARSING + var round = Math.round; + var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year + }; - addRegexToken('Y', matchSigned); - addRegexToken('YY', match1to2, match2); - addRegexToken('YYYY', match1to4, match4); - addRegexToken('YYYYY', match1to6, match6); - addRegexToken('YYYYYY', match1to6, match6); + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } - addParseToken(['YYYYY', 'YYYYYY'], YEAR); - addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); - }); - addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); - }); - addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); - }); + function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); - // HELPERS + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); } - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; } - // HOOKS - - hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; + } - // MOMENTS + function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } - var getSetYear = makeGetSet('FullYear', true); + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); - function getIsLeapYear () { - return isLeapYear(this.year()); - } + if (withSuffix) { + output = locale.pastFuture(+this, output); + } - function makeGetSet (unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; + return locale.postformat(output); } - function get (mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; - } + var abs$1 = Math.abs; - function set$1 (mom, unit, value) { - if (mom.isValid() && !isNaN(value)) { - if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); - } - else { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } + function sign(x) { + return ((x > 0) - (x < 0)) || +x; } - // MOMENTS - - function stringGet (units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); } - return this; - } + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; - function stringSet (units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units); - for (var i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; - } + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; - function mod(n, x) { - return ((n % x) + x) % x; - } + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; - var indexOf; - if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; - } else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; - } + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); - function daysInMonth(year, month) { - if (isNaN(year) || isNaN(month)) { - return NaN; + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; } - var modMonth = mod(month, 12); - year += (month - modMonth) / 12; - return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); - } - // FORMATTING + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; - addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; - }); + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); + } - addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); - }); + var proto$2 = Duration.prototype; - addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); - }); + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asQuarters = asQuarters; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; - // ALIASES + proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); + proto$2.lang = lang; - addUnitAlias('month', 'M'); + // Side effect imports - // PRIORITY + // FORMATTING - addUnitPriority('month', 8); + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); // PARSING - addRegexToken('M', match1to2); - addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); - }); - addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); }); - - addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); }); - addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } - }); + // Side effect imports - // LOCALES - var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - function localeMonths (m, format) { - if (!m) { - return isArray(this._months) ? this._months : - this._months['standalone']; - } - return isArray(this._months) ? this._months[m.month()] : - this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; - } + hooks.version = '2.24.0'; - var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - function localeMonthsShort (m, format) { - if (!m) { - return isArray(this._monthsShort) ? this._monthsShort : - this._monthsShort['standalone']; - } - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; - } + setHookCallback(createLocal); - function handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; - if (strict) { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } - } + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'GGGG-[W]WW', // + MONTH: 'YYYY-MM' // + }; - function localeMonthsParse (monthName, format, strict) { - var i, mom, regex; + return hooks; - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } +}))); - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - } +/***/ }), +/* 11 */ +/***/ (function(module, exports) { - // MOMENTS +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; - function setMonth (mom, value) { - var dayOfMonth; - if (!mom.isValid()) { - // No op - return mom; - } +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } +var map = { + "./af": 13, + "./af.js": 13, + "./ar": 14, + "./ar-dz": 15, + "./ar-dz.js": 15, + "./ar-kw": 16, + "./ar-kw.js": 16, + "./ar-ly": 17, + "./ar-ly.js": 17, + "./ar-ma": 18, + "./ar-ma.js": 18, + "./ar-sa": 19, + "./ar-sa.js": 19, + "./ar-tn": 20, + "./ar-tn.js": 20, + "./ar.js": 14, + "./az": 21, + "./az.js": 21, + "./be": 22, + "./be.js": 22, + "./bg": 23, + "./bg.js": 23, + "./bm": 24, + "./bm.js": 24, + "./bn": 25, + "./bn.js": 25, + "./bo": 26, + "./bo.js": 26, + "./br": 27, + "./br.js": 27, + "./bs": 28, + "./bs.js": 28, + "./ca": 29, + "./ca.js": 29, + "./cs": 30, + "./cs.js": 30, + "./cv": 31, + "./cv.js": 31, + "./cy": 32, + "./cy.js": 32, + "./da": 33, + "./da.js": 33, + "./de": 34, + "./de-at": 35, + "./de-at.js": 35, + "./de-ch": 36, + "./de-ch.js": 36, + "./de.js": 34, + "./dv": 37, + "./dv.js": 37, + "./el": 38, + "./el.js": 38, + "./en-SG": 39, + "./en-SG.js": 39, + "./en-au": 40, + "./en-au.js": 40, + "./en-ca": 41, + "./en-ca.js": 41, + "./en-gb": 42, + "./en-gb.js": 42, + "./en-ie": 43, + "./en-ie.js": 43, + "./en-il": 44, + "./en-il.js": 44, + "./en-nz": 45, + "./en-nz.js": 45, + "./eo": 46, + "./eo.js": 46, + "./es": 47, + "./es-do": 48, + "./es-do.js": 48, + "./es-us": 49, + "./es-us.js": 49, + "./es.js": 47, + "./et": 50, + "./et.js": 50, + "./eu": 51, + "./eu.js": 51, + "./fa": 52, + "./fa.js": 52, + "./fi": 53, + "./fi.js": 53, + "./fo": 54, + "./fo.js": 54, + "./fr": 55, + "./fr-ca": 56, + "./fr-ca.js": 56, + "./fr-ch": 57, + "./fr-ch.js": 57, + "./fr.js": 55, + "./fy": 58, + "./fy.js": 58, + "./ga": 59, + "./ga.js": 59, + "./gd": 60, + "./gd.js": 60, + "./gl": 61, + "./gl.js": 61, + "./gom-latn": 62, + "./gom-latn.js": 62, + "./gu": 63, + "./gu.js": 63, + "./he": 64, + "./he.js": 64, + "./hi": 65, + "./hi.js": 65, + "./hr": 66, + "./hr.js": 66, + "./hu": 67, + "./hu.js": 67, + "./hy-am": 68, + "./hy-am.js": 68, + "./id": 69, + "./id.js": 69, + "./is": 70, + "./is.js": 70, + "./it": 71, + "./it-ch": 72, + "./it-ch.js": 72, + "./it.js": 71, + "./ja": 73, + "./ja.js": 73, + "./jv": 74, + "./jv.js": 74, + "./ka": 75, + "./ka.js": 75, + "./kk": 76, + "./kk.js": 76, + "./km": 77, + "./km.js": 77, + "./kn": 78, + "./kn.js": 78, + "./ko": 79, + "./ko.js": 79, + "./ku": 80, + "./ku.js": 80, + "./ky": 81, + "./ky.js": 81, + "./lb": 82, + "./lb.js": 82, + "./lo": 83, + "./lo.js": 83, + "./lt": 84, + "./lt.js": 84, + "./lv": 85, + "./lv.js": 85, + "./me": 86, + "./me.js": 86, + "./mi": 87, + "./mi.js": 87, + "./mk": 88, + "./mk.js": 88, + "./ml": 89, + "./ml.js": 89, + "./mn": 90, + "./mn.js": 90, + "./mr": 91, + "./mr.js": 91, + "./ms": 92, + "./ms-my": 93, + "./ms-my.js": 93, + "./ms.js": 92, + "./mt": 94, + "./mt.js": 94, + "./my": 95, + "./my.js": 95, + "./nb": 96, + "./nb.js": 96, + "./ne": 97, + "./ne.js": 97, + "./nl": 98, + "./nl-be": 99, + "./nl-be.js": 99, + "./nl.js": 98, + "./nn": 100, + "./nn.js": 100, + "./pa-in": 101, + "./pa-in.js": 101, + "./pl": 102, + "./pl.js": 102, + "./pt": 103, + "./pt-br": 104, + "./pt-br.js": 104, + "./pt.js": 103, + "./ro": 105, + "./ro.js": 105, + "./ru": 106, + "./ru.js": 106, + "./sd": 107, + "./sd.js": 107, + "./se": 108, + "./se.js": 108, + "./si": 109, + "./si.js": 109, + "./sk": 110, + "./sk.js": 110, + "./sl": 111, + "./sl.js": 111, + "./sq": 112, + "./sq.js": 112, + "./sr": 113, + "./sr-cyrl": 114, + "./sr-cyrl.js": 114, + "./sr.js": 113, + "./ss": 115, + "./ss.js": 115, + "./sv": 116, + "./sv.js": 116, + "./sw": 117, + "./sw.js": 117, + "./ta": 118, + "./ta.js": 118, + "./te": 119, + "./te.js": 119, + "./tet": 120, + "./tet.js": 120, + "./tg": 121, + "./tg.js": 121, + "./th": 122, + "./th.js": 122, + "./tl-ph": 123, + "./tl-ph.js": 123, + "./tlh": 124, + "./tlh.js": 124, + "./tr": 125, + "./tr.js": 125, + "./tzl": 126, + "./tzl.js": 126, + "./tzm": 127, + "./tzm-latn": 128, + "./tzm-latn.js": 128, + "./tzm.js": 127, + "./ug-cn": 129, + "./ug-cn.js": 129, + "./uk": 130, + "./uk.js": 130, + "./ur": 131, + "./ur.js": 131, + "./uz": 132, + "./uz-latn": 133, + "./uz-latn.js": 133, + "./uz.js": 132, + "./vi": 134, + "./vi.js": 134, + "./x-pseudo": 135, + "./x-pseudo.js": 135, + "./yo": 136, + "./yo.js": 136, + "./zh-cn": 137, + "./zh-cn.js": 137, + "./zh-hk": 138, + "./zh-hk.js": 138, + "./zh-tw": 139, + "./zh-tw.js": 139 +}; - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - function getSetMonth (value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } - } +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = 12; - function getDaysInMonth () { - return daysInMonth(this.year(), this.month()); - } +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { - var defaultMonthsShortRegex = matchWord; - function monthsShortRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } - } +//! moment.js locale configuration - var defaultMonthsRegex = matchWord; - function monthsRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var af = moment.defineLocale('af', { + months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), + weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), + weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), + meridiemParse: /vm|nm/i, + isPM : function (input) { + return /^nm$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'vm' : 'VM'; } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; + return isLower ? 'nm' : 'NM'; } - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; + }, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Vandag om] LT', + nextDay : '[Môre om] LT', + nextWeek : 'dddd [om] LT', + lastDay : '[Gister om] LT', + lastWeek : '[Laas] dddd [om] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'oor %s', + past : '%s gelede', + s : '\'n paar sekondes', + ss : '%d sekondes', + m : '\'n minuut', + mm : '%d minute', + h : '\'n uur', + hh : '%d ure', + d : '\'n dag', + dd : '%d dae', + M : '\'n maand', + MM : '%d maande', + y : '\'n jaar', + yy : '%d jaar' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + }, + week : { + dow : 1, // Maandag is die eerste dag van die week. + doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. } - } + }); - function computeMonthsParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } + return af; - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } +}))); - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - } - function createDate (y, m, d, h, M, s, ms) { - // can't just apply() to create a date: - // https://stackoverflow.com/q/181348 - var date; - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - date = new Date(y + 400, m, d, h, M, s, ms); - if (isFinite(date.getFullYear())) { - date.setFullYear(y); - } - } else { - date = new Date(y, m, d, h, M, s, ms); - } +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { - return date; - } +//! moment.js locale configuration - function createUTCDate (y) { - var date; - // the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - var args = Array.prototype.slice.call(arguments); - // preserve leap years using a full 400 year cycle, then reset - args[0] = y + 400; - date = new Date(Date.UTC.apply(null, args)); - if (isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; } - } else { - date = new Date(Date.UTC.apply(null, arguments)); + return str.replace(/%d/i, number); + }; + }, months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; + + var ar = moment.defineLocale('ar', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + ss : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } + }); - return date; - } + return ar; - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; +}))); - return -fwdlw + fwd - 1; - } - // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } +//! moment.js locale configuration - return { - year: resYear, - dayOfYear: resDayOfYear - }; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; + var arDz = moment.defineLocale('ar-dz', { + months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - return { - week: resWeek, - year: resYear - }; - } + return arDz; - function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; - } +}))); - // FORMATTING - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { - // ALIASES +//! moment.js locale configuration - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PRIORITIES - addUnitPriority('week', 5); - addUnitPriority('isoWeek', 5); + var arKw = moment.defineLocale('ar-kw', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } + }); - // PARSING + return arKw; - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); +}))); - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - // HELPERS +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { - // LOCALES +//! moment.js locale configuration - function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - }; - function localeFirstDayOfWeek () { - return this._week.dow; - } + var symbolMap = { + '1': '1', + '2': '2', + '3': '3', + '4': '4', + '5': '5', + '6': '6', + '7': '7', + '8': '8', + '9': '9', + '0': '0' + }, pluralForm = function (n) { + return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; + }, plurals = { + s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], + m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], + h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], + d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], + M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], + y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] + }, pluralize = function (u) { + return function (number, withoutSuffix, string, isFuture) { + var f = pluralForm(number), + str = plurals[u][pluralForm(number)]; + if (f === 2) { + str = str[withoutSuffix ? 0 : 1]; + } + return str.replace(/%d/i, number); + }; + }, months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر' + ]; - function localeFirstDayOfYear () { - return this._week.doy; - } + var arLy = moment.defineLocale('ar-ly', { + months : months, + monthsShort : months, + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/\u200FM/\u200FYYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم عند الساعة] LT', + nextDay: '[غدًا عند الساعة] LT', + nextWeek: 'dddd [عند الساعة] LT', + lastDay: '[أمس عند الساعة] LT', + lastWeek: 'dddd [عند الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'بعد %s', + past : 'منذ %s', + s : pluralize('s'), + ss : pluralize('s'), + m : pluralize('m'), + mm : pluralize('m'), + h : pluralize('h'), + hh : pluralize('h'), + d : pluralize('d'), + dd : pluralize('d'), + M : pluralize('M'), + MM : pluralize('M'), + y : pluralize('y'), + yy : pluralize('y') + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } + }); - // MOMENTS + return arLy; - function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } +}))); - function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - // FORMATTING +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { - addFormatToken('d', 0, 'do', 'day'); +//! moment.js locale configuration - addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); - }); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); - }); - addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); + var arMa = moment.defineLocale('ar-ma', { + months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), + weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } }); - addFormatToken('e', 0, 0, 'weekday'); - addFormatToken('E', 0, 0, 'isoWeekday'); + return arMa; - // ALIASES +}))); - addUnitAlias('day', 'd'); - addUnitAlias('weekday', 'e'); - addUnitAlias('isoWeekday', 'E'); - // PRIORITY - addUnitPriority('day', 11); - addUnitPriority('weekday', 11); - addUnitPriority('isoWeekday', 11); +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { - // PARSING +//! moment.js locale configuration - addRegexToken('d', match1to2); - addRegexToken('e', match1to2); - addRegexToken('E', match1to2); - addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); - }); - addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); - }); - addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); - }); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } - }); - addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }; + + var arSa = moment.defineLocale('ar-sa', { + months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ص|م/, + isPM : function (input) { + return 'م' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ص'; + } else { + return 'م'; + } + }, + calendar : { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'في %s', + past : 'منذ %s', + s : 'ثوان', + ss : '%d ثانية', + m : 'دقيقة', + mm : '%d دقائق', + h : 'ساعة', + hh : '%d ساعات', + d : 'يوم', + dd : '%d أيام', + M : 'شهر', + MM : '%d أشهر', + y : 'سنة', + yy : '%d سنوات' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. + } }); - // HELPERS + return arSa; - function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } +}))); - if (!isNaN(input)) { - return parseInt(input, 10); - } - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { - return null; - } +//! moment.js locale configuration - function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // LOCALES - function shiftWeekdays (ws, n) { - return ws.slice(n, 7).concat(ws.slice(0, n)); - } - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - function localeWeekdays (m, format) { - var weekdays = isArray(this._weekdays) ? this._weekdays : - this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone']; - return (m === true) ? shiftWeekdays(weekdays, this._week.dow) - : (m) ? weekdays[m.day()] : weekdays; - } - - var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); - function localeWeekdaysShort (m) { - return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow) - : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; - } + var arTn = moment.defineLocale('ar-tn', { + months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), + weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), + weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), + weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[اليوم على الساعة] LT', + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'في %s', + past: 'منذ %s', + s: 'ثوان', + ss : '%d ثانية', + m: 'دقيقة', + mm: '%d دقائق', + h: 'ساعة', + hh: '%d ساعات', + d: 'يوم', + dd: '%d أيام', + M: 'شهر', + MM: '%d أشهر', + y: 'سنة', + yy: '%d سنوات' + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); - var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); - function localeWeekdaysMin (m) { - return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow) - : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; - } + return arTn; - function handleStrictParse$1(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; +}))); - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - if (strict) { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } - } +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { - function localeWeekdaysParse (weekdayName, format, strict) { - var i, mom, regex; +//! moment.js locale configuration - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already + var suffixes = { + 1: '-inci', + 5: '-inci', + 8: '-inci', + 70: '-inci', + 80: '-inci', + 2: '-nci', + 7: '-nci', + 20: '-nci', + 50: '-nci', + 3: '-üncü', + 4: '-üncü', + 100: '-üncü', + 6: '-ncı', + 9: '-uncu', + 10: '-uncu', + 30: '-uncu', + 60: '-ıncı', + 90: '-ıncı' + }; - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + var az = moment.defineLocale('az', { + months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), + monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), + weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), + weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), + weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[sabah saat] LT', + nextWeek : '[gələn həftə] dddd [saat] LT', + lastDay : '[dünən] LT', + lastWeek : '[keçən həftə] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s sonra', + past : '%s əvvəl', + s : 'birneçə saniyə', + ss : '%d saniyə', + m : 'bir dəqiqə', + mm : '%d dəqiqə', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir il', + yy : '%d il' + }, + meridiemParse: /gecə|səhər|gündüz|axşam/, + isPM : function (input) { + return /^(gündüz|axşam)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'gecə'; + } else if (hour < 12) { + return 'səhər'; + } else if (hour < 17) { + return 'gündüz'; + } else { + return 'axşam'; } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + '-ıncı'; } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } - } + }); - // MOMENTS + return az; - function getSetDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - } +}))); - function getSetLocaleDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - } - function getSetISODayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. +//! moment.js locale configuration - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var defaultWeekdaysRegex = matchWord; - function weekdaysRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } - } - var defaultWeekdaysShortRegex = matchWord; - function weekdaysShortRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', + 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', + 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', + 'dd': 'дзень_дні_дзён', + 'MM': 'месяц_месяцы_месяцаў', + 'yy': 'год_гады_гадоў' + }; + if (key === 'm') { + return withoutSuffix ? 'хвіліна' : 'хвіліну'; + } + else if (key === 'h') { + return withoutSuffix ? 'гадзіна' : 'гадзіну'; + } + else { + return number + ' ' + plural(format[key], +number); } } - var defaultWeekdaysMinRegex = matchWord; - function weekdaysMinRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; + var be = moment.defineLocale('be', { + months : { + format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), + standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') + }, + monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), + weekdays : { + format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), + standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), + isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/ + }, + weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., HH:mm', + LLLL : 'dddd, D MMMM YYYY г., HH:mm' + }, + calendar : { + sameDay: '[Сёння ў] LT', + nextDay: '[Заўтра ў] LT', + lastDay: '[Учора ў] LT', + nextWeek: function () { + return '[У] dddd [ў] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return '[У мінулую] dddd [ў] LT'; + case 1: + case 2: + case 4: + return '[У мінулы] dddd [ў] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'праз %s', + past : '%s таму', + s : 'некалькі секунд', + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : relativeTimeWithPlural, + hh : relativeTimeWithPlural, + d : 'дзень', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночы|раніцы|дня|вечара/, + isPM : function (input) { + return /^(дня|вечара)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночы'; + } else if (hour < 12) { + return 'раніцы'; + } else if (hour < 17) { + return 'дня'; } else { - return this._weekdaysMinRegex; + return 'вечара'; } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; + }, + dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; + case 'D': + return number + '-га'; + default: + return number; } - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } - } - - - function computeWeekdaysParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } + }); - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; + return be; - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); - } +}))); - // FORMATTING - function hFormat() { - return this.hours() % 12 || 12; - } +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { - function kFormat() { - return this.hours() || 24; - } +//! moment.js locale configuration - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, hFormat); - addFormatToken('k', ['kk', 2], 0, kFormat); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); - }); - addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); - }); - - addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); + var bg = moment.defineLocale('bg', { + months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), + weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Днес в] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[В изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[В изминалия] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'след %s', + past : 'преди %s', + s : 'няколко секунди', + ss : '%d секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дни', + M : 'месец', + MM : '%d месеца', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } }); - function meridiem (token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); - } - - meridiem('a', true); - meridiem('A', false); - - // ALIASES - - addUnitAlias('hour', 'h'); - - // PRIORITY - addUnitPriority('hour', 13); - - // PARSING + return bg; - function matchMeridiem (isStrict, locale) { - return locale._meridiemParse; - } +}))); - addRegexToken('a', matchMeridiem); - addRegexToken('A', matchMeridiem); - addRegexToken('H', match1to2); - addRegexToken('h', match1to2); - addRegexToken('k', match1to2); - addRegexToken('HH', match1to2, match2); - addRegexToken('hh', match1to2, match2); - addRegexToken('kk', match1to2, match2); - addRegexToken('hmm', match3to4); - addRegexToken('hmmss', match5to6); - addRegexToken('Hmm', match3to4); - addRegexToken('Hmmss', match5to6); +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { - addParseToken(['H', 'HH'], HOUR); - addParseToken(['k', 'kk'], function (input, array, config) { - var kInput = toInt(input); - array[HOUR] = kInput === 24 ? 0 : kInput; - }); - addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; - }); - addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - }); - addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - }); +//! moment.js locale configuration - // LOCALES +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function localeIsPM (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - } - var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; - function localeMeridiem (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; + var bm = moment.defineLocale('bm', { + months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'), + monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'), + weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'), + weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'), + weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'MMMM [tile] D [san] YYYY', + LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', + LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm' + }, + calendar : { + sameDay : '[Bi lɛrɛ] LT', + nextDay : '[Sini lɛrɛ] LT', + nextWeek : 'dddd [don lɛrɛ] LT', + lastDay : '[Kunu lɛrɛ] LT', + lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s kɔnɔ', + past : 'a bɛ %s bɔ', + s : 'sanga dama dama', + ss : 'sekondi %d', + m : 'miniti kelen', + mm : 'miniti %d', + h : 'lɛrɛ kelen', + hh : 'lɛrɛ %d', + d : 'tile kelen', + dd : 'tile %d', + M : 'kalo kelen', + MM : 'kalo %d', + y : 'san kelen', + yy : 'san %d' + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); + return bm; - // MOMENTS +}))); - // Setting the hour should keep the time, because the user explicitly - // specified which hour they want. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - var getSetHour = makeGetSet('Hours', true); - var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, - relativeTime: defaultRelativeTime, +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, +//! moment.js locale configuration - week: defaultLocaleWeek, +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - meridiemParse: defaultLocaleMeridiemParse + var symbolMap = { + '1': '১', + '2': '২', + '3': '৩', + '4': '৪', + '5': '৫', + '6': '৬', + '7': '৭', + '8': '৮', + '9': '৯', + '0': '০' + }, + numberMap = { + '১': '1', + '২': '2', + '৩': '3', + '৪': '4', + '৫': '5', + '৬': '6', + '৭': '7', + '৮': '8', + '৯': '9', + '০': '0' }; - // internal storage for locale config files - var locales = {}; - var localeFamilies = {}; - var globalLocale; - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return globalLocale; - } - - function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - var aliasedRequire = require; - __webpack_require__(41)("./" + name); - getSetGlobalLocale(oldLocale); - } catch (e) {} - } - return locales[name]; - } - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - function getSetGlobalLocale (key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } - else { - data = defineLocale(key, values); + var bn = moment.defineLocale('bn', { + months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), + monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), + weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), + weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), + weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), + longDateFormat : { + LT : 'A h:mm সময়', + LTS : 'A h:mm:ss সময়', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm সময়', + LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' + }, + calendar : { + sameDay : '[আজ] LT', + nextDay : '[আগামীকাল] LT', + nextWeek : 'dddd, LT', + lastDay : '[গতকাল] LT', + lastWeek : '[গত] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s পরে', + past : '%s আগে', + s : 'কয়েক সেকেন্ড', + ss : '%d সেকেন্ড', + m : 'এক মিনিট', + mm : '%d মিনিট', + h : 'এক ঘন্টা', + hh : '%d ঘন্টা', + d : 'এক দিন', + dd : '%d দিন', + M : 'এক মাস', + MM : '%d মাস', + y : 'এক বছর', + yy : '%d বছর' + }, + preparse: function (string) { + return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; + if ((meridiem === 'রাত' && hour >= 4) || + (meridiem === 'দুপুর' && hour < 5) || + meridiem === 'বিকাল') { + return hour + 12; + } else { + return hour; } - else { - if ((typeof console !== 'undefined') && console.warn) { - //warn user if arguments are passed but the locale could not be set - console.warn('Locale ' + key + ' not found. Did you forget to load it?'); - } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'রাত'; + } else if (hour < 10) { + return 'সকাল'; + } else if (hour < 17) { + return 'দুপুর'; + } else if (hour < 20) { + return 'বিকাল'; + } else { + return 'রাত'; } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } + }); - return globalLocale._abbr; - } - - function defineLocale (name, config) { - if (config !== null) { - var locale, parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - locale = loadLocale(config.parentLocale); - if (locale != null) { - parentConfig = locale._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; - } - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); + return bn; +}))); - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - } - function updateLocale(name, config) { - if (config != null) { - var locale, tmpLocale, parentConfig = baseConfig; - // MERGE - tmpLocale = loadLocale(name); - if (tmpLocale != null) { - parentConfig = tmpLocale._config; - } - config = mergeConfigs(parentConfig, config); - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; - } +//! moment.js locale configuration - // returns locale data - function getLocale (key) { - var locale; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - if (!key) { - return globalLocale; - } + var symbolMap = { + '1': '༡', + '2': '༢', + '3': '༣', + '4': '༤', + '5': '༥', + '6': '༦', + '7': '༧', + '8': '༨', + '9': '༩', + '0': '༠' + }, + numberMap = { + '༡': '1', + '༢': '2', + '༣': '3', + '༤': '4', + '༥': '5', + '༦': '6', + '༧': '7', + '༨': '8', + '༩': '9', + '༠': '0' + }; - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; + var bo = moment.defineLocale('bo', { + months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), + weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), + weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + longDateFormat : { + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' + }, + calendar : { + sameDay : '[དི་རིང] LT', + nextDay : '[སང་ཉིན] LT', + nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', + lastDay : '[ཁ་སང] LT', + lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ལ་', + past : '%s སྔན་ལ', + s : 'ལམ་སང', + ss : '%d སྐར་ཆ།', + m : 'སྐར་མ་གཅིག', + mm : '%d སྐར་མ', + h : 'ཆུ་ཚོད་གཅིག', + hh : '%d ཆུ་ཚོད', + d : 'ཉིན་གཅིག', + dd : '%d ཉིན་', + M : 'ཟླ་བ་གཅིག', + MM : '%d ཟླ་བ', + y : 'ལོ་གཅིག', + yy : '%d ལོ' + }, + preparse: function (string) { + return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; } - key = [key]; + if ((meridiem === 'མཚན་མོ' && hour >= 4) || + (meridiem === 'ཉིན་གུང' && hour < 5) || + meridiem === 'དགོང་དག') { + return hour + 12; + } else { + return hour; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'མཚན་མོ'; + } else if (hour < 10) { + return 'ཞོགས་ཀས'; + } else if (hour < 17) { + return 'ཉིན་གུང'; + } else if (hour < 20) { + return 'དགོང་དག'; + } else { + return 'མཚན་མོ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } + }); - return chooseLocale(key); - } + return bo; - function listLocales() { - return keys(locales); - } +}))); - function checkOverflow (m) { - var overflow; - var a = m._a; - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } +//! moment.js locale configuration - getParsingFlags(m).overflow = overflow; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - return m; - } - // Pick the first defined of two or three arguments. - function defaults(a, b, c) { - if (a != null) { - return a; + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': 'munutenn', + 'MM': 'miz', + 'dd': 'devezh' + }; + return number + ' ' + mutation(format[key], number); + } + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; } - if (b != null) { - return b; + } + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); } - return c; + return number; } - - function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + function mutation(text, number) { + if (number === 2) { + return softMutation(text); } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + return text; } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function configFromArray (config) { - var i, date, input = [], currentDate, expectedWeekday, yearToUse; - - if (config._d) { - return; + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; } + return mutationTable[text.charAt(0)] + text.substring(1); + } - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); + var br = moment.defineLocale('br', { + months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), + monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), + weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), + weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), + weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h[e]mm A', + LTS : 'h[e]mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [a viz] MMMM YYYY', + LLL : 'D [a viz] MMMM YYYY h[e]mm A', + LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'a-benn %s', + past : '%s \'zo', + s : 'un nebeud segondennoù', + ss : '%d eilenn', + m : 'ur vunutenn', + mm : relativeTimeWithMutation, + h : 'un eur', + hh : '%d eur', + d : 'un devezh', + dd : relativeTimeWithMutation, + M : 'ur miz', + MM : relativeTimeWithMutation, + y : 'ur bloaz', + yy : specialMutationForYears + }, + dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - //if the day of the year is set, figure out what it is - if (config._dayOfYear != null) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } + return br; - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } +}))); - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); +//! moment.js locale configuration - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (config._nextDay) { - config._a[HOUR] = 24; - } - // check for mismatching day of week - if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { - getParsingFlags(config).weekdayMismatch = true; + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + if (number === 1) { + result += 'sekunda'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sekunde'; + } else { + result += 'sekundi'; + } + return result; + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; } } - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + var bs = moment.defineLocale('bs', { + months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } + }); - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; + return bs; - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; +}))); - var curWeek = weekOfYear(createLocal(), dow, doy); - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { - // Default to current week. - week = defaults(w.w, curWeek.week); +//! moment.js locale configuration - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from beginning of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to beginning of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - - var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] - ]; - - // iso time formats and regexes - var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] - ]; + var ca = moment.defineLocale('ca', { + months : { + standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), + format: 'de gener_de febrer_de març_d\'abril_de maig_de juny_de juliol_d\'agost_de setembre_d\'octubre_de novembre_de desembre'.split('_'), + isFormat: /D[oD]?(\s)+MMMM/ + }, + monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), + weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), + weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [de] YYYY', + ll : 'D MMM YYYY', + LLL : 'D MMMM [de] YYYY [a les] H:mm', + lll : 'D MMM YYYY, H:mm', + LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm', + llll : 'ddd D MMM YYYY, H:mm' + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'd\'aquí %s', + past : 'fa %s', + s : 'uns segons', + ss : '%d segons', + m : 'un minut', + mm : '%d minuts', + h : 'una hora', + hh : '%d hores', + d : 'un dia', + dd : '%d dies', + M : 'un mes', + MM : '%d mesos', + y : 'un any', + yy : '%d anys' + }, + dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/, + ordinal : function (number, period) { + var output = (number === 1) ? 'r' : + (number === 2) ? 'n' : + (number === 3) ? 'r' : + (number === 4) ? 't' : 'è'; + if (period === 'w' || period === 'W') { + output = 'a'; + } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + return ca; - // date from iso format - function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; +}))); - if (match) { - getParsingFlags(config).iso = true; - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } - } +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { - // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; +//! moment.js locale configuration - function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - var result = [ - untruncateYear(yearStr), - defaultLocaleMonthsShort.indexOf(monthStr), - parseInt(dayStr, 10), - parseInt(hourStr, 10), - parseInt(minuteStr, 10) - ]; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (secondStr) { - result.push(parseInt(secondStr, 10)); - } - return result; - } + var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'), + monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); - function untruncateYear(yearStr) { - var year = parseInt(yearStr, 10); - if (year <= 49) { - return 2000 + year; - } else if (year <= 999) { - return 1900 + year; - } - return year; - } + var monthsParse = [/^led/i, /^úno/i, /^bře/i, /^dub/i, /^kvě/i, /^(čvn|červen$|června)/i, /^(čvc|červenec|července)/i, /^srp/i, /^zář/i, /^říj/i, /^lis/i, /^pro/i]; + // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. + // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. + var monthsRegex = /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i; - function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); } - - function checkWeekday(weekdayStr, parsedInput, config) { - if (weekdayStr) { - // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. - var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), - weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); - if (weekdayProvided !== weekdayActual) { - getParsingFlags(config).weekdayMismatch = true; - config._isValid = false; - return false; - } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'sekundy' : 'sekund'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'měsíce' : 'měsíců'); + } else { + return result + 'měsíci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; } - return true; } - var obsOffsets = { - UT: 0, - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60 - }; - - function calculateOffset(obsOffset, militaryOffset, numOffset) { - if (obsOffset) { - return obsOffsets[obsOffset]; - } else if (militaryOffset) { - // the only allowed military tz is Z - return 0; - } else { - var hm = parseInt(numOffset, 10); - var m = hm % 100, h = (hm - m) / 100; - return h * 60 + m; + var cs = moment.defineLocale('cs', { + months : months, + monthsShort : monthsShort, + monthsRegex : monthsRegex, + monthsShortRegex : monthsRegex, + // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. + // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. + monthsStrictRegex : /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i, + monthsShortStrictRegex : /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), + weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), + weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), + longDateFormat : { + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm', + l : 'D. M. YYYY' + }, + calendar : { + sameDay: '[dnes v] LT', + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v neděli v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve středu v] LT'; + case 4: + return '[ve čtvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[včera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou neděli v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou středu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : 'za %s', + past : 'před %s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse : /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - // date and time from ref 2822 format - function configFromRFC2822(config) { - var match = rfc2822.exec(preprocessRFC2822(config._i)); - if (match) { - var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); - if (!checkWeekday(match[1], parsedArray, config)) { - return; - } + return cs; - config._a = parsedArray; - config._tzm = calculateOffset(match[8], match[9], match[10]); +}))); - config._d = createUTCDate.apply(null, config._a); - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - getParsingFlags(config).rfc2822 = true; - } else { - config._isValid = false; - } - } +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { - // date from iso format or fallback - function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); +//! moment.js locale configuration - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - configFromRFC2822(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; + var cv = moment.defineLocale('cv', { + months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), + monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), + weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), + weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), + weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', + LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', + LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' + }, + calendar : { + sameDay: '[Паян] LT [сехетре]', + nextDay: '[Ыран] LT [сехетре]', + lastDay: '[Ӗнер] LT [сехетре]', + nextWeek: '[Ҫитес] dddd LT [сехетре]', + lastWeek: '[Иртнӗ] dddd LT [сехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; + return output + affix; + }, + past : '%s каялла', + s : 'пӗр-ик ҫеккунт', + ss : '%d ҫеккунт', + m : 'пӗр минут', + mm : '%d минут', + h : 'пӗр сехет', + hh : '%d сехет', + d : 'пӗр кун', + dd : '%d кун', + M : 'пӗр уйӑх', + MM : '%d уйӑх', + y : 'пӗр ҫул', + yy : '%d ҫул' + }, + dayOfMonthOrdinalParse: /\d{1,2}-мӗш/, + ordinal : '%d-мӗш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } + }); - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); - } + return cv; - hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + - 'discouraged and will be removed in an upcoming major release. Please refer to ' + - 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); +}))); - // constant that refers to the ISO standard - hooks.ISO_8601 = function () {}; - // constant that refers to the RFC 2822 form - hooks.RFC_2822 = function () {}; +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { - // date from string and format string - function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { - configFromISO(config); - return; - } - if (config._f === hooks.RFC_2822) { - configFromRFC2822(config); - return; - } - config._a = []; - getParsingFlags(config).empty = true; +//! moment.js locale configuration - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); + var cy = moment.defineLocale('cy', { + months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), + monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), + weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), + weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), + weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), + weekdaysParseExact : true, + // time formats are the same as en-gb + longDateFormat: { + LT: 'HH:mm', + LTS : 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[Heddiw am] LT', + nextDay: '[Yfory am] LT', + nextWeek: 'dddd [am] LT', + lastDay: '[Ddoe am] LT', + lastWeek: 'dddd [diwethaf am] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'mewn %s', + past: '%s yn ôl', + s: 'ychydig eiliadau', + ss: '%d eiliad', + m: 'munud', + mm: '%d munud', + h: 'awr', + hh: '%d awr', + d: 'diwrnod', + dd: '%d diwrnod', + M: 'mis', + MM: '%d mis', + y: 'blwyddyn', + yy: '%d flynedd' + }, + dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, + // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh + ordinal: function (number) { + var b = number, + output = '', + lookup = [ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed + ]; + if (b > 20) { + if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { + output = 'fed'; // not 30ain, 70ain or 90ain + } else { + output = 'ain'; } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); + } else if (b > 0) { + output = lookup[b]; } + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } + return cy; - // clear _12h flag if hour is <= 12 - if (config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } +}))); - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - configFromArray(config); - checkOverflow(config); - } +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { +//! moment.js locale configuration - function meridiemFixWrap (locale, hour, meridiem) { - var isPm; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; + + var da = moment.defineLocale('da', { + months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay : '[i dag kl.] LT', + nextDay : '[i morgen kl.] LT', + nextWeek : 'på dddd [kl.] LT', + lastDay : '[i går kl.] LT', + lastWeek : '[i] dddd[s kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'om %s', + past : '%s siden', + s : 'få sekunder', + ss : '%d sekunder', + m : 'et minut', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dage', + M : 'en måned', + MM : '%d måneder', + y : 'et år', + yy : '%d år' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - // date from string and array of format strings - function configFromStringAndArray(config) { - var tempConfig, - bestMoment, + return da; - scoreToBeat, - i, - currentScore; +}))); - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { - if (!isValid(tempConfig)) { - continue; - } +//! moment.js locale configuration - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - getParsingFlags(tempConfig).score = currentScore; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } + var de = moment.defineLocale('de', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - extend(config, bestMoment || tempConfig); - } + return de; - function configFromObject(config) { - if (config._d) { - return; - } +}))); - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - configFromArray(config); +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; } - function createFromConfig (config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; + var deAt = moment.defineLocale('de-at', { + months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - return res; - } + return deAt; - function prepareConfig (config) { - var input = config._i, - format = config._f; +}))); - config._locale = config._locale || getLocale(config._l); - if (input === null || (format === undefined && input === '')) { - return createInvalid({nullInput: true}); - } +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } +//! moment.js locale configuration - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - if (!isValid(config)) { - config._d = null; - } - return config; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; } - function configFromInput(config) { - var input = config._i; - if (isUndefined(input)) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (isObject(input)) { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { - hooks.createFromInputFallback(config); + var deCh = moment.defineLocale('de-ch', { + months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), + weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY HH:mm', + LLLL : 'dddd, D. MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[heute um] LT [Uhr]', + sameElse: 'L', + nextDay: '[morgen um] LT [Uhr]', + nextWeek: 'dddd [um] LT [Uhr]', + lastDay: '[gestern um] LT [Uhr]', + lastWeek: '[letzten] dddd [um] LT [Uhr]' + }, + relativeTime : { + future : 'in %s', + past : 'vor %s', + s : 'ein paar Sekunden', + ss : '%d Sekunden', + m : processRelativeTime, + mm : '%d Minuten', + h : processRelativeTime, + hh : '%d Stunden', + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - function createLocalOrUTC (input, format, locale, strict, isUTC) { - var c = {}; + return deCh; - if (locale === true || locale === false) { - strict = locale; - locale = undefined; - } +}))); - if ((isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0)) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - return createFromConfig(c); - } +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { - function createLocal (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); - } +//! moment.js locale configuration - var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return createInvalid(); - } - } - ); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; + + var months = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު' + ], weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު' + ]; + + var dv = moment.defineLocale('dv', { + months : months, + monthsShort : months, + weekdays : weekdays, + weekdaysShort : weekdays, + weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), + longDateFormat : { + + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'D/M/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + meridiemParse: /މކ|މފ/, + isPM : function (input) { + return 'މފ' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'މކ'; } else { - return createInvalid(); + return 'މފ'; } + }, + calendar : { + sameDay : '[މިއަދު] LT', + nextDay : '[މާދަމާ] LT', + nextWeek : 'dddd LT', + lastDay : '[އިއްޔެ] LT', + lastWeek : '[ފާއިތުވި] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ތެރޭގައި %s', + past : 'ކުރިން %s', + s : 'ސިކުންތުކޮޅެއް', + ss : 'd% ސިކުންތު', + m : 'މިނިޓެއް', + mm : 'މިނިޓު %d', + h : 'ގަޑިއިރެއް', + hh : 'ގަޑިއިރު %d', + d : 'ދުވަހެއް', + dd : 'ދުވަސް %d', + M : 'މަހެއް', + MM : 'މަސް %d', + y : 'އަހަރެއް', + yy : 'އަހަރު %d' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 7, // Sunday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } - ); + }); - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } + return dv; - // TODO: Use [].sort instead? - function min () { - var args = [].slice.call(arguments, 0); +}))); - return pickBy('isBefore', args); - } - function max () { - var args = [].slice.call(arguments, 0); +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { - return pickBy('isAfter', args); - } +//! moment.js locale configuration - var now = function () { - return Date.now ? Date.now() : +(new Date()); - }; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } - function isDurationValid(m) { - for (var key in m) { - if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { - return false; - } - } - var unitHasDecimal = false; - for (var i = 0; i < ordering.length; ++i) { - if (m[ordering[i]]) { - if (unitHasDecimal) { - return false; // only allow non-integers for smallest unit - } - if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { - unitHasDecimal = true; + var el = moment.defineLocale('el', { + monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), + monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), + months : function (momentToFormat, format) { + if (!momentToFormat) { + return this._monthsNominativeEl; + } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), + weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), + weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), + weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + isPM : function (input) { + return ((input + '').toLowerCase()[0] === 'μ'); + }, + meridiemParse : /[ΠΜ]\.?Μ?\.?/i, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendarEl : { + sameDay : '[Σήμερα {}] LT', + nextDay : '[Αύριο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : function () { + switch (this.day()) { + case 6: + return '[το προηγούμενο] dddd [{}] LT'; + default: + return '[την προηγούμενη] dddd [{}] LT'; } + }, + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + if (isFunction(output)) { + output = output.apply(mom); } + return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + }, + relativeTime : { + future : 'σε %s', + past : '%s πριν', + s : 'λίγα δευτερόλεπτα', + ss : '%d δευτερόλεπτα', + m : 'ένα λεπτό', + mm : '%d λεπτά', + h : 'μία ώρα', + hh : '%d ώρες', + d : 'μία μέρα', + dd : '%d μέρες', + M : 'ένας μήνας', + MM : '%d μήνες', + y : 'ένας χρόνος', + yy : '%d χρόνια' + }, + dayOfMonthOrdinalParse: /\d{1,2}η/, + ordinal: '%dη', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. } + }); - return true; - } - - function isValid$1() { - return this._isValid; - } - - function createInvalid$1() { - return createDuration(NaN); - } - - function Duration (duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || normalizedInput.isoWeek || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; + return el; - this._isValid = isDurationValid(normalizedInput); +}))); - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible to translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - this._data = {}; +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { - this._locale = getLocale(); +//! moment.js locale configuration - this._bubble(); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function isDuration (obj) { - return obj instanceof Duration; - } - function absRound (number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); + var enSG = moment.defineLocale('en-SG', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } - - // FORMATTING + }); - function offset (token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); - } + return enSG; - offset('Z', ':'); - offset('ZZ', ''); +}))); - // PARSING - addRegexToken('Z', matchShortOffset); - addRegexToken('ZZ', matchShortOffset); - addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); - }); +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { - // HELPERS +//! moment.js locale configuration - // timezone chunker - // '+10:00' > ['10', '00'] - // '-1530' > ['-15', '30'] - var chunkOffset = /([\+\-]|\d\d)/gi; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher); - if (matches === null) { - return null; + var enAu = moment.defineLocale('en-au', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); + return enAu; - return minutes === 0 ? - 0 : - parts[0] === '+' ? minutes : -minutes; - } +}))); - // Return a moment from input, that is local/utc/zone equivalent to model. - function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } - } - function getDateOffset (m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; - } +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { - // HOOKS +//! moment.js locale configuration - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - hooks.updateOffset = function () {}; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // MOMENTS - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - function getSetOffset (input, keepLocalTime, keepMinutes) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16 && !keepMinutes) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract(this, createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); + var enCa = moment.defineLocale('en-ca', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'YYYY-MM-DD', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; } - } + }); - function getSetZone (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } + return enCa; - this.utcOffset(input, keepLocalTime); +}))); - return this; - } else { - return -this.utcOffset(); - } - } - function setOffsetToUTC (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - } +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { - function setOffsetToLocal (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; +//! moment.js locale configuration - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function setOffsetToParsedOffset () { - if (this._tzm != null) { - this.utcOffset(this._tzm, false, true); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } - else { - this.utcOffset(0, true); - } - } - return this; - } - function hasAlignedHourOffset (input) { - if (!this.isValid()) { - return false; + var enGb = moment.defineLocale('en-gb', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; - } + }); - function isDaylightSavingTime () { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); - } + return enGb; - function isDaylightSavingTimeShifted () { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } +}))); - var c = {}; - copyConfig(c, this); - c = prepareConfig(c); +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { - if (c._a) { - var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } +//! moment.js locale configuration - return this._isDSTShifted; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function isLocal () { - return this.isValid() ? !this._isUTC : false; - } - function isUtcOffset () { - return this.isValid() ? this._isUTC : false; - } + var enIe = moment.defineLocale('en-ie', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - function isUtc () { - return this.isValid() ? this._isUTC && this._offset === 0 : false; - } + return enIe; - // ASP.NET json date format regex - var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; +}))); - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - // and further modified to allow for strings containing both week and day - var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - function createDuration (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { - if (isDuration(input)) { - duration = { - ms : input._milliseconds, - d : input._days, - M : input._months - }; - } else if (isNumber(input)) { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match - }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : parseIso(match[2], sign), - M : parseIso(match[3], sign), - w : parseIso(match[4], sign), - d : parseIso(match[5], sign), - h : parseIso(match[6], sign), - m : parseIso(match[7], sign), - s : parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); +//! moment.js locale configuration - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - ret = new Duration(duration); - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; + var enIl = moment.defineLocale('en-il', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; } + }); - return ret; - } + return enIl; - createDuration.fn = Duration.prototype; - createDuration.invalid = createInvalid$1; +}))); - function parseIso (inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - } - function positiveMomentsDifference(base, other) { - var res = {}; +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } +//! moment.js locale configuration - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - return res; - } - function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; + var enNz = moment.defineLocale('en-nz', { + months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } + return enNz; - return res; - } +}))); - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); - tmp = val; val = period; period = tmp; - } - val = typeof val === 'string' ? +val : val; - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; - } +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { - function addSubtract (mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); +//! moment.js locale configuration - if (!mom.isValid()) { - // No op - return; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - updateOffset = updateOffset == null ? true : updateOffset; - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); + var eo = moment.defineLocale('eo', { + months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), + weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'), + weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'), + weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D[-a de] MMMM, YYYY', + LLL : 'D[-a de] MMMM, YYYY HH:mm', + LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm' + }, + meridiemParse: /[ap]\.t\.m/i, + isPM: function (input) { + return input.charAt(0).toLowerCase() === 'p'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[Hodiaŭ je] LT', + nextDay : '[Morgaŭ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[Hieraŭ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'post %s', + past : 'antaŭ %s', + s : 'sekundoj', + ss : '%d sekundoj', + m : 'minuto', + mm : '%d minutoj', + h : 'horo', + hh : '%d horoj', + d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo + dd : '%d tagoj', + M : 'monato', + MM : '%d monatoj', + y : 'jaro', + yy : '%d jaroj' + }, + dayOfMonthOrdinalParse: /\d{1,2}a/, + ordinal : '%da', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } - } + }); - var add = createAdder(1, 'add'); - var subtract = createAdder(-1, 'subtract'); + return eo; - function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - } +}))); - function calendar$1 (time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse'; - var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { - return this.format(output || this.localeData().calendar(format, this, createLocal(now))); - } +//! moment.js locale configuration - function clone () { - return new Moment(this); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function isAfter (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } - } - function isBefore (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } - } + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - function isBetween (from, to, units, inclusivity) { - var localFrom = isMoment(from) ? from : createLocal(from), - localTo = isMoment(to) ? to : createLocal(to); - if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { - return false; - } - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && - (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); - } + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - function isSame (input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units) || 'millisecond'; - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + var es = moment.defineLocale('es', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex : monthsRegex, + monthsShortRegex : monthsRegex, + monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } + }); - function isSameOrAfter (input, units) { - return this.isSame(input, units) || this.isAfter(input, units); - } + return es; - function isSameOrBefore (input, units) { - return this.isSame(input, units) || this.isBefore(input, units); - } +}))); - function diff (input, units, asFloat) { - var that, - zoneDelta, - output; - if (!this.isValid()) { - return NaN; - } +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { - that = cloneWithOffset(input, this); +//! moment.js locale configuration - if (!that.isValid()) { - return NaN; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - units = normalizeUnits(units); + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - switch (units) { - case 'year': output = monthDiff(this, that) / 12; break; - case 'month': output = monthDiff(this, that); break; - case 'quarter': output = monthDiff(this, that) / 3; break; - case 'second': output = (this - that) / 1e3; break; // 1000 - case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 - case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 - case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst - case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst - default: output = this - that; + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + + var esDo = moment.defineLocale('es-do', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; + } else { + return monthsShortDot[m.month()]; + } + }, + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse: monthsParse, + longMonthsParse: monthsParse, + shortMonthsParse: monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY h:mm A', + LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - return asFloat ? output : absFloor(output); - } + return esDo; - function monthDiff (a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; +}))); - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; - } +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { - hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; - hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; +//! moment.js locale configuration - function toString () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function toISOString(keepOffset) { - if (!this.isValid()) { - return null; - } - var utc = keepOffset !== true; - var m = utc ? this.clone().utc() : this; - if (m.year() < 0 || m.year() > 9999) { - return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - if (utc) { - return this.toDate().toISOString(); + + var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), + monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); + + var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; + var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + + var esUs = moment.defineLocale('es-us', { + months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortDot; + } else if (/-MMM-/.test(format)) { + return monthsShort[m.month()]; } else { - return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + return monthsShortDot[m.month()]; } + }, + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, + monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, + monthsParse: monthsParse, + longMonthsParse: monthsParse, + shortMonthsParse: monthsParse, + weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'MM/DD/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY h:mm A', + LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : 'en %s', + past : 'hace %s', + s : 'unos segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'una hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un año', + yy : '%d años' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } - return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } + }); - /** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ - function inspect () { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment'; - var zone = ''; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - var prefix = '[' + func + '("]'; - var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; - var datetime = '-MM-DD[T]HH:mm:ss.SSS'; - var suffix = zone + '[")]'; + return esUs; - return this.format(prefix + year + datetime + suffix); - } +}))); - function format (inputString) { - if (!inputString) { - inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); - } - function from (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { - function fromNow (withoutSuffix) { - return this.from(createLocal(), withoutSuffix); - } +//! moment.js locale configuration - function to (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function toNow (withoutSuffix) { - return this.to(createLocal(), withoutSuffix); - } - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - function locale (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], + 'ss': [number + 'sekundi', number + 'sekundit'], + 'm' : ['ühe minuti', 'üks minut'], + 'mm': [number + ' minuti', number + ' minutit'], + 'h' : ['ühe tunni', 'tund aega', 'üks tund'], + 'hh': [number + ' tunni', number + ' tundi'], + 'd' : ['ühe päeva', 'üks päev'], + 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], + 'MM': [number + ' kuu', number + ' kuud'], + 'y' : ['ühe aasta', 'aasta', 'üks aasta'], + 'yy': [number + ' aasta', number + ' aastat'] + }; + if (withoutSuffix) { + return format[key][2] ? format[key][2] : format[key][1]; } + return isFuture ? format[key][0] : format[key][1]; } - var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } + var et = moment.defineLocale('et', { + months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), + monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), + weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), + weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), + weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s pärast', + past : '%s tagasi', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : '%d päeva', + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - ); + }); - function localeData () { - return this._locale; - } + return et; - var MS_PER_SECOND = 1000; - var MS_PER_MINUTE = 60 * MS_PER_SECOND; - var MS_PER_HOUR = 60 * MS_PER_MINUTE; - var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; +}))); - // actual modulo - handles negative numbers (for dates before 1970): - function mod$1(dividend, divisor) { - return (dividend % divisor + divisor) % divisor; - } - function localStartOfDate(y, m, d) { - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - return new Date(y + 400, m, d) - MS_PER_400_YEARS; - } else { - return new Date(y, m, d).valueOf(); - } - } +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { - function utcStartOfDate(y, m, d) { - // Date.UTC remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0) { - // preserve leap years using a full 400 year cycle, then reset - return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; - } else { - return Date.UTC(y, m, d); - } - } +//! moment.js locale configuration - function startOf (units) { - var time; - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond' || !this.isValid()) { - return this; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; - switch (units) { - case 'year': - time = startOfDate(this.year(), 0, 1); - break; - case 'quarter': - time = startOfDate(this.year(), this.month() - this.month() % 3, 1); - break; - case 'month': - time = startOfDate(this.year(), this.month(), 1); - break; - case 'week': - time = startOfDate(this.year(), this.month(), this.date() - this.weekday()); - break; - case 'isoWeek': - time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); - break; - case 'day': - case 'date': - time = startOfDate(this.year(), this.month(), this.date()); - break; - case 'hour': - time = this._d.valueOf(); - time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR); - break; - case 'minute': - time = this._d.valueOf(); - time -= mod$1(time, MS_PER_MINUTE); - break; - case 'second': - time = this._d.valueOf(); - time -= mod$1(time, MS_PER_SECOND); - break; + var eu = moment.defineLocale('eu', { + months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), + monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), + monthsParseExact : true, + weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), + weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), + weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY[ko] MMMM[ren] D[a]', + LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', + LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + l : 'YYYY-M-D', + ll : 'YYYY[ko] MMM D[a]', + lll : 'YYYY[ko] MMM D[a] HH:mm', + llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : '%s barru', + past : 'duela %s', + s : 'segundo batzuk', + ss : '%d segundo', + m : 'minutu bat', + mm : '%d minutu', + h : 'ordu bat', + hh : '%d ordu', + d : 'egun bat', + dd : '%d egun', + M : 'hilabete bat', + MM : '%d hilabete', + y : 'urte bat', + yy : '%d urte' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } + }); - this._d.setTime(time); - hooks.updateOffset(this, true); - return this; - } + return eu; - function endOf (units) { - var time; - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond' || !this.isValid()) { - return this; +}))); + + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '۱', + '2': '۲', + '3': '۳', + '4': '۴', + '5': '۵', + '6': '۶', + '7': '۷', + '8': '۸', + '9': '۹', + '0': '۰' + }, numberMap = { + '۱': '1', + '۲': '2', + '۳': '3', + '۴': '4', + '۵': '5', + '۶': '6', + '۷': '7', + '۸': '8', + '۹': '9', + '۰': '0' + }; + + var fa = moment.defineLocale('fa', { + months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /قبل از ظهر|بعد از ظهر/, + isPM: function (input) { + return /بعد از ظهر/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'قبل از ظهر'; + } else { + return 'بعد از ظهر'; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[فردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چند ثانیه', + ss : 'ثانیه d%', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[۰-۹]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, + dayOfMonthOrdinalParse: /\d{1,2}م/, + ordinal : '%dم', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } + }); - var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + return fa; - switch (units) { - case 'year': - time = startOfDate(this.year() + 1, 0, 1) - 1; - break; - case 'quarter': - time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; - break; - case 'month': - time = startOfDate(this.year(), this.month() + 1, 1) - 1; - break; - case 'week': - time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; - break; - case 'isoWeek': - time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; +}))); + + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbersFuture = [ + 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbersPast[7], numbersPast[8], numbersPast[9] + ]; + function translate(number, withoutSuffix, key, isFuture) { + var result = ''; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'ss': + return isFuture ? 'sekunnin' : 'sekuntia'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; break; - case 'day': - case 'date': - time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; break; - case 'hour': - time = this._d.valueOf(); - time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; break; - case 'minute': - time = this._d.valueOf(); - time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; break; - case 'second': - time = this._d.valueOf(); - time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; break; } - - this._d.setTime(time); - hooks.updateOffset(this, true); - return this; - } - - function valueOf () { - return this._d.valueOf() - ((this._offset || 0) * 60000); + result = verbalNumber(number, isFuture) + ' ' + result; + return result; } - - function unix () { - return Math.floor(this.valueOf() / 1000); + function verbalNumber(number, isFuture) { + return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; } - function toDate () { - return new Date(this.valueOf()); - } + var fi = moment.defineLocale('fi', { + months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), + monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), + weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), + weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), + weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD.MM.YYYY', + LL : 'Do MMMM[ta] YYYY', + LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', + LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', + l : 'D.M.YYYY', + ll : 'Do MMM YYYY', + lll : 'Do MMM YYYY, [klo] HH.mm', + llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s päästä', + past : '%s sitten', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - function toArray () { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; - } + return fi; - function toObject () { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; - } +}))); - function toJSON () { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; - } - function isValid$2 () { - return isValid(this); - } +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { - function parsingFlags () { - return extend({}, getParsingFlags(this)); - } +//! moment.js locale configuration - function invalidAt () { - return getParsingFlags(this).overflow; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; - } - // FORMATTING - - addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; - }); - - addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; + var fo = moment.defineLocale('fo', { + months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), + weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), + weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D. MMMM, YYYY HH:mm' + }, + calendar : { + sameDay : '[Í dag kl.] LT', + nextDay : '[Í morgin kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[Í gjár kl.] LT', + lastWeek : '[síðstu] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'um %s', + past : '%s síðani', + s : 'fá sekund', + ss : '%d sekundir', + m : 'ein minuttur', + mm : '%d minuttir', + h : 'ein tími', + hh : '%d tímar', + d : 'ein dagur', + dd : '%d dagar', + M : 'ein mánaður', + MM : '%d mánaðir', + y : 'eitt ár', + yy : '%d ár' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } }); - function addWeekYearFormatToken (token, getter) { - addFormatToken(0, [token, token.length], 0, getter); - } - - addWeekYearFormatToken('gggg', 'weekYear'); - addWeekYearFormatToken('ggggg', 'weekYear'); - addWeekYearFormatToken('GGGG', 'isoWeekYear'); - addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - - // ALIASES - - addUnitAlias('weekYear', 'gg'); - addUnitAlias('isoWeekYear', 'GG'); - - // PRIORITY - - addUnitPriority('weekYear', 1); - addUnitPriority('isoWeekYear', 1); - - - // PARSING + return fo; - addRegexToken('G', matchSigned); - addRegexToken('g', matchSigned); - addRegexToken('GG', match1to2, match2); - addRegexToken('gg', match1to2, match2); - addRegexToken('GGGG', match1to4, match4); - addRegexToken('gggg', match1to4, match4); - addRegexToken('GGGGG', match1to6, match6); - addRegexToken('ggggg', match1to6, match6); +}))); - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); - }); - addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); - }); +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { - // MOMENTS +//! moment.js locale configuration - function getSetWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function getSetISOWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); - } - function getISOWeeksInYear () { - return weeksInYear(this.year(), 1, 4); - } + var fr = moment.defineLocale('fr', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|)/, + ordinal : function (number, period) { + switch (period) { + // TODO: Return 'e' when day of month > 1. Move this case inside + // block for masculine words below. + // See https://github.com/moment/moment/issues/3375 + case 'D': + return number + (number === 1 ? 'er' : ''); - function getWeeksInYear () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - } + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); - function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); } - return setWeekAll.call(this, input, week, weekday, dow, doy); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } - } - - function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; - } - - // FORMATTING - - addFormatToken('Q', 0, 'Qo', 'quarter'); - - // ALIASES - - addUnitAlias('quarter', 'Q'); - - // PRIORITY - - addUnitPriority('quarter', 7); - - // PARSING - - addRegexToken('Q', match1); - addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; }); - // MOMENTS - - function getSetQuarter (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - } + return fr; - // FORMATTING +}))); - addFormatToken('D', ['DD', 2], 'Do', 'date'); - // ALIASES +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { - addUnitAlias('date', 'D'); +//! moment.js locale configuration - // PRIORITY - addUnitPriority('date', 9); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PARSING - addRegexToken('D', match1to2); - addRegexToken('DD', match1to2, match2); - addRegexToken('Do', function (isStrict, locale) { - // TODO: Remove "ordinalParse" fallback in next major release. - return isStrict ? - (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : - locale._dayOfMonthOrdinalParseLenient; - }); + var frCa = moment.defineLocale('fr-ca', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); - addParseToken(['D', 'DD'], DATE); - addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0]); + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + } }); - // MOMENTS + return frCa; - var getSetDayOfMonth = makeGetSet('Date', true); +}))); - // FORMATTING - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { - // ALIASES +//! moment.js locale configuration - addUnitAlias('dayOfYear', 'DDD'); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PRIORITY - addUnitPriority('dayOfYear', 4); - // PARSING + var frCh = moment.defineLocale('fr-ch', { + months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), + monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), + monthsParseExact : true, + weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), + weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), + weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[Aujourd’hui à] LT', + nextDay : '[Demain à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[Hier à] LT', + lastWeek : 'dddd [dernier à] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'dans %s', + past : 'il y a %s', + s : 'quelques secondes', + ss : '%d secondes', + m : 'une minute', + mm : '%d minutes', + h : 'une heure', + hh : '%d heures', + d : 'un jour', + dd : '%d jours', + M : 'un mois', + MM : '%d mois', + y : 'un an', + yy : '%d ans' + }, + dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, + ordinal : function (number, period) { + switch (period) { + // Words with masculine grammatical gender: mois, trimestre, jour + default: + case 'M': + case 'Q': + case 'D': + case 'DDD': + case 'd': + return number + (number === 1 ? 'er' : 'e'); - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return number + (number === 1 ? 're' : 'e'); + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } }); - // HELPERS - - // MOMENTS - - function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - } - - // FORMATTING + return frCh; - addFormatToken('m', ['mm', 2], 0, 'minute'); +}))); - // ALIASES - addUnitAlias('minute', 'm'); +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { - // PRIORITY +//! moment.js locale configuration - addUnitPriority('minute', 14); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PARSING - addRegexToken('m', match1to2); - addRegexToken('mm', match1to2, match2); - addParseToken(['m', 'mm'], MINUTE); + var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - // MOMENTS + var fy = moment.defineLocale('fy', { + months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + monthsParseExact : true, + weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), + weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), + weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' + }, + calendar : { + sameDay: '[hjoed om] LT', + nextDay: '[moarn om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[juster om] LT', + lastWeek: '[ôfrûne] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : 'oer %s', + past : '%s lyn', + s : 'in pear sekonden', + ss : '%d sekonden', + m : 'ien minút', + mm : '%d minuten', + h : 'ien oere', + hh : '%d oeren', + d : 'ien dei', + dd : '%d dagen', + M : 'ien moanne', + MM : '%d moannen', + y : 'ien jier', + yy : '%d jierren' + }, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - var getSetMinute = makeGetSet('Minutes', false); + return fy; - // FORMATTING +}))); - addFormatToken('s', ['ss', 2], 0, 'second'); - // ALIASES +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { - addUnitAlias('second', 's'); +//! moment.js locale configuration - // PRIORITY +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - addUnitPriority('second', 15); - // PARSING - addRegexToken('s', match1to2); - addRegexToken('ss', match1to2, match2); - addParseToken(['s', 'ss'], SECOND); + var months = [ + 'Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Méitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deaireadh Fómhair', 'Samhain', 'Nollaig' + ]; - // MOMENTS + var monthsShort = ['Eaná', 'Feab', 'Márt', 'Aibr', 'Beal', 'Méit', 'Iúil', 'Lúna', 'Meán', 'Deai', 'Samh', 'Noll']; - var getSetSecond = makeGetSet('Seconds', false); + var weekdays = ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Satharn']; - // FORMATTING + var weekdaysShort = ['Dom', 'Lua', 'Mái', 'Céa', 'Déa', 'hAo', 'Sat']; - addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); - }); + var weekdaysMin = ['Do', 'Lu', 'Má', 'Ce', 'Dé', 'hA', 'Sa']; - addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); + var ga = moment.defineLocale('ga', { + months: months, + monthsShort: monthsShort, + monthsParseExact: true, + weekdays: weekdays, + weekdaysShort: weekdaysShort, + weekdaysMin: weekdaysMin, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + calendar: { + sameDay: '[Inniu ag] LT', + nextDay: '[Amárach ag] LT', + nextWeek: 'dddd [ag] LT', + lastDay: '[Inné aig] LT', + lastWeek: 'dddd [seo caite] [ag] LT', + sameElse: 'L' + }, + relativeTime: { + future: 'i %s', + past: '%s ó shin', + s: 'cúpla soicind', + ss: '%d soicind', + m: 'nóiméad', + mm: '%d nóiméad', + h: 'uair an chloig', + hh: '%d uair an chloig', + d: 'lá', + dd: '%d lá', + M: 'mí', + MM: '%d mí', + y: 'bliain', + yy: '%d bliain' + }, + dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/, + ordinal: function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + return number + output; + }, + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } }); - addFormatToken(0, ['SSS', 3], 0, 'millisecond'); - addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; - }); - addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; - }); - addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; - }); - addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; - }); - addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; - }); - addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; - }); + return ga; +}))); - // ALIASES - addUnitAlias('millisecond', 'ms'); +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { - // PRIORITY +//! moment.js locale configuration - addUnitPriority('millisecond', 16); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // PARSING - addRegexToken('S', match1to3, match1); - addRegexToken('SS', match1to3, match2); - addRegexToken('SSS', match1to3, match3); + var months = [ + 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' + ]; - var token; - for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); - } + var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; - function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - } + var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; - for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); - } - // MOMENTS + var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; - var getSetMillisecond = makeGetSet('Milliseconds', false); + var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; - // FORMATTING + var gd = moment.defineLocale('gd', { + months : months, + monthsShort : monthsShort, + monthsParseExact : true, + weekdays : weekdays, + weekdaysShort : weekdaysShort, + weekdaysMin : weekdaysMin, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' + }, + calendar : { + sameDay : '[An-diugh aig] LT', + nextDay : '[A-màireach aig] LT', + nextWeek : 'dddd [aig] LT', + lastDay : '[An-dè aig] LT', + lastWeek : 'dddd [seo chaidh] [aig] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'ann an %s', + past : 'bho chionn %s', + s : 'beagan diogan', + ss : '%d diogan', + m : 'mionaid', + mm : '%d mionaidean', + h : 'uair', + hh : '%d uairean', + d : 'latha', + dd : '%d latha', + M : 'mìos', + MM : '%d mìosan', + y : 'bliadhna', + yy : '%d bliadhna' + }, + dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, + ordinal : function (number) { + var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - addFormatToken('z', 0, 0, 'zoneAbbr'); - addFormatToken('zz', 0, 0, 'zoneName'); + return gd; - // MOMENTS +}))); - function getZoneAbbr () { - return this._isUTC ? 'UTC' : ''; - } - function getZoneName () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - } +/***/ }), +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { - var proto = Moment.prototype; +//! moment.js locale configuration - proto.add = add; - proto.calendar = calendar$1; - proto.clone = clone; - proto.diff = diff; - proto.endOf = endOf; - proto.format = format; - proto.from = from; - proto.fromNow = fromNow; - proto.to = to; - proto.toNow = toNow; - proto.get = stringGet; - proto.invalidAt = invalidAt; - proto.isAfter = isAfter; - proto.isBefore = isBefore; - proto.isBetween = isBetween; - proto.isSame = isSame; - proto.isSameOrAfter = isSameOrAfter; - proto.isSameOrBefore = isSameOrBefore; - proto.isValid = isValid$2; - proto.lang = lang; - proto.locale = locale; - proto.localeData = localeData; - proto.max = prototypeMax; - proto.min = prototypeMin; - proto.parsingFlags = parsingFlags; - proto.set = stringSet; - proto.startOf = startOf; - proto.subtract = subtract; - proto.toArray = toArray; - proto.toObject = toObject; - proto.toDate = toDate; - proto.toISOString = toISOString; - proto.inspect = inspect; - proto.toJSON = toJSON; - proto.toString = toString; - proto.unix = unix; - proto.valueOf = valueOf; - proto.creationData = creationData; - proto.year = getSetYear; - proto.isLeapYear = getIsLeapYear; - proto.weekYear = getSetWeekYear; - proto.isoWeekYear = getSetISOWeekYear; - proto.quarter = proto.quarters = getSetQuarter; - proto.month = getSetMonth; - proto.daysInMonth = getDaysInMonth; - proto.week = proto.weeks = getSetWeek; - proto.isoWeek = proto.isoWeeks = getSetISOWeek; - proto.weeksInYear = getWeeksInYear; - proto.isoWeeksInYear = getISOWeeksInYear; - proto.date = getSetDayOfMonth; - proto.day = proto.days = getSetDayOfWeek; - proto.weekday = getSetLocaleDayOfWeek; - proto.isoWeekday = getSetISODayOfWeek; - proto.dayOfYear = getSetDayOfYear; - proto.hour = proto.hours = getSetHour; - proto.minute = proto.minutes = getSetMinute; - proto.second = proto.seconds = getSetSecond; - proto.millisecond = proto.milliseconds = getSetMillisecond; - proto.utcOffset = getSetOffset; - proto.utc = setOffsetToUTC; - proto.local = setOffsetToLocal; - proto.parseZone = setOffsetToParsedOffset; - proto.hasAlignedHourOffset = hasAlignedHourOffset; - proto.isDST = isDaylightSavingTime; - proto.isLocal = isLocal; - proto.isUtcOffset = isUtcOffset; - proto.isUtc = isUtc; - proto.isUTC = isUtc; - proto.zoneAbbr = getZoneAbbr; - proto.zoneName = getZoneName; - proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); - proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); - proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); - proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); - proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function createUnix (input) { - return createLocal(input * 1000); - } - function createInZone () { - return createLocal.apply(null, arguments).parseZone(); - } + var gl = moment.defineLocale('gl', { + months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), + monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), + weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), + weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [de] MMMM [de] YYYY', + LLL : 'D [de] MMMM [de] YYYY H:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str.indexOf('un') === 0) { + return 'n' + str; + } + return 'en ' + str; + }, + past : 'hai %s', + s : 'uns segundos', + ss : '%d segundos', + m : 'un minuto', + mm : '%d minutos', + h : 'unha hora', + hh : '%d horas', + d : 'un día', + dd : '%d días', + M : 'un mes', + MM : '%d meses', + y : 'un ano', + yy : '%d anos' + }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); - function preParsePostFormat (string) { - return string; - } + return gl; - var proto$1 = Locale.prototype; +}))); - proto$1.calendar = calendar; - proto$1.longDateFormat = longDateFormat; - proto$1.invalidDate = invalidDate; - proto$1.ordinal = ordinal; - proto$1.preparse = preParsePostFormat; - proto$1.postformat = preParsePostFormat; - proto$1.relativeTime = relativeTime; - proto$1.pastFuture = pastFuture; - proto$1.set = set; - proto$1.months = localeMonths; - proto$1.monthsShort = localeMonthsShort; - proto$1.monthsParse = localeMonthsParse; - proto$1.monthsRegex = monthsRegex; - proto$1.monthsShortRegex = monthsShortRegex; - proto$1.week = localeWeek; - proto$1.firstDayOfYear = localeFirstDayOfYear; - proto$1.firstDayOfWeek = localeFirstDayOfWeek; +/***/ }), +/* 62 */ +/***/ (function(module, exports, __webpack_require__) { - proto$1.weekdays = localeWeekdays; - proto$1.weekdaysMin = localeWeekdaysMin; - proto$1.weekdaysShort = localeWeekdaysShort; - proto$1.weekdaysParse = localeWeekdaysParse; +//! moment.js locale configuration - proto$1.weekdaysRegex = weekdaysRegex; - proto$1.weekdaysShortRegex = weekdaysShortRegex; - proto$1.weekdaysMinRegex = weekdaysMinRegex; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - proto$1.isPM = localeIsPM; - proto$1.meridiem = localeMeridiem; - function get$1 (format, index, field, setter) { - var locale = getLocale(); - var utc = createUTC().set(setter, index); - return locale[field](utc, format); + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['thodde secondanim', 'thodde second'], + 'ss': [number + ' secondanim', number + ' second'], + 'm': ['eka mintan', 'ek minute'], + 'mm': [number + ' mintanim', number + ' mintam'], + 'h': ['eka voran', 'ek vor'], + 'hh': [number + ' voranim', number + ' voram'], + 'd': ['eka disan', 'ek dis'], + 'dd': [number + ' disanim', number + ' dis'], + 'M': ['eka mhoinean', 'ek mhoino'], + 'MM': [number + ' mhoineanim', number + ' mhoine'], + 'y': ['eka vorsan', 'ek voros'], + 'yy': [number + ' vorsanim', number + ' vorsam'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; } - function listMonthsImpl (format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; + var gomLatn = moment.defineLocale('gom-latn', { + months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), + monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), + weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), + weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'A h:mm [vazta]', + LTS : 'A h:mm:ss [vazta]', + L : 'DD-MM-YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY A h:mm [vazta]', + LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', + llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + }, + calendar : { + sameDay: '[Aiz] LT', + nextDay: '[Faleam] LT', + nextWeek: '[Ieta to] dddd[,] LT', + lastDay: '[Kal] LT', + lastWeek: '[Fatlo] dddd[,] LT', + sameElse: 'L' + }, + relativeTime : { + future : '%s', + past : '%s adim', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + dayOfMonthOrdinalParse : /\d{1,2}(er)/, + ordinal : function (number, period) { + switch (period) { + // the ordinal 'er' only applies to day of the month + case 'D': + return number + 'er'; + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + case 'w': + case 'W': + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + }, + meridiemParse: /rati|sokalli|donparam|sanje/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'rati') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'sokalli') { + return hour; + } else if (meridiem === 'donparam') { + return hour > 12 ? hour : hour + 12; + } else if (meridiem === 'sanje') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'rati'; + } else if (hour < 12) { + return 'sokalli'; + } else if (hour < 16) { + return 'donparam'; + } else if (hour < 20) { + return 'sanje'; + } else { + return 'rati'; + } } + }); - format = format || ''; + return gomLatn; - if (index != null) { - return get$1(format, index, field, 'month'); - } +}))); - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); - } - return out; - } - // () - // (5) - // (fmt, 5) - // (fmt) - // (true) - // (true, 5) - // (true, fmt, 5) - // (true, fmt) - function listWeekdaysImpl (localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; - } +/***/ }), +/* 63 */ +/***/ (function(module, exports, __webpack_require__) { - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; +//! moment.js locale configuration - if (isNumber(format)) { - index = format; - format = undefined; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - format = format || ''; - } - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0; + var symbolMap = { + '1': '૧', + '2': '૨', + '3': '૩', + '4': '૪', + '5': '૫', + '6': '૬', + '7': '૭', + '8': '૮', + '9': '૯', + '0': '૦' + }, + numberMap = { + '૧': '1', + '૨': '2', + '૩': '3', + '૪': '4', + '૫': '5', + '૬': '6', + '૭': '7', + '૮': '8', + '૯': '9', + '૦': '0' + }; - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); + var gu = moment.defineLocale('gu', { + months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), + monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), + monthsParseExact: true, + weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'), + weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'), + weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'), + longDateFormat: { + LT: 'A h:mm વાગ્યે', + LTS: 'A h:mm:ss વાગ્યે', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY, A h:mm વાગ્યે', + LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે' + }, + calendar: { + sameDay: '[આજ] LT', + nextDay: '[કાલે] LT', + nextWeek: 'dddd, LT', + lastDay: '[ગઇકાલે] LT', + lastWeek: '[પાછલા] dddd, LT', + sameElse: 'L' + }, + relativeTime: { + future: '%s મા', + past: '%s પેહલા', + s: 'અમુક પળો', + ss: '%d સેકંડ', + m: 'એક મિનિટ', + mm: '%d મિનિટ', + h: 'એક કલાક', + hh: '%d કલાક', + d: 'એક દિવસ', + dd: '%d દિવસ', + M: 'એક મહિનો', + MM: '%d મહિનો', + y: 'એક વર્ષ', + yy: '%d વર્ષ' + }, + preparse: function (string) { + return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Gujarati notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. + meridiemParse: /રાત|બપોર|સવાર|સાંજ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'રાત') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'સવાર') { + return hour; + } else if (meridiem === 'બપોર') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'સાંજ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'રાત'; + } else if (hour < 10) { + return 'સવાર'; + } else if (hour < 17) { + return 'બપોર'; + } else if (hour < 20) { + return 'સાંજ'; + } else { + return 'રાત'; + } + }, + week: { + dow: 0, // Sunday is the first day of the week. + doy: 6 // The week that contains Jan 6th is the first week of the year. } + }); - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; - } + return gu; - function listMonths (format, index) { - return listMonthsImpl(format, index, 'months'); - } +}))); - function listMonthsShort (format, index) { - return listMonthsImpl(format, index, 'monthsShort'); - } - function listWeekdays (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); - } +/***/ }), +/* 64 */ +/***/ (function(module, exports, __webpack_require__) { - function listWeekdaysShort (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); - } +//! moment.js locale configuration - function listWeekdaysMin (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - getSetGlobalLocale('en', { - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + + var he = moment.defineLocale('he', { + months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), + monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), + weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), + weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), + weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D [ב]MMMM YYYY', + LLL : 'D [ב]MMMM YYYY HH:mm', + LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', + l : 'D/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' + }, + calendar : { + sameDay : '[היום ב־]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[אתמול ב־]LT', + lastWeek : '[ביום] dddd [האחרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'בעוד %s', + past : 'לפני %s', + s : 'מספר שניות', + ss : '%d שניות', + m : 'דקה', + mm : '%d דקות', + h : 'שעה', + hh : function (number) { + if (number === 2) { + return 'שעתיים'; + } + return number + ' שעות'; + }, + d : 'יום', + dd : function (number) { + if (number === 2) { + return 'יומיים'; + } + return number + ' ימים'; + }, + M : 'חודש', + MM : function (number) { + if (number === 2) { + return 'חודשיים'; + } + return number + ' חודשים'; + }, + y : 'שנה', + yy : function (number) { + if (number === 2) { + return 'שנתיים'; + } else if (number % 10 === 0 && number !== 10) { + return number + ' שנה'; + } + return number + ' שנים'; + } + }, + meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, + isPM : function (input) { + return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 5) { + return 'לפנות בוקר'; + } else if (hour < 10) { + return 'בבוקר'; + } else if (hour < 12) { + return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } else if (hour < 18) { + return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } else { + return 'בערב'; + } } }); - // Side effect imports - - hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); - hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - - var mathAbs = Math.abs; - - function abs () { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; - } + return he; - function addSubtract$1 (duration, input, value, direction) { - var other = createDuration(input, value); +}))); - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - return duration._bubble(); - } +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { - // supports only 2.0-style add(1, 's') or add(duration) - function add$1 (input, value) { - return addSubtract$1(this, input, value, 1); - } +//! moment.js locale configuration - // supports only 2.0-style subtract(1, 's') or subtract(duration) - function subtract$1 (input, value) { - return addSubtract$1(this, input, value, -1); - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function absCeil (number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } - } - function bubble () { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; + var hi = moment.defineLocale('hi', { + months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), + monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), + monthsParseExact: true, + weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + longDateFormat : { + LT : 'A h:mm बजे', + LTS : 'A h:mm:ss बजे', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s में', + past : '%s पहले', + s : 'कुछ ही क्षण', + ss : '%d सेकंड', + m : 'एक मिनट', + mm : '%d मिनट', + h : 'एक घंटा', + hh : '%d घंटे', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महीने', + MM : '%d महीने', + y : 'एक वर्ष', + yy : '%d वर्ष' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiemParse: /रात|सुबह|दोपहर|शाम/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सुबह') { + return hour; + } else if (meridiem === 'दोपहर') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'शाम') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'रात'; + } else if (hour < 10) { + return 'सुबह'; + } else if (hour < 17) { + return 'दोपहर'; + } else if (hour < 20) { + return 'शाम'; + } else { + return 'रात'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } + }); - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; + return hi; - days += absFloor(hours / 24); +}))); - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; +/***/ }), +/* 66 */ +/***/ (function(module, exports, __webpack_require__) { - data.days = days; - data.months = months; - data.years = years; +//! moment.js locale configuration - return this; - } +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - function daysToMonths (days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; - } - function monthsToDays (months) { - // the reverse of daysToMonths - return months * 146097 / 4800; + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + if (number === 1) { + result += 'sekunda'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sekunde'; + } else { + result += 'sekundi'; + } + return result; + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } } - function as (units) { - if (!this.isValid()) { - return NaN; - } - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'quarter' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - switch (units) { - case 'month': return months; - case 'quarter': return months / 3; - case 'year': return months / 12; - } - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week' : return days / 7 + milliseconds / 6048e5; - case 'day' : return days + milliseconds / 864e5; - case 'hour' : return days * 24 + milliseconds / 36e5; - case 'minute' : return days * 1440 + milliseconds / 6e4; - case 'second' : return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 864e5) + milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - } - - // TODO: Use this.as('ms')? - function valueOf$1 () { - if (!this.isValid()) { - return NaN; + var hr = moment.defineLocale('hr', { + months : { + format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), + standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') + }, + monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), + monthsParseExact: true, + weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[jučer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prošli] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : 'za %s', + past : 'prije %s', + s : 'par sekundi', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : 'dan', + dd : translate, + M : 'mjesec', + MM : translate, + y : 'godinu', + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); - } - - function makeAs (alias) { - return function () { - return this.as(alias); - }; - } - - var asMilliseconds = makeAs('ms'); - var asSeconds = makeAs('s'); - var asMinutes = makeAs('m'); - var asHours = makeAs('h'); - var asDays = makeAs('d'); - var asWeeks = makeAs('w'); - var asMonths = makeAs('M'); - var asQuarters = makeAs('Q'); - var asYears = makeAs('y'); - - function clone$1 () { - return createDuration(this); - } - - function get$2 (units) { - units = normalizeUnits(units); - return this.isValid() ? this[units + 's']() : NaN; - } - - function makeGetter(name) { - return function () { - return this.isValid() ? this._data[name] : NaN; - }; - } + }); - var milliseconds = makeGetter('milliseconds'); - var seconds = makeGetter('seconds'); - var minutes = makeGetter('minutes'); - var hours = makeGetter('hours'); - var days = makeGetter('days'); - var months = makeGetter('months'); - var years = makeGetter('years'); + return hr; - function weeks () { - return absFloor(this.days() / 7); - } +}))); - var round = Math.round; - var thresholds = { - ss: 44, // a few seconds to seconds - s : 45, // seconds to minute - m : 45, // minutes to hour - h : 22, // hours to day - d : 26, // days to month - M : 11 // months to year - }; - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } +/***/ }), +/* 67 */ +/***/ (function(module, exports, __webpack_require__) { - function relativeTime$1 (posNegDuration, withoutSuffix, locale) { - var duration = createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); +//! moment.js locale configuration - var a = seconds <= thresholds.ss && ['s', seconds] || - seconds < thresholds.s && ['ss', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); - } - // This function allows you to set the rounding function for relative time strings - function getSetRelativeTimeRounding (roundingFunction) { - if (roundingFunction === undefined) { - return round; - } - if (typeof(roundingFunction) === 'function') { - round = roundingFunction; - return true; + var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); + function translate(number, withoutSuffix, key, isFuture) { + var num = number; + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'ss': + return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); } - return false; + return ''; } - - // This function allows you to set a threshold for relative time strings - function getSetRelativeTimeThreshold (threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - if (threshold === 's') { - thresholds.ss = limit - 1; - } - return true; + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; } - function humanize (withSuffix) { - if (!this.isValid()) { - return this.localeData().invalidDate(); + var hu = moment.defineLocale('hu', { + months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), + monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), + weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), + weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), + weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + longDateFormat : { + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY. MMMM D.', + LLL : 'YYYY. MMMM D. H:mm', + LLLL : 'YYYY. MMMM D., dddd H:mm' + }, + meridiemParse: /de|du/i, + isPM: function (input) { + return input.charAt(1).toLowerCase() === 'u'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower === true ? 'de' : 'DE'; + } else { + return isLower === true ? 'du' : 'DU'; + } + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : '%s múlva', + past : '%s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } + }); - var locale = this.localeData(); - var output = relativeTime$1(this, !withSuffix, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } + return hu; - return locale.postformat(output); - } +}))); - var abs$1 = Math.abs; - function sign(x) { - return ((x > 0) - (x < 0)) || +x; - } +/***/ }), +/* 68 */ +/***/ (function(module, exports, __webpack_require__) { - function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - if (!this.isValid()) { - return this.localeData().invalidDate(); - } +//! moment.js locale configuration - var seconds = abs$1(this._milliseconds) / 1000; - var days = abs$1(this._days); - var months = abs$1(this._months); - var minutes, hours, years; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; + var hyAm = moment.defineLocale('hy-am', { + months : { + format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), + standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') + }, + monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), + weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), + weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY թ.', + LLL : 'D MMMM YYYY թ., HH:mm', + LLLL : 'dddd, D MMMM YYYY թ., HH:mm' + }, + calendar : { + sameDay: '[այսօր] LT', + nextDay: '[վաղը] LT', + lastDay: '[երեկ] LT', + nextWeek: function () { + return 'dddd [օրը ժամը] LT'; + }, + lastWeek: function () { + return '[անցած] dddd [օրը ժամը] LT'; + }, + sameElse: 'L' + }, + relativeTime : { + future : '%s հետո', + past : '%s առաջ', + s : 'մի քանի վայրկյան', + ss : '%d վայրկյան', + m : 'րոպե', + mm : '%d րոպե', + h : 'ժամ', + hh : '%d ժամ', + d : 'օր', + dd : '%d օր', + M : 'ամիս', + MM : '%d ամիս', + y : 'տարի', + yy : '%d տարի' + }, + meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + isPM: function (input) { + return /^(ցերեկվա|երեկոյան)$/.test(input); + }, + meridiem : function (hour) { + if (hour < 4) { + return 'գիշերվա'; + } else if (hour < 12) { + return 'առավոտվա'; + } else if (hour < 17) { + return 'ցերեկվա'; + } else { + return 'երեկոյան'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, + ordinal: function (number, period) { + switch (period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + if (number === 1) { + return number + '-ին'; + } + return number + '-րդ'; + default: + return number; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } + }); + return hyAm; - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; - var total = this.asSeconds(); +}))); - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - var totalSign = total < 0 ? '-' : ''; - var ymSign = sign(this._months) !== sign(total) ? '-' : ''; - var daysSign = sign(this._days) !== sign(total) ? '-' : ''; - var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; +/***/ }), +/* 69 */ +/***/ (function(module, exports, __webpack_require__) { - return totalSign + 'P' + - (Y ? ymSign + Y + 'Y' : '') + - (M ? ymSign + M + 'M' : '') + - (D ? daysSign + D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? hmsSign + h + 'H' : '') + - (m ? hmsSign + m + 'M' : '') + - (s ? hmsSign + s + 'S' : ''); - } +//! moment.js locale configuration - var proto$2 = Duration.prototype; +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; - proto$2.isValid = isValid$1; - proto$2.abs = abs; - proto$2.add = add$1; - proto$2.subtract = subtract$1; - proto$2.as = as; - proto$2.asMilliseconds = asMilliseconds; - proto$2.asSeconds = asSeconds; - proto$2.asMinutes = asMinutes; - proto$2.asHours = asHours; - proto$2.asDays = asDays; - proto$2.asWeeks = asWeeks; - proto$2.asMonths = asMonths; - proto$2.asQuarters = asQuarters; - proto$2.asYears = asYears; - proto$2.valueOf = valueOf$1; - proto$2._bubble = bubble; - proto$2.clone = clone$1; - proto$2.get = get$2; - proto$2.milliseconds = milliseconds; - proto$2.seconds = seconds; - proto$2.minutes = minutes; - proto$2.hours = hours; - proto$2.days = days; - proto$2.weeks = weeks; - proto$2.months = months; - proto$2.years = years; - proto$2.humanize = humanize; - proto$2.toISOString = toISOString$1; - proto$2.toString = toISOString$1; - proto$2.toJSON = toISOString$1; - proto$2.locale = locale; - proto$2.localeData = localeData; - proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); - proto$2.lang = lang; - - // Side effect imports - - // FORMATTING - - addFormatToken('X', 0, 0, 'unix'); - addFormatToken('x', 0, 0, 'valueOf'); - - // PARSING - - addRegexToken('x', matchSigned); - addRegexToken('X', matchTimestamp); - addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); - }); - addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); - }); - - // Side effect imports - - - hooks.version = '2.24.0'; - - setHookCallback(createLocal); - - hooks.fn = proto; - hooks.min = min; - hooks.max = max; - hooks.now = now; - hooks.utc = createUTC; - hooks.unix = createUnix; - hooks.months = listMonths; - hooks.isDate = isDate; - hooks.locale = getSetGlobalLocale; - hooks.invalid = createInvalid; - hooks.duration = createDuration; - hooks.isMoment = isMoment; - hooks.weekdays = listWeekdays; - hooks.parseZone = createInZone; - hooks.localeData = getLocale; - hooks.isDuration = isDuration; - hooks.monthsShort = listMonthsShort; - hooks.weekdaysMin = listWeekdaysMin; - hooks.defineLocale = defineLocale; - hooks.updateLocale = updateLocale; - hooks.locales = listLocales; - hooks.weekdaysShort = listWeekdaysShort; - hooks.normalizeUnits = normalizeUnits; - hooks.relativeTimeRounding = getSetRelativeTimeRounding; - hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; - hooks.calendarFormat = getCalendarFormat; - hooks.prototype = proto; - - // currently HTML5 input type only supports 24-hour formats - hooks.HTML5_FMT = { - DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // - DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // - DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // - DATE: 'YYYY-MM-DD', // - TIME: 'HH:mm', // - TIME_SECONDS: 'HH:mm:ss', // - TIME_MS: 'HH:mm:ss.SSS', // - WEEK: 'GGGG-[W]WW', // - MONTH: 'YYYY-MM' // - }; - - return hooks; - -}))); - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./af": 42, - "./af.js": 42, - "./ar": 43, - "./ar-dz": 44, - "./ar-dz.js": 44, - "./ar-kw": 45, - "./ar-kw.js": 45, - "./ar-ly": 46, - "./ar-ly.js": 46, - "./ar-ma": 47, - "./ar-ma.js": 47, - "./ar-sa": 48, - "./ar-sa.js": 48, - "./ar-tn": 49, - "./ar-tn.js": 49, - "./ar.js": 43, - "./az": 50, - "./az.js": 50, - "./be": 51, - "./be.js": 51, - "./bg": 52, - "./bg.js": 52, - "./bm": 53, - "./bm.js": 53, - "./bn": 54, - "./bn.js": 54, - "./bo": 55, - "./bo.js": 55, - "./br": 56, - "./br.js": 56, - "./bs": 57, - "./bs.js": 57, - "./ca": 58, - "./ca.js": 58, - "./cs": 59, - "./cs.js": 59, - "./cv": 60, - "./cv.js": 60, - "./cy": 61, - "./cy.js": 61, - "./da": 62, - "./da.js": 62, - "./de": 63, - "./de-at": 64, - "./de-at.js": 64, - "./de-ch": 65, - "./de-ch.js": 65, - "./de.js": 63, - "./dv": 66, - "./dv.js": 66, - "./el": 67, - "./el.js": 67, - "./en-SG": 68, - "./en-SG.js": 68, - "./en-au": 69, - "./en-au.js": 69, - "./en-ca": 70, - "./en-ca.js": 70, - "./en-gb": 71, - "./en-gb.js": 71, - "./en-ie": 72, - "./en-ie.js": 72, - "./en-il": 73, - "./en-il.js": 73, - "./en-nz": 74, - "./en-nz.js": 74, - "./eo": 75, - "./eo.js": 75, - "./es": 76, - "./es-do": 77, - "./es-do.js": 77, - "./es-us": 78, - "./es-us.js": 78, - "./es.js": 76, - "./et": 79, - "./et.js": 79, - "./eu": 80, - "./eu.js": 80, - "./fa": 81, - "./fa.js": 81, - "./fi": 82, - "./fi.js": 82, - "./fo": 83, - "./fo.js": 83, - "./fr": 84, - "./fr-ca": 85, - "./fr-ca.js": 85, - "./fr-ch": 86, - "./fr-ch.js": 86, - "./fr.js": 84, - "./fy": 87, - "./fy.js": 87, - "./ga": 88, - "./ga.js": 88, - "./gd": 89, - "./gd.js": 89, - "./gl": 90, - "./gl.js": 90, - "./gom-latn": 91, - "./gom-latn.js": 91, - "./gu": 92, - "./gu.js": 92, - "./he": 93, - "./he.js": 93, - "./hi": 94, - "./hi.js": 94, - "./hr": 95, - "./hr.js": 95, - "./hu": 96, - "./hu.js": 96, - "./hy-am": 97, - "./hy-am.js": 97, - "./id": 98, - "./id.js": 98, - "./is": 99, - "./is.js": 99, - "./it": 100, - "./it-ch": 101, - "./it-ch.js": 101, - "./it.js": 100, - "./ja": 102, - "./ja.js": 102, - "./jv": 103, - "./jv.js": 103, - "./ka": 104, - "./ka.js": 104, - "./kk": 105, - "./kk.js": 105, - "./km": 106, - "./km.js": 106, - "./kn": 107, - "./kn.js": 107, - "./ko": 108, - "./ko.js": 108, - "./ku": 109, - "./ku.js": 109, - "./ky": 110, - "./ky.js": 110, - "./lb": 111, - "./lb.js": 111, - "./lo": 112, - "./lo.js": 112, - "./lt": 113, - "./lt.js": 113, - "./lv": 114, - "./lv.js": 114, - "./me": 115, - "./me.js": 115, - "./mi": 116, - "./mi.js": 116, - "./mk": 117, - "./mk.js": 117, - "./ml": 118, - "./ml.js": 118, - "./mn": 119, - "./mn.js": 119, - "./mr": 120, - "./mr.js": 120, - "./ms": 121, - "./ms-my": 122, - "./ms-my.js": 122, - "./ms.js": 121, - "./mt": 123, - "./mt.js": 123, - "./my": 124, - "./my.js": 124, - "./nb": 125, - "./nb.js": 125, - "./ne": 126, - "./ne.js": 126, - "./nl": 127, - "./nl-be": 128, - "./nl-be.js": 128, - "./nl.js": 127, - "./nn": 129, - "./nn.js": 129, - "./pa-in": 130, - "./pa-in.js": 130, - "./pl": 131, - "./pl.js": 131, - "./pt": 132, - "./pt-br": 133, - "./pt-br.js": 133, - "./pt.js": 132, - "./ro": 134, - "./ro.js": 134, - "./ru": 135, - "./ru.js": 135, - "./sd": 136, - "./sd.js": 136, - "./se": 137, - "./se.js": 137, - "./si": 138, - "./si.js": 138, - "./sk": 139, - "./sk.js": 139, - "./sl": 140, - "./sl.js": 140, - "./sq": 141, - "./sq.js": 141, - "./sr": 142, - "./sr-cyrl": 143, - "./sr-cyrl.js": 143, - "./sr.js": 142, - "./ss": 144, - "./ss.js": 144, - "./sv": 145, - "./sv.js": 145, - "./sw": 146, - "./sw.js": 146, - "./ta": 147, - "./ta.js": 147, - "./te": 148, - "./te.js": 148, - "./tet": 149, - "./tet.js": 149, - "./tg": 150, - "./tg.js": 150, - "./th": 151, - "./th.js": 151, - "./tl-ph": 152, - "./tl-ph.js": 152, - "./tlh": 153, - "./tlh.js": 153, - "./tr": 154, - "./tr.js": 154, - "./tzl": 155, - "./tzl.js": 155, - "./tzm": 156, - "./tzm-latn": 157, - "./tzm-latn.js": 157, - "./tzm.js": 156, - "./ug-cn": 158, - "./ug-cn.js": 158, - "./uk": 159, - "./uk.js": 159, - "./ur": 160, - "./ur.js": 160, - "./uz": 161, - "./uz-latn": 162, - "./uz-latn.js": 162, - "./uz.js": 161, - "./vi": 163, - "./vi.js": 163, - "./x-pseudo": 164, - "./x-pseudo.js": 164, - "./yo": 165, - "./yo.js": 165, - "./zh-cn": 166, - "./zh-cn.js": 166, - "./zh-hk": 167, - "./zh-hk.js": 167, - "./zh-tw": 168, - "./zh-tw.js": 168 -}; - - -function webpackContext(req) { - var id = webpackContextResolve(req); - return __webpack_require__(id); -} -function webpackContextResolve(req) { - if(!__webpack_require__.o(map, req)) { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - } - return map[req]; -} -webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); -}; -webpackContext.resolve = webpackContextResolve; -module.exports = webpackContext; -webpackContext.id = 41; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var af = moment.defineLocale('af', { - months : 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'), - weekdaysShort : 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'), - weekdaysMin : 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'), - meridiemParse: /vm|nm/i, - isPM : function (input) { - return /^nm$/i.test(input); + var id = moment.defineLocale('id', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + longDateFormat : { + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|siang|sore|malam/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'siang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sore' || meridiem === 'malam') { + return hour + 12; + } }, meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'vm' : 'VM'; + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; } else { - return isLower ? 'nm' : 'NM'; + return 'malam'; } }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, calendar : { - sameDay : '[Vandag om] LT', - nextDay : '[Môre om] LT', - nextWeek : 'dddd [om] LT', - lastDay : '[Gister om] LT', - lastWeek : '[Laas] dddd [om] LT', + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', sameElse : 'L' }, relativeTime : { - future : 'oor %s', - past : '%s gelede', - s : '\'n paar sekondes', - ss : '%d sekondes', - m : '\'n minuut', - mm : '%d minute', - h : '\'n uur', - hh : '%d ure', - d : '\'n dag', - dd : '%d dae', - M : '\'n maand', - MM : '%d maande', - y : '\'n jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); // Thanks to Joris Röling : https://github.com/jjupiter + future : 'dalam %s', + past : '%s yang lalu', + s : 'beberapa detik', + ss : '%d detik', + m : 'semenit', + mm : '%d menit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' }, week : { - dow : 1, // Maandag is die eerste dag van die week. - doy : 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return af; + return id; }))); /***/ }), -/* 43 */ +/* 70 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر' - ]; + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'ss': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); + } + return result + 'sekúnda'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } - var ar = moment.defineLocale('ar', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var is = moment.defineLocale('is', { + months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), + weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), + weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), + weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' }, calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' }, relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - ss : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + future : 'eftir %s', + past : 'fyrir %s síðan', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : 'klukkustund', + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ar; + return is; }))); /***/ }), -/* 44 */ +/* 71 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arDz = moment.defineLocale('ar-dz', { - months : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'), - weekdaysParseExact : true, + var it = moment.defineLocale('it', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', @@ -10130,446 +11445,586 @@ webpackContext.id = 41; LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, sameElse: 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + ss : '%d secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', week : { - dow : 0, // Sunday is the first day of the week. + dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return arDz; + return it; }))); /***/ }), -/* 45 */ +/* 72 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arKw = moment.defineLocale('ar-kw', { - months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', + var itCh = moment.defineLocale('it-ch', { + months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), + monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), + weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), + weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), + weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + longDateFormat : { + LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', + L : 'DD.MM.YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, sameElse: 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' + future : function (s) { + return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; + }, + past : '%s fa', + s : 'alcuni secondi', + ss : '%d secondi', + m : 'un minuto', + mm : '%d minuti', + h : 'un\'ora', + hh : '%d ore', + d : 'un giorno', + dd : '%d giorni', + M : 'un mese', + MM : '%d mesi', + y : 'un anno', + yy : '%d anni' }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', week : { - dow : 0, // Sunday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return arKw; + return itCh; }))); /***/ }), -/* 46 */ +/* 73 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '1', - '2': '2', - '3': '3', - '4': '4', - '5': '5', - '6': '6', - '7': '7', - '8': '8', - '9': '9', - '0': '0' - }, pluralForm = function (n) { - return n === 0 ? 0 : n === 1 ? 1 : n === 2 ? 2 : n % 100 >= 3 && n % 100 <= 10 ? 3 : n % 100 >= 11 ? 4 : 5; - }, plurals = { - s : ['أقل من ثانية', 'ثانية واحدة', ['ثانيتان', 'ثانيتين'], '%d ثوان', '%d ثانية', '%d ثانية'], - m : ['أقل من دقيقة', 'دقيقة واحدة', ['دقيقتان', 'دقيقتين'], '%d دقائق', '%d دقيقة', '%d دقيقة'], - h : ['أقل من ساعة', 'ساعة واحدة', ['ساعتان', 'ساعتين'], '%d ساعات', '%d ساعة', '%d ساعة'], - d : ['أقل من يوم', 'يوم واحد', ['يومان', 'يومين'], '%d أيام', '%d يومًا', '%d يوم'], - M : ['أقل من شهر', 'شهر واحد', ['شهران', 'شهرين'], '%d أشهر', '%d شهرا', '%d شهر'], - y : ['أقل من عام', 'عام واحد', ['عامان', 'عامين'], '%d أعوام', '%d عامًا', '%d عام'] - }, pluralize = function (u) { - return function (number, withoutSuffix, string, isFuture) { - var f = pluralForm(number), - str = plurals[u][pluralForm(number)]; - if (f === 2) { - str = str[withoutSuffix ? 0 : 1]; - } - return str.replace(/%d/i, number); - }; - }, months = [ - 'يناير', - 'فبراير', - 'مارس', - 'أبريل', - 'مايو', - 'يونيو', - 'يوليو', - 'أغسطس', - 'سبتمبر', - 'أكتوبر', - 'نوفمبر', - 'ديسمبر' - ]; - - var arLy = moment.defineLocale('ar-ly', { - months : months, - monthsShort : months, - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var ja = moment.defineLocale('ja', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), + weekdaysShort : '日_月_火_水_木_金_土'.split('_'), + weekdaysMin : '日_月_火_水_木_金_土'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'D/\u200FM/\u200FYYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日 dddd HH:mm', + l : 'YYYY/MM/DD', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日(ddd) HH:mm' }, - meridiemParse: /ص|م/, + meridiemParse: /午前|午後/i, isPM : function (input) { - return 'م' === input; + return input === '午後'; }, meridiem : function (hour, minute, isLower) { if (hour < 12) { - return 'ص'; + return '午前'; } else { - return 'م'; + return '午後'; } }, calendar : { - sameDay: '[اليوم عند الساعة] LT', - nextDay: '[غدًا عند الساعة] LT', - nextWeek: 'dddd [عند الساعة] LT', - lastDay: '[أمس عند الساعة] LT', - lastWeek: 'dddd [عند الساعة] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'بعد %s', - past : 'منذ %s', - s : pluralize('s'), - ss : pluralize('s'), - m : pluralize('m'), - mm : pluralize('m'), - h : pluralize('h'), - hh : pluralize('h'), - d : pluralize('d'), - dd : pluralize('d'), - M : pluralize('M'), - MM : pluralize('M'), - y : pluralize('y'), - yy : pluralize('y') - }, - preparse: function (string) { - return string.replace(/،/g, ','); + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : function (now) { + if (now.week() < this.week()) { + return '[来週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + lastDay : '[昨日] LT', + lastWeek : function (now) { + if (this.week() < now.week()) { + return '[先週]dddd LT'; + } else { + return 'dddd LT'; + } + }, + sameElse : 'L' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + dayOfMonthOrdinalParse : /\d{1,2}日/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + default: + return number; + } }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + relativeTime : { + future : '%s後', + past : '%s前', + s : '数秒', + ss : '%d秒', + m : '1分', + mm : '%d分', + h : '1時間', + hh : '%d時間', + d : '1日', + dd : '%d日', + M : '1ヶ月', + MM : '%dヶ月', + y : '1年', + yy : '%d年' } }); - return arLy; + return ja; }))); /***/ }), -/* 47 */ +/* 74 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arMa = moment.defineLocale('ar-ma', { - months : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'), - weekdays : 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var jv = moment.defineLocale('jv', { + months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), + monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), + weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), + weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), + weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'HH.mm', + LTS : 'HH.mm.ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /enjing|siyang|sonten|ndalu/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'enjing') { + return hour; + } else if (meridiem === 'siyang') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'sonten' || meridiem === 'ndalu') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'enjing'; + } else if (hours < 15) { + return 'siyang'; + } else if (hours < 19) { + return 'sonten'; + } else { + return 'ndalu'; + } }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' + sameDay : '[Dinten puniko pukul] LT', + nextDay : '[Mbenjang pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kala wingi pukul] LT', + lastWeek : 'dddd [kepengker pukul] LT', + sameElse : 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' + future : 'wonten ing %s', + past : '%s ingkang kepengker', + s : 'sawetawis detik', + ss : '%d detik', + m : 'setunggal menit', + mm : '%d menit', + h : 'setunggal jam', + hh : '%d jam', + d : 'sedinten', + dd : '%d dinten', + M : 'sewulan', + MM : '%d wulan', + y : 'setaun', + yy : '%d taun' }, week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return arMa; + return jv; }))); /***/ }), -/* 48 */ +/* 75 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }; - - var arSa = moment.defineLocale('ar-sa', { - months : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort : 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays : 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort : 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin : 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, + var ka = moment.defineLocale('ka', { + months : { + standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), + format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') + }, + monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), + weekdays : { + standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), + format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), + isFormat: /(წინა|შემდეგ)/ + }, + weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), + weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'h:mm A', + LTS : 'h:mm:ss A', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /ص|م/, - isPM : function (input) { - return 'م' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ص'; - } else { - return 'م'; - } + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' }, calendar : { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', - sameElse: 'L' + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვალ] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინა] dddd LT-ზე', + sameElse : 'L' }, relativeTime : { - future : 'في %s', - past : 'منذ %s', - s : 'ثوان', - ss : '%d ثانية', - m : 'دقيقة', - mm : '%d دقائق', - h : 'ساعة', - hh : '%d ساعات', - d : 'يوم', - dd : '%d أيام', - M : 'شهر', - MM : '%d أشهر', - y : 'سنة', - yy : '%d سنوات' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); + future : function (s) { + return (/(წამი|წუთი|საათი|წელი)/).test(s) ? + s.replace(/ი$/, 'ში') : + s + 'ში'; + }, + past : function (s) { + if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, 'ის წინ'); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, 'წლის წინ'); + } + }, + s : 'რამდენიმე წამი', + ss : '%d წამი', + m : 'წუთი', + mm : '%d წუთი', + h : 'საათი', + hh : '%d საათი', + d : 'დღე', + dd : '%d დღე', + M : 'თვე', + MM : '%d თვე', + y : 'წელი', + yy : '%d წელი' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, + ordinal : function (number) { + if (number === 0) { + return number; + } + if (number === 1) { + return number + '-ლი'; + } + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return 'მე-' + number; + } + return number + '-ე'; }, week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, + doy : 7 } }); - return arSa; + return ka; }))); /***/ }), -/* 49 */ +/* 76 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var arTn = moment.defineLocale('ar-tn', { - months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'), - weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'), - weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'), - weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' + var suffixes = { + 0: '-ші', + 1: '-ші', + 2: '-ші', + 3: '-ші', + 4: '-ші', + 5: '-ші', + 6: '-шы', + 7: '-ші', + 8: '-ші', + 9: '-шы', + 10: '-шы', + 20: '-шы', + 30: '-шы', + 40: '-шы', + 50: '-ші', + 60: '-шы', + 70: '-ші', + 80: '-ші', + 90: '-шы', + 100: '-ші' + }; + + var kk = moment.defineLocale('kk', { + months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), + monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), + weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), + weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), + weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, - calendar: { - sameDay: '[اليوم على الساعة] LT', - nextDay: '[غدا على الساعة] LT', - nextWeek: 'dddd [على الساعة] LT', - lastDay: '[أمس على الساعة] LT', - lastWeek: 'dddd [على الساعة] LT', + calendar : { + sameDay : '[Бүгін сағат] LT', + nextDay : '[Ертең сағат] LT', + nextWeek : 'dddd [сағат] LT', + lastDay : '[Кеше сағат] LT', + lastWeek : '[Өткен аптаның] dddd [сағат] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s ішінде', + past : '%s бұрын', + s : 'бірнеше секунд', + ss : '%d секунд', + m : 'бір минут', + mm : '%d минут', + h : 'бір сағат', + hh : '%d сағат', + d : 'бір күн', + dd : '%d күн', + M : 'бір ай', + MM : '%d ай', + y : 'бір жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. + } + }); + + return kk; + +}))); + + +/***/ }), +/* 77 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var symbolMap = { + '1': '១', + '2': '២', + '3': '៣', + '4': '៤', + '5': '៥', + '6': '៦', + '7': '៧', + '8': '៨', + '9': '៩', + '0': '០' + }, numberMap = { + '១': '1', + '២': '2', + '៣': '3', + '៤': '4', + '៥': '5', + '៦': '6', + '៧': '7', + '៨': '8', + '៩': '9', + '០': '0' + }; + + var km = moment.defineLocale('km', { + months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( + '_' + ), + monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( + '_' + ), + weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), + weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), + weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), + weekdaysParseExact: true, + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd, D MMMM YYYY HH:mm' + }, + meridiemParse: /ព្រឹក|ល្ងាច/, + isPM: function (input) { + return input === 'ល្ងាច'; + }, + meridiem: function (hour, minute, isLower) { + if (hour < 12) { + return 'ព្រឹក'; + } else { + return 'ល្ងាច'; + } + }, + calendar: { + sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', + nextDay: '[ស្អែក ម៉ោង] LT', + nextWeek: 'dddd [ម៉ោង] LT', + lastDay: '[ម្សិលមិញ ម៉ោង] LT', + lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', sameElse: 'L' }, relativeTime: { - future: 'في %s', - past: 'منذ %s', - s: 'ثوان', - ss : '%d ثانية', - m: 'دقيقة', - mm: '%d دقائق', - h: 'ساعة', - hh: '%d ساعات', - d: 'يوم', - dd: '%d أيام', - M: 'شهر', - MM: '%d أشهر', - y: 'سنة', - yy: '%d سنوات' + future: '%sទៀត', + past: '%sមុន', + s: 'ប៉ុន្មានវិនាទី', + ss: '%d វិនាទី', + m: 'មួយនាទី', + mm: '%d នាទី', + h: 'មួយម៉ោង', + hh: '%d ម៉ោង', + d: 'មួយថ្ងៃ', + dd: '%d ថ្ងៃ', + M: 'មួយខែ', + MM: '%d ខែ', + y: 'មួយឆ្នាំ', + yy: '%d ឆ្នាំ' + }, + dayOfMonthOrdinalParse : /ទី\d{1,2}/, + ordinal : 'ទី%d', + preparse: function (string) { + return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); }, week: { dow: 1, // Monday is the first day of the week. @@ -10577,857 +12032,926 @@ webpackContext.id = 41; } }); - return arTn; + return km; }))); /***/ }), -/* 50 */ +/* 78 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var suffixes = { - 1: '-inci', - 5: '-inci', - 8: '-inci', - 70: '-inci', - 80: '-inci', - 2: '-nci', - 7: '-nci', - 20: '-nci', - 50: '-nci', - 3: '-üncü', - 4: '-üncü', - 100: '-üncü', - 6: '-ncı', - 9: '-uncu', - 10: '-uncu', - 30: '-uncu', - 60: '-ıncı', - 90: '-ıncı' + var symbolMap = { + '1': '೧', + '2': '೨', + '3': '೩', + '4': '೪', + '5': '೫', + '6': '೬', + '7': '೭', + '8': '೮', + '9': '೯', + '0': '೦' + }, + numberMap = { + '೧': '1', + '೨': '2', + '೩': '3', + '೪': '4', + '೫': '5', + '೬': '6', + '೭': '7', + '೮': '8', + '೯': '9', + '೦': '0' }; - var az = moment.defineLocale('az', { - months : 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split('_'), - monthsShort : 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'), - weekdays : 'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split('_'), - weekdaysShort : 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'), - weekdaysMin : 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'), - weekdaysParseExact : true, + var kn = moment.defineLocale('kn', { + months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), + monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), + monthsParseExact: true, + weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'), + weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'), + weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' }, calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[sabah saat] LT', - nextWeek : '[gələn həftə] dddd [saat] LT', - lastDay : '[dünən] LT', - lastWeek : '[keçən həftə] dddd [saat] LT', + sameDay : '[ಇಂದು] LT', + nextDay : '[ನಾಳೆ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ನಿನ್ನೆ] LT', + lastWeek : '[ಕೊನೆಯ] dddd, LT', sameElse : 'L' }, relativeTime : { - future : '%s sonra', - past : '%s əvvəl', - s : 'birneçə saniyə', - ss : '%d saniyə', - m : 'bir dəqiqə', - mm : '%d dəqiqə', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir il', - yy : '%d il' + future : '%s ನಂತರ', + past : '%s ಹಿಂದೆ', + s : 'ಕೆಲವು ಕ್ಷಣಗಳು', + ss : '%d ಸೆಕೆಂಡುಗಳು', + m : 'ಒಂದು ನಿಮಿಷ', + mm : '%d ನಿಮಿಷ', + h : 'ಒಂದು ಗಂಟೆ', + hh : '%d ಗಂಟೆ', + d : 'ಒಂದು ದಿನ', + dd : '%d ದಿನ', + M : 'ಒಂದು ತಿಂಗಳು', + MM : '%d ತಿಂಗಳು', + y : 'ಒಂದು ವರ್ಷ', + yy : '%d ವರ್ಷ' }, - meridiemParse: /gecə|səhər|gündüz|axşam/, - isPM : function (input) { - return /^(gündüz|axşam)$/.test(input); + preparse: function (string) { + return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ರಾತ್ರಿ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') { + return hour; + } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ಸಂಜೆ') { + return hour + 12; + } }, meridiem : function (hour, minute, isLower) { if (hour < 4) { - return 'gecə'; - } else if (hour < 12) { - return 'səhər'; + return 'ರಾತ್ರಿ'; + } else if (hour < 10) { + return 'ಬೆಳಿಗ್ಗೆ'; } else if (hour < 17) { - return 'gündüz'; + return 'ಮಧ್ಯಾಹ್ನ'; + } else if (hour < 20) { + return 'ಸಂಜೆ'; } else { - return 'axşam'; + return 'ರಾತ್ರಿ'; } }, - dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/, + dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, ordinal : function (number) { - if (number === 0) { // special case for zero - return number + '-ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes[a] || suffixes[b] || suffixes[c]); + return number + 'ನೇ'; }, week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return az; + return kn; }))); /***/ }), -/* 51 */ +/* 79 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', - 'mm': withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін', - 'hh': withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін', - 'dd': 'дзень_дні_дзён', - 'MM': 'месяц_месяцы_месяцаў', - 'yy': 'год_гады_гадоў' - }; - if (key === 'm') { - return withoutSuffix ? 'хвіліна' : 'хвіліну'; - } - else if (key === 'h') { - return withoutSuffix ? 'гадзіна' : 'гадзіну'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - - var be = moment.defineLocale('be', { - months : { - format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'), - standalone: 'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split('_') - }, - monthsShort : 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'), - weekdays : { - format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'), - standalone: 'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split('_'), - isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/ - }, - weekdaysShort : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_ат_ср_чц_пт_сб'.split('_'), + var ko = moment.defineLocale('ko', { + months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), + weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), + weekdaysShort : '일_월_화_수_목_금_토'.split('_'), + weekdaysMin : '일_월_화_수_목_금_토'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., HH:mm', - LLLL : 'dddd, D MMMM YYYY г., HH:mm' + LT : 'A h:mm', + LTS : 'A h:mm:ss', + L : 'YYYY.MM.DD.', + LL : 'YYYY년 MMMM D일', + LLL : 'YYYY년 MMMM D일 A h:mm', + LLLL : 'YYYY년 MMMM D일 dddd A h:mm', + l : 'YYYY.MM.DD.', + ll : 'YYYY년 MMMM D일', + lll : 'YYYY년 MMMM D일 A h:mm', + llll : 'YYYY년 MMMM D일 dddd A h:mm' }, calendar : { - sameDay: '[Сёння ў] LT', - nextDay: '[Заўтра ў] LT', - lastDay: '[Учора ў] LT', - nextWeek: function () { - return '[У] dddd [ў] LT'; - }, - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return '[У мінулую] dddd [ў] LT'; - case 1: - case 2: - case 4: - return '[У мінулы] dddd [ў] LT'; - } - }, - sameElse: 'L' + sameDay : '오늘 LT', + nextDay : '내일 LT', + nextWeek : 'dddd LT', + lastDay : '어제 LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' }, relativeTime : { - future : 'праз %s', - past : '%s таму', - s : 'некалькі секунд', - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : relativeTimeWithPlural, - hh : relativeTimeWithPlural, - d : 'дзень', - dd : relativeTimeWithPlural, - M : 'месяц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночы|раніцы|дня|вечара/, - isPM : function (input) { - return /^(дня|вечара)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночы'; - } else if (hour < 12) { - return 'раніцы'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечара'; - } + future : '%s 후', + past : '%s 전', + s : '몇 초', + ss : '%d초', + m : '1분', + mm : '%d분', + h : '한 시간', + hh : '%d시간', + d : '하루', + dd : '%d일', + M : '한 달', + MM : '%d달', + y : '일 년', + yy : '%d년' }, - dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/, - ordinal: function (number, period) { + dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, + ordinal : function (number, period) { switch (period) { - case 'M': case 'd': + case 'D': case 'DDD': + return number + '일'; + case 'M': + return number + '월'; case 'w': case 'W': - return (number % 10 === 2 || number % 10 === 3) && (number % 100 !== 12 && number % 100 !== 13) ? number + '-і' : number + '-ы'; - case 'D': - return number + '-га'; + return number + '주'; default: return number; } }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + meridiemParse : /오전|오후/, + isPM : function (token) { + return token === '오후'; + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; } }); - return be; + return ko; }))); /***/ }), -/* 52 */ +/* 80 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var bg = moment.defineLocale('bg', { - months : 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'), - weekdaysShort : 'нед_пон_вто_сря_чет_пет_съб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Днес в] LT', - nextDay : '[Утре в] LT', - nextWeek : 'dddd [в] LT', - lastDay : '[Вчера в] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[В изминалата] dddd [в] LT'; - case 1: - case 2: - case 4: - case 5: - return '[В изминалия] dddd [в] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'след %s', - past : 'преди %s', - s : 'няколко секунди', - ss : '%d секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дни', - M : 'месец', - MM : '%d месеца', - y : 'година', - yy : '%d години' + var symbolMap = { + '1': '١', + '2': '٢', + '3': '٣', + '4': '٤', + '5': '٥', + '6': '٦', + '7': '٧', + '8': '٨', + '9': '٩', + '0': '٠' + }, numberMap = { + '١': '1', + '٢': '2', + '٣': '3', + '٤': '4', + '٥': '5', + '٦': '6', + '٧': '7', + '٨': '8', + '٩': '9', + '٠': '0' + }, + months = [ + 'کانونی دووەم', + 'شوبات', + 'ئازار', + 'نیسان', + 'ئایار', + 'حوزەیران', + 'تەمموز', + 'ئاب', + 'ئەیلوول', + 'تشرینی یەكەم', + 'تشرینی دووەم', + 'كانونی یەکەم' + ]; + + + var ku = moment.defineLocale('ku', { + months : months, + monthsShort : months, + weekdays : 'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split('_'), + weekdaysShort : 'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'), + weekdaysMin : 'ی_د_س_چ_پ_ه_ش'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, - dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; + meridiemParse: /ئێواره‌|به‌یانی/, + isPM: function (input) { + return /ئێواره‌/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'به‌یانی'; } else { - return number + '-ти'; + return 'ئێواره‌'; } }, + calendar : { + sameDay : '[ئه‌مرۆ كاتژمێر] LT', + nextDay : '[به‌یانی كاتژمێر] LT', + nextWeek : 'dddd [كاتژمێر] LT', + lastDay : '[دوێنێ كاتژمێر] LT', + lastWeek : 'dddd [كاتژمێر] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'له‌ %s', + past : '%s', + s : 'چه‌ند چركه‌یه‌ك', + ss : 'چركه‌ %d', + m : 'یه‌ك خوله‌ك', + mm : '%d خوله‌ك', + h : 'یه‌ك كاتژمێر', + hh : '%d كاتژمێر', + d : 'یه‌ك ڕۆژ', + dd : '%d ڕۆژ', + M : 'یه‌ك مانگ', + MM : '%d مانگ', + y : 'یه‌ك ساڵ', + yy : '%d ساڵ' + }, + preparse: function (string) { + return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { + return numberMap[match]; + }).replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, '،'); + }, week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } }); - return bg; + return ku; }))); /***/ }), -/* 53 */ +/* 81 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var bm = moment.defineLocale('bm', { - months : 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'), - monthsShort : 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'), - weekdays : 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'), - weekdaysShort : 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'), - weekdaysMin : 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'), + var suffixes = { + 0: '-чү', + 1: '-чи', + 2: '-чи', + 3: '-чү', + 4: '-чү', + 5: '-чи', + 6: '-чы', + 7: '-чи', + 8: '-чи', + 9: '-чу', + 10: '-чу', + 20: '-чы', + 30: '-чу', + 40: '-чы', + 50: '-чү', + 60: '-чы', + 70: '-чи', + 80: '-чи', + 90: '-чу', + 100: '-чү' + }; + + var ky = moment.defineLocale('ky', { + months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), + monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), + weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), + weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'MMMM [tile] D [san] YYYY', - LLL : 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', - LLLL : 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm' + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Bi lɛrɛ] LT', - nextDay : '[Sini lɛrɛ] LT', - nextWeek : 'dddd [don lɛrɛ] LT', - lastDay : '[Kunu lɛrɛ] LT', - lastWeek : 'dddd [tɛmɛnen lɛrɛ] LT', + sameDay : '[Бүгүн саат] LT', + nextDay : '[Эртең саат] LT', + nextWeek : 'dddd [саат] LT', + lastDay : '[Кечээ саат] LT', + lastWeek : '[Өткөн аптанын] dddd [күнү] [саат] LT', sameElse : 'L' }, relativeTime : { - future : '%s kɔnɔ', - past : 'a bɛ %s bɔ', - s : 'sanga dama dama', - ss : 'sekondi %d', - m : 'miniti kelen', - mm : 'miniti %d', - h : 'lɛrɛ kelen', - hh : 'lɛrɛ %d', - d : 'tile kelen', - dd : 'tile %d', - M : 'kalo kelen', - MM : 'kalo %d', - y : 'san kelen', - yy : 'san %d' + future : '%s ичинде', + past : '%s мурун', + s : 'бирнече секунд', + ss : '%d секунд', + m : 'бир мүнөт', + mm : '%d мүнөт', + h : 'бир саат', + hh : '%d саат', + d : 'бир күн', + dd : '%d күн', + M : 'бир ай', + MM : '%d ай', + y : 'бир жыл', + yy : '%d жыл' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, + ordinal : function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); }, week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return bm; + return ky; }))); /***/ }), -/* 54 */ +/* 82 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '১', - '2': '২', - '3': '৩', - '4': '৪', - '5': '৫', - '6': '৬', - '7': '৭', - '8': '৮', - '9': '৯', - '0': '০' - }, - numberMap = { - '১': '1', - '২': '2', - '৩': '3', - '৪': '4', - '৫': '5', - '৬': '6', - '৭': '7', - '৮': '8', - '৯': '9', - '০': '0' - }; - - var bn = moment.defineLocale('bn', { - months : 'জানুয়ারী_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'), - monthsShort : 'জানু_ফেব_মার্চ_এপ্র_মে_জুন_জুল_আগ_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'), - weekdays : 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'), - weekdaysShort : 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'), - weekdaysMin : 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'), - longDateFormat : { - LT : 'A h:mm সময়', - LTS : 'A h:mm:ss সময়', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm সময়', - LLLL : 'dddd, D MMMM YYYY, A h:mm সময়' - }, - calendar : { - sameDay : '[আজ] LT', - nextDay : '[আগামীকাল] LT', - nextWeek : 'dddd, LT', - lastDay : '[গতকাল] LT', - lastWeek : '[গত] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s পরে', - past : '%s আগে', - s : 'কয়েক সেকেন্ড', - ss : '%d সেকেন্ড', - m : 'এক মিনিট', - mm : '%d মিনিট', - h : 'এক ঘন্টা', - hh : '%d ঘন্টা', - d : 'এক দিন', - dd : '%d দিন', - M : 'এক মাস', - MM : '%d মাস', - y : 'এক বছর', - yy : '%d বছর' - }, - preparse: function (string) { - return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eng Minutt', 'enger Minutt'], + 'h': ['eng Stonn', 'enger Stonn'], + 'd': ['een Dag', 'engem Dag'], + 'M': ['ee Mount', 'engem Mount'], + 'y': ['ee Joer', 'engem Joer'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + function processFutureTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'a ' + string; + } + return 'an ' + string; + } + function processPastTime(string) { + var number = string.substr(0, string.indexOf(' ')); + if (eifelerRegelAppliesToNumber(number)) { + return 'viru ' + string; + } + return 'virun ' + string; + } + /** + * Returns true if the word before the given number loses the '-n' ending. + * e.g. 'an 10 Deeg' but 'a 5 Deeg' + * + * @param number {integer} + * @returns {boolean} + */ + function eifelerRegelAppliesToNumber(number) { + number = parseInt(number, 10); + if (isNaN(number)) { + return false; + } + if (number < 0) { + // Negative Number --> always true + return true; + } else if (number < 10) { + // Only 1 digit + if (4 <= number && number <= 7) { + return true; } - if ((meridiem === 'রাত' && hour >= 4) || - (meridiem === 'দুপুর' && hour < 5) || - meridiem === 'বিকাল') { - return hour + 12; - } else { - return hour; + return false; + } else if (number < 100) { + // 2 digits + var lastDigit = number % 10, firstDigit = number / 10; + if (lastDigit === 0) { + return eifelerRegelAppliesToNumber(firstDigit); + } + return eifelerRegelAppliesToNumber(lastDigit); + } else if (number < 10000) { + // 3 or 4 digits --> recursively check first digit + while (number >= 10) { + number = number / 10; } + return eifelerRegelAppliesToNumber(number); + } else { + // Anything larger than 4 digits: recursively check first n-3 digits + number = number / 1000; + return eifelerRegelAppliesToNumber(number); + } + } + + var lb = moment.defineLocale('lb', { + months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), + monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), + monthsParseExact : true, + weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), + weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), + weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm [Auer]', + LTS: 'H:mm:ss [Auer]', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm [Auer]', + LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'রাত'; - } else if (hour < 10) { - return 'সকাল'; - } else if (hour < 17) { - return 'দুপুর'; - } else if (hour < 20) { - return 'বিকাল'; - } else { - return 'রাত'; + calendar: { + sameDay: '[Haut um] LT', + sameElse: 'L', + nextDay: '[Muer um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gëschter um] LT', + lastWeek: function () { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch (this.day()) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } } }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + relativeTime : { + future : processFutureTime, + past : processPastTime, + s : 'e puer Sekonnen', + ss : '%d Sekonnen', + m : processRelativeTime, + mm : '%d Minutten', + h : processRelativeTime, + hh : '%d Stonnen', + d : processRelativeTime, + dd : '%d Deeg', + M : processRelativeTime, + MM : '%d Méint', + y : processRelativeTime, + yy : '%d Joer' + }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal: '%d.', + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. } }); - return bn; + return lb; }))); /***/ }), -/* 55 */ +/* 83 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '༡', - '2': '༢', - '3': '༣', - '4': '༤', - '5': '༥', - '6': '༦', - '7': '༧', - '8': '༨', - '9': '༩', - '0': '༠' - }, - numberMap = { - '༡': '1', - '༢': '2', - '༣': '3', - '༤': '4', - '༥': '5', - '༦': '6', - '༧': '7', - '༨': '8', - '༩': '9', - '༠': '0' - }; - - var bo = moment.defineLocale('bo', { - months : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - monthsShort : 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'), - weekdays : 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'), - weekdaysShort : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), - weekdaysMin : 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'), + var lo = moment.defineLocale('lo', { + months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), + weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), + weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'ວັນdddd D MMMM YYYY HH:mm' + }, + meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, + isPM: function (input) { + return input === 'ຕອນແລງ'; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ຕອນເຊົ້າ'; + } else { + return 'ຕອນແລງ'; + } }, calendar : { - sameDay : '[དི་རིང] LT', - nextDay : '[སང་ཉིན] LT', - nextWeek : '[བདུན་ཕྲག་རྗེས་མ], LT', - lastDay : '[ཁ་སང] LT', - lastWeek : '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + sameDay : '[ມື້ນີ້ເວລາ] LT', + nextDay : '[ມື້ອື່ນເວລາ] LT', + nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', + lastDay : '[ມື້ວານນີ້ເວລາ] LT', + lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', sameElse : 'L' }, relativeTime : { - future : '%s ལ་', - past : '%s སྔན་ལ', - s : 'ལམ་སང', - ss : '%d སྐར་ཆ།', - m : 'སྐར་མ་གཅིག', - mm : '%d སྐར་མ', - h : 'ཆུ་ཚོད་གཅིག', - hh : '%d ཆུ་ཚོད', - d : 'ཉིན་གཅིག', - dd : '%d ཉིན་', - M : 'ཟླ་བ་གཅིག', - MM : '%d ཟླ་བ', - y : 'ལོ་གཅིག', - yy : '%d ལོ' - }, - preparse: function (string) { - return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + future : 'ອີກ %s', + past : '%sຜ່ານມາ', + s : 'ບໍ່ເທົ່າໃດວິນາທີ', + ss : '%d ວິນາທີ' , + m : '1 ນາທີ', + mm : '%d ນາທີ', + h : '1 ຊົ່ວໂມງ', + hh : '%d ຊົ່ວໂມງ', + d : '1 ມື້', + dd : '%d ມື້', + M : '1 ເດືອນ', + MM : '%d ເດືອນ', + y : '1 ປີ', + yy : '%d ປີ' }, - meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'མཚན་མོ' && hour >= 4) || - (meridiem === 'ཉིན་གུང' && hour < 5) || - meridiem === 'དགོང་དག') { - return hour + 12; + dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, + ordinal : function (number) { + return 'ທີ່' + number; + } + }); + + return lo; + +}))); + + +/***/ }), +/* 84 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var units = { + 'ss' : 'sekundė_sekundžių_sekundes', + 'm' : 'minutė_minutės_minutę', + 'mm': 'minutės_minučių_minutes', + 'h' : 'valanda_valandos_valandą', + 'hh': 'valandos_valandų_valandas', + 'd' : 'diena_dienos_dieną', + 'dd': 'dienos_dienų_dienas', + 'M' : 'mėnuo_mėnesio_mėnesį', + 'MM': 'mėnesiai_mėnesių_mėnesius', + 'y' : 'metai_metų_metus', + 'yy': 'metai_metų_metus' + }; + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return 'kelios sekundės'; + } else { + return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; + } + } + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + function forms(key) { + return units[key].split('_'); + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; } else { - return hour; + return result + (special(number) ? forms(key)[1] : forms(key)[2]); } + } + } + var lt = moment.defineLocale('lt', { + months : { + format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), + standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), + isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'མཚན་མོ'; - } else if (hour < 10) { - return 'ཞོགས་ཀས'; - } else if (hour < 17) { - return 'ཉིན་གུང'; - } else if (hour < 20) { - return 'དགོང་དག'; - } else { - return 'མཚན་མོ'; - } + monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), + weekdays : { + format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), + standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), + isFormat: /dddd HH:mm/ + }, + weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), + weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', + LL : 'YYYY [m.] MMMM D [d.]', + LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', + l : 'YYYY-MM-DD', + ll : 'YYYY [m.] MMMM D [d.]', + lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', + llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + }, + calendar : { + sameDay : '[Šiandien] LT', + nextDay : '[Rytoj] LT', + nextWeek : 'dddd LT', + lastDay : '[Vakar] LT', + lastWeek : '[Praėjusį] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : 'po %s', + past : 'prieš %s', + s : translateSeconds, + ss : translate, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2}-oji/, + ordinal : function (number) { + return number + '-oji'; }, week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return bo; + return lt; }))); /***/ }), -/* 56 */ +/* 85 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function relativeTimeWithMutation(number, withoutSuffix, key) { - var format = { - 'mm': 'munutenn', - 'MM': 'miz', - 'dd': 'devezh' - }; - return number + ' ' + mutation(format[key], number); - } - function specialMutationForYears(number) { - switch (lastNumber(number)) { - case 1: - case 3: - case 4: - case 5: - case 9: - return number + ' bloaz'; - default: - return number + ' vloaz'; + var units = { + 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), + 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), + 'h': 'stundas_stundām_stunda_stundas'.split('_'), + 'hh': 'stundas_stundām_stunda_stundas'.split('_'), + 'd': 'dienas_dienām_diena_dienas'.split('_'), + 'dd': 'dienas_dienām_diena_dienas'.split('_'), + 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), + 'y': 'gada_gadiem_gads_gadi'.split('_'), + 'yy': 'gada_gadiem_gads_gadi'.split('_') + }; + /** + * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. + */ + function format(forms, number, withoutSuffix) { + if (withoutSuffix) { + // E.g. "21 minūte", "3 minūtes". + return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; + } else { + // E.g. "21 minūtes" as in "pēc 21 minūtes". + // E.g. "3 minūtēm" as in "pēc 3 minūtēm". + return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; } } - function lastNumber(number) { - if (number > 9) { - return lastNumber(number % 10); - } - return number; + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); } - function mutation(text, number) { - if (number === 2) { - return softMutation(text); - } - return text; + function relativeTimeWithSingular(number, withoutSuffix, key) { + return format(units[key], number, withoutSuffix); } - function softMutation(text) { - var mutationTable = { - 'm': 'v', - 'b': 'v', - 'd': 'z' - }; - if (mutationTable[text.charAt(0)] === undefined) { - return text; - } - return mutationTable[text.charAt(0)] + text.substring(1); + function relativeSeconds(number, withoutSuffix) { + return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; } - var br = moment.defineLocale('br', { - months : 'Genver_C\'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'), - monthsShort : 'Gen_C\'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'), - weekdays : 'Sul_Lun_Meurzh_Merc\'her_Yaou_Gwener_Sadorn'.split('_'), - weekdaysShort : 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'), - weekdaysMin : 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'), + var lv = moment.defineLocale('lv', { + months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), + weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), + weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'h[e]mm A', - LTS : 'h[e]mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D [a viz] MMMM YYYY', - LLL : 'D [a viz] MMMM YYYY h[e]mm A', - LLLL : 'dddd, D [a viz] MMMM YYYY h[e]mm A' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY.', + LL : 'YYYY. [gada] D. MMMM', + LLL : 'YYYY. [gada] D. MMMM, HH:mm', + LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' }, calendar : { - sameDay : '[Hiziv da] LT', - nextDay : '[Warc\'hoazh da] LT', - nextWeek : 'dddd [da] LT', - lastDay : '[Dec\'h da] LT', - lastWeek : 'dddd [paset da] LT', + sameDay : '[Šodien pulksten] LT', + nextDay : '[Rīt pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[Pagājušā] dddd [pulksten] LT', sameElse : 'L' }, relativeTime : { - future : 'a-benn %s', - past : '%s \'zo', - s : 'un nebeud segondennoù', - ss : '%d eilenn', - m : 'ur vunutenn', - mm : relativeTimeWithMutation, - h : 'un eur', - hh : '%d eur', - d : 'un devezh', - dd : relativeTimeWithMutation, - M : 'ur miz', - MM : relativeTimeWithMutation, - y : 'ur bloaz', - yy : specialMutationForYears - }, - dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/, - ordinal : function (number) { - var output = (number === 1) ? 'añ' : 'vet'; - return number + output; + future : 'pēc %s', + past : 'pirms %s', + s : relativeSeconds, + ss : relativeTimeWithPlural, + m : relativeTimeWithSingular, + mm : relativeTimeWithPlural, + h : relativeTimeWithSingular, + hh : relativeTimeWithPlural, + d : relativeTimeWithSingular, + dd : relativeTimeWithPlural, + M : relativeTimeWithSingular, + MM : relativeTimeWithPlural, + y : relativeTimeWithSingular, + yy : relativeTimeWithPlural }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return br; + return lv; }))); /***/ }), -/* 57 */ +/* 86 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - if (number === 1) { - result += 'sekunda'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sekunde'; - } else { - result += 'sekundi'; - } - return result; - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; + var translator = { + words: { //Different grammatical cases + ss: ['sekund', 'sekunda', 'sekundi'], + m: ['jedan minut', 'jednog minuta'], + mm: ['minut', 'minuta', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mjesec', 'mjeseca', 'mjeseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } } - } + }; - var bs = moment.defineLocale('bs', { - months : 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), + var me = moment.defineLocale('me', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact : true, + weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', + longDateFormat: { + LT: 'H:mm', LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' }, - calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { + calendar: { + sameDay: '[danas u] LT', + nextDay: '[sjutra u] LT', + + nextWeek: function () { switch (this.day()) { case 0: return '[u] [nedjelju] [u] LT'; @@ -11442,38 +12966,36 @@ webpackContext.id = 41; return '[u] dddd [u] LT'; } }, - lastDay : '[jučer u] LT', + lastDay : '[juče u] LT', lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } + var lastWeekDays = [ + '[prošle] [nedjelje] [u] LT', + '[prošlog] [ponedjeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srijede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; }, sameElse : 'L' }, relativeTime : { future : 'za %s', past : 'prije %s', - s : 'par sekundi', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, d : 'dan', - dd : translate, + dd : translator.translate, M : 'mjesec', - MM : translate, + MM : translator.translate, y : 'godinu', - yy : translate + yy : translator.translate }, dayOfMonthOrdinalParse: /\d{1,2}\./, ordinal : '%d.', @@ -11483,1059 +13005,1123 @@ webpackContext.id = 41; } }); - return bs; + return me; }))); /***/ }), -/* 58 */ +/* 87 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ca = moment.defineLocale('ca', { - months : { - standalone: 'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split('_'), - format: 'de gener_de febrer_de març_d\'abril_de maig_de juny_de juliol_d\'agost_de setembre_d\'octubre_de novembre_de desembre'.split('_'), - isFormat: /D[oD]?(\s)+MMMM/ + var mi = moment.defineLocale('mi', { + months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), + monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), + monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, + monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, + weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), + weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY [i] HH:mm', + LLLL: 'dddd, D MMMM YYYY [i] HH:mm' }, - monthsShort : 'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split('_'), - weekdaysShort : 'dg._dl._dt._dc._dj._dv._ds.'.split('_'), - weekdaysMin : 'dg_dl_dt_dc_dj_dv_ds'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [de] YYYY', - ll : 'D MMM YYYY', - LLL : 'D MMMM [de] YYYY [a les] H:mm', - lll : 'D MMM YYYY, H:mm', - LLLL : 'dddd D MMMM [de] YYYY [a les] H:mm', - llll : 'ddd D MMM YYYY, H:mm' - }, - calendar : { - sameDay : function () { - return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextDay : function () { - return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastDay : function () { - return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'd\'aquí %s', - past : 'fa %s', - s : 'uns segons', - ss : '%d segons', - m : 'un minut', - mm : '%d minuts', - h : 'una hora', - hh : '%d hores', - d : 'un dia', - dd : '%d dies', - M : 'un mes', - MM : '%d mesos', - y : 'un any', - yy : '%d anys' + calendar: { + sameDay: '[i teie mahana, i] LT', + nextDay: '[apopo i] LT', + nextWeek: 'dddd [i] LT', + lastDay: '[inanahi i] LT', + lastWeek: 'dddd [whakamutunga i] LT', + sameElse: 'L' }, - dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/, - ordinal : function (number, period) { - var output = (number === 1) ? 'r' : - (number === 2) ? 'n' : - (number === 3) ? 'r' : - (number === 4) ? 't' : 'è'; - if (period === 'w' || period === 'W') { - output = 'a'; - } - return number + output; + relativeTime: { + future: 'i roto i %s', + past: '%s i mua', + s: 'te hēkona ruarua', + ss: '%d hēkona', + m: 'he meneti', + mm: '%d meneti', + h: 'te haora', + hh: '%d haora', + d: 'he ra', + dd: '%d ra', + M: 'he marama', + MM: '%d marama', + y: 'he tau', + yy: '%d tau' }, + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal: '%dº', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ca; + return mi; }))); /***/ }), -/* 59 */ +/* 88 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var months = 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split('_'), - monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'); - - var monthsParse = [/^led/i, /^úno/i, /^bře/i, /^dub/i, /^kvě/i, /^(čvn|červen$|června)/i, /^(čvc|červenec|července)/i, /^srp/i, /^zář/i, /^říj/i, /^lis/i, /^pro/i]; - // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. - // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. - var monthsRegex = /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i; - - function plural(n) { - return (n > 1) && (n < 5) && (~~(n / 10) !== 1); - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekund' : 'pár sekundami'; - case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'sekundy' : 'sekund'); - } else { - return result + 'sekundami'; - } - break; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minuty' : 'minut'); - } else { - return result + 'minutami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodin'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'den' : 'dnem'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dny' : 'dní'); - } else { - return result + 'dny'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'měsíce' : 'měsíců'); - } else { - return result + 'měsíci'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'let'); - } else { - return result + 'lety'; - } - break; - } - } - - var cs = moment.defineLocale('cs', { - months : months, - monthsShort : monthsShort, - monthsRegex : monthsRegex, - monthsShortRegex : monthsRegex, - // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched. - // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'. - monthsStrictRegex : /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i, - monthsShortStrictRegex : /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i, - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - weekdays : 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'), - weekdaysShort : 'ne_po_út_st_čt_pá_so'.split('_'), - weekdaysMin : 'ne_po_út_st_čt_pá_so'.split('_'), + var mk = moment.defineLocale('mk', { + months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), + monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), + weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), + weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), + weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), longDateFormat : { - LT: 'H:mm', + LT : 'H:mm', LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm', - l : 'D. M. YYYY' + L : 'D.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' }, calendar : { - sameDay: '[dnes v] LT', - nextDay: '[zítra v] LT', - nextWeek: function () { + sameDay : '[Денес во] LT', + nextDay : '[Утре во] LT', + nextWeek : '[Во] dddd [во] LT', + lastDay : '[Вчера во] LT', + lastWeek : function () { switch (this.day()) { case 0: - return '[v neděli v] LT'; - case 1: - case 2: - return '[v] dddd [v] LT'; case 3: - return '[ve středu v] LT'; - case 4: - return '[ve čtvrtek v] LT'; - case 5: - return '[v pátek v] LT'; case 6: - return '[v sobotu v] LT'; - } - }, - lastDay: '[včera v] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulou neděli v] LT'; + return '[Изминатата] dddd [во] LT'; case 1: case 2: - return '[minulé] dddd [v] LT'; - case 3: - return '[minulou středu v] LT'; case 4: case 5: - return '[minulý] dddd [v] LT'; - case 6: - return '[minulou sobotu v] LT'; + return '[Изминатиот] dddd [во] LT'; } }, - sameElse: 'L' + sameElse : 'L' }, relativeTime : { - future : 'za %s', - past : 'před %s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate + future : 'после %s', + past : 'пред %s', + s : 'неколку секунди', + ss : '%d секунди', + m : 'минута', + mm : '%d минути', + h : 'час', + hh : '%d часа', + d : 'ден', + dd : '%d дена', + M : 'месец', + MM : '%d месеци', + y : 'година', + yy : '%d години' + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } }, - dayOfMonthOrdinalParse : /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return cs; + return mk; }))); /***/ }), -/* 60 */ +/* 89 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var cv = moment.defineLocale('cv', { - months : 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'), - monthsShort : 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'), - weekdays : 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'), - weekdaysShort : 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'), - weekdaysMin : 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'), + var ml = moment.defineLocale('ml', { + months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), + monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), + monthsParseExact : true, + weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), + weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), + weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', - LLL : 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', - LLLL : 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm' + LT : 'A h:mm -നു', + LTS : 'A h:mm:ss -നു', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm -നു', + LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' }, calendar : { - sameDay: '[Паян] LT [сехетре]', - nextDay: '[Ыран] LT [сехетре]', - lastDay: '[Ӗнер] LT [сехетре]', - nextWeek: '[Ҫитес] dddd LT [сехетре]', - lastWeek: '[Иртнӗ] dddd LT [сехетре]', - sameElse: 'L' + sameDay : '[ഇന്ന്] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇന്നലെ] LT', + lastWeek : '[കഴിഞ്ഞ] dddd, LT', + sameElse : 'L' }, relativeTime : { - future : function (output) { - var affix = /сехет$/i.exec(output) ? 'рен' : /ҫул$/i.exec(output) ? 'тан' : 'ран'; - return output + affix; - }, - past : '%s каялла', - s : 'пӗр-ик ҫеккунт', - ss : '%d ҫеккунт', - m : 'пӗр минут', - mm : '%d минут', - h : 'пӗр сехет', - hh : '%d сехет', - d : 'пӗр кун', - dd : '%d кун', - M : 'пӗр уйӑх', - MM : '%d уйӑх', - y : 'пӗр ҫул', - yy : '%d ҫул' - }, - dayOfMonthOrdinalParse: /\d{1,2}-мӗш/, - ordinal : '%d-мӗш', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - - return cv; - -}))); - - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var cy = moment.defineLocale('cy', { - months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'), - monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'), - weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'), - weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'), - weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'), - weekdaysParseExact : true, - // time formats are the same as en-gb - longDateFormat: { - LT: 'HH:mm', - LTS : 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[Heddiw am] LT', - nextDay: '[Yfory am] LT', - nextWeek: 'dddd [am] LT', - lastDay: '[Ddoe am] LT', - lastWeek: 'dddd [diwethaf am] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'mewn %s', - past: '%s yn ôl', - s: 'ychydig eiliadau', - ss: '%d eiliad', - m: 'munud', - mm: '%d munud', - h: 'awr', - hh: '%d awr', - d: 'diwrnod', - dd: '%d diwrnod', - M: 'mis', - MM: '%d mis', - y: 'blwyddyn', - yy: '%d flynedd' + future : '%s കഴിഞ്ഞ്', + past : '%s മുൻപ്', + s : 'അൽപ നിമിഷങ്ങൾ', + ss : '%d സെക്കൻഡ്', + m : 'ഒരു മിനിറ്റ്', + mm : '%d മിനിറ്റ്', + h : 'ഒരു മണിക്കൂർ', + hh : '%d മണിക്കൂർ', + d : 'ഒരു ദിവസം', + dd : '%d ദിവസം', + M : 'ഒരു മാസം', + MM : '%d മാസം', + y : 'ഒരു വർഷം', + yy : '%d വർഷം' }, - dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/, - // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh - ordinal: function (number) { - var b = number, - output = '', - lookup = [ - '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed - 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed - ]; - if (b > 20) { - if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) { - output = 'fed'; // not 30ain, 70ain or 90ain - } else { - output = 'ain'; - } - } else if (b > 0) { - output = lookup[b]; + meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ((meridiem === 'രാത്രി' && hour >= 4) || + meridiem === 'ഉച്ച കഴിഞ്ഞ്' || + meridiem === 'വൈകുന്നേരം') { + return hour + 12; + } else { + return hour; } - return number + output; }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'രാത്രി'; + } else if (hour < 12) { + return 'രാവിലെ'; + } else if (hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } else if (hour < 20) { + return 'വൈകുന്നേരം'; + } else { + return 'രാത്രി'; + } } }); - return cy; + return ml; }))); /***/ }), -/* 62 */ +/* 90 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var da = moment.defineLocale('da', { - months : 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'søn_man_tir_ons_tor_fre_lør'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + function translate(number, withoutSuffix, key, isFuture) { + switch (key) { + case 's': + return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; + case 'ss': + return number + (withoutSuffix ? ' секунд' : ' секундын'); + case 'm': + case 'mm': + return number + (withoutSuffix ? ' минут' : ' минутын'); + case 'h': + case 'hh': + return number + (withoutSuffix ? ' цаг' : ' цагийн'); + case 'd': + case 'dd': + return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); + case 'M': + case 'MM': + return number + (withoutSuffix ? ' сар' : ' сарын'); + case 'y': + case 'yy': + return number + (withoutSuffix ? ' жил' : ' жилийн'); + default: + return number; + } + } + + var mn = moment.defineLocale('mn', { + months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), + monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), + monthsParseExact : true, + weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), + weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), + weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), + weekdaysParseExact : true, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm' + L : 'YYYY-MM-DD', + LL : 'YYYY оны MMMMын D', + LLL : 'YYYY оны MMMMын D HH:mm', + LLLL : 'dddd, YYYY оны MMMMын D HH:mm' }, - calendar : { - sameDay : '[i dag kl.] LT', - nextDay : '[i morgen kl.] LT', - nextWeek : 'på dddd [kl.] LT', - lastDay : '[i går kl.] LT', - lastWeek : '[i] dddd[s kl.] LT', - sameElse : 'L' + meridiemParse: /ҮӨ|ҮХ/i, + isPM : function (input) { + return input === 'ҮХ'; }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'få sekunder', - ss : '%d sekunder', - m : 'et minut', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dage', - M : 'en måned', - MM : '%d måneder', - y : 'et år', - yy : '%d år' + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ҮӨ'; + } else { + return 'ҮХ'; + } }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + calendar : { + sameDay : '[Өнөөдөр] LT', + nextDay : '[Маргааш] LT', + nextWeek : '[Ирэх] dddd LT', + lastDay : '[Өчигдөр] LT', + lastWeek : '[Өнгөрсөн] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s дараа', + past : '%s өмнө', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + dayOfMonthOrdinalParse: /\d{1,2} өдөр/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + ' өдөр'; + default: + return number; + } } }); - return da; + return mn; }))); /***/ }), -/* 63 */ +/* 91 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + function relativeTimeMr(number, withoutSuffix, string, isFuture) + { + var output = ''; + if (withoutSuffix) { + switch (string) { + case 's': output = 'काही सेकंद'; break; + case 'ss': output = '%d सेकंद'; break; + case 'm': output = 'एक मिनिट'; break; + case 'mm': output = '%d मिनिटे'; break; + case 'h': output = 'एक तास'; break; + case 'hh': output = '%d तास'; break; + case 'd': output = 'एक दिवस'; break; + case 'dd': output = '%d दिवस'; break; + case 'M': output = 'एक महिना'; break; + case 'MM': output = '%d महिने'; break; + case 'y': output = 'एक वर्ष'; break; + case 'yy': output = '%d वर्षे'; break; + } + } + else { + switch (string) { + case 's': output = 'काही सेकंदां'; break; + case 'ss': output = '%d सेकंदां'; break; + case 'm': output = 'एका मिनिटा'; break; + case 'mm': output = '%d मिनिटां'; break; + case 'h': output = 'एका तासा'; break; + case 'hh': output = '%d तासां'; break; + case 'd': output = 'एका दिवसा'; break; + case 'dd': output = '%d दिवसां'; break; + case 'M': output = 'एका महिन्या'; break; + case 'MM': output = '%d महिन्यां'; break; + case 'y': output = 'एका वर्षा'; break; + case 'yy': output = '%d वर्षां'; break; + } + } + return output.replace(/%d/i, number); } - var de = moment.defineLocale('de', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), + var mr = moment.defineLocale('mr', { + months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), + monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, + weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), + weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), + weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' + LT : 'A h:mm वाजता', + LTS : 'A h:mm:ss वाजता', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, A h:mm वाजता', + LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' }, calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' + sameDay : '[आज] LT', + nextDay : '[उद्या] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future: '%sमध्ये', + past: '%sपूर्वी', + s: relativeTimeMr, + ss: relativeTimeMr, + m: relativeTimeMr, + mm: relativeTimeMr, + h: relativeTimeMr, + hh: relativeTimeMr, + d: relativeTimeMr, + dd: relativeTimeMr, + M: relativeTimeMr, + MM: relativeTimeMr, + y: relativeTimeMr, + yy: relativeTimeMr + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'रात्री') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'सकाळी') { + return hour; + } else if (meridiem === 'दुपारी') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'सायंकाळी') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'रात्री'; + } else if (hour < 10) { + return 'सकाळी'; + } else if (hour < 17) { + return 'दुपारी'; + } else if (hour < 20) { + return 'सायंकाळी'; + } else { + return 'रात्री'; + } }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return de; + return mr; }))); /***/ }), -/* 64 */ +/* 92 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var deAt = moment.defineLocale('de-at', { - months : 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, + var ms = moment.defineLocale('ms', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } }, calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return deAt; + return ms; }))); /***/ }), -/* 65 */ +/* 93 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eine Minute', 'einer Minute'], - 'h': ['eine Stunde', 'einer Stunde'], - 'd': ['ein Tag', 'einem Tag'], - 'dd': [number + ' Tage', number + ' Tagen'], - 'M': ['ein Monat', 'einem Monat'], - 'MM': [number + ' Monate', number + ' Monaten'], - 'y': ['ein Jahr', 'einem Jahr'], - 'yy': [number + ' Jahre', number + ' Jahren'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var deCh = moment.defineLocale('de-ch', { - months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'), - weekdaysShort : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysMin : 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, + var msMy = moment.defineLocale('ms-my', { + months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), + weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), + weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), + weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), longDateFormat : { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY HH:mm', - LLLL : 'dddd, D. MMMM YYYY HH:mm' + LT : 'HH.mm', + LTS : 'HH.mm.ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY [pukul] HH.mm', + LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + }, + meridiemParse: /pagi|tengahari|petang|malam/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'pagi') { + return hour; + } else if (meridiem === 'tengahari') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'petang' || meridiem === 'malam') { + return hour + 12; + } + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } }, calendar : { - sameDay: '[heute um] LT [Uhr]', - sameElse: 'L', - nextDay: '[morgen um] LT [Uhr]', - nextWeek: 'dddd [um] LT [Uhr]', - lastDay: '[gestern um] LT [Uhr]', - lastWeek: '[letzten] dddd [um] LT [Uhr]' + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : 'vor %s', - s : 'ein paar Sekunden', - ss : '%d Sekunden', - m : processRelativeTime, - mm : '%d Minuten', - h : processRelativeTime, - hh : '%d Stunden', - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future : 'dalam %s', + past : '%s yang lepas', + s : 'beberapa saat', + ss : '%d saat', + m : 'seminit', + mm : '%d minit', + h : 'sejam', + hh : '%d jam', + d : 'sehari', + dd : '%d hari', + M : 'sebulan', + MM : '%d bulan', + y : 'setahun', + yy : '%d tahun' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return deCh; + return msMy; }))); /***/ }), -/* 66 */ +/* 94 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var months = [ - 'ޖެނުއަރީ', - 'ފެބްރުއަރީ', - 'މާރިޗު', - 'އޭޕްރީލު', - 'މޭ', - 'ޖޫން', - 'ޖުލައި', - 'އޯގަސްޓު', - 'ސެޕްޓެމްބަރު', - 'އޮކްޓޯބަރު', - 'ނޮވެމްބަރު', - 'ޑިސެމްބަރު' - ], weekdays = [ - 'އާދިއްތަ', - 'ހޯމަ', - 'އަންގާރަ', - 'ބުދަ', - 'ބުރާސްފަތި', - 'ހުކުރު', - 'ހޮނިހިރު' - ]; - - var dv = moment.defineLocale('dv', { - months : months, - monthsShort : months, - weekdays : weekdays, - weekdaysShort : weekdays, - weekdaysMin : 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'), + var mt = moment.defineLocale('mt', { + months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), + monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), + weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), + weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), + weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'), longDateFormat : { - LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'D/M/YYYY', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - meridiemParse: /މކ|މފ/, - isPM : function (input) { - return 'މފ' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'މކ'; - } else { - return 'މފ'; - } + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[މިއަދު] LT', - nextDay : '[މާދަމާ] LT', - nextWeek : 'dddd LT', - lastDay : '[އިއްޔެ] LT', - lastWeek : '[ފާއިތުވި] dddd LT', + sameDay : '[Illum fil-]LT', + nextDay : '[Għada fil-]LT', + nextWeek : 'dddd [fil-]LT', + lastDay : '[Il-bieraħ fil-]LT', + lastWeek : 'dddd [li għadda] [fil-]LT', sameElse : 'L' }, relativeTime : { - future : 'ތެރޭގައި %s', - past : 'ކުރިން %s', - s : 'ސިކުންތުކޮޅެއް', - ss : 'd% ސިކުންތު', - m : 'މިނިޓެއް', - mm : 'މިނިޓު %d', - h : 'ގަޑިއިރެއް', - hh : 'ގަޑިއިރު %d', - d : 'ދުވަހެއް', - dd : 'ދުވަސް %d', - M : 'މަހެއް', - MM : 'މަސް %d', - y : 'އަހަރެއް', - yy : 'އަހަރު %d' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); + future : 'f’ %s', + past : '%s ilu', + s : 'ftit sekondi', + ss : '%d sekondi', + m : 'minuta', + mm : '%d minuti', + h : 'siegħa', + hh : '%d siegħat', + d : 'ġurnata', + dd : '%d ġranet', + M : 'xahar', + MM : '%d xhur', + y : 'sena', + yy : '%d sni' }, + dayOfMonthOrdinalParse : /\d{1,2}º/, + ordinal: '%dº', week : { - dow : 7, // Sunday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return dv; + return mt; }))); /***/ }), -/* 67 */ +/* 95 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } + var symbolMap = { + '1': '၁', + '2': '၂', + '3': '၃', + '4': '၄', + '5': '၅', + '6': '၆', + '7': '၇', + '8': '၈', + '9': '၉', + '0': '၀' + }, numberMap = { + '၁': '1', + '၂': '2', + '၃': '3', + '၄': '4', + '၅': '5', + '၆': '6', + '၇': '7', + '၈': '8', + '၉': '9', + '၀': '0' + }; - var el = moment.defineLocale('el', { - monthsNominativeEl : 'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split('_'), - monthsGenitiveEl : 'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split('_'), - months : function (momentToFormat, format) { - if (!momentToFormat) { - return this._monthsNominativeEl; - } else if (typeof format === 'string' && /D/.test(format.substring(0, format.indexOf('MMMM')))) { // if there is a day number before 'MMMM' - return this._monthsGenitiveEl[momentToFormat.month()]; - } else { - return this._monthsNominativeEl[momentToFormat.month()]; - } + var my = moment.defineLocale('my', { + months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), + monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), + weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), + weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), + + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'DD/MM/YYYY', + LL: 'D MMMM YYYY', + LLL: 'D MMMM YYYY HH:mm', + LLLL: 'dddd D MMMM YYYY HH:mm' }, - monthsShort : 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'), - weekdays : 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split('_'), - weekdaysShort : 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'), - weekdaysMin : 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'), - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'μμ' : 'ΜΜ'; - } else { - return isLower ? 'πμ' : 'ΠΜ'; - } + calendar: { + sameDay: '[ယနေ.] LT [မှာ]', + nextDay: '[မနက်ဖြန်] LT [မှာ]', + nextWeek: 'dddd LT [မှာ]', + lastDay: '[မနေ.က] LT [မှာ]', + lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', + sameElse: 'L' }, - isPM : function (input) { - return ((input + '').toLowerCase()[0] === 'μ'); + relativeTime: { + future: 'လာမည့် %s မှာ', + past: 'လွန်ခဲ့သော %s က', + s: 'စက္ကန်.အနည်းငယ်', + ss : '%d စက္ကန့်', + m: 'တစ်မိနစ်', + mm: '%d မိနစ်', + h: 'တစ်နာရီ', + hh: '%d နာရီ', + d: 'တစ်ရက်', + dd: '%d ရက်', + M: 'တစ်လ', + MM: '%d လ', + y: 'တစ်နှစ်', + yy: '%d နှစ်' }, - meridiemParse : /[ΠΜ]\.?Μ?\.?/i, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + preparse: function (string) { + return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { + return numberMap[match]; + }); }, - calendarEl : { - sameDay : '[Σήμερα {}] LT', - nextDay : '[Αύριο {}] LT', - nextWeek : 'dddd [{}] LT', - lastDay : '[Χθες {}] LT', - lastWeek : function () { - switch (this.day()) { - case 6: - return '[το προηγούμενο] dddd [{}] LT'; - default: - return '[την προηγούμενη] dddd [{}] LT'; - } - }, - sameElse : 'L' + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); }, - calendar : function (key, mom) { - var output = this._calendarEl[key], - hours = mom && mom.hours(); - if (isFunction(output)) { - output = output.apply(mom); - } - return output.replace('{}', (hours % 12 === 1 ? 'στη' : 'στις')); + week: { + dow: 1, // Monday is the first day of the week. + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }); + + return my; + +}))); + + +/***/ }), +/* 96 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js locale configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var nb = moment.defineLocale('nb', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), + monthsParseExact : true, + weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), + weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), + weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i går kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' }, relativeTime : { - future : 'σε %s', - past : '%s πριν', - s : 'λίγα δευτερόλεπτα', - ss : '%d δευτερόλεπτα', - m : 'ένα λεπτό', - mm : '%d λεπτά', - h : 'μία ώρα', - hh : '%d ώρες', - d : 'μία μέρα', - dd : '%d μέρες', - M : 'ένας μήνας', - MM : '%d μήνες', - y : 'ένας χρόνος', - yy : '%d χρόνια' + future : 'om %s', + past : '%s siden', + s : 'noen sekunder', + ss : '%d sekunder', + m : 'ett minutt', + mm : '%d minutter', + h : 'en time', + hh : '%d timer', + d : 'en dag', + dd : '%d dager', + M : 'en måned', + MM : '%d måneder', + y : 'ett år', + yy : '%d år' }, - dayOfMonthOrdinalParse: /\d{1,2}η/, - ordinal: '%dη', + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4st is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return el; + return nb; }))); /***/ }), -/* 68 */ +/* 97 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enSG = moment.defineLocale('en-SG', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + var ne = moment.defineLocale('ne', { + months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), + monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), + monthsParseExact : true, + weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), + weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), + weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'Aको h:mm बजे', + LTS : 'Aको h:mm:ss बजे', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY, Aको h:mm बजे', + LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiemParse: /राति|बिहान|दिउँसो|साँझ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'राति') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'बिहान') { + return hour; + } else if (meridiem === 'दिउँसो') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'साँझ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return 'राति'; + } else if (hour < 12) { + return 'बिहान'; + } else if (hour < 16) { + return 'दिउँसो'; + } else if (hour < 20) { + return 'साँझ'; + } else { + return 'राति'; + } }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', + sameDay : '[आज] LT', + nextDay : '[भोलि] LT', + nextWeek : '[आउँदो] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गएको] dddd[,] LT', sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + future : '%sमा', + past : '%s अगाडि', + s : 'केही क्षण', + ss : '%d सेकेण्ड', + m : 'एक मिनेट', + mm : '%d मिनेट', + h : 'एक घण्टा', + hh : '%d घण्टा', + d : 'एक दिन', + dd : '%d दिन', + M : 'एक महिना', + MM : '%d महिना', + y : 'एक बर्ष', + yy : '%d बर्ष' }, week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return enSG; + return ne; }))); /***/ }), -/* 69 */ +/* 98 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enAu = moment.defineLocale('en-au', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); + + var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; + + var nl = moment.defineLocale('nl', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, + + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD-MM-YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); }, week : { dow : 1, // Monday is the first day of the week. @@ -12543,135 +14129,89 @@ webpackContext.id = 41; } }); - return enAu; + return nl; }))); /***/ }), -/* 70 */ +/* 99 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enCa = moment.defineLocale('en-ca', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'YYYY-MM-DD', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }, - calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - return enCa; - -}))); - + var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), + monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { + var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; + var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; -//! moment.js locale configuration + var nlBe = moment.defineLocale('nl-be', { + months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), + monthsShort : function (m, format) { + if (!m) { + return monthsShortWithDots; + } else if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; + monthsRegex: monthsRegex, + monthsShortRegex: monthsRegex, + monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, + monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, - var enGb = moment.defineLocale('en-gb', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), + weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), + weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), + weekdaysParseExact : true, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' + future : 'over %s', + past : '%s geleden', + s : 'een paar seconden', + ss : '%d seconden', + m : 'één minuut', + mm : '%d minuten', + h : 'één uur', + hh : '%d uur', + d : 'één dag', + dd : '%d dagen', + M : 'één maand', + MM : '%d maanden', + y : 'één jaar', + yy : '%d jaar' }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); }, week : { dow : 1, // Monday is the first day of the week. @@ -12679,373 +14219,386 @@ webpackContext.id = 41; } }); - return enGb; + return nlBe; }))); /***/ }), -/* 72 */ +/* 100 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enIe = moment.defineLocale('en-ie', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var nn = moment.defineLocale('nn', { + months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), + monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), + weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), + weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), + weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY [kl.] H:mm', + LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I går klokka] LT', + lastWeek: '[Føregåande] dddd [klokka] LT', + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + future : 'om %s', + past : '%s sidan', + s : 'nokre sekund', + ss : '%d sekund', + m : 'eit minutt', + mm : '%d minutt', + h : 'ein time', + hh : '%d timar', + d : 'ein dag', + dd : '%d dagar', + M : 'ein månad', + MM : '%d månader', + y : 'eit år', + yy : '%d år' }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return enIe; + return nn; }))); /***/ }), -/* 73 */ +/* 101 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enIl = moment.defineLocale('en-il', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var symbolMap = { + '1': '੧', + '2': '੨', + '3': '੩', + '4': '੪', + '5': '੫', + '6': '੬', + '7': '੭', + '8': '੮', + '9': '੯', + '0': '੦' + }, + numberMap = { + '੧': '1', + '੨': '2', + '੩': '3', + '੪': '4', + '੫': '5', + '੬': '6', + '੭': '7', + '੮': '8', + '੯': '9', + '੦': '0' + }; + + var paIn = moment.defineLocale('pa-in', { + // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi. + months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), + weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), + weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), + weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'A h:mm ਵਜੇ', + LTS : 'A h:mm:ss ਵਜੇ', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', + LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', + sameDay : '[ਅਜ] LT', + nextDay : '[ਕਲ] LT', + nextWeek : '[ਅਗਲਾ] dddd, LT', + lastDay : '[ਕਲ] LT', + lastWeek : '[ਪਿਛਲੇ] dddd, LT', sameElse : 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' + future : '%s ਵਿੱਚ', + past : '%s ਪਿਛਲੇ', + s : 'ਕੁਝ ਸਕਿੰਟ', + ss : '%d ਸਕਿੰਟ', + m : 'ਇਕ ਮਿੰਟ', + mm : '%d ਮਿੰਟ', + h : 'ਇੱਕ ਘੰਟਾ', + hh : '%d ਘੰਟੇ', + d : 'ਇੱਕ ਦਿਨ', + dd : '%d ਦਿਨ', + M : 'ਇੱਕ ਮਹੀਨਾ', + MM : '%d ਮਹੀਨੇ', + y : 'ਇੱਕ ਸਾਲ', + yy : '%d ਸਾਲ' }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + preparse: function (string) { + return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Punjabi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. + meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ਰਾਤ') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'ਸਵੇਰ') { + return hour; + } else if (meridiem === 'ਦੁਪਹਿਰ') { + return hour >= 10 ? hour : hour + 12; + } else if (meridiem === 'ਸ਼ਾਮ') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ਰਾਤ'; + } else if (hour < 10) { + return 'ਸਵੇਰ'; + } else if (hour < 17) { + return 'ਦੁਪਹਿਰ'; + } else if (hour < 20) { + return 'ਸ਼ਾਮ'; + } else { + return 'ਰਾਤ'; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return enIl; + return paIn; }))); /***/ }), -/* 74 */ +/* 102 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var enNz = moment.defineLocale('en-nz', { - months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), - weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), - weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), - weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), + monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); + } + function translate(number, withoutSuffix, key) { + var result = number + ' '; + switch (key) { + case 'ss': + return result + (plural(number) ? 'sekundy' : 'sekund'); + case 'm': + return withoutSuffix ? 'minuta' : 'minutę'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinę'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiące' : 'miesięcy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + var pl = moment.defineLocale('pl', { + months : function (momentToFormat, format) { + if (!momentToFormat) { + return monthsNominative; + } else if (format === '') { + // Hack: if format empty we know this is used to generate + // RegExp by moment. Give then back both valid forms of months + // in RegExp ready format. + return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; + } else if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), + weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), + weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), + weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' + sameDay: '[Dziś o] LT', + nextDay: '[Jutro o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[W niedzielę o] LT'; + + case 2: + return '[We wtorek o] LT'; + + case 3: + return '[W środę o] LT'; + + case 6: + return '[W sobotę o] LT'; + + default: + return '[W] dddd [o] LT'; + } + }, + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + sameElse: 'L' }, relativeTime : { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; + future : 'za %s', + past : '%s temu', + s : 'kilka sekund', + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : '1 dzień', + dd : '%d dni', + M : 'miesiąc', + MM : translate, + y : 'rok', + yy : translate }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return enNz; + return pl; }))); /***/ }), -/* 75 */ +/* 103 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var eo = moment.defineLocale('eo', { - months : 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec'.split('_'), - weekdays : 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'), - weekdaysShort : 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'), - weekdaysMin : 'di_lu_ma_me_ĵa_ve_sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D[-a de] MMMM, YYYY', - LLL : 'D[-a de] MMMM, YYYY HH:mm', - LLLL : 'dddd, [la] D[-a de] MMMM, YYYY HH:mm' - }, - meridiemParse: /[ap]\.t\.m/i, - isPM: function (input) { - return input.charAt(0).toLowerCase() === 'p'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'p.t.m.' : 'P.T.M.'; - } else { - return isLower ? 'a.t.m.' : 'A.T.M.'; - } - }, - calendar : { - sameDay : '[Hodiaŭ je] LT', - nextDay : '[Morgaŭ je] LT', - nextWeek : 'dddd [je] LT', - lastDay : '[Hieraŭ je] LT', - lastWeek : '[pasinta] dddd [je] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'post %s', - past : 'antaŭ %s', - s : 'sekundoj', - ss : '%d sekundoj', - m : 'minuto', - mm : '%d minutoj', - h : 'horo', - hh : '%d horoj', - d : 'tago',//ne 'diurno', ĉar estas uzita por proksimumo - dd : '%d tagoj', - M : 'monato', - MM : '%d monatoj', - y : 'jaro', - yy : '%d jaroj' - }, - dayOfMonthOrdinalParse: /\d{1,2}a/, - ordinal : '%da', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - - return eo; - -}))); - - -/***/ }), -/* 76 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - - var es = moment.defineLocale('es', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex : monthsRegex, - monthsShortRegex : monthsRegex, - monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + var pt = moment.defineLocale('pt', { + months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + LLL : 'D [de] MMMM [de] YYYY HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' }, calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday }, - sameElse : 'L' + sameElse: 'L' }, relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', + future : 'em %s', + past : 'há %s', + s : 'segundos', ss : '%d segundos', - m : 'un minuto', + m : 'um minuto', mm : '%d minutos', - h : 'una hora', + h : 'uma hora', hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', + d : 'um dia', + dd : '%d dias', + M : 'um mês', MM : '%d meses', - y : 'un año', - yy : '%d años' + y : 'um ano', + yy : '%d anos' }, - dayOfMonthOrdinalParse : /\d{1,2}º/, + dayOfMonthOrdinalParse: /\d{1,2}º/, ordinal : '%dº', week : { dow : 1, // Monday is the first day of the week. @@ -13053,560 +14606,488 @@ webpackContext.id = 41; } }); - return es; + return pt; }))); /***/ }), -/* 77 */ +/* 104 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; - - var esDo = moment.defineLocale('es-do', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse: monthsParse, - longMonthsParse: monthsParse, - shortMonthsParse: monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), + var ptBr = moment.defineLocale('pt-br', { + months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), + weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), + weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY h:mm A', - LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', + LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' }, calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday }, - sameElse : 'L' + sameElse: 'L' }, relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', + future : 'em %s', + past : 'há %s', + s : 'poucos segundos', ss : '%d segundos', - m : 'un minuto', + m : 'um minuto', mm : '%d minutos', - h : 'una hora', + h : 'uma hora', hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', + d : 'um dia', + dd : '%d dias', + M : 'um mês', MM : '%d meses', - y : 'un año', - yy : '%d años' + y : 'um ano', + yy : '%d anos' }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } + dayOfMonthOrdinalParse: /\d{1,2}º/, + ordinal : '%dº' }); - return esDo; + return ptBr; }))); /***/ }), -/* 78 */ +/* 105 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'), - monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'); - - var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i]; - var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i; + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': 'secunde', + 'mm': 'minute', + 'hh': 'ore', + 'dd': 'zile', + 'MM': 'luni', + 'yy': 'ani' + }, + separator = ' '; + if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { + separator = ' de '; + } + return number + separator + format[key]; + } - var esUs = moment.defineLocale('es-us', { - months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortDot; - } else if (/-MMM-/.test(format)) { - return monthsShort[m.month()]; - } else { - return monthsShortDot[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i, - monthsShortStrictRegex: /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i, - monthsParse: monthsParse, - longMonthsParse: monthsParse, - shortMonthsParse: monthsParse, - weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'), - weekdaysParseExact : true, + var ro = moment.defineLocale('ro', { + months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), + monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), + weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), + weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'MM/DD/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY h:mm A', - LLLL : 'dddd, D [de] MMMM [de] YYYY h:mm A' + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY H:mm', + LLLL : 'dddd, D MMMM YYYY H:mm' }, calendar : { - sameDay : function () { - return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextDay : function () { - return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - nextWeek : function () { - return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastDay : function () { - return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - lastWeek : function () { - return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; - }, - sameElse : 'L' + sameDay: '[azi la] LT', + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' }, relativeTime : { - future : 'en %s', - past : 'hace %s', - s : 'unos segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'una hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un año', - yy : '%d años' + future : 'peste %s', + past : '%s în urmă', + s : 'câteva secunde', + ss : relativeTimeWithPlural, + m : 'un minut', + mm : relativeTimeWithPlural, + h : 'o oră', + hh : relativeTimeWithPlural, + d : 'o zi', + dd : relativeTimeWithPlural, + M : 'o lună', + MM : relativeTimeWithPlural, + y : 'un an', + yy : relativeTimeWithPlural }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return esUs; + return ro; }))); /***/ }), -/* 79 */ +/* 106 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { var format = { - 's' : ['mõne sekundi', 'mõni sekund', 'paar sekundit'], - 'ss': [number + 'sekundi', number + 'sekundit'], - 'm' : ['ühe minuti', 'üks minut'], - 'mm': [number + ' minuti', number + ' minutit'], - 'h' : ['ühe tunni', 'tund aega', 'üks tund'], - 'hh': [number + ' tunni', number + ' tundi'], - 'd' : ['ühe päeva', 'üks päev'], - 'M' : ['kuu aja', 'kuu aega', 'üks kuu'], - 'MM': [number + ' kuu', number + ' kuud'], - 'y' : ['ühe aasta', 'aasta', 'üks aasta'], - 'yy': [number + ' aasta', number + ' aastat'] + 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', + 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', + 'hh': 'час_часа_часов', + 'dd': 'день_дня_дней', + 'MM': 'месяц_месяца_месяцев', + 'yy': 'год_года_лет' }; - if (withoutSuffix) { - return format[key][2] ? format[key][2] : format[key][1]; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); } - return isFuture ? format[key][0] : format[key][1]; } + var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; - var et = moment.defineLocale('et', { - months : 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split('_'), - monthsShort : 'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'), - weekdays : 'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split('_'), - weekdaysShort : 'P_E_T_K_N_R_L'.split('_'), - weekdaysMin : 'P_E_T_K_N_R_L'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' + // http://new.gramota.ru/spravka/rules/139-prop : § 103 + // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 + // CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 + var ru = moment.defineLocale('ru', { + months : { + format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), + standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') }, - calendar : { - sameDay : '[Täna,] LT', - nextDay : '[Homme,] LT', - nextWeek : '[Järgmine] dddd LT', - lastDay : '[Eile,] LT', - lastWeek : '[Eelmine] dddd LT', - sameElse : 'L' + monthsShort : { + // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? + format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), + standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') }, - relativeTime : { - future : '%s pärast', - past : '%s tagasi', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : '%d päeva', - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + weekdays : { + standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), + format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), + isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return et; - -}))); - - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { + weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), + monthsParse : monthsParse, + longMonthsParse : monthsParse, + shortMonthsParse : monthsParse, -//! moment.js locale configuration + // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки + monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; + // копия предыдущего + monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, + // полные названия с падежами + monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, - var eu = moment.defineLocale('eu', { - months : 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split('_'), - monthsShort : 'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split('_'), - monthsParseExact : true, - weekdays : 'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split('_'), - weekdaysShort : 'ig._al._ar._az._og._ol._lr.'.split('_'), - weekdaysMin : 'ig_al_ar_az_og_ol_lr'.split('_'), - weekdaysParseExact : true, + // Выражение, которое соотвествует только сокращённым формам + monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY[ko] MMMM[ren] D[a]', - LLL : 'YYYY[ko] MMMM[ren] D[a] HH:mm', - LLLL : 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', - l : 'YYYY-M-D', - ll : 'YYYY[ko] MMM D[a]', - lll : 'YYYY[ko] MMM D[a] HH:mm', - llll : 'ddd, YYYY[ko] MMM D[a] HH:mm' + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY г.', + LLL : 'D MMMM YYYY г., H:mm', + LLLL : 'dddd, D MMMM YYYY г., H:mm' }, calendar : { - sameDay : '[gaur] LT[etan]', - nextDay : '[bihar] LT[etan]', - nextWeek : 'dddd LT[etan]', - lastDay : '[atzo] LT[etan]', - lastWeek : '[aurreko] dddd LT[etan]', - sameElse : 'L' + sameDay: '[Сегодня, в] LT', + nextDay: '[Завтра, в] LT', + lastDay: '[Вчера, в] LT', + nextWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В следующее] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + lastWeek: function (now) { + if (now.week() !== this.week()) { + switch (this.day()) { + case 0: + return '[В прошлое] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd, [в] LT'; + } + } else { + if (this.day() === 2) { + return '[Во] dddd, [в] LT'; + } else { + return '[В] dddd, [в] LT'; + } + } + }, + sameElse: 'L' }, relativeTime : { - future : '%s barru', - past : 'duela %s', - s : 'segundo batzuk', - ss : '%d segundo', - m : 'minutu bat', - mm : '%d minutu', - h : 'ordu bat', - hh : '%d ordu', - d : 'egun bat', - dd : '%d egun', - M : 'hilabete bat', - MM : '%d hilabete', - y : 'urte bat', - yy : '%d urte' + future : 'через %s', + past : '%s назад', + s : 'несколько секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'час', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'месяц', + MM : relativeTimeWithPlural, + y : 'год', + yy : relativeTimeWithPlural + }, + meridiemParse: /ночи|утра|дня|вечера/i, + isPM : function (input) { + return /^(дня|вечера)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночи'; + } else if (hour < 12) { + return 'утра'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечера'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-я'; + default: + return number; + } }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return eu; + return ru; }))); /***/ }), -/* 81 */ +/* 107 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '۱', - '2': '۲', - '3': '۳', - '4': '۴', - '5': '۵', - '6': '۶', - '7': '۷', - '8': '۸', - '9': '۹', - '0': '۰' - }, numberMap = { - '۱': '1', - '۲': '2', - '۳': '3', - '۴': '4', - '۵': '5', - '۶': '6', - '۷': '7', - '۸': '8', - '۹': '9', - '۰': '0' - }; + var months = [ + 'جنوري', + 'فيبروري', + 'مارچ', + 'اپريل', + 'مئي', + 'جون', + 'جولاءِ', + 'آگسٽ', + 'سيپٽمبر', + 'آڪٽوبر', + 'نومبر', + 'ڊسمبر' + ]; + var days = [ + 'آچر', + 'سومر', + 'اڱارو', + 'اربع', + 'خميس', + 'جمع', + 'ڇنڇر' + ]; - var fa = moment.defineLocale('fa', { - months : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - monthsShort : 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), - weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), - weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'), - weekdaysParseExact : true, + var sd = moment.defineLocale('sd', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLLL : 'dddd، D MMMM YYYY HH:mm' }, - meridiemParse: /قبل از ظهر|بعد از ظهر/, - isPM: function (input) { - return /بعد از ظهر/.test(input); + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; }, meridiem : function (hour, minute, isLower) { if (hour < 12) { - return 'قبل از ظهر'; - } else { - return 'بعد از ظهر'; + return 'صبح'; } + return 'شام'; }, calendar : { - sameDay : '[امروز ساعت] LT', - nextDay : '[فردا ساعت] LT', - nextWeek : 'dddd [ساعت] LT', - lastDay : '[دیروز ساعت] LT', - lastWeek : 'dddd [پیش] [ساعت] LT', + sameDay : '[اڄ] LT', + nextDay : '[سڀاڻي] LT', + nextWeek : 'dddd [اڳين هفتي تي] LT', + lastDay : '[ڪالهه] LT', + lastWeek : '[گزريل هفتي] dddd [تي] LT', sameElse : 'L' }, relativeTime : { - future : 'در %s', - past : '%s پیش', - s : 'چند ثانیه', - ss : 'ثانیه d%', - m : 'یک دقیقه', - mm : '%d دقیقه', - h : 'یک ساعت', - hh : '%d ساعت', - d : 'یک روز', - dd : '%d روز', - M : 'یک ماه', - MM : '%d ماه', - y : 'یک سال', + future : '%s پوء', + past : '%s اڳ', + s : 'چند سيڪنڊ', + ss : '%d سيڪنڊ', + m : 'هڪ منٽ', + mm : '%d منٽ', + h : 'هڪ ڪلاڪ', + hh : '%d ڪلاڪ', + d : 'هڪ ڏينهن', + dd : '%d ڏينهن', + M : 'هڪ مهينو', + MM : '%d مهينا', + y : 'هڪ سال', yy : '%d سال' }, preparse: function (string) { - return string.replace(/[۰-۹]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); + return string.replace(/،/g, ','); }, postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + return string.replace(/,/g, '،'); }, - dayOfMonthOrdinalParse: /\d{1,2}م/, - ordinal : '%dم', week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return fa; + return sd; }))); /***/ }), -/* 82 */ +/* 108 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var numbersPast = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), - numbersFuture = [ - 'nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', - numbersPast[7], numbersPast[8], numbersPast[9] - ]; - function translate(number, withoutSuffix, key, isFuture) { - var result = ''; - switch (key) { - case 's': - return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; - case 'ss': - return isFuture ? 'sekunnin' : 'sekuntia'; - case 'm': - return isFuture ? 'minuutin' : 'minuutti'; - case 'mm': - result = isFuture ? 'minuutin' : 'minuuttia'; - break; - case 'h': - return isFuture ? 'tunnin' : 'tunti'; - case 'hh': - result = isFuture ? 'tunnin' : 'tuntia'; - break; - case 'd': - return isFuture ? 'päivän' : 'päivä'; - case 'dd': - result = isFuture ? 'päivän' : 'päivää'; - break; - case 'M': - return isFuture ? 'kuukauden' : 'kuukausi'; - case 'MM': - result = isFuture ? 'kuukauden' : 'kuukautta'; - break; - case 'y': - return isFuture ? 'vuoden' : 'vuosi'; - case 'yy': - result = isFuture ? 'vuoden' : 'vuotta'; - break; - } - result = verbalNumber(number, isFuture) + ' ' + result; - return result; - } - function verbalNumber(number, isFuture) { - return number < 10 ? (isFuture ? numbersFuture[number] : numbersPast[number]) : number; - } - - var fi = moment.defineLocale('fi', { - months : 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split('_'), - monthsShort : 'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split('_'), - weekdays : 'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split('_'), - weekdaysShort : 'su_ma_ti_ke_to_pe_la'.split('_'), - weekdaysMin : 'su_ma_ti_ke_to_pe_la'.split('_'), + var se = moment.defineLocale('se', { + months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), + monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), + weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), + weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), + weekdaysMin : 's_v_m_g_d_b_L'.split('_'), longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD.MM.YYYY', - LL : 'Do MMMM[ta] YYYY', - LLL : 'Do MMMM[ta] YYYY, [klo] HH.mm', - LLLL : 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm', - l : 'D.M.YYYY', - ll : 'Do MMM YYYY', - lll : 'Do MMM YYYY, [klo] HH.mm', - llll : 'ddd, Do MMM YYYY, [klo] HH.mm' + LL : 'MMMM D. [b.] YYYY', + LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', + LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' }, calendar : { - sameDay : '[tänään] [klo] LT', - nextDay : '[huomenna] [klo] LT', - nextWeek : 'dddd [klo] LT', - lastDay : '[eilen] [klo] LT', - lastWeek : '[viime] dddd[na] [klo] LT', - sameElse : 'L' + sameDay: '[otne ti] LT', + nextDay: '[ihttin ti] LT', + nextWeek: 'dddd [ti] LT', + lastDay: '[ikte ti] LT', + lastWeek: '[ovddit] dddd [ti] LT', + sameElse: 'L' }, relativeTime : { - future : '%s päästä', - past : '%s sitten', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate + future : '%s geažes', + past : 'maŋit %s', + s : 'moadde sekunddat', + ss: '%d sekunddat', + m : 'okta minuhta', + mm : '%d minuhtat', + h : 'okta diimmu', + hh : '%d diimmut', + d : 'okta beaivi', + dd : '%d beaivvit', + M : 'okta mánnu', + MM : '%d mánut', + y : 'okta jahki', + yy : '%d jagit' }, dayOfMonthOrdinalParse: /\d{1,2}\./, ordinal : '%d.', @@ -13616,1102 +15097,1155 @@ webpackContext.id = 41; } }); - return fi; + return se; }))); /***/ }), -/* 83 */ +/* 109 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var fo = moment.defineLocale('fo', { - months : 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split('_'), - weekdaysShort : 'sun_mán_týs_mik_hós_frí_ley'.split('_'), - weekdaysMin : 'su_má_tý_mi_hó_fr_le'.split('_'), + /*jshint -W100*/ + var si = moment.defineLocale('si', { + months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), + monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), + weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), + weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), + weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D. MMMM, YYYY HH:mm' + LT : 'a h:mm', + LTS : 'a h:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY MMMM D', + LLL : 'YYYY MMMM D, a h:mm', + LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' }, calendar : { - sameDay : '[Í dag kl.] LT', - nextDay : '[Í morgin kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[Í gjár kl.] LT', - lastWeek : '[síðstu] dddd [kl] LT', + sameDay : '[අද] LT[ට]', + nextDay : '[හෙට] LT[ට]', + nextWeek : 'dddd LT[ට]', + lastDay : '[ඊයේ] LT[ට]', + lastWeek : '[පසුගිය] dddd LT[ට]', sameElse : 'L' }, relativeTime : { - future : 'um %s', - past : '%s síðani', - s : 'fá sekund', - ss : '%d sekundir', - m : 'ein minuttur', - mm : '%d minuttir', - h : 'ein tími', - hh : '%d tímar', - d : 'ein dagur', - dd : '%d dagar', - M : 'ein mánaður', - MM : '%d mánaðir', - y : 'eitt ár', - yy : '%d ár' + future : '%sකින්', + past : '%sකට පෙර', + s : 'තත්පර කිහිපය', + ss : 'තත්පර %d', + m : 'මිනිත්තුව', + mm : 'මිනිත්තු %d', + h : 'පැය', + hh : 'පැය %d', + d : 'දිනය', + dd : 'දින %d', + M : 'මාසය', + MM : 'මාස %d', + y : 'වසර', + yy : 'වසර %d' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + dayOfMonthOrdinalParse: /\d{1,2} වැනි/, + ordinal : function (number) { + return number + ' වැනි'; + }, + meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, + isPM : function (input) { + return input === 'ප.ව.' || input === 'පස් වරු'; + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'ප.ව.' : 'පස් වරු'; + } else { + return isLower ? 'පෙ.ව.' : 'පෙර වරු'; + } } }); - return fo; + return si; }))); /***/ }), -/* 84 */ +/* 110 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var fr = moment.defineLocale('fr', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - dayOfMonthOrdinalParse: /\d{1,2}(er|)/, - ordinal : function (number, period) { - switch (period) { - // TODO: Return 'e' when day of month > 1. Move this case inside - // block for masculine words below. - // See https://github.com/moment/moment/issues/3375 - case 'D': - return number + (number === 1 ? 'er' : ''); - - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), + monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); + function plural(n) { + return (n > 1) && (n < 5); + } + function translate(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'sekundy' : 'sekúnd'); + } else { + return result + 'sekundami'; + } + break; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; } - }); - - return fr; - -}))); - - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - + } - var frCa = moment.defineLocale('fr-ca', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), - weekdaysParseExact : true, + var sk = moment.defineLocale('sk', { + months : months, + monthsShort : monthsShort, + weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), + weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), + weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LT: 'H:mm', + LTS : 'H:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd D. MMMM YYYY H:mm' }, calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', - sameElse : 'L' + sameDay: '[dnes o] LT', + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo štvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[včera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: 'L' }, relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' + future : 'za %s', + past : 'pred %s', + s : translate, + ss : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate }, - dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, - ordinal : function (number, period) { - switch (period) { - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'D': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return frCa; + return sk; }))); /***/ }), -/* 86 */ +/* 111 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var frCh = moment.defineLocale('fr-ch', { - months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), - monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), - monthsParseExact : true, - weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), - weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), - weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var result = number + ' '; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; + case 'ss': + if (number === 1) { + result += withoutSuffix ? 'sekundo' : 'sekundi'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; + } else { + result += 'sekund'; + } + return result; + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += withoutSuffix ? 'minuta' : 'minuto'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'minute' : 'minutami'; + } else { + result += withoutSuffix || isFuture ? 'minut' : 'minutami'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += withoutSuffix ? 'ura' : 'uro'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'uri' : 'urama'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'ure' : 'urami'; + } else { + result += withoutSuffix || isFuture ? 'ur' : 'urami'; + } + return result; + case 'd': + return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; + case 'dd': + if (number === 1) { + result += withoutSuffix || isFuture ? 'dan' : 'dnem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; + } else { + result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; + } + return result; + case 'M': + return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; + case 'MM': + if (number === 1) { + result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; + } else { + result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; + } + return result; + case 'y': + return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; + case 'yy': + if (number === 1) { + result += withoutSuffix || isFuture ? 'leto' : 'letom'; + } else if (number === 2) { + result += withoutSuffix || isFuture ? 'leti' : 'letoma'; + } else if (number < 5) { + result += withoutSuffix || isFuture ? 'leta' : 'leti'; + } else { + result += withoutSuffix || isFuture ? 'let' : 'leti'; + } + return result; + } + } + + var sl = moment.defineLocale('sl', { + months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), + monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), + monthsParseExact: true, + weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), + weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), + weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'H:mm', + LTS : 'H:mm:ss', L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LL : 'D. MMMM YYYY', + LLL : 'D. MMMM YYYY H:mm', + LLLL : 'dddd, D. MMMM YYYY H:mm' }, calendar : { - sameDay : '[Aujourd’hui à] LT', - nextDay : '[Demain à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[Hier à] LT', - lastWeek : 'dddd [dernier à] LT', + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[včeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + return '[prejšnjo] [nedeljo] [ob] LT'; + case 3: + return '[prejšnjo] [sredo] [ob] LT'; + case 6: + return '[prejšnjo] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejšnji] dddd [ob] LT'; + } + }, sameElse : 'L' }, relativeTime : { - future : 'dans %s', - past : 'il y a %s', - s : 'quelques secondes', - ss : '%d secondes', - m : 'une minute', - mm : '%d minutes', - h : 'une heure', - hh : '%d heures', - d : 'un jour', - dd : '%d jours', - M : 'un mois', - MM : '%d mois', - y : 'un an', - yy : '%d ans' - }, - dayOfMonthOrdinalParse: /\d{1,2}(er|e)/, - ordinal : function (number, period) { - switch (period) { - // Words with masculine grammatical gender: mois, trimestre, jour - default: - case 'M': - case 'Q': - case 'D': - case 'DDD': - case 'd': - return number + (number === 1 ? 'er' : 'e'); - - // Words with feminine grammatical gender: semaine - case 'w': - case 'W': - return number + (number === 1 ? 're' : 'e'); - } + future : 'čez %s', + past : 'pred %s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return frCh; + return sl; }))); /***/ }), -/* 87 */ +/* 112 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var monthsShortWithDots = 'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'); - - var fy = moment.defineLocale('fy', { - months : 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsParseExact : true, - weekdays : 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split('_'), - weekdaysShort : 'si._mo._ti._wo._to._fr._so.'.split('_'), - weekdaysMin : 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'), + var sq = moment.defineLocale('sq', { + months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), + monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), + weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), + weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), + weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), weekdaysParseExact : true, + meridiemParse: /PD|MD/, + isPM: function (input) { + return input.charAt(0) === 'M'; + }, + meridiem : function (hours, minutes, isLower) { + return hours < 12 ? 'PD' : 'MD'; + }, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[hjoed om] LT', - nextDay: '[moarn om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[juster om] LT', - lastWeek: '[ôfrûne] dddd [om] LT', - sameElse: 'L' + sameDay : '[Sot në] LT', + nextDay : '[Nesër në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' }, relativeTime : { - future : 'oer %s', - past : '%s lyn', - s : 'in pear sekonden', - ss : '%d sekonden', - m : 'ien minút', - mm : '%d minuten', - h : 'ien oere', - hh : '%d oeren', - d : 'ien dei', - dd : '%d dagen', - M : 'ien moanne', - MM : '%d moannen', - y : 'ien jier', - yy : '%d jierren' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + future : 'në %s', + past : '%s më parë', + s : 'disa sekonda', + ss : '%d sekonda', + m : 'një minutë', + mm : '%d minuta', + h : 'një orë', + hh : '%d orë', + d : 'një ditë', + dd : '%d ditë', + M : 'një muaj', + MM : '%d muaj', + y : 'një vit', + yy : '%d vite' }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return fy; + return sq; }))); /***/ }), -/* 88 */ +/* 113 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; + var translator = { + words: { //Different grammatical cases + ss: ['sekunda', 'sekunde', 'sekundi'], + m: ['jedan minut', 'jedne minute'], + mm: ['minut', 'minute', 'minuta'], + h: ['jedan sat', 'jednog sata'], + hh: ['sat', 'sata', 'sati'], + dd: ['dan', 'dana', 'dana'], + MM: ['mesec', 'meseca', 'meseci'], + yy: ['godina', 'godine', 'godina'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; - var months = [ - 'Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Méitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deaireadh Fómhair', 'Samhain', 'Nollaig' - ]; - - var monthsShort = ['Eaná', 'Feab', 'Márt', 'Aibr', 'Beal', 'Méit', 'Iúil', 'Lúna', 'Meán', 'Deai', 'Samh', 'Noll']; - - var weekdays = ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Satharn']; - - var weekdaysShort = ['Dom', 'Lua', 'Mái', 'Céa', 'Déa', 'hAo', 'Sat']; - - var weekdaysMin = ['Do', 'Lu', 'Má', 'Ce', 'Dé', 'hA', 'Sa']; - - var ga = moment.defineLocale('ga', { - months: months, - monthsShort: monthsShort, + var sr = moment.defineLocale('sr', { + months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), + monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), monthsParseExact: true, - weekdays: weekdays, - weekdaysShort: weekdaysShort, - weekdaysMin: weekdaysMin, + weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), + weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), + weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), + weekdaysParseExact : true, longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' }, calendar: { - sameDay: '[Inniu ag] LT', - nextDay: '[Amárach ag] LT', - nextWeek: 'dddd [ag] LT', - lastDay: '[Inné aig] LT', - lastWeek: 'dddd [seo caite] [ag] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'i %s', - past: '%s ó shin', - s: 'cúpla soicind', - ss: '%d soicind', - m: 'nóiméad', - mm: '%d nóiméad', - h: 'uair an chloig', - hh: '%d uair an chloig', - d: 'lá', - dd: '%d lá', - M: 'mí', - MM: '%d mí', - y: 'bliain', - yy: '%d bliain' + sameDay: '[danas u] LT', + nextDay: '[sutra u] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[u] [nedelju] [u] LT'; + case 3: + return '[u] [sredu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juče u] LT', + lastWeek : function () { + var lastWeekDays = [ + '[prošle] [nedelje] [u] LT', + '[prošlog] [ponedeljka] [u] LT', + '[prošlog] [utorka] [u] LT', + '[prošle] [srede] [u] LT', + '[prošlog] [četvrtka] [u] LT', + '[prošlog] [petka] [u] LT', + '[prošle] [subote] [u] LT' + ]; + return lastWeekDays[this.day()]; + }, + sameElse : 'L' }, - dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/, - ordinal: function (number) { - var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; - return number + output; + relativeTime : { + future : 'za %s', + past : 'pre %s', + s : 'nekoliko sekundi', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'dan', + dd : translator.translate, + M : 'mesec', + MM : translator.translate, + y : 'godinu', + yy : translator.translate }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return ga; + return sr; }))); /***/ }), -/* 89 */ +/* 114 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var months = [ - 'Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd' - ]; - - var monthsShort = ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh']; - - var weekdays = ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne']; - - var weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis']; - - var weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa']; + var translator = { + words: { //Different grammatical cases + ss: ['секунда', 'секунде', 'секунди'], + m: ['један минут', 'једне минуте'], + mm: ['минут', 'минуте', 'минута'], + h: ['један сат', 'једног сата'], + hh: ['сат', 'сата', 'сати'], + dd: ['дан', 'дана', 'дана'], + MM: ['месец', 'месеца', 'месеци'], + yy: ['година', 'године', 'година'] + }, + correctGrammaticalCase: function (number, wordKey) { + return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); + }, + translate: function (number, withoutSuffix, key) { + var wordKey = translator.words[key]; + if (key.length === 1) { + return withoutSuffix ? wordKey[0] : wordKey[1]; + } else { + return number + ' ' + translator.correctGrammaticalCase(number, wordKey); + } + } + }; - var gd = moment.defineLocale('gd', { - months : months, - monthsShort : monthsShort, - monthsParseExact : true, - weekdays : weekdays, - weekdaysShort : weekdaysShort, - weekdaysMin : weekdaysMin, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + var srCyrl = moment.defineLocale('sr-cyrl', { + months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), + monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), + monthsParseExact: true, + weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), + weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), + weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), + weekdaysParseExact : true, + longDateFormat: { + LT: 'H:mm', + LTS : 'H:mm:ss', + L: 'DD.MM.YYYY', + LL: 'D. MMMM YYYY', + LLL: 'D. MMMM YYYY H:mm', + LLLL: 'dddd, D. MMMM YYYY H:mm' }, - calendar : { - sameDay : '[An-diugh aig] LT', - nextDay : '[A-màireach aig] LT', - nextWeek : 'dddd [aig] LT', - lastDay : '[An-dè aig] LT', - lastWeek : 'dddd [seo chaidh] [aig] LT', + calendar: { + sameDay: '[данас у] LT', + nextDay: '[сутра у] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[у] [недељу] [у] LT'; + case 3: + return '[у] [среду] [у] LT'; + case 6: + return '[у] [суботу] [у] LT'; + case 1: + case 2: + case 4: + case 5: + return '[у] dddd [у] LT'; + } + }, + lastDay : '[јуче у] LT', + lastWeek : function () { + var lastWeekDays = [ + '[прошле] [недеље] [у] LT', + '[прошлог] [понедељка] [у] LT', + '[прошлог] [уторка] [у] LT', + '[прошле] [среде] [у] LT', + '[прошлог] [четвртка] [у] LT', + '[прошлог] [петка] [у] LT', + '[прошле] [суботе] [у] LT' + ]; + return lastWeekDays[this.day()]; + }, sameElse : 'L' }, relativeTime : { - future : 'ann an %s', - past : 'bho chionn %s', - s : 'beagan diogan', - ss : '%d diogan', - m : 'mionaid', - mm : '%d mionaidean', - h : 'uair', - hh : '%d uairean', - d : 'latha', - dd : '%d latha', - M : 'mìos', - MM : '%d mìosan', - y : 'bliadhna', - yy : '%d bliadhna' - }, - dayOfMonthOrdinalParse : /\d{1,2}(d|na|mh)/, - ordinal : function (number) { - var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh'; - return number + output; + future : 'за %s', + past : 'пре %s', + s : 'неколико секунди', + ss : translator.translate, + m : translator.translate, + mm : translator.translate, + h : translator.translate, + hh : translator.translate, + d : 'дан', + dd : translator.translate, + M : 'месец', + MM : translator.translate, + y : 'годину', + yy : translator.translate }, + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return gd; + return srCyrl; }))); /***/ }), -/* 90 */ +/* 115 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var gl = moment.defineLocale('gl', { - months : 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split('_'), - monthsShort : 'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'), - weekdaysShort : 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'), - weekdaysMin : 'do_lu_ma_mé_xo_ve_sá'.split('_'), + var ss = moment.defineLocale('ss', { + months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), + monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), + weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), + weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), + weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), weekdaysParseExact : true, longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', + LT : 'h:mm A', + LTS : 'h:mm:ss A', L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY H:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm' + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' }, calendar : { - sameDay : function () { - return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextDay : function () { - return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; - }, - nextWeek : function () { - return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, - lastDay : function () { - return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; - }, - lastWeek : function () { - return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; - }, + sameDay : '[Namuhla nga] LT', + nextDay : '[Kusasa nga] LT', + nextWeek : 'dddd [nga] LT', + lastDay : '[Itolo nga] LT', + lastWeek : 'dddd [leliphelile] [nga] LT', sameElse : 'L' }, relativeTime : { - future : function (str) { - if (str.indexOf('un') === 0) { - return 'n' + str; + future : 'nga %s', + past : 'wenteka nga %s', + s : 'emizuzwana lomcane', + ss : '%d mzuzwana', + m : 'umzuzu', + mm : '%d emizuzu', + h : 'lihora', + hh : '%d emahora', + d : 'lilanga', + dd : '%d emalanga', + M : 'inyanga', + MM : '%d tinyanga', + y : 'umnyaka', + yy : '%d iminyaka' + }, + meridiemParse: /ekuseni|emini|entsambama|ebusuku/, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'ekuseni'; + } else if (hours < 15) { + return 'emini'; + } else if (hours < 19) { + return 'entsambama'; + } else { + return 'ebusuku'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'ekuseni') { + return hour; + } else if (meridiem === 'emini') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { + if (hour === 0) { + return 0; } - return 'en ' + str; - }, - past : 'hai %s', - s : 'uns segundos', - ss : '%d segundos', - m : 'un minuto', - mm : '%d minutos', - h : 'unha hora', - hh : '%d horas', - d : 'un día', - dd : '%d días', - M : 'un mes', - MM : '%d meses', - y : 'un ano', - yy : '%d anos' + return hour + 12; + } }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal : '%dº', + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : '%d', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return gl; + return ss; }))); /***/ }), -/* 91 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's': ['thodde secondanim', 'thodde second'], - 'ss': [number + ' secondanim', number + ' second'], - 'm': ['eka mintan', 'ek minute'], - 'mm': [number + ' mintanim', number + ' mintam'], - 'h': ['eka voran', 'ek vor'], - 'hh': [number + ' voranim', number + ' voram'], - 'd': ['eka disan', 'ek dis'], - 'dd': [number + ' disanim', number + ' dis'], - 'M': ['eka mhoinean', 'ek mhoino'], - 'MM': [number + ' mhoineanim', number + ' mhoine'], - 'y': ['eka vorsan', 'ek voros'], - 'yy': [number + ' vorsanim', number + ' vorsam'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - - var gomLatn = moment.defineLocale('gom-latn', { - months : 'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split('_'), - monthsShort : 'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays : 'Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son\'var'.split('_'), - weekdaysShort : 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'), - weekdaysMin : 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'), - weekdaysParseExact : true, + var sv = moment.defineLocale('sv', { + months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), + monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), + weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), + weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), + weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), longDateFormat : { - LT : 'A h:mm [vazta]', - LTS : 'A h:mm:ss [vazta]', - L : 'DD-MM-YYYY', + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY-MM-DD', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY A h:mm [vazta]', - LLLL : 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', - llll: 'ddd, D MMM YYYY, A h:mm [vazta]' + LLL : 'D MMMM YYYY [kl.] HH:mm', + LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd D MMM YYYY HH:mm' }, calendar : { - sameDay: '[Aiz] LT', - nextDay: '[Faleam] LT', - nextWeek: '[Ieta to] dddd[,] LT', - lastDay: '[Kal] LT', - lastWeek: '[Fatlo] dddd[,] LT', + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[Igår] LT', + nextWeek: '[På] dddd LT', + lastWeek: '[I] dddd[s] LT', sameElse: 'L' }, relativeTime : { - future : '%s', - past : '%s adim', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime + future : 'om %s', + past : 'för %s sedan', + s : 'några sekunder', + ss : '%d sekunder', + m : 'en minut', + mm : '%d minuter', + h : 'en timme', + hh : '%d timmar', + d : 'en dag', + dd : '%d dagar', + M : 'en månad', + MM : '%d månader', + y : 'ett år', + yy : '%d år' }, - dayOfMonthOrdinalParse : /\d{1,2}(er)/, - ordinal : function (number, period) { - switch (period) { - // the ordinal 'er' only applies to day of the month - case 'D': - return number + 'er'; - default: - case 'M': - case 'Q': - case 'DDD': - case 'd': - case 'w': - case 'W': - return number; - } + dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; }, week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. - }, - meridiemParse: /rati|sokalli|donparam|sanje/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'rati') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'sokalli') { - return hour; - } else if (meridiem === 'donparam') { - return hour > 12 ? hour : hour + 12; - } else if (meridiem === 'sanje') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'rati'; - } else if (hour < 12) { - return 'sokalli'; - } else if (hour < 16) { - return 'donparam'; - } else if (hour < 20) { - return 'sanje'; - } else { - return 'rati'; - } } }); - return gomLatn; + return sv; }))); /***/ }), -/* 92 */ +/* 117 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '૧', - '2': '૨', - '3': '૩', - '4': '૪', - '5': '૫', - '6': '૬', - '7': '૭', - '8': '૮', - '9': '૯', - '0': '૦' - }, - numberMap = { - '૧': '1', - '૨': '2', - '૩': '3', - '૪': '4', - '૫': '5', - '૬': '6', - '૭': '7', - '૮': '8', - '૯': '9', - '૦': '0' - }; - - var gu = moment.defineLocale('gu', { - months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split('_'), - monthsShort: 'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split('_'), - monthsParseExact: true, - weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split('_'), - weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'), - weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'), - longDateFormat: { - LT: 'A h:mm વાગ્યે', - LTS: 'A h:mm:ss વાગ્યે', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY, A h:mm વાગ્યે', - LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે' - }, - calendar: { - sameDay: '[આજ] LT', - nextDay: '[કાલે] LT', - nextWeek: 'dddd, LT', - lastDay: '[ગઇકાલે] LT', - lastWeek: '[પાછલા] dddd, LT', - sameElse: 'L' - }, - relativeTime: { - future: '%s મા', - past: '%s પેહલા', - s: 'અમુક પળો', - ss: '%d સેકંડ', - m: 'એક મિનિટ', - mm: '%d મિનિટ', - h: 'એક કલાક', - hh: '%d કલાક', - d: 'એક દિવસ', - dd: '%d દિવસ', - M: 'એક મહિનો', - MM: '%d મહિનો', - y: 'એક વર્ષ', - yy: '%d વર્ષ' - }, - preparse: function (string) { - return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + var sw = moment.defineLocale('sw', { + months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), + monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), + weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), + weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), + weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), + weekdaysParseExact : true, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, - // Gujarati notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati. - meridiemParse: /રાત|બપોર|સવાર|સાંજ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'રાત') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'સવાર') { - return hour; - } else if (meridiem === 'બપોર') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'સાંજ') { - return hour + 12; - } + calendar : { + sameDay : '[leo saa] LT', + nextDay : '[kesho saa] LT', + nextWeek : '[wiki ijayo] dddd [saat] LT', + lastDay : '[jana] LT', + lastWeek : '[wiki iliyopita] dddd [saat] LT', + sameElse : 'L' }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'રાત'; - } else if (hour < 10) { - return 'સવાર'; - } else if (hour < 17) { - return 'બપોર'; - } else if (hour < 20) { - return 'સાંજ'; - } else { - return 'રાત'; - } + relativeTime : { + future : '%s baadaye', + past : 'tokea %s', + s : 'hivi punde', + ss : 'sekunde %d', + m : 'dakika moja', + mm : 'dakika %d', + h : 'saa limoja', + hh : 'masaa %d', + d : 'siku moja', + dd : 'masiku %d', + M : 'mwezi mmoja', + MM : 'miezi %d', + y : 'mwaka mmoja', + yy : 'miaka %d' }, - week: { - dow: 0, // Sunday is the first day of the week. - doy: 6 // The week that contains Jan 6th is the first week of the year. + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return gu; + return sw; }))); /***/ }), -/* 93 */ +/* 118 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var he = moment.defineLocale('he', { - months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'), - monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'), - weekdays : 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'), - weekdaysShort : 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'), - weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'), + var symbolMap = { + '1': '௧', + '2': '௨', + '3': '௩', + '4': '௪', + '5': '௫', + '6': '௬', + '7': '௭', + '8': '௮', + '9': '௯', + '0': '௦' + }, numberMap = { + '௧': '1', + '௨': '2', + '௩': '3', + '௪': '4', + '௫': '5', + '௬': '6', + '௭': '7', + '௮': '8', + '௯': '9', + '௦': '0' + }; + + var ta = moment.defineLocale('ta', { + months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), + weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), + weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), + weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', - LL : 'D [ב]MMMM YYYY', - LLL : 'D [ב]MMMM YYYY HH:mm', - LLLL : 'dddd, D [ב]MMMM YYYY HH:mm', - l : 'D/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY, HH:mm', + LLLL : 'dddd, D MMMM YYYY, HH:mm' }, calendar : { - sameDay : '[היום ב־]LT', - nextDay : '[מחר ב־]LT', - nextWeek : 'dddd [בשעה] LT', - lastDay : '[אתמול ב־]LT', - lastWeek : '[ביום] dddd [האחרון בשעה] LT', + sameDay : '[இன்று] LT', + nextDay : '[நாளை] LT', + nextWeek : 'dddd, LT', + lastDay : '[நேற்று] LT', + lastWeek : '[கடந்த வாரம்] dddd, LT', sameElse : 'L' }, relativeTime : { - future : 'בעוד %s', - past : 'לפני %s', - s : 'מספר שניות', - ss : '%d שניות', - m : 'דקה', - mm : '%d דקות', - h : 'שעה', - hh : function (number) { - if (number === 2) { - return 'שעתיים'; - } - return number + ' שעות'; - }, - d : 'יום', - dd : function (number) { - if (number === 2) { - return 'יומיים'; - } - return number + ' ימים'; - }, - M : 'חודש', - MM : function (number) { - if (number === 2) { - return 'חודשיים'; - } - return number + ' חודשים'; - }, - y : 'שנה', - yy : function (number) { - if (number === 2) { - return 'שנתיים'; - } else if (number % 10 === 0 && number !== 10) { - return number + ' שנה'; - } - return number + ' שנים'; - } + future : '%s இல்', + past : '%s முன்', + s : 'ஒரு சில விநாடிகள்', + ss : '%d விநாடிகள்', + m : 'ஒரு நிமிடம்', + mm : '%d நிமிடங்கள்', + h : 'ஒரு மணி நேரம்', + hh : '%d மணி நேரம்', + d : 'ஒரு நாள்', + dd : '%d நாட்கள்', + M : 'ஒரு மாதம்', + MM : '%d மாதங்கள்', + y : 'ஒரு வருடம்', + yy : '%d ஆண்டுகள்' }, - meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i, - isPM : function (input) { - return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input); + dayOfMonthOrdinalParse: /\d{1,2}வது/, + ordinal : function (number) { + return number + 'வது'; }, + preparse: function (string) { + return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // refer http://ta.wikipedia.org/s/1er1 + meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, meridiem : function (hour, minute, isLower) { - if (hour < 5) { - return 'לפנות בוקר'; + if (hour < 2) { + return ' யாமம்'; + } else if (hour < 6) { + return ' வைகறை'; // வைகறை } else if (hour < 10) { - return 'בבוקר'; - } else if (hour < 12) { - return isLower ? 'לפנה"צ' : 'לפני הצהריים'; + return ' காலை'; // காலை + } else if (hour < 14) { + return ' நண்பகல்'; // நண்பகல் } else if (hour < 18) { - return isLower ? 'אחה"צ' : 'אחרי הצהריים'; + return ' எற்பாடு'; // எற்பாடு + } else if (hour < 22) { + return ' மாலை'; // மாலை } else { - return 'בערב'; + return ' யாமம்'; + } + }, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'யாமம்') { + return hour < 2 ? hour : hour + 12; + } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { + return hour; + } else if (meridiem === 'நண்பகல்') { + return hour >= 10 ? hour : hour + 12; + } else { + return hour + 12; } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 6th is the first week of the year. } }); - return he; + return ta; }))); /***/ }), -/* 94 */ +/* 119 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - - var hi = moment.defineLocale('hi', { - months : 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split('_'), - monthsShort : 'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'), - monthsParseExact: true, - weekdays : 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), + var te = moment.defineLocale('te', { + months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), + monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), + monthsParseExact : true, + weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), + weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), + weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), longDateFormat : { - LT : 'A h:mm बजे', - LTS : 'A h:mm:ss बजे', + LT : 'A h:mm', + LTS : 'A h:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, A h:mm बजे' + LLL : 'D MMMM YYYY, A h:mm', + LLLL : 'dddd, D MMMM YYYY, A h:mm' }, calendar : { - sameDay : '[आज] LT', - nextDay : '[कल] LT', + sameDay : '[నేడు] LT', + nextDay : '[రేపు] LT', nextWeek : 'dddd, LT', - lastDay : '[कल] LT', - lastWeek : '[पिछले] dddd, LT', + lastDay : '[నిన్న] LT', + lastWeek : '[గత] dddd, LT', sameElse : 'L' }, relativeTime : { - future : '%s में', - past : '%s पहले', - s : 'कुछ ही क्षण', - ss : '%d सेकंड', - m : 'एक मिनट', - mm : '%d मिनट', - h : 'एक घंटा', - hh : '%d घंटे', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महीने', - MM : '%d महीने', - y : 'एक वर्ष', - yy : '%d वर्ष' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + future : '%s లో', + past : '%s క్రితం', + s : 'కొన్ని క్షణాలు', + ss : '%d సెకన్లు', + m : 'ఒక నిమిషం', + mm : '%d నిమిషాలు', + h : 'ఒక గంట', + hh : '%d గంటలు', + d : 'ఒక రోజు', + dd : '%d రోజులు', + M : 'ఒక నెల', + MM : '%d నెలలు', + y : 'ఒక సంవత్సరం', + yy : '%d సంవత్సరాలు' }, - // Hindi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. - meridiemParse: /रात|सुबह|दोपहर|शाम/, + dayOfMonthOrdinalParse : /\d{1,2}వ/, + ordinal : '%dవ', + meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, meridiemHour : function (hour, meridiem) { if (hour === 12) { hour = 0; } - if (meridiem === 'रात') { + if (meridiem === 'రాత్రి') { return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सुबह') { + } else if (meridiem === 'ఉదయం') { return hour; - } else if (meridiem === 'दोपहर') { + } else if (meridiem === 'మధ్యాహ్నం') { return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'शाम') { + } else if (meridiem === 'సాయంత్రం') { return hour + 12; } }, meridiem : function (hour, minute, isLower) { if (hour < 4) { - return 'रात'; + return 'రాత్రి'; } else if (hour < 10) { - return 'सुबह'; + return 'ఉదయం'; } else if (hour < 17) { - return 'दोपहर'; + return 'మధ్యాహ్నం'; } else if (hour < 20) { - return 'शाम'; + return 'సాయంత్రం'; } else { - return 'रात'; + return 'రాత్రి'; } }, week : { @@ -14720,584 +16254,445 @@ webpackContext.id = 41; } }); - return hi; + return te; }))); /***/ }), -/* 95 */ +/* 120 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - if (number === 1) { - result += 'sekunda'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sekunde'; - } else { - result += 'sekundi'; - } - return result; - case 'm': - return withoutSuffix ? 'jedna minuta' : 'jedne minute'; - case 'mm': - if (number === 1) { - result += 'minuta'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'minute'; - } else { - result += 'minuta'; - } - return result; - case 'h': - return withoutSuffix ? 'jedan sat' : 'jednog sata'; - case 'hh': - if (number === 1) { - result += 'sat'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'sata'; - } else { - result += 'sati'; - } - return result; - case 'dd': - if (number === 1) { - result += 'dan'; - } else { - result += 'dana'; - } - return result; - case 'MM': - if (number === 1) { - result += 'mjesec'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'mjeseca'; - } else { - result += 'mjeseci'; - } - return result; - case 'yy': - if (number === 1) { - result += 'godina'; - } else if (number === 2 || number === 3 || number === 4) { - result += 'godine'; - } else { - result += 'godina'; - } - return result; - } - } - - var hr = moment.defineLocale('hr', { - months : { - format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split('_'), - standalone: 'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split('_') - }, - monthsShort : 'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split('_'), - monthsParseExact: true, - weekdays : 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort : 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin : 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, + var tet = moment.defineLocale('tet', { + months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), + monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), + weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), + weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), + weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'), longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[danas u] LT', - nextDay : '[sutra u] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[jučer u] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - return '[prošlu] dddd [u] LT'; - case 6: - return '[prošle] [subote] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prošli] dddd [u] LT'; - } - }, - sameElse : 'L' + sameDay: '[Ohin iha] LT', + nextDay: '[Aban iha] LT', + nextWeek: 'dddd [iha] LT', + lastDay: '[Horiseik iha] LT', + lastWeek: 'dddd [semana kotuk] [iha] LT', + sameElse: 'L' }, relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'par sekundi', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : 'dan', - dd : translate, - M : 'mjesec', - MM : translate, - y : 'godinu', - yy : translate + future : 'iha %s', + past : '%s liuba', + s : 'minutu balun', + ss : 'minutu %d', + m : 'minutu ida', + mm : 'minutu %d', + h : 'oras ida', + hh : 'oras %d', + d : 'loron ida', + dd : 'loron %d', + M : 'fulan ida', + MM : 'fulan %d', + y : 'tinan ida', + yy : 'tinan %d' + }, + dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return hr; + return tet; }))); /***/ }), -/* 96 */ +/* 121 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' '); - function translate(number, withoutSuffix, key, isFuture) { - var num = number; - switch (key) { - case 's': - return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; - case 'ss': - return num + (isFuture || withoutSuffix) ? ' másodperc' : ' másodperce'; - case 'm': - return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'mm': - return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); - case 'h': - return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'hh': - return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); - case 'd': - return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'dd': - return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); - case 'M': - return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'MM': - return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); - case 'y': - return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); - case 'yy': - return num + (isFuture || withoutSuffix ? ' év' : ' éve'); - } - return ''; - } - function week(isFuture) { - return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; - } + var suffixes = { + 0: '-ум', + 1: '-ум', + 2: '-юм', + 3: '-юм', + 4: '-ум', + 5: '-ум', + 6: '-ум', + 7: '-ум', + 8: '-ум', + 9: '-ум', + 10: '-ум', + 12: '-ум', + 13: '-ум', + 20: '-ум', + 30: '-юм', + 40: '-ум', + 50: '-ум', + 60: '-ум', + 70: '-ум', + 80: '-ум', + 90: '-ум', + 100: '-ум' + }; - var hu = moment.defineLocale('hu', { - months : 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split('_'), - monthsShort : 'jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec'.split('_'), - weekdays : 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'), - weekdaysShort : 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'), - weekdaysMin : 'v_h_k_sze_cs_p_szo'.split('_'), + var tg = moment.defineLocale('tg', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), + weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'), + weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'), longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY. MMMM D.', - LLL : 'YYYY. MMMM D. H:mm', - LLLL : 'YYYY. MMMM D., dddd H:mm' - }, - meridiemParse: /de|du/i, - isPM: function (input) { - return input.charAt(1).toLowerCase() === 'u'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower === true ? 'de' : 'DE'; - } else { - return isLower === true ? 'du' : 'DU'; - } + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[ma] LT[-kor]', - nextDay : '[holnap] LT[-kor]', - nextWeek : function () { - return week.call(this, true); - }, - lastDay : '[tegnap] LT[-kor]', - lastWeek : function () { - return week.call(this, false); - }, + sameDay : '[Имрӯз соати] LT', + nextDay : '[Пагоҳ соати] LT', + lastDay : '[Дирӯз соати] LT', + nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT', + lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', sameElse : 'L' }, relativeTime : { - future : '%s múlva', - past : '%s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate + future : 'баъди %s', + past : '%s пеш', + s : 'якчанд сония', + m : 'як дақиқа', + mm : '%d дақиқа', + h : 'як соат', + hh : '%d соат', + d : 'як рӯз', + dd : '%d рӯз', + M : 'як моҳ', + MM : '%d моҳ', + y : 'як сол', + yy : '%d сол' + }, + meridiemParse: /шаб|субҳ|рӯз|бегоҳ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === 'шаб') { + return hour < 4 ? hour : hour + 12; + } else if (meridiem === 'субҳ') { + return hour; + } else if (meridiem === 'рӯз') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === 'бегоҳ') { + return hour + 12; + } + }, + meridiem: function (hour, minute, isLower) { + if (hour < 4) { + return 'шаб'; + } else if (hour < 11) { + return 'субҳ'; + } else if (hour < 16) { + return 'рӯз'; + } else if (hour < 19) { + return 'бегоҳ'; + } else { + return 'шаб'; + } + }, + dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, + ordinal: function (number) { + var a = number % 10, + b = number >= 100 ? 100 : null; + return number + (suffixes[number] || suffixes[a] || suffixes[b]); }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 1th is the first week of the year. } }); - return hu; + return tg; }))); /***/ }), -/* 97 */ +/* 122 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var hyAm = moment.defineLocale('hy-am', { - months : { - format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split('_'), - standalone: 'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split('_') - }, - monthsShort : 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'), - weekdays : 'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split('_'), - weekdaysShort : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), - weekdaysMin : 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'), + var th = moment.defineLocale('th', { + months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), + monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), + monthsParseExact: true, + weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), + weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference + weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), + weekdaysParseExact : true, longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY թ.', - LLL : 'D MMMM YYYY թ., HH:mm', - LLLL : 'dddd, D MMMM YYYY թ., HH:mm' - }, - calendar : { - sameDay: '[այսօր] LT', - nextDay: '[վաղը] LT', - lastDay: '[երեկ] LT', - nextWeek: function () { - return 'dddd [օրը ժամը] LT'; - }, - lastWeek: function () { - return '[անցած] dddd [օրը ժամը] LT'; - }, - sameElse: 'L' - }, - relativeTime : { - future : '%s հետո', - past : '%s առաջ', - s : 'մի քանի վայրկյան', - ss : '%d վայրկյան', - m : 'րոպե', - mm : '%d րոպե', - h : 'ժամ', - hh : '%d ժամ', - d : 'օր', - dd : '%d օր', - M : 'ամիս', - MM : '%d ամիս', - y : 'տարի', - yy : '%d տարի' + LT : 'H:mm', + LTS : 'H:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY เวลา H:mm', + LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' }, - meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/, + meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, isPM: function (input) { - return /^(ցերեկվա|երեկոյան)$/.test(input); + return input === 'หลังเที่ยง'; }, - meridiem : function (hour) { - if (hour < 4) { - return 'գիշերվա'; - } else if (hour < 12) { - return 'առավոտվա'; - } else if (hour < 17) { - return 'ցերեկվա'; + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'ก่อนเที่ยง'; } else { - return 'երեկոյան'; + return 'หลังเที่ยง'; } }, - dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/, - ordinal: function (number, period) { - switch (period) { - case 'DDD': - case 'w': - case 'W': - case 'DDDo': - if (number === 1) { - return number + '-ին'; - } - return number + '-րդ'; - default: - return number; - } + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', + sameElse : 'L' }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + relativeTime : { + future : 'อีก %s', + past : '%sที่แล้ว', + s : 'ไม่กี่วินาที', + ss : '%d วินาที', + m : '1 นาที', + mm : '%d นาที', + h : '1 ชั่วโมง', + hh : '%d ชั่วโมง', + d : '1 วัน', + dd : '%d วัน', + M : '1 เดือน', + MM : '%d เดือน', + y : '1 ปี', + yy : '%d ปี' } }); - return hyAm; + return th; }))); /***/ }), -/* 98 */ +/* 123 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var id = moment.defineLocale('id', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'), + var tlPh = moment.defineLocale('tl-ph', { + months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), + monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), + weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), + weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), + weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|siang|sore|malam/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'siang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sore' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'siang'; - } else if (hours < 19) { - return 'sore'; - } else { - return 'malam'; - } + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'MM/D/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY HH:mm', + LLLL : 'dddd, MMMM DD, YYYY HH:mm' }, calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Besok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kemarin pukul] LT', - lastWeek : 'dddd [lalu pukul] LT', - sameElse : 'L' + sameDay: 'LT [ngayong araw]', + nextDay: '[Bukas ng] LT', + nextWeek: 'LT [sa susunod na] dddd', + lastDay: 'LT [kahapon]', + lastWeek: 'LT [noong nakaraang] dddd', + sameElse: 'L' }, relativeTime : { - future : 'dalam %s', - past : '%s yang lalu', - s : 'beberapa detik', - ss : '%d detik', - m : 'semenit', - mm : '%d menit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' + future : 'sa loob ng %s', + past : '%s ang nakalipas', + s : 'ilang segundo', + ss : '%d segundo', + m : 'isang minuto', + mm : '%d minuto', + h : 'isang oras', + hh : '%d oras', + d : 'isang araw', + dd : '%d araw', + M : 'isang buwan', + MM : '%d buwan', + y : 'isang taon', + yy : '%d taon' + }, + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; }, week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return id; + return tlPh; }))); /***/ }), -/* 99 */ +/* 124 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function plural(n) { - if (n % 100 === 11) { - return true; - } else if (n % 10 === 1) { - return false; - } - return true; + var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); + + function translateFuture(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'leS' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'waQ' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'nem' : + time + ' pIq'; + return time; } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; - case 'ss': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum'); - } - return result + 'sekúnda'; - case 'm': - return withoutSuffix ? 'mínúta' : 'mínútu'; + + function translatePast(output) { + var time = output; + time = (output.indexOf('jaj') !== -1) ? + time.slice(0, -3) + 'Hu’' : + (output.indexOf('jar') !== -1) ? + time.slice(0, -3) + 'wen' : + (output.indexOf('DIS') !== -1) ? + time.slice(0, -3) + 'ben' : + time + ' ret'; + return time; + } + + function translate(number, withoutSuffix, string, isFuture) { + var numberNoun = numberAsNoun(number); + switch (string) { + case 'ss': + return numberNoun + ' lup'; case 'mm': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); - } else if (withoutSuffix) { - return result + 'mínúta'; - } - return result + 'mínútu'; + return numberNoun + ' tup'; case 'hh': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); - } - return result + 'klukkustund'; - case 'd': - if (withoutSuffix) { - return 'dagur'; - } - return isFuture ? 'dag' : 'degi'; + return numberNoun + ' rep'; case 'dd': - if (plural(number)) { - if (withoutSuffix) { - return result + 'dagar'; - } - return result + (isFuture ? 'daga' : 'dögum'); - } else if (withoutSuffix) { - return result + 'dagur'; - } - return result + (isFuture ? 'dag' : 'degi'); - case 'M': - if (withoutSuffix) { - return 'mánuður'; - } - return isFuture ? 'mánuð' : 'mánuði'; + return numberNoun + ' jaj'; case 'MM': - if (plural(number)) { - if (withoutSuffix) { - return result + 'mánuðir'; - } - return result + (isFuture ? 'mánuði' : 'mánuðum'); - } else if (withoutSuffix) { - return result + 'mánuður'; - } - return result + (isFuture ? 'mánuð' : 'mánuði'); - case 'y': - return withoutSuffix || isFuture ? 'ár' : 'ári'; + return numberNoun + ' jar'; case 'yy': - if (plural(number)) { - return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); - } - return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + return numberNoun + ' DIS'; } } - var is = moment.defineLocale('is', { - months : 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'), - weekdays : 'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split('_'), - weekdaysShort : 'sun_mán_þri_mið_fim_fös_lau'.split('_'), - weekdaysMin : 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'), + function numberAsNoun(number) { + var hundred = Math.floor((number % 1000) / 100), + ten = Math.floor((number % 100) / 10), + one = number % 10, + word = ''; + if (hundred > 0) { + word += numbersNouns[hundred] + 'vatlh'; + } + if (ten > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + } + if (one > 0) { + word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + } + return (word === '') ? 'pagh' : word; + } + + var tlh = moment.defineLocale('tlh', { + months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), + monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), + monthsParseExact : true, + weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), + weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd, D. MMMM YYYY [kl.] H:mm' + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[í dag kl.] LT', - nextDay : '[á morgun kl.] LT', - nextWeek : 'dddd [kl.] LT', - lastDay : '[í gær kl.] LT', - lastWeek : '[síðasta] dddd [kl.] LT', - sameElse : 'L' + sameDay: '[DaHjaj] LT', + nextDay: '[wa’leS] LT', + nextWeek: 'LLL', + lastDay: '[wa’Hu’] LT', + lastWeek: 'LLL', + sameElse: 'L' }, relativeTime : { - future : 'eftir %s', - past : 'fyrir %s síðan', - s : translate, + future : translateFuture, + past : translatePast, + s : 'puS lup', ss : translate, - m : translate, + m : 'wa’ tup', mm : translate, - h : 'klukkustund', + h : 'wa’ rep', hh : translate, - d : translate, + d : 'wa’ jaj', dd : translate, - M : translate, + M : 'wa’ jar', MM : translate, - y : translate, + y : 'wa’ DIS', yy : translate }, dayOfMonthOrdinalParse: /\d{1,2}\./, @@ -15308,32250 +16703,27327 @@ webpackContext.id = 41; } }); - return is; + return tlh; }))); /***/ }), -/* 100 */ +/* 125 */ /***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; + var suffixes = { + 1: '\'inci', + 5: '\'inci', + 8: '\'inci', + 70: '\'inci', + 80: '\'inci', + 2: '\'nci', + 7: '\'nci', + 20: '\'nci', + 50: '\'nci', + 3: '\'üncü', + 4: '\'üncü', + 100: '\'üncü', + 6: '\'ncı', + 9: '\'uncu', + 10: '\'uncu', + 30: '\'uncu', + 60: '\'ıncı', + 90: '\'ıncı' + }; - var it = moment.defineLocale('it', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), - weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), - weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + var tr = moment.defineLocale('tr', { + months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), + monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), + weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), + weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), + weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', + L : 'DD.MM.YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LLLL : 'dddd, D MMMM YYYY HH:mm' }, calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[gelecek] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen] dddd [saat] LT', + sameElse : 'L' }, relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - ss : '%d secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' + future : '%s sonra', + past : '%s önce', + s : 'birkaç saniye', + ss : '%d saniye', + m : 'bir dakika', + mm : '%d dakika', + h : 'bir saat', + hh : '%d saat', + d : 'bir gün', + dd : '%d gün', + M : 'bir ay', + MM : '%d ay', + y : 'bir yıl', + yy : '%d yıl' + }, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'Do': + case 'DD': + return number; + default: + if (number === 0) { // special case for zero + return number + '\'ıncı'; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + } }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', week : { dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return it; + return tr; }))); /***/ }), -/* 101 */ +/* 126 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var itCh = moment.defineLocale('it-ch', { - months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'), - monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'), - weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'), - weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'), - weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'), + // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. + // This is currently too difficult (maybe even impossible) to add. + var tzl = moment.defineLocale('tzl', { + months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), + monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), + weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), + weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), + weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', + LT : 'HH.mm', + LTS : 'HH.mm.ss', L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' + LL : 'D. MMMM [dallas] YYYY', + LLL : 'D. MMMM [dallas] YYYY HH.mm', + LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' + }, + meridiemParse: /d\'o|d\'a/i, + isPM : function (input) { + return 'd\'o' === input.toLowerCase(); + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'd\'o' : 'D\'O'; + } else { + return isLower ? 'd\'a' : 'D\'A'; + } }, calendar : { - sameDay: '[Oggi alle] LT', - nextDay: '[Domani alle] LT', - nextWeek: 'dddd [alle] LT', - lastDay: '[Ieri alle] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[la scorsa] dddd [alle] LT'; - default: - return '[lo scorso] dddd [alle] LT'; - } - }, - sameElse: 'L' + sameDay : '[oxhi à] LT', + nextDay : '[demà à] LT', + nextWeek : 'dddd [à] LT', + lastDay : '[ieiri à] LT', + lastWeek : '[sür el] dddd [lasteu à] LT', + sameElse : 'L' }, relativeTime : { - future : function (s) { - return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s; - }, - past : '%s fa', - s : 'alcuni secondi', - ss : '%d secondi', - m : 'un minuto', - mm : '%d minuti', - h : 'un\'ora', - hh : '%d ore', - d : 'un giorno', - dd : '%d giorni', - M : 'un mese', - MM : '%d mesi', - y : 'un anno', - yy : '%d anni' + future : 'osprei %s', + past : 'ja%s', + s : processRelativeTime, + ss : processRelativeTime, + m : processRelativeTime, + mm : processRelativeTime, + h : processRelativeTime, + hh : processRelativeTime, + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', + dayOfMonthOrdinalParse: /\d{1,2}\./, + ordinal : '%d.', week : { dow : 1, // Monday is the first day of the week. doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return itCh; + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 's': ['viensas secunds', '\'iensas secunds'], + 'ss': [number + ' secunds', '' + number + ' secunds'], + 'm': ['\'n míut', '\'iens míut'], + 'mm': [number + ' míuts', '' + number + ' míuts'], + 'h': ['\'n þora', '\'iensa þora'], + 'hh': [number + ' þoras', '' + number + ' þoras'], + 'd': ['\'n ziua', '\'iensa ziua'], + 'dd': [number + ' ziuas', '' + number + ' ziuas'], + 'M': ['\'n mes', '\'iens mes'], + 'MM': [number + ' mesen', '' + number + ' mesen'], + 'y': ['\'n ar', '\'iens ar'], + 'yy': [number + ' ars', '' + number + ' ars'] + }; + return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); + } + + return tzl; }))); /***/ }), -/* 102 */ +/* 127 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ja = moment.defineLocale('ja', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'), - weekdaysShort : '日_月_火_水_木_金_土'.split('_'), - weekdaysMin : '日_月_火_水_木_金_土'.split('_'), + var tzm = moment.defineLocale('tzm', { + months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), + weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), + weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), longDateFormat : { LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日 dddd HH:mm', - l : 'YYYY/MM/DD', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日(ddd) HH:mm' - }, - meridiemParse: /午前|午後/i, - isPM : function (input) { - return input === '午後'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return '午前'; - } else { - return '午後'; - } + LTS: 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' }, calendar : { - sameDay : '[今日] LT', - nextDay : '[明日] LT', - nextWeek : function (now) { - if (now.week() < this.week()) { - return '[来週]dddd LT'; - } else { - return 'dddd LT'; - } - }, - lastDay : '[昨日] LT', - lastWeek : function (now) { - if (this.week() < now.week()) { - return '[先週]dddd LT'; - } else { - return 'dddd LT'; - } - }, - sameElse : 'L' - }, - dayOfMonthOrdinalParse : /\d{1,2}日/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - default: - return number; - } + sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', + nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', + nextWeek: 'dddd [ⴴ] LT', + lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', + lastWeek: 'dddd [ⴴ] LT', + sameElse: 'L' }, relativeTime : { - future : '%s後', - past : '%s前', - s : '数秒', - ss : '%d秒', - m : '1分', - mm : '%d分', - h : '1時間', - hh : '%d時間', - d : '1日', - dd : '%d日', - M : '1ヶ月', - MM : '%dヶ月', - y : '1年', - yy : '%d年' + future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', + past : 'ⵢⴰⵏ %s', + s : 'ⵉⵎⵉⴽ', + ss : '%d ⵉⵎⵉⴽ', + m : 'ⵎⵉⵏⵓⴺ', + mm : '%d ⵎⵉⵏⵓⴺ', + h : 'ⵙⴰⵄⴰ', + hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', + d : 'ⴰⵙⵙ', + dd : '%d oⵙⵙⴰⵏ', + M : 'ⴰⵢoⵓⵔ', + MM : '%d ⵉⵢⵢⵉⵔⵏ', + y : 'ⴰⵙⴳⴰⵙ', + yy : '%d ⵉⵙⴳⴰⵙⵏ' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. } }); - return ja; + return tzm; }))); /***/ }), -/* 103 */ +/* 128 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var jv = moment.defineLocale('jv', { - months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split('_'), - monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'), - weekdays : 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'), - weekdaysShort : 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'), - weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'), + var tzmLatn = moment.defineLocale('tzm-latn', { + months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), + weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), + weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd D MMMM YYYY HH:mm' }, - meridiemParse: /enjing|siyang|sonten|ndalu/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'enjing') { - return hour; - } else if (meridiem === 'siyang') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'sonten' || meridiem === 'ndalu') { - return hour + 12; - } + calendar : { + sameDay: '[asdkh g] LT', + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'enjing'; - } else if (hours < 15) { - return 'siyang'; - } else if (hours < 19) { - return 'sonten'; + relativeTime : { + future : 'dadkh s yan %s', + past : 'yan %s', + s : 'imik', + ss : '%d imik', + m : 'minuḍ', + mm : '%d minuḍ', + h : 'saɛa', + hh : '%d tassaɛin', + d : 'ass', + dd : '%d ossan', + M : 'ayowr', + MM : '%d iyyirn', + y : 'asgas', + yy : '%d isgasn' + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 12th is the first week of the year. + } + }); + + return tzmLatn; + +}))); + + +/***/ }), +/* 129 */ +/***/ (function(module, exports, __webpack_require__) { + +//! moment.js language configuration + +;(function (global, factory) { + true ? factory(__webpack_require__(10)) : + undefined +}(this, (function (moment) { 'use strict'; + + + var ugCn = moment.defineLocale('ug-cn', { + months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( + '_' + ), + weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( + '_' + ), + weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), + longDateFormat: { + LT: 'HH:mm', + LTS: 'HH:mm:ss', + L: 'YYYY-MM-DD', + LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', + LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', + LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' + }, + meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if ( + meridiem === 'يېرىم كېچە' || + meridiem === 'سەھەر' || + meridiem === 'چۈشتىن بۇرۇن' + ) { + return hour; + } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { + return hour + 12; } else { - return 'ndalu'; + return hour >= 11 ? hour : hour + 12; } }, - calendar : { - sameDay : '[Dinten puniko pukul] LT', - nextDay : '[Mbenjang pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kala wingi pukul] LT', - lastWeek : 'dddd [kepengker pukul] LT', - sameElse : 'L' + meridiem: function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return 'يېرىم كېچە'; + } else if (hm < 900) { + return 'سەھەر'; + } else if (hm < 1130) { + return 'چۈشتىن بۇرۇن'; + } else if (hm < 1230) { + return 'چۈش'; + } else if (hm < 1800) { + return 'چۈشتىن كېيىن'; + } else { + return 'كەچ'; + } }, - relativeTime : { - future : 'wonten ing %s', - past : '%s ingkang kepengker', - s : 'sawetawis detik', - ss : '%d detik', - m : 'setunggal menit', - mm : '%d menit', - h : 'setunggal jam', - hh : '%d jam', - d : 'sedinten', - dd : '%d dinten', - M : 'sewulan', - MM : '%d wulan', - y : 'setaun', - yy : '%d taun' + calendar: { + sameDay: '[بۈگۈن سائەت] LT', + nextDay: '[ئەتە سائەت] LT', + nextWeek: '[كېلەركى] dddd [سائەت] LT', + lastDay: '[تۆنۈگۈن] LT', + lastWeek: '[ئالدىنقى] dddd [سائەت] LT', + sameElse: 'L' }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + relativeTime: { + future: '%s كېيىن', + past: '%s بۇرۇن', + s: 'نەچچە سېكونت', + ss: '%d سېكونت', + m: 'بىر مىنۇت', + mm: '%d مىنۇت', + h: 'بىر سائەت', + hh: '%d سائەت', + d: 'بىر كۈن', + dd: '%d كۈن', + M: 'بىر ئاي', + MM: '%d ئاي', + y: 'بىر يىل', + yy: '%d يىل' + }, + + dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, + ordinal: function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '-كۈنى'; + case 'w': + case 'W': + return number + '-ھەپتە'; + default: + return number; + } + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, // Monday is the first day of the week. + doy: 7 // The week that contains Jan 1st is the first week of the year. } }); - return jv; + return ugCn; }))); /***/ }), -/* 104 */ +/* 130 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ka = moment.defineLocale('ka', { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд', + 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', + 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'місяць_місяці_місяців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') + }; + + if (m === true) { + return weekdays['nominative'].slice(1, 7).concat(weekdays['nominative'].slice(0, 1)); + } + if (!m) { + return weekdays['nominative']; + } + + var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + return weekdays[nounCase][m.day()]; + } + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + var uk = moment.defineLocale('uk', { months : { - standalone: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'), - format: 'იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს'.split('_') - }, - monthsShort : 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'), - weekdays : { - standalone: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'), - format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split('_'), - isFormat: /(წინა|შემდეგ)/ + 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), + 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') }, - weekdaysShort : 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'), - weekdaysMin : 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'), + monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), + weekdays : weekdaysCaseReplace, + weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), + weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD.MM.YYYY', + LL : 'D MMMM YYYY р.', + LLL : 'D MMMM YYYY р., HH:mm', + LLLL : 'dddd, D MMMM YYYY р., HH:mm' }, calendar : { - sameDay : '[დღეს] LT[-ზე]', - nextDay : '[ხვალ] LT[-ზე]', - lastDay : '[გუშინ] LT[-ზე]', - nextWeek : '[შემდეგ] dddd LT[-ზე]', - lastWeek : '[წინა] dddd LT-ზე', - sameElse : 'L' - }, - relativeTime : { - future : function (s) { - return (/(წამი|წუთი|საათი|წელი)/).test(s) ? - s.replace(/ი$/, 'ში') : - s + 'ში'; - }, - past : function (s) { - if ((/(წამი|წუთი|საათი|დღე|თვე)/).test(s)) { - return s.replace(/(ი|ე)$/, 'ის წინ'); - } - if ((/წელი/).test(s)) { - return s.replace(/წელი$/, 'წლის წინ'); + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); } }, - s : 'რამდენიმე წამი', - ss : '%d წამი', - m : 'წუთი', - mm : '%d წუთი', - h : 'საათი', - hh : '%d საათი', - d : 'დღე', - dd : '%d დღე', - M : 'თვე', - MM : '%d თვე', - y : 'წელი', - yy : '%d წელი' + sameElse: 'L' }, - dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/, - ordinal : function (number) { - if (number === 0) { - return number; - } - if (number === 1) { - return number + '-ლი'; + relativeTime : { + future : 'за %s', + past : '%s тому', + s : 'декілька секунд', + ss : relativeTimeWithPlural, + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : 'годину', + hh : relativeTimeWithPlural, + d : 'день', + dd : relativeTimeWithPlural, + M : 'місяць', + MM : relativeTimeWithPlural, + y : 'рік', + yy : relativeTimeWithPlural + }, + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + meridiemParse: /ночі|ранку|дня|вечора/, + isPM: function (input) { + return /^(дня|вечора)$/.test(input); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return 'ночі'; + } else if (hour < 12) { + return 'ранку'; + } else if (hour < 17) { + return 'дня'; + } else { + return 'вечора'; } - if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { - return 'მე-' + number; + }, + dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/, + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; } - return number + '-ე'; }, week : { - dow : 1, - doy : 7 + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return ka; + return uk; }))); /***/ }), -/* 105 */ +/* 131 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var suffixes = { - 0: '-ші', - 1: '-ші', - 2: '-ші', - 3: '-ші', - 4: '-ші', - 5: '-ші', - 6: '-шы', - 7: '-ші', - 8: '-ші', - 9: '-шы', - 10: '-шы', - 20: '-шы', - 30: '-шы', - 40: '-шы', - 50: '-ші', - 60: '-шы', - 70: '-ші', - 80: '-ші', - 90: '-шы', - 100: '-ші' - }; + var months = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر' + ]; + var days = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ' + ]; - var kk = moment.defineLocale('kk', { - months : 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split('_'), - monthsShort : 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'), - weekdays : 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split('_'), - weekdaysShort : 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'), - weekdaysMin : 'жк_дй_сй_ср_бй_жм_сн'.split('_'), + var ur = moment.defineLocale('ur', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLLL : 'dddd، D MMMM YYYY HH:mm' + }, + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'صبح'; + } + return 'شام'; }, calendar : { - sameDay : '[Бүгін сағат] LT', - nextDay : '[Ертең сағат] LT', - nextWeek : 'dddd [сағат] LT', - lastDay : '[Кеше сағат] LT', - lastWeek : '[Өткен аптаның] dddd [сағат] LT', + sameDay : '[آج بوقت] LT', + nextDay : '[کل بوقت] LT', + nextWeek : 'dddd [بوقت] LT', + lastDay : '[گذشتہ روز بوقت] LT', + lastWeek : '[گذشتہ] dddd [بوقت] LT', sameElse : 'L' }, relativeTime : { - future : '%s ішінде', - past : '%s бұрын', - s : 'бірнеше секунд', - ss : '%d секунд', - m : 'бір минут', - mm : '%d минут', - h : 'бір сағат', - hh : '%d сағат', - d : 'бір күн', - dd : '%d күн', - M : 'бір ай', - MM : '%d ай', - y : 'бір жыл', - yy : '%d жыл' + future : '%s بعد', + past : '%s قبل', + s : 'چند سیکنڈ', + ss : '%d سیکنڈ', + m : 'ایک منٹ', + mm : '%d منٹ', + h : 'ایک گھنٹہ', + hh : '%d گھنٹے', + d : 'ایک دن', + dd : '%d دن', + M : 'ایک ماہ', + MM : '%d ماہ', + y : 'ایک سال', + yy : '%d سال' }, - dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); }, week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return kk; + return ur; }))); /***/ }), -/* 106 */ +/* 132 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '១', - '2': '២', - '3': '៣', - '4': '៤', - '5': '៥', - '6': '៦', - '7': '៧', - '8': '៨', - '9': '៩', - '0': '០' - }, numberMap = { - '១': '1', - '២': '2', - '៣': '3', - '៤': '4', - '៥': '5', - '៦': '6', - '៧': '7', - '៨': '8', - '៩': '9', - '០': '0' - }; - - var km = moment.defineLocale('km', { - months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( - '_' - ), - monthsShort: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split( - '_' - ), - weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'), - weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), - weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'), - weekdaysParseExact: true, - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd, D MMMM YYYY HH:mm' - }, - meridiemParse: /ព្រឹក|ល្ងាច/, - isPM: function (input) { - return input === 'ល្ងាច'; - }, - meridiem: function (hour, minute, isLower) { - if (hour < 12) { - return 'ព្រឹក'; - } else { - return 'ល្ងាច'; - } - }, - calendar: { - sameDay: '[ថ្ងៃនេះ ម៉ោង] LT', - nextDay: '[ស្អែក ម៉ោង] LT', - nextWeek: 'dddd [ម៉ោង] LT', - lastDay: '[ម្សិលមិញ ម៉ោង] LT', - lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%sទៀត', - past: '%sមុន', - s: 'ប៉ុន្មានវិនាទី', - ss: '%d វិនាទី', - m: 'មួយនាទី', - mm: '%d នាទី', - h: 'មួយម៉ោង', - hh: '%d ម៉ោង', - d: 'មួយថ្ងៃ', - dd: '%d ថ្ងៃ', - M: 'មួយខែ', - MM: '%d ខែ', - y: 'មួយឆ្នាំ', - yy: '%d ឆ្នាំ' + var uz = moment.defineLocale('uz', { + months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), + monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), + weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), + weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), + weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' }, - dayOfMonthOrdinalParse : /ទី\d{1,2}/, - ordinal : 'ទី%d', - preparse: function (string) { - return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) { - return numberMap[match]; - }); + calendar : { + sameDay : '[Бугун соат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни соат] LT [да]', + lastDay : '[Кеча соат] LT [да]', + lastWeek : '[Утган] dddd [куни соат] LT [да]', + sameElse : 'L' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); + relativeTime : { + future : 'Якин %s ичида', + past : 'Бир неча %s олдин', + s : 'фурсат', + ss : '%d фурсат', + m : 'бир дакика', + mm : '%d дакика', + h : 'бир соат', + hh : '%d соат', + d : 'бир кун', + dd : '%d кун', + M : 'бир ой', + MM : '%d ой', + y : 'бир йил', + yy : '%d йил' }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. } }); - return km; + return uz; }))); /***/ }), -/* 107 */ +/* 133 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '೧', - '2': '೨', - '3': '೩', - '4': '೪', - '5': '೫', - '6': '೬', - '7': '೭', - '8': '೮', - '9': '೯', - '0': '೦' - }, - numberMap = { - '೧': '1', - '೨': '2', - '೩': '3', - '೪': '4', - '೫': '5', - '೬': '6', - '೭': '7', - '೮': '8', - '೯': '9', - '೦': '0' - }; - - var kn = moment.defineLocale('kn', { - months : 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split('_'), - monthsShort : 'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split('_'), - monthsParseExact: true, - weekdays : 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split('_'), - weekdaysShort : 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'), - weekdaysMin : 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'), + var uzLatn = moment.defineLocale('uz-latn', { + months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), + monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), + weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), + weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), + weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', + LT : 'HH:mm', + LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'D MMMM YYYY, dddd HH:mm' }, calendar : { - sameDay : '[ಇಂದು] LT', - nextDay : '[ನಾಳೆ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ನಿನ್ನೆ] LT', - lastWeek : '[ಕೊನೆಯ] dddd, LT', + sameDay : '[Bugun soat] LT [da]', + nextDay : '[Ertaga] LT [da]', + nextWeek : 'dddd [kuni soat] LT [da]', + lastDay : '[Kecha soat] LT [da]', + lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', sameElse : 'L' }, relativeTime : { - future : '%s ನಂತರ', - past : '%s ಹಿಂದೆ', - s : 'ಕೆಲವು ಕ್ಷಣಗಳು', - ss : '%d ಸೆಕೆಂಡುಗಳು', - m : 'ಒಂದು ನಿಮಿಷ', - mm : '%d ನಿಮಿಷ', - h : 'ಒಂದು ಗಂಟೆ', - hh : '%d ಗಂಟೆ', - d : 'ಒಂದು ದಿನ', - dd : '%d ದಿನ', - M : 'ಒಂದು ತಿಂಗಳು', - MM : '%d ತಿಂಗಳು', - y : 'ಒಂದು ವರ್ಷ', - yy : '%d ವರ್ಷ' - }, - preparse: function (string) { - return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ರಾತ್ರಿ') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') { - return hour; - } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'ಸಂಜೆ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ರಾತ್ರಿ'; - } else if (hour < 10) { - return 'ಬೆಳಿಗ್ಗೆ'; - } else if (hour < 17) { - return 'ಮಧ್ಯಾಹ್ನ'; - } else if (hour < 20) { - return 'ಸಂಜೆ'; - } else { - return 'ರಾತ್ರಿ'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/, - ordinal : function (number) { - return number + 'ನೇ'; + future : 'Yaqin %s ichida', + past : 'Bir necha %s oldin', + s : 'soniya', + ss : '%d soniya', + m : 'bir daqiqa', + mm : '%d daqiqa', + h : 'bir soat', + hh : '%d soat', + d : 'bir kun', + dd : '%d kun', + M : 'bir oy', + MM : '%d oy', + y : 'bir yil', + yy : '%d yil' }, week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 7th is the first week of the year. } }); - return kn; + return uzLatn; }))); /***/ }), -/* 108 */ +/* 134 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var ko = moment.defineLocale('ko', { - months : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - monthsShort : '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'), - weekdays : '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'), - weekdaysShort : '일_월_화_수_목_금_토'.split('_'), - weekdaysMin : '일_월_화_수_목_금_토'.split('_'), + var vi = moment.defineLocale('vi', { + months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), + monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), + monthsParseExact : true, + weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), + weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), + weekdaysParseExact : true, + meridiemParse: /sa|ch/i, + isPM : function (input) { + return /^ch$/i.test(input); + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 12) { + return isLower ? 'sa' : 'SA'; + } else { + return isLower ? 'ch' : 'CH'; + } + }, longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'YYYY.MM.DD.', - LL : 'YYYY년 MMMM D일', - LLL : 'YYYY년 MMMM D일 A h:mm', - LLLL : 'YYYY년 MMMM D일 dddd A h:mm', - l : 'YYYY.MM.DD.', - ll : 'YYYY년 MMMM D일', - lll : 'YYYY년 MMMM D일 A h:mm', - llll : 'YYYY년 MMMM D일 dddd A h:mm' + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM [năm] YYYY', + LLL : 'D MMMM [năm] YYYY HH:mm', + LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', + l : 'DD/M/YYYY', + ll : 'D MMM YYYY', + lll : 'D MMM YYYY HH:mm', + llll : 'ddd, D MMM YYYY HH:mm' }, calendar : { - sameDay : '오늘 LT', - nextDay : '내일 LT', - nextWeek : 'dddd LT', - lastDay : '어제 LT', - lastWeek : '지난주 dddd LT', - sameElse : 'L' + sameDay: '[Hôm nay lúc] LT', + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tới lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' }, relativeTime : { - future : '%s 후', - past : '%s 전', - s : '몇 초', - ss : '%d초', - m : '1분', - mm : '%d분', - h : '한 시간', - hh : '%d시간', - d : '하루', - dd : '%d일', - M : '한 달', - MM : '%d달', - y : '일 년', - yy : '%d년' - }, - dayOfMonthOrdinalParse : /\d{1,2}(일|월|주)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '일'; - case 'M': - return number + '월'; - case 'w': - case 'W': - return number + '주'; - default: - return number; - } + future : '%s tới', + past : '%s trước', + s : 'vài giây', + ss : '%d giây' , + m : 'một phút', + mm : '%d phút', + h : 'một giờ', + hh : '%d giờ', + d : 'một ngày', + dd : '%d ngày', + M : 'một tháng', + MM : '%d tháng', + y : 'một năm', + yy : '%d năm' }, - meridiemParse : /오전|오후/, - isPM : function (token) { - return token === '오후'; + dayOfMonthOrdinalParse: /\d{1,2}/, + ordinal : function (number) { + return number; }, - meridiem : function (hour, minute, isUpper) { - return hour < 12 ? '오전' : '오후'; + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ko; + return vi; }))); /***/ }), -/* 109 */ +/* 135 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '١', - '2': '٢', - '3': '٣', - '4': '٤', - '5': '٥', - '6': '٦', - '7': '٧', - '8': '٨', - '9': '٩', - '0': '٠' - }, numberMap = { - '١': '1', - '٢': '2', - '٣': '3', - '٤': '4', - '٥': '5', - '٦': '6', - '٧': '7', - '٨': '8', - '٩': '9', - '٠': '0' - }, - months = [ - 'کانونی دووەم', - 'شوبات', - 'ئازار', - 'نیسان', - 'ئایار', - 'حوزەیران', - 'تەمموز', - 'ئاب', - 'ئەیلوول', - 'تشرینی یەكەم', - 'تشرینی دووەم', - 'كانونی یەکەم' - ]; - - - var ku = moment.defineLocale('ku', { - months : months, - monthsShort : months, - weekdays : 'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split('_'), - weekdaysShort : 'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'), - weekdaysMin : 'ی_د_س_چ_پ_ه_ش'.split('_'), + var xPseudo = moment.defineLocale('x-pseudo', { + months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), + monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), + monthsParseExact : true, + weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), + weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), + weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), weekdaysParseExact : true, longDateFormat : { LT : 'HH:mm', - LTS : 'HH:mm:ss', L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', LLL : 'D MMMM YYYY HH:mm', LLLL : 'dddd, D MMMM YYYY HH:mm' }, - meridiemParse: /ئێواره‌|به‌یانی/, - isPM: function (input) { - return /ئێواره‌/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'به‌یانی'; - } else { - return 'ئێواره‌'; - } - }, calendar : { - sameDay : '[ئه‌مرۆ كاتژمێر] LT', - nextDay : '[به‌یانی كاتژمێر] LT', - nextWeek : 'dddd [كاتژمێر] LT', - lastDay : '[دوێنێ كاتژمێر] LT', - lastWeek : 'dddd [كاتژمێر] LT', + sameDay : '[T~ódá~ý át] LT', + nextDay : '[T~ómó~rró~w át] LT', + nextWeek : 'dddd [át] LT', + lastDay : '[Ý~ést~érdá~ý át] LT', + lastWeek : '[L~ást] dddd [át] LT', sameElse : 'L' }, relativeTime : { - future : 'له‌ %s', - past : '%s', - s : 'چه‌ند چركه‌یه‌ك', - ss : 'چركه‌ %d', - m : 'یه‌ك خوله‌ك', - mm : '%d خوله‌ك', - h : 'یه‌ك كاتژمێر', - hh : '%d كاتژمێر', - d : 'یه‌ك ڕۆژ', - dd : '%d ڕۆژ', - M : 'یه‌ك مانگ', - MM : '%d مانگ', - y : 'یه‌ك ساڵ', - yy : '%d ساڵ' - }, - preparse: function (string) { - return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) { - return numberMap[match]; - }).replace(/،/g, ','); + future : 'í~ñ %s', + past : '%s á~gó', + s : 'á ~féw ~sécó~ñds', + ss : '%d s~écóñ~ds', + m : 'á ~míñ~úté', + mm : '%d m~íñú~tés', + h : 'á~ñ hó~úr', + hh : '%d h~óúrs', + d : 'á ~dáý', + dd : '%d d~áýs', + M : 'á ~móñ~th', + MM : '%d m~óñt~hs', + y : 'á ~ýéár', + yy : '%d ý~éárs' }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }).replace(/,/g, '،'); + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (~~(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; }, week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ku; + return xPseudo; }))); /***/ }), -/* 110 */ +/* 136 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var suffixes = { - 0: '-чү', - 1: '-чи', - 2: '-чи', - 3: '-чү', - 4: '-чү', - 5: '-чи', - 6: '-чы', - 7: '-чи', - 8: '-чи', - 9: '-чу', - 10: '-чу', - 20: '-чы', - 30: '-чу', - 40: '-чы', - 50: '-чү', - 60: '-чы', - 70: '-чи', - 80: '-чи', - 90: '-чу', - 100: '-чү' - }; - - var ky = moment.defineLocale('ky', { - months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'), - monthsShort : 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split('_'), - weekdaysShort : 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'), - weekdaysMin : 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', + var yo = moment.defineLocale('yo', { + months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), + monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), + weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), + weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), + weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), + longDateFormat : { + LT : 'h:mm A', + LTS : 'h:mm:ss A', + L : 'DD/MM/YYYY', LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' + LLL : 'D MMMM YYYY h:mm A', + LLLL : 'dddd, D MMMM YYYY h:mm A' }, calendar : { - sameDay : '[Бүгүн саат] LT', - nextDay : '[Эртең саат] LT', - nextWeek : 'dddd [саат] LT', - lastDay : '[Кечээ саат] LT', - lastWeek : '[Өткөн аптанын] dddd [күнү] [саат] LT', + sameDay : '[Ònì ni] LT', + nextDay : '[Ọ̀la ni] LT', + nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', + lastDay : '[Àna ni] LT', + lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', sameElse : 'L' }, relativeTime : { - future : '%s ичинде', - past : '%s мурун', - s : 'бирнече секунд', - ss : '%d секунд', - m : 'бир мүнөт', - mm : '%d мүнөт', - h : 'бир саат', - hh : '%d саат', - d : 'бир күн', - dd : '%d күн', - M : 'бир ай', - MM : '%d ай', - y : 'бир жыл', - yy : '%d жыл' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/, - ordinal : function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); + future : 'ní %s', + past : '%s kọjá', + s : 'ìsẹjú aayá die', + ss :'aayá %d', + m : 'ìsẹjú kan', + mm : 'ìsẹjú %d', + h : 'wákati kan', + hh : 'wákati %d', + d : 'ọjọ́ kan', + dd : 'ọjọ́ %d', + M : 'osù kan', + MM : 'osù %d', + y : 'ọdún kan', + yy : 'ọdún %d' }, + dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, + ordinal : 'ọjọ́ %d', week : { dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return ky; + return yo; }))); /***/ }), -/* 111 */ +/* 137 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 'm': ['eng Minutt', 'enger Minutt'], - 'h': ['eng Stonn', 'enger Stonn'], - 'd': ['een Dag', 'engem Dag'], - 'M': ['ee Mount', 'engem Mount'], - 'y': ['ee Joer', 'engem Joer'] - }; - return withoutSuffix ? format[key][0] : format[key][1]; - } - function processFutureTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'a ' + string; - } - return 'an ' + string; - } - function processPastTime(string) { - var number = string.substr(0, string.indexOf(' ')); - if (eifelerRegelAppliesToNumber(number)) { - return 'viru ' + string; - } - return 'virun ' + string; - } - /** - * Returns true if the word before the given number loses the '-n' ending. - * e.g. 'an 10 Deeg' but 'a 5 Deeg' - * - * @param number {integer} - * @returns {boolean} - */ - function eifelerRegelAppliesToNumber(number) { - number = parseInt(number, 10); - if (isNaN(number)) { - return false; - } - if (number < 0) { - // Negative Number --> always true - return true; - } else if (number < 10) { - // Only 1 digit - if (4 <= number && number <= 7) { - return true; + var zhCn = moment.defineLocale('zh-cn', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日Ah点mm分', + LLLL : 'YYYY年M月D日ddddAh点mm分', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour: function (hour, meridiem) { + if (hour === 12) { + hour = 0; } - return false; - } else if (number < 100) { - // 2 digits - var lastDigit = number % 10, firstDigit = number / 10; - if (lastDigit === 0) { - return eifelerRegelAppliesToNumber(firstDigit); + if (meridiem === '凌晨' || meridiem === '早上' || + meridiem === '上午') { + return hour; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } else { + // '中午' + return hour >= 11 ? hour : hour + 12; } - return eifelerRegelAppliesToNumber(lastDigit); - } else if (number < 10000) { - // 3 or 4 digits --> recursively check first digit - while (number >= 10) { - number = number / 10; + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; } - return eifelerRegelAppliesToNumber(number); - } else { - // Anything larger than 4 digits: recursively check first n-3 digits - number = number / 1000; - return eifelerRegelAppliesToNumber(number); - } - } - - var lb = moment.defineLocale('lb', { - months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'), - monthsShort: 'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'), - monthsParseExact : true, - weekdays: 'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split('_'), - weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'), - weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm [Auer]', - LTS: 'H:mm:ss [Auer]', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm [Auer]', - LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]' }, - calendar: { - sameDay: '[Haut um] LT', - sameElse: 'L', - nextDay: '[Muer um] LT', - nextWeek: 'dddd [um] LT', - lastDay: '[Gëschter um] LT', - lastWeek: function () { - // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule - switch (this.day()) { - case 2: - case 4: - return '[Leschten] dddd [um] LT'; - default: - return '[Leschte] dddd [um] LT'; - } + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, + ordinal : function (number, period) { + switch (period) { + case 'd': + case 'D': + case 'DDD': + return number + '日'; + case 'M': + return number + '月'; + case 'w': + case 'W': + return number + '周'; + default: + return number; } }, relativeTime : { - future : processFutureTime, - past : processPastTime, - s : 'e puer Sekonnen', - ss : '%d Sekonnen', - m : processRelativeTime, - mm : '%d Minutten', - h : processRelativeTime, - hh : '%d Stonnen', - d : processRelativeTime, - dd : '%d Deeg', - M : processRelativeTime, - MM : '%d Méint', - y : processRelativeTime, - yy : '%d Joer' + future : '%s内', + past : '%s前', + s : '几秒', + ss : '%d 秒', + m : '1 分钟', + mm : '%d 分钟', + h : '1 小时', + hh : '%d 小时', + d : '1 天', + dd : '%d 天', + M : '1 个月', + MM : '%d 个月', + y : '1 年', + yy : '%d 年' }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal: '%d.', - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. + week : { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. } }); - return lb; + return zhCn; }))); /***/ }), -/* 112 */ +/* 138 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var lo = moment.defineLocale('lo', { - months : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - monthsShort : 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split('_'), - weekdays : 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysShort : 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'), - weekdaysMin : 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'), - weekdaysParseExact : true, + var zhHk = moment.defineLocale('zh-hk', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'ວັນdddd D MMMM YYYY HH:mm' + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' }, - meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/, - isPM: function (input) { - return input === 'ຕອນແລງ'; + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } }, meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ຕອນເຊົ້າ'; + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; } else { - return 'ຕອນແລງ'; + return '晚上'; } }, calendar : { - sameDay : '[ມື້ນີ້ເວລາ] LT', - nextDay : '[ມື້ອື່ນເວລາ] LT', - nextWeek : '[ວັນ]dddd[ໜ້າເວລາ] LT', - lastDay : '[ມື້ວານນີ້ເວລາ] LT', - lastWeek : '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', sameElse : 'L' }, - relativeTime : { - future : 'ອີກ %s', - past : '%sຜ່ານມາ', - s : 'ບໍ່ເທົ່າໃດວິນາທີ', - ss : '%d ວິນາທີ' , - m : '1 ນາທີ', - mm : '%d ນາທີ', - h : '1 ຊົ່ວໂມງ', - hh : '%d ຊົ່ວໂມງ', - d : '1 ມື້', - dd : '%d ມື້', - M : '1 ເດືອນ', - MM : '%d ເດືອນ', - y : '1 ປີ', - yy : '%d ປີ' + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } }, - dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/, - ordinal : function (number) { - return 'ທີ່' + number; + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' } }); - return lo; + return zhHk; }))); /***/ }), -/* 113 */ +/* 139 */ /***/ (function(module, exports, __webpack_require__) { //! moment.js locale configuration ;(function (global, factory) { - true ? factory(__webpack_require__(40)) : + true ? factory(__webpack_require__(10)) : undefined }(this, (function (moment) { 'use strict'; - var units = { - 'ss' : 'sekundė_sekundžių_sekundes', - 'm' : 'minutė_minutės_minutę', - 'mm': 'minutės_minučių_minutes', - 'h' : 'valanda_valandos_valandą', - 'hh': 'valandos_valandų_valandas', - 'd' : 'diena_dienos_dieną', - 'dd': 'dienos_dienų_dienas', - 'M' : 'mėnuo_mėnesio_mėnesį', - 'MM': 'mėnesiai_mėnesių_mėnesius', - 'y' : 'metai_metų_metus', - 'yy': 'metai_metų_metus' - }; - function translateSeconds(number, withoutSuffix, key, isFuture) { - if (withoutSuffix) { - return 'kelios sekundės'; - } else { - return isFuture ? 'kelių sekundžių' : 'kelias sekundes'; - } - } - function translateSingular(number, withoutSuffix, key, isFuture) { - return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); - } - function special(number) { - return number % 10 === 0 || (number > 10 && number < 20); - } - function forms(key) { - return units[key].split('_'); - } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - if (number === 1) { - return result + translateSingular(number, withoutSuffix, key[0], isFuture); - } else if (withoutSuffix) { - return result + (special(number) ? forms(key)[1] : forms(key)[0]); - } else { - if (isFuture) { - return result + forms(key)[1]; - } else { - return result + (special(number) ? forms(key)[1] : forms(key)[2]); - } - } - } - var lt = moment.defineLocale('lt', { - months : { - format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'), - standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'), - isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/ - }, - monthsShort : 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'), - weekdays : { - format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split('_'), - standalone: 'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split('_'), - isFormat: /dddd HH:mm/ - }, - weekdaysShort : 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'), - weekdaysMin : 'S_P_A_T_K_Pn_Š'.split('_'), - weekdaysParseExact : true, + var zhTw = moment.defineLocale('zh-tw', { + months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), + monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), + weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), + weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), + weekdaysMin : '日_一_二_三_四_五_六'.split('_'), longDateFormat : { LT : 'HH:mm', LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY [m.] MMMM D [d.]', - LLL : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - LLLL : 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]', - l : 'YYYY-MM-DD', - ll : 'YYYY [m.] MMMM D [d.]', - lll : 'YYYY [m.] MMMM D [d.], HH:mm [val.]', - llll : 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]' + L : 'YYYY/MM/DD', + LL : 'YYYY年M月D日', + LLL : 'YYYY年M月D日 HH:mm', + LLLL : 'YYYY年M月D日dddd HH:mm', + l : 'YYYY/M/D', + ll : 'YYYY年M月D日', + lll : 'YYYY年M月D日 HH:mm', + llll : 'YYYY年M月D日dddd HH:mm' + }, + meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, + meridiemHour : function (hour, meridiem) { + if (hour === 12) { + hour = 0; + } + if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { + return hour; + } else if (meridiem === '中午') { + return hour >= 11 ? hour : hour + 12; + } else if (meridiem === '下午' || meridiem === '晚上') { + return hour + 12; + } + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return '凌晨'; + } else if (hm < 900) { + return '早上'; + } else if (hm < 1130) { + return '上午'; + } else if (hm < 1230) { + return '中午'; + } else if (hm < 1800) { + return '下午'; + } else { + return '晚上'; + } }, calendar : { - sameDay : '[Šiandien] LT', - nextDay : '[Rytoj] LT', - nextWeek : 'dddd LT', - lastDay : '[Vakar] LT', - lastWeek : '[Praėjusį] dddd LT', + sameDay : '[今天] LT', + nextDay : '[明天] LT', + nextWeek : '[下]dddd LT', + lastDay : '[昨天] LT', + lastWeek : '[上]dddd LT', sameElse : 'L' }, - relativeTime : { - future : 'po %s', - past : 'prieš %s', - s : translateSeconds, - ss : translate, - m : translateSingular, - mm : translate, - h : translateSingular, - hh : translate, - d : translateSingular, - dd : translate, - M : translateSingular, - MM : translate, - y : translateSingular, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}-oji/, - ordinal : function (number) { - return number + '-oji'; + dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, + ordinal : function (number, period) { + switch (period) { + case 'd' : + case 'D' : + case 'DDD' : + return number + '日'; + case 'M' : + return number + '月'; + case 'w' : + case 'W' : + return number + '週'; + default : + return number; + } }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + relativeTime : { + future : '%s內', + past : '%s前', + s : '幾秒', + ss : '%d 秒', + m : '1 分鐘', + mm : '%d 分鐘', + h : '1 小時', + hh : '%d 小時', + d : '1 天', + dd : '%d 天', + M : '1 個月', + MM : '%d 個月', + y : '1 年', + yy : '%d 年' } }); - return lt; + return zhTw; }))); /***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { +/* 140 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _internal_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return _internal_Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(157); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__["ConnectableObservable"]; }); +/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(162); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__["GroupedObservable"]; }); - var units = { - 'ss': 'sekundes_sekundēm_sekunde_sekundes'.split('_'), - 'm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'mm': 'minūtes_minūtēm_minūte_minūtes'.split('_'), - 'h': 'stundas_stundām_stunda_stundas'.split('_'), - 'hh': 'stundas_stundām_stunda_stundas'.split('_'), - 'd': 'dienas_dienām_diena_dienas'.split('_'), - 'dd': 'dienas_dienām_diena_dienas'.split('_'), - 'M': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'MM': 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'), - 'y': 'gada_gadiem_gads_gadi'.split('_'), - 'yy': 'gada_gadiem_gads_gadi'.split('_') - }; - /** - * @param withoutSuffix boolean true = a length of time; false = before/after a period of time. - */ - function format(forms, number, withoutSuffix) { - if (withoutSuffix) { - // E.g. "21 minūte", "3 minūtes". - return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3]; - } else { - // E.g. "21 minūtes" as in "pēc 21 minūtes". - // E.g. "3 minūtēm" as in "pēc 3 minūtēm". - return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1]; - } - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - return number + ' ' + format(units[key], number, withoutSuffix); - } - function relativeTimeWithSingular(number, withoutSuffix, key) { - return format(units[key], number, withoutSuffix); - } - function relativeSeconds(number, withoutSuffix) { - return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm'; - } +/* harmony import */ var _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(154); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__["observable"]; }); - var lv = moment.defineLocale('lv', { - months : 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split('_'), - weekdaysShort : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysMin : 'Sv_P_O_T_C_Pk_S'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY.', - LL : 'YYYY. [gada] D. MMMM', - LLL : 'YYYY. [gada] D. MMMM, HH:mm', - LLLL : 'YYYY. [gada] D. MMMM, dddd, HH:mm' - }, - calendar : { - sameDay : '[Šodien pulksten] LT', - nextDay : '[Rīt pulksten] LT', - nextWeek : 'dddd [pulksten] LT', - lastDay : '[Vakar pulksten] LT', - lastWeek : '[Pagājušā] dddd [pulksten] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'pēc %s', - past : 'pirms %s', - s : relativeSeconds, - ss : relativeTimeWithPlural, - m : relativeTimeWithSingular, - mm : relativeTimeWithPlural, - h : relativeTimeWithSingular, - hh : relativeTimeWithPlural, - d : relativeTimeWithSingular, - dd : relativeTimeWithPlural, - M : relativeTimeWithSingular, - MM : relativeTimeWithPlural, - y : relativeTimeWithSingular, - yy : relativeTimeWithPlural - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +/* harmony import */ var _internal_Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(158); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _internal_Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]; }); - return lv; +/* harmony import */ var _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(163); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__["BehaviorSubject"]; }); -}))); +/* harmony import */ var _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(164); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__["ReplaySubject"]; }); +/* harmony import */ var _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(181); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__["AsyncSubject"]; }); -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(182); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__["asap"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(186); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asyncScheduler", function() { return _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__["async"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(165); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "queueScheduler", function() { return _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__["queue"]; }); +/* harmony import */ var _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(187); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "animationFrameScheduler", function() { return _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__["animationFrame"]; }); - var translator = { - words: { //Different grammatical cases - ss: ['sekund', 'sekunda', 'sekundi'], - m: ['jedan minut', 'jednog minuta'], - mm: ['minut', 'minuta', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mjesec', 'mjeseca', 'mjeseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } - } - }; +/* harmony import */ var _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(190); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualTimeScheduler"]; }); - var me = moment.defineLocale('me', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact : true, - weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sjutra u] LT', +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualAction"]; }); - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedjelju] [u] LT'; - case 3: - return '[u] [srijedu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedjelje] [u] LT', - '[prošlog] [ponedjeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srijede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'prije %s', - s : 'nekoliko sekundi', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mjesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); +/* harmony import */ var _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(171); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__["Scheduler"]; }); - return me; +/* harmony import */ var _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(148); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__["Subscription"]; }); -}))); +/* harmony import */ var _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(143); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__["Subscriber"]; }); +/* harmony import */ var _internal_Notification__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(173); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["Notification"]; }); -/***/ }), -/* 116 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["NotificationKind"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(155); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__["pipe"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(156); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__["noop"]; }); +/* harmony import */ var _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(191); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__["identity"]; }); - var mi = moment.defineLocale('mi', { - months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split('_'), - monthsShort: 'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split('_'), - monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i, - monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i, - weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'), - weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY [i] HH:mm', - LLLL: 'dddd, D MMMM YYYY [i] HH:mm' - }, - calendar: { - sameDay: '[i teie mahana, i] LT', - nextDay: '[apopo i] LT', - nextWeek: 'dddd [i] LT', - lastDay: '[inanahi i] LT', - lastWeek: 'dddd [whakamutunga i] LT', - sameElse: 'L' - }, - relativeTime: { - future: 'i roto i %s', - past: '%s i mua', - s: 'te hēkona ruarua', - ss: '%d hēkona', - m: 'he meneti', - mm: '%d meneti', - h: 'te haora', - hh: '%d haora', - d: 'he ra', - dd: '%d ra', - M: 'he marama', - MM: '%d marama', - y: 'he tau', - yy: '%d tau' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +/* harmony import */ var _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(192); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__["isObservable"]; }); - return mi; +/* harmony import */ var _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(193); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__["ArgumentOutOfRangeError"]; }); -}))); +/* harmony import */ var _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(194); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__["EmptyError"]; }); +/* harmony import */ var _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(159); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__["ObjectUnsubscribedError"]; }); -/***/ }), -/* 117 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(151); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__["UnsubscriptionError"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(195); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__["TimeoutError"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(196); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__["bindCallback"]; }); +/* harmony import */ var _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(198); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__["bindNodeCallback"]; }); - var mk = moment.defineLocale('mk', { - months : 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split('_'), - monthsShort : 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'), - weekdays : 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split('_'), - weekdaysShort : 'нед_пон_вто_сре_чет_пет_саб'.split('_'), - weekdaysMin : 'нe_пo_вт_ср_че_пе_сa'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'D.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[Денес во] LT', - nextDay : '[Утре во] LT', - nextWeek : '[Во] dddd [во] LT', - lastDay : '[Вчера во] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - case 3: - case 6: - return '[Изминатата] dddd [во] LT'; - case 1: - case 2: - case 4: - case 5: - return '[Изминатиот] dddd [во] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'после %s', - past : 'пред %s', - s : 'неколку секунди', - ss : '%d секунди', - m : 'минута', - mm : '%d минути', - h : 'час', - hh : '%d часа', - d : 'ден', - dd : '%d дена', - M : 'месец', - MM : '%d месеци', - y : 'година', - yy : '%d години' - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/, - ordinal : function (number) { - var lastDigit = number % 10, - last2Digits = number % 100; - if (number === 0) { - return number + '-ев'; - } else if (last2Digits === 0) { - return number + '-ен'; - } else if (last2Digits > 10 && last2Digits < 20) { - return number + '-ти'; - } else if (lastDigit === 1) { - return number + '-ви'; - } else if (lastDigit === 2) { - return number + '-ри'; - } else if (lastDigit === 7 || lastDigit === 8) { - return number + '-ми'; - } else { - return number + '-ти'; - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); +/* harmony import */ var _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(199); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__["combineLatest"]; }); - return mk; +/* harmony import */ var _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(210); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__["concat"]; }); -}))); +/* harmony import */ var _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(221); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__["defer"]; }); +/* harmony import */ var _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(174); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["empty"]; }); -/***/ }), -/* 118 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(222); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__["forkJoin"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(214); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "from", function() { return _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__["from"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(223); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__["fromEvent"]; }); +/* harmony import */ var _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(224); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__["fromEventPattern"]; }); - var ml = moment.defineLocale('ml', { - months : 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split('_'), - monthsShort : 'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split('_'), - monthsParseExact : true, - weekdays : 'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split('_'), - weekdaysShort : 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'), - weekdaysMin : 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'), - longDateFormat : { - LT : 'A h:mm -നു', - LTS : 'A h:mm:ss -നു', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm -നു', - LLLL : 'dddd, D MMMM YYYY, A h:mm -നു' - }, - calendar : { - sameDay : '[ഇന്ന്] LT', - nextDay : '[നാളെ] LT', - nextWeek : 'dddd, LT', - lastDay : '[ഇന്നലെ] LT', - lastWeek : '[കഴിഞ്ഞ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s കഴിഞ്ഞ്', - past : '%s മുൻപ്', - s : 'അൽപ നിമിഷങ്ങൾ', - ss : '%d സെക്കൻഡ്', - m : 'ഒരു മിനിറ്റ്', - mm : '%d മിനിറ്റ്', - h : 'ഒരു മണിക്കൂർ', - hh : '%d മണിക്കൂർ', - d : 'ഒരു ദിവസം', - dd : '%d ദിവസം', - M : 'ഒരു മാസം', - MM : '%d മാസം', - y : 'ഒരു വർഷം', - yy : '%d വർഷം' - }, - meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if ((meridiem === 'രാത്രി' && hour >= 4) || - meridiem === 'ഉച്ച കഴിഞ്ഞ്' || - meridiem === 'വൈകുന്നേരം') { - return hour + 12; - } else { - return hour; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'രാത്രി'; - } else if (hour < 12) { - return 'രാവിലെ'; - } else if (hour < 17) { - return 'ഉച്ച കഴിഞ്ഞ്'; - } else if (hour < 20) { - return 'വൈകുന്നേരം'; - } else { - return 'രാത്രി'; - } - } - }); +/* harmony import */ var _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(225); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__["generate"]; }); - return ml; +/* harmony import */ var _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(226); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__["iif"]; }); -}))); +/* harmony import */ var _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(227); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__["interval"]; }); +/* harmony import */ var _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(229); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__["merge"]; }); -/***/ }), -/* 119 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(230); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "never", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["never"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(175); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "of", function() { return _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__["of"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(231); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__["onErrorResumeNext"]; }); +/* harmony import */ var _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(232); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__["pairs"]; }); - function translate(number, withoutSuffix, key, isFuture) { - switch (key) { - case 's': - return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын'; - case 'ss': - return number + (withoutSuffix ? ' секунд' : ' секундын'); - case 'm': - case 'mm': - return number + (withoutSuffix ? ' минут' : ' минутын'); - case 'h': - case 'hh': - return number + (withoutSuffix ? ' цаг' : ' цагийн'); - case 'd': - case 'dd': - return number + (withoutSuffix ? ' өдөр' : ' өдрийн'); - case 'M': - case 'MM': - return number + (withoutSuffix ? ' сар' : ' сарын'); - case 'y': - case 'yy': - return number + (withoutSuffix ? ' жил' : ' жилийн'); - default: - return number; - } - } +/* harmony import */ var _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(233); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__["partition"]; }); - var mn = moment.defineLocale('mn', { - months : 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split('_'), - monthsShort : '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split('_'), - monthsParseExact : true, - weekdays : 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'), - weekdaysShort : 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'), - weekdaysMin : 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'YYYY оны MMMMын D', - LLL : 'YYYY оны MMMMын D HH:mm', - LLLL : 'dddd, YYYY оны MMMMын D HH:mm' - }, - meridiemParse: /ҮӨ|ҮХ/i, - isPM : function (input) { - return input === 'ҮХ'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ҮӨ'; - } else { - return 'ҮХ'; - } - }, - calendar : { - sameDay : '[Өнөөдөр] LT', - nextDay : '[Маргааш] LT', - nextWeek : '[Ирэх] dddd LT', - lastDay : '[Өчигдөр] LT', - lastWeek : '[Өнгөрсөн] dddd LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s дараа', - past : '%s өмнө', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2} өдөр/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + ' өдөр'; - default: - return number; - } - } - }); +/* harmony import */ var _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(236); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__["race"]; }); - return mn; +/* harmony import */ var _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(237); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__["range"]; }); -}))); +/* harmony import */ var _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(180); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__["throwError"]; }); +/* harmony import */ var _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(238); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__["timer"]; }); -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { +/* harmony import */ var _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(239); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "using", function() { return _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__["using"]; }); -//! moment.js locale configuration +/* harmony import */ var _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(240); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__["zip"]; }); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* harmony import */ var _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(215); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__["scheduled"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["EMPTY"]; }); - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["NEVER"]; }); - function relativeTimeMr(number, withoutSuffix, string, isFuture) - { - var output = ''; - if (withoutSuffix) { - switch (string) { - case 's': output = 'काही सेकंद'; break; - case 'ss': output = '%d सेकंद'; break; - case 'm': output = 'एक मिनिट'; break; - case 'mm': output = '%d मिनिटे'; break; - case 'h': output = 'एक तास'; break; - case 'hh': output = '%d तास'; break; - case 'd': output = 'एक दिवस'; break; - case 'dd': output = '%d दिवस'; break; - case 'M': output = 'एक महिना'; break; - case 'MM': output = '%d महिने'; break; - case 'y': output = 'एक वर्ष'; break; - case 'yy': output = '%d वर्षे'; break; - } - } - else { - switch (string) { - case 's': output = 'काही सेकंदां'; break; - case 'ss': output = '%d सेकंदां'; break; - case 'm': output = 'एका मिनिटा'; break; - case 'mm': output = '%d मिनिटां'; break; - case 'h': output = 'एका तासा'; break; - case 'hh': output = '%d तासां'; break; - case 'd': output = 'एका दिवसा'; break; - case 'dd': output = '%d दिवसां'; break; - case 'M': output = 'एका महिन्या'; break; - case 'MM': output = '%d महिन्यां'; break; - case 'y': output = 'एका वर्षा'; break; - case 'yy': output = '%d वर्षां'; break; - } - } - return output.replace(/%d/i, number); - } +/* harmony import */ var _internal_config__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(146); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "config", function() { return _internal_config__WEBPACK_IMPORTED_MODULE_52__["config"]; }); - var mr = moment.defineLocale('mr', { - months : 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split('_'), - monthsShort: 'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split('_'), - monthsParseExact : true, - weekdays : 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'), - weekdaysShort : 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'), - weekdaysMin : 'र_सो_मं_बु_गु_शु_श'.split('_'), - longDateFormat : { - LT : 'A h:mm वाजता', - LTS : 'A h:mm:ss वाजता', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm वाजता', - LLLL : 'dddd, D MMMM YYYY, A h:mm वाजता' - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[उद्या] LT', - nextWeek : 'dddd, LT', - lastDay : '[काल] LT', - lastWeek: '[मागील] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future: '%sमध्ये', - past: '%sपूर्वी', - s: relativeTimeMr, - ss: relativeTimeMr, - m: relativeTimeMr, - mm: relativeTimeMr, - h: relativeTimeMr, - hh: relativeTimeMr, - d: relativeTimeMr, - dd: relativeTimeMr, - M: relativeTimeMr, - MM: relativeTimeMr, - y: relativeTimeMr, - yy: relativeTimeMr - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /रात्री|सकाळी|दुपारी|सायंकाळी/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'रात्री') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'सकाळी') { - return hour; - } else if (meridiem === 'दुपारी') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'सायंकाळी') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'रात्री'; - } else if (hour < 10) { - return 'सकाळी'; - } else if (hour < 17) { - return 'दुपारी'; - } else if (hour < 20) { - return 'सायंकाळी'; - } else { - return 'रात्री'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - } - }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ - return mr; -}))); -/***/ }), -/* 121 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var ms = moment.defineLocale('ms', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - ss : '%d saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return ms; -}))); -/***/ }), -/* 122 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var msMy = moment.defineLocale('ms-my', { - months : 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'), - weekdays : 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'), - weekdaysShort : 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'), - weekdaysMin : 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [pukul] HH.mm', - LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm' - }, - meridiemParse: /pagi|tengahari|petang|malam/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'pagi') { - return hour; - } else if (meridiem === 'tengahari') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'petang' || meridiem === 'malam') { - return hour + 12; - } - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'pagi'; - } else if (hours < 15) { - return 'tengahari'; - } else if (hours < 19) { - return 'petang'; - } else { - return 'malam'; - } - }, - calendar : { - sameDay : '[Hari ini pukul] LT', - nextDay : '[Esok pukul] LT', - nextWeek : 'dddd [pukul] LT', - lastDay : '[Kelmarin pukul] LT', - lastWeek : 'dddd [lepas pukul] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'dalam %s', - past : '%s yang lepas', - s : 'beberapa saat', - ss : '%d saat', - m : 'seminit', - mm : '%d minit', - h : 'sejam', - hh : '%d jam', - d : 'sehari', - dd : '%d hari', - M : 'sebulan', - MM : '%d bulan', - y : 'setahun', - yy : '%d tahun' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return msMy; -}))); -/***/ }), -/* 123 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var mt = moment.defineLocale('mt', { - months : 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split('_'), - monthsShort : 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'), - weekdays : 'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split('_'), - weekdaysShort : 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'), - weekdaysMin : 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Illum fil-]LT', - nextDay : '[Għada fil-]LT', - nextWeek : 'dddd [fil-]LT', - lastDay : '[Il-bieraħ fil-]LT', - lastWeek : 'dddd [li għadda] [fil-]LT', - sameElse : 'L' - }, - relativeTime : { - future : 'f’ %s', - past : '%s ilu', - s : 'ftit sekondi', - ss : '%d sekondi', - m : 'minuta', - mm : '%d minuti', - h : 'siegħa', - hh : '%d siegħat', - d : 'ġurnata', - dd : '%d ġranet', - M : 'xahar', - MM : '%d xhur', - y : 'sena', - yy : '%d sni' - }, - dayOfMonthOrdinalParse : /\d{1,2}º/, - ordinal: '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - return mt; -}))); -/***/ }), -/* 124 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '၁', - '2': '၂', - '3': '၃', - '4': '၄', - '5': '၅', - '6': '၆', - '7': '၇', - '8': '၈', - '9': '၉', - '0': '၀' - }, numberMap = { - '၁': '1', - '၂': '2', - '၃': '3', - '၄': '4', - '၅': '5', - '၆': '6', - '၇': '7', - '၈': '8', - '၉': '9', - '၀': '0' - }; - var my = moment.defineLocale('my', { - months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split('_'), - monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'), - weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split('_'), - weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'DD/MM/YYYY', - LL: 'D MMMM YYYY', - LLL: 'D MMMM YYYY HH:mm', - LLLL: 'dddd D MMMM YYYY HH:mm' - }, - calendar: { - sameDay: '[ယနေ.] LT [မှာ]', - nextDay: '[မနက်ဖြန်] LT [မှာ]', - nextWeek: 'dddd LT [မှာ]', - lastDay: '[မနေ.က] LT [မှာ]', - lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]', - sameElse: 'L' - }, - relativeTime: { - future: 'လာမည့် %s မှာ', - past: 'လွန်ခဲ့သော %s က', - s: 'စက္ကန်.အနည်းငယ်', - ss : '%d စက္ကန့်', - m: 'တစ်မိနစ်', - mm: '%d မိနစ်', - h: 'တစ်နာရီ', - hh: '%d နာရီ', - d: 'တစ်ရက်', - dd: '%d ရက်', - M: 'တစ်လ', - MM: '%d လ', - y: 'တစ်နှစ်', - yy: '%d နှစ်' - }, - preparse: function (string) { - return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - week: { - dow: 1, // Monday is the first day of the week. - doy: 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return my; -}))); -/***/ }), -/* 125 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var nb = moment.defineLocale('nb', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.'.split('_'), - monthsParseExact : true, - weekdays : 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'), - weekdaysShort : 'sø._ma._ti._on._to._fr._lø.'.split('_'), - weekdaysMin : 'sø_ma_ti_on_to_fr_lø'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[i dag kl.] LT', - nextDay: '[i morgen kl.] LT', - nextWeek: 'dddd [kl.] LT', - lastDay: '[i går kl.] LT', - lastWeek: '[forrige] dddd [kl.] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s siden', - s : 'noen sekunder', - ss : '%d sekunder', - m : 'ett minutt', - mm : '%d minutter', - h : 'en time', - hh : '%d timer', - d : 'en dag', - dd : '%d dager', - M : 'en måned', - MM : '%d måneder', - y : 'ett år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - return nb; -}))); -/***/ }), -/* 126 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var symbolMap = { - '1': '१', - '2': '२', - '3': '३', - '4': '४', - '5': '५', - '6': '६', - '7': '७', - '8': '८', - '9': '९', - '0': '०' - }, - numberMap = { - '१': '1', - '२': '2', - '३': '3', - '४': '4', - '५': '5', - '६': '6', - '७': '7', - '८': '8', - '९': '9', - '०': '0' - }; - var ne = moment.defineLocale('ne', { - months : 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split('_'), - monthsShort : 'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split('_'), - monthsParseExact : true, - weekdays : 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split('_'), - weekdaysShort : 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'), - weekdaysMin : 'आ._सो._मं._बु._बि._शु._श.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'Aको h:mm बजे', - LTS : 'Aको h:mm:ss बजे', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, Aको h:mm बजे', - LLLL : 'dddd, D MMMM YYYY, Aको h:mm बजे' - }, - preparse: function (string) { - return string.replace(/[१२३४५६७८९०]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - meridiemParse: /राति|बिहान|दिउँसो|साँझ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'राति') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'बिहान') { - return hour; - } else if (meridiem === 'दिउँसो') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'साँझ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 3) { - return 'राति'; - } else if (hour < 12) { - return 'बिहान'; - } else if (hour < 16) { - return 'दिउँसो'; - } else if (hour < 20) { - return 'साँझ'; - } else { - return 'राति'; - } - }, - calendar : { - sameDay : '[आज] LT', - nextDay : '[भोलि] LT', - nextWeek : '[आउँदो] dddd[,] LT', - lastDay : '[हिजो] LT', - lastWeek : '[गएको] dddd[,] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%sमा', - past : '%s अगाडि', - s : 'केही क्षण', - ss : '%d सेकेण्ड', - m : 'एक मिनेट', - mm : '%d मिनेट', - h : 'एक घण्टा', - hh : '%d घण्टा', - d : 'एक दिन', - dd : '%d दिन', - M : 'एक महिना', - MM : '%d महिना', - y : 'एक बर्ष', - yy : '%d बर्ष' - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - } - }); - return ne; -}))); -/***/ }), -/* 127 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration +//# sourceMappingURL=index.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 141 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return Observable; }); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(142); +/* harmony import */ var _util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(153); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154); +/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(155); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(146); +/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ - var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; - var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; - var nl = moment.defineLocale('nl', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD-MM-YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - ss : '%d seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +var Observable = /*@__PURE__*/ (function () { + function Observable(subscribe) { + this._isScalar = false; + if (subscribe) { + this._subscribe = subscribe; } - }); - - return nl; + } + Observable.prototype.lift = function (operator) { + var observable = new Observable(); + observable.source = this; + observable.operator = operator; + return observable; + }; + Observable.prototype.subscribe = function (observerOrNext, error, complete) { + var operator = this.operator; + var sink = Object(_util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__["toSubscriber"])(observerOrNext, error, complete); + if (operator) { + sink.add(operator.call(sink, this.source)); + } + else { + sink.add(this.source || (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? + this._subscribe(sink) : + this._trySubscribe(sink)); + } + if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { + if (sink.syncErrorThrowable) { + sink.syncErrorThrowable = false; + if (sink.syncErrorThrown) { + throw sink.syncErrorValue; + } + } + } + return sink; + }; + Observable.prototype._trySubscribe = function (sink) { + try { + return this._subscribe(sink); + } + catch (err) { + if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; + } + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_0__["canReportError"])(sink)) { + sink.error(err); + } + else { + console.warn(err); + } + } + }; + Observable.prototype.forEach = function (next, promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var subscription; + subscription = _this.subscribe(function (value) { + try { + next(value); + } + catch (err) { + reject(err); + if (subscription) { + subscription.unsubscribe(); + } + } + }, reject, resolve); + }); + }; + Observable.prototype._subscribe = function (subscriber) { + var source = this.source; + return source && source.subscribe(subscriber); + }; + Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () { + return this; + }; + Observable.prototype.pipe = function () { + var operations = []; + for (var _i = 0; _i < arguments.length; _i++) { + operations[_i] = arguments[_i]; + } + if (operations.length === 0) { + return this; + } + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipeFromArray"])(operations)(this); + }; + Observable.prototype.toPromise = function (promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var value; + _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); + }); + }; + Observable.create = function (subscribe) { + return new Observable(subscribe); + }; + return Observable; +}()); -}))); +function getPromiseCtor(promiseCtor) { + if (!promiseCtor) { + promiseCtor = _config__WEBPACK_IMPORTED_MODULE_4__["config"].Promise || Promise; + } + if (!promiseCtor) { + throw new Error('no Promise impl found'); + } + return promiseCtor; +} +//# sourceMappingURL=Observable.js.map /***/ }), -/* 128 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - +/* 142 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var monthsShortWithDots = 'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'), - monthsShortWithoutDots = 'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canReportError", function() { return canReportError; }); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(143); +/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */ - var monthsParse = [/^jan/i, /^feb/i, /^maart|mrt.?$/i, /^apr/i, /^mei$/i, /^jun[i.]?$/i, /^jul[i.]?$/i, /^aug/i, /^sep/i, /^okt/i, /^nov/i, /^dec/i]; - var monthsRegex = /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i; +function canReportError(observer) { + while (observer) { + var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped; + if (closed_1 || isStopped) { + return false; + } + else if (destination && destination instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { + observer = destination; + } + else { + observer = null; + } + } + return true; +} +//# sourceMappingURL=canReportError.js.map - var nlBe = moment.defineLocale('nl-be', { - months : 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split('_'), - monthsShort : function (m, format) { - if (!m) { - return monthsShortWithDots; - } else if (/-MMM-/.test(format)) { - return monthsShortWithoutDots[m.month()]; - } else { - return monthsShortWithDots[m.month()]; - } - }, - monthsRegex: monthsRegex, - monthsShortRegex: monthsRegex, - monthsStrictRegex: /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i, - monthsShortStrictRegex: /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i, +/***/ }), +/* 143 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return Subscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SafeSubscriber", function() { return SafeSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(144); +/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(148); +/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(152); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(146); +/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(147); +/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ - weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'), - weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'), - weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[vandaag om] LT', - nextDay: '[morgen om] LT', - nextWeek: 'dddd [om] LT', - lastDay: '[gisteren om] LT', - lastWeek: '[afgelopen] dddd [om] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'over %s', - past : '%s geleden', - s : 'een paar seconden', - ss : '%d seconden', - m : 'één minuut', - mm : '%d minuten', - h : 'één uur', - hh : '%d uur', - d : 'één dag', - dd : '%d dagen', - M : 'één maand', - MM : '%d maanden', - y : 'één jaar', - yy : '%d jaar' - }, - dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/, - ordinal : function (number) { - return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - return nlBe; -}))); -/***/ }), -/* 129 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var nn = moment.defineLocale('nn', { - months : 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split('_'), - monthsShort : 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'), - weekdays : 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'), - weekdaysShort : 'sun_mån_tys_ons_tor_fre_lau'.split('_'), - weekdaysMin : 'su_må_ty_on_to_fr_lø'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY [kl.] H:mm', - LLLL : 'dddd D. MMMM YYYY [kl.] HH:mm' - }, - calendar : { - sameDay: '[I dag klokka] LT', - nextDay: '[I morgon klokka] LT', - nextWeek: 'dddd [klokka] LT', - lastDay: '[I går klokka] LT', - lastWeek: '[Føregåande] dddd [klokka] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : '%s sidan', - s : 'nokre sekund', - ss : '%d sekund', - m : 'eit minutt', - mm : '%d minutt', - h : 'ein time', - hh : '%d timar', - d : 'ein dag', - dd : '%d dagar', - M : 'ein månad', - MM : '%d månader', - y : 'eit år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +var Subscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subscriber, _super); + function Subscriber(destinationOrNext, error, complete) { + var _this = _super.call(this) || this; + _this.syncErrorValue = null; + _this.syncErrorThrown = false; + _this.syncErrorThrowable = false; + _this.isStopped = false; + switch (arguments.length) { + case 0: + _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; + break; + case 1: + if (!destinationOrNext) { + _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; + break; + } + if (typeof destinationOrNext === 'object') { + if (destinationOrNext instanceof Subscriber) { + _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; + _this.destination = destinationOrNext; + destinationOrNext.add(_this); + } + else { + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext); + } + break; + } + default: + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete); + break; } - }); + return _this; + } + Subscriber.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__["rxSubscriber"]] = function () { return this; }; + Subscriber.create = function (next, error, complete) { + var subscriber = new Subscriber(next, error, complete); + subscriber.syncErrorThrowable = false; + return subscriber; + }; + Subscriber.prototype.next = function (value) { + if (!this.isStopped) { + this._next(value); + } + }; + Subscriber.prototype.error = function (err) { + if (!this.isStopped) { + this.isStopped = true; + this._error(err); + } + }; + Subscriber.prototype.complete = function () { + if (!this.isStopped) { + this.isStopped = true; + this._complete(); + } + }; + Subscriber.prototype.unsubscribe = function () { + if (this.closed) { + return; + } + this.isStopped = true; + _super.prototype.unsubscribe.call(this); + }; + Subscriber.prototype._next = function (value) { + this.destination.next(value); + }; + Subscriber.prototype._error = function (err) { + this.destination.error(err); + this.unsubscribe(); + }; + Subscriber.prototype._complete = function () { + this.destination.complete(); + this.unsubscribe(); + }; + Subscriber.prototype._unsubscribeAndRecycle = function () { + var _parentOrParents = this._parentOrParents; + this._parentOrParents = null; + this.unsubscribe(); + this.closed = false; + this.isStopped = false; + this._parentOrParents = _parentOrParents; + return this; + }; + return Subscriber; +}(_Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"])); - return nn; +var SafeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SafeSubscriber, _super); + function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) { + var _this = _super.call(this) || this; + _this._parentSubscriber = _parentSubscriber; + var next; + var context = _this; + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(observerOrNext)) { + next = observerOrNext; + } + else if (observerOrNext) { + next = observerOrNext.next; + error = observerOrNext.error; + complete = observerOrNext.complete; + if (observerOrNext !== _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]) { + context = Object.create(observerOrNext); + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(context.unsubscribe)) { + _this.add(context.unsubscribe.bind(context)); + } + context.unsubscribe = _this.unsubscribe.bind(_this); + } + } + _this._context = context; + _this._next = next; + _this._error = error; + _this._complete = complete; + return _this; + } + SafeSubscriber.prototype.next = function (value) { + if (!this.isStopped && this._next) { + var _parentSubscriber = this._parentSubscriber; + if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._next, value); + } + else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + var useDeprecatedSynchronousErrorHandling = _config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling; + if (this._error) { + if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._error, err); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, this._error, err); + this.unsubscribe(); + } + } + else if (!_parentSubscriber.syncErrorThrowable) { + this.unsubscribe(); + if (useDeprecatedSynchronousErrorHandling) { + throw err; + } + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + } + else { + if (useDeprecatedSynchronousErrorHandling) { + _parentSubscriber.syncErrorValue = err; + _parentSubscriber.syncErrorThrown = true; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + } + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.complete = function () { + var _this = this; + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + if (this._complete) { + var wrappedComplete = function () { return _this._complete.call(_this._context); }; + if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(wrappedComplete); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, wrappedComplete); + this.unsubscribe(); + } + } + else { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { + try { + fn.call(this._context, value); + } + catch (err) { + this.unsubscribe(); + if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + } + } + }; + SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) { + if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { + throw new Error('bad call'); + } + try { + fn.call(this._context, value); + } + catch (err) { + if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { + parent.syncErrorValue = err; + parent.syncErrorThrown = true; + return true; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + return true; + } + } + return false; + }; + SafeSubscriber.prototype._unsubscribe = function () { + var _parentSubscriber = this._parentSubscriber; + this._context = null; + this._parentSubscriber = null; + _parentSubscriber.unsubscribe(); + }; + return SafeSubscriber; +}(Subscriber)); -}))); +//# sourceMappingURL=Subscriber.js.map /***/ }), -/* 130 */ -/***/ (function(module, exports, __webpack_require__) { +/* 144 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFunction", function() { return isFunction; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isFunction(x) { + return typeof x === 'function'; +} +//# sourceMappingURL=isFunction.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 145 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(146); +/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(147); +/** PURE_IMPORTS_START _config,_util_hostReportError PURE_IMPORTS_END */ - var symbolMap = { - '1': '੧', - '2': '੨', - '3': '੩', - '4': '੪', - '5': '੫', - '6': '੬', - '7': '੭', - '8': '੮', - '9': '੯', - '0': '੦' + +var empty = { + closed: true, + next: function (value) { }, + error: function (err) { + if (_config__WEBPACK_IMPORTED_MODULE_0__["config"].useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_1__["hostReportError"])(err); + } }, - numberMap = { - '੧': '1', - '੨': '2', - '੩': '3', - '੪': '4', - '੫': '5', - '੬': '6', - '੭': '7', - '੮': '8', - '੯': '9', - '੦': '0' - }; + complete: function () { } +}; +//# sourceMappingURL=Observer.js.map - var paIn = moment.defineLocale('pa-in', { - // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi. - months : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - monthsShort : 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split('_'), - weekdays : 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split('_'), - weekdaysShort : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - weekdaysMin : 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'), - longDateFormat : { - LT : 'A h:mm ਵਜੇ', - LTS : 'A h:mm:ss ਵਜੇ', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm ਵਜੇ', - LLLL : 'dddd, D MMMM YYYY, A h:mm ਵਜੇ' - }, - calendar : { - sameDay : '[ਅਜ] LT', - nextDay : '[ਕਲ] LT', - nextWeek : '[ਅਗਲਾ] dddd, LT', - lastDay : '[ਕਲ] LT', - lastWeek : '[ਪਿਛਲੇ] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s ਵਿੱਚ', - past : '%s ਪਿਛਲੇ', - s : 'ਕੁਝ ਸਕਿੰਟ', - ss : '%d ਸਕਿੰਟ', - m : 'ਇਕ ਮਿੰਟ', - mm : '%d ਮਿੰਟ', - h : 'ਇੱਕ ਘੰਟਾ', - hh : '%d ਘੰਟੇ', - d : 'ਇੱਕ ਦਿਨ', - dd : '%d ਦਿਨ', - M : 'ਇੱਕ ਮਹੀਨਾ', - MM : '%d ਮਹੀਨੇ', - y : 'ਇੱਕ ਸਾਲ', - yy : '%d ਸਾਲ' - }, - preparse: function (string) { - return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // Punjabi notation for meridiems are quite fuzzy in practice. While there exists - // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi. - meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ਰਾਤ') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ਸਵੇਰ') { - return hour; - } else if (meridiem === 'ਦੁਪਹਿਰ') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'ਸ਼ਾਮ') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ਰਾਤ'; - } else if (hour < 10) { - return 'ਸਵੇਰ'; - } else if (hour < 17) { - return 'ਦੁਪਹਿਰ'; - } else if (hour < 20) { - return 'ਸ਼ਾਮ'; - } else { - return 'ਰਾਤ'; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + +/***/ }), +/* 146 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return config; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var _enable_super_gross_mode_that_will_cause_bad_things = false; +var config = { + Promise: undefined, + set useDeprecatedSynchronousErrorHandling(value) { + if (value) { + var error = /*@__PURE__*/ new Error(); + /*@__PURE__*/ console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack); } - }); + else if (_enable_super_gross_mode_that_will_cause_bad_things) { + /*@__PURE__*/ console.log('RxJS: Back to a better error behavior. Thank you. <3'); + } + _enable_super_gross_mode_that_will_cause_bad_things = value; + }, + get useDeprecatedSynchronousErrorHandling() { + return _enable_super_gross_mode_that_will_cause_bad_things; + }, +}; +//# sourceMappingURL=config.js.map - return paIn; -}))); +/***/ }), +/* 147 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hostReportError", function() { return hostReportError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function hostReportError(err) { + setTimeout(function () { throw err; }, 0); +} +//# sourceMappingURL=hostReportError.js.map /***/ }), -/* 131 */ -/***/ (function(module, exports, __webpack_require__) { +/* 148 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return Subscription; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(150); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(151); +/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_UnsubscriptionError PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var monthsNominative = 'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split('_'), - monthsSubjective = 'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split('_'); - function plural(n) { - return (n % 10 < 5) && (n % 10 > 1) && ((~~(n / 10) % 10) !== 1); - } - function translate(number, withoutSuffix, key) { - var result = number + ' '; - switch (key) { - case 'ss': - return result + (plural(number) ? 'sekundy' : 'sekund'); - case 'm': - return withoutSuffix ? 'minuta' : 'minutę'; - case 'mm': - return result + (plural(number) ? 'minuty' : 'minut'); - case 'h': - return withoutSuffix ? 'godzina' : 'godzinę'; - case 'hh': - return result + (plural(number) ? 'godziny' : 'godzin'); - case 'MM': - return result + (plural(number) ? 'miesiące' : 'miesięcy'); - case 'yy': - return result + (plural(number) ? 'lata' : 'lat'); + +var Subscription = /*@__PURE__*/ (function () { + function Subscription(unsubscribe) { + this.closed = false; + this._parentOrParents = null; + this._subscriptions = null; + if (unsubscribe) { + this._unsubscribe = unsubscribe; } } - - var pl = moment.defineLocale('pl', { - months : function (momentToFormat, format) { - if (!momentToFormat) { - return monthsNominative; - } else if (format === '') { - // Hack: if format empty we know this is used to generate - // RegExp by moment. Give then back both valid forms of months - // in RegExp ready format. - return '(' + monthsSubjective[momentToFormat.month()] + '|' + monthsNominative[momentToFormat.month()] + ')'; - } else if (/D MMMM/.test(format)) { - return monthsSubjective[momentToFormat.month()]; - } else { - return monthsNominative[momentToFormat.month()]; - } - }, - monthsShort : 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'), - weekdays : 'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'), - weekdaysShort : 'ndz_pon_wt_śr_czw_pt_sob'.split('_'), - weekdaysMin : 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Dziś o] LT', - nextDay: '[Jutro o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[W niedzielę o] LT'; - - case 2: - return '[We wtorek o] LT'; - - case 3: - return '[W środę o] LT'; - - case 6: - return '[W sobotę o] LT'; - - default: - return '[W] dddd [o] LT'; + Subscription.prototype.unsubscribe = function () { + var errors; + if (this.closed) { + return; + } + var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; + this.closed = true; + this._parentOrParents = null; + this._subscriptions = null; + if (_parentOrParents instanceof Subscription) { + _parentOrParents.remove(this); + } + else if (_parentOrParents !== null) { + for (var index = 0; index < _parentOrParents.length; ++index) { + var parent_1 = _parentOrParents[index]; + parent_1.remove(this); + } + } + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(_unsubscribe)) { + try { + _unsubscribe.call(this); + } + catch (e) { + errors = e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"] ? flattenUnsubscriptionErrors(e.errors) : [e]; + } + } + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(_subscriptions)) { + var index = -1; + var len = _subscriptions.length; + while (++index < len) { + var sub = _subscriptions[index]; + if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_1__["isObject"])(sub)) { + try { + sub.unsubscribe(); + } + catch (e) { + errors = errors || []; + if (e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) { + errors = errors.concat(flattenUnsubscriptionErrors(e.errors)); + } + else { + errors.push(e); + } + } } - }, - lastDay: '[Wczoraj o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[W zeszłą niedzielę o] LT'; - case 3: - return '[W zeszłą środę o] LT'; - case 6: - return '[W zeszłą sobotę o] LT'; - default: - return '[W zeszły] dddd [o] LT'; + } + } + if (errors) { + throw new _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"](errors); + } + }; + Subscription.prototype.add = function (teardown) { + var subscription = teardown; + if (!teardown) { + return Subscription.EMPTY; + } + switch (typeof teardown) { + case 'function': + subscription = new Subscription(teardown); + case 'object': + if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') { + return subscription; } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : '%s temu', - s : 'kilka sekund', - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : '1 dzień', - dd : '%d dni', - M : 'miesiąc', - MM : translate, - y : 'rok', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + else if (this.closed) { + subscription.unsubscribe(); + return subscription; + } + else if (!(subscription instanceof Subscription)) { + var tmp = subscription; + subscription = new Subscription(); + subscription._subscriptions = [tmp]; + } + break; + default: { + throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); + } } - }); - - return pl; + var _parentOrParents = subscription._parentOrParents; + if (_parentOrParents === null) { + subscription._parentOrParents = this; + } + else if (_parentOrParents instanceof Subscription) { + if (_parentOrParents === this) { + return subscription; + } + subscription._parentOrParents = [_parentOrParents, this]; + } + else if (_parentOrParents.indexOf(this) === -1) { + _parentOrParents.push(this); + } + else { + return subscription; + } + var subscriptions = this._subscriptions; + if (subscriptions === null) { + this._subscriptions = [subscription]; + } + else { + subscriptions.push(subscription); + } + return subscription; + }; + Subscription.prototype.remove = function (subscription) { + var subscriptions = this._subscriptions; + if (subscriptions) { + var subscriptionIndex = subscriptions.indexOf(subscription); + if (subscriptionIndex !== -1) { + subscriptions.splice(subscriptionIndex, 1); + } + } + }; + Subscription.EMPTY = (function (empty) { + empty.closed = true; + return empty; + }(new Subscription())); + return Subscription; +}()); -}))); +function flattenUnsubscriptionErrors(errors) { + return errors.reduce(function (errs, err) { return errs.concat((err instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) ? err.errors : err); }, []); +} +//# sourceMappingURL=Subscription.js.map /***/ }), -/* 132 */ -/***/ (function(module, exports, __webpack_require__) { +/* 149 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArray", function() { return isArray; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var isArray = /*@__PURE__*/ (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })(); +//# sourceMappingURL=isArray.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 150 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var pt = moment.defineLocale('pt', { - months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'segundos', - ss : '%d segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal : '%dº', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return isObject; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isObject(x) { + return x !== null && typeof x === 'object'; +} +//# sourceMappingURL=isObject.js.map - return pt; -}))); +/***/ }), +/* 151 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return UnsubscriptionError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var UnsubscriptionErrorImpl = /*@__PURE__*/ (function () { + function UnsubscriptionErrorImpl(errors) { + Error.call(this); + this.message = errors ? + errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n ') : ''; + this.name = 'UnsubscriptionError'; + this.errors = errors; + return this; + } + UnsubscriptionErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return UnsubscriptionErrorImpl; +})(); +var UnsubscriptionError = UnsubscriptionErrorImpl; +//# sourceMappingURL=UnsubscriptionError.js.map /***/ }), -/* 133 */ -/***/ (function(module, exports, __webpack_require__) { +/* 152 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rxSubscriber", function() { return rxSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$rxSubscriber", function() { return $$rxSubscriber; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var rxSubscriber = /*@__PURE__*/ (function () { + return typeof Symbol === 'function' + ? /*@__PURE__*/ Symbol('rxSubscriber') + : '@@rxSubscriber_' + /*@__PURE__*/ Math.random(); +})(); +var $$rxSubscriber = rxSubscriber; +//# sourceMappingURL=rxSubscriber.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 153 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var ptBr = moment.defineLocale('pt-br', { - months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'), - weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'), - weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D [de] MMMM [de] YYYY', - LLL : 'D [de] MMMM [de] YYYY [às] HH:mm', - LLLL : 'dddd, D [de] MMMM [de] YYYY [às] HH:mm' - }, - calendar : { - sameDay: '[Hoje às] LT', - nextDay: '[Amanhã às] LT', - nextWeek: 'dddd [às] LT', - lastDay: '[Ontem às] LT', - lastWeek: function () { - return (this.day() === 0 || this.day() === 6) ? - '[Último] dddd [às] LT' : // Saturday + Sunday - '[Última] dddd [às] LT'; // Monday - Friday - }, - sameElse: 'L' - }, - relativeTime : { - future : 'em %s', - past : 'há %s', - s : 'poucos segundos', - ss : '%d segundos', - m : 'um minuto', - mm : '%d minutos', - h : 'uma hora', - hh : '%d horas', - d : 'um dia', - dd : '%d dias', - M : 'um mês', - MM : '%d meses', - y : 'um ano', - yy : '%d anos' - }, - dayOfMonthOrdinalParse: /\d{1,2}º/, - ordinal : '%dº' - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toSubscriber", function() { return toSubscriber; }); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(143); +/* harmony import */ var _symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(152); +/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); +/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */ - return ptBr; -}))); + +function toSubscriber(nextOrObserver, error, complete) { + if (nextOrObserver) { + if (nextOrObserver instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { + return nextOrObserver; + } + if (nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]]) { + return nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]](); + } + } + if (!nextOrObserver && !error && !complete) { + return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](_Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]); + } + return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](nextOrObserver, error, complete); +} +//# sourceMappingURL=toSubscriber.js.map /***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { +/* 154 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return observable; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var observable = /*@__PURE__*/ (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })(); +//# sourceMappingURL=observable.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 155 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': 'secunde', - 'mm': 'minute', - 'hh': 'ore', - 'dd': 'zile', - 'MM': 'luni', - 'yy': 'ani' - }, - separator = ' '; - if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) { - separator = ' de '; - } - return number + separator + format[key]; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipeFromArray", function() { return pipeFromArray; }); +/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(156); +/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */ + +function pipe() { + var fns = []; + for (var _i = 0; _i < arguments.length; _i++) { + fns[_i] = arguments[_i]; + } + return pipeFromArray(fns); +} +function pipeFromArray(fns) { + if (!fns) { + return _noop__WEBPACK_IMPORTED_MODULE_0__["noop"]; + } + if (fns.length === 1) { + return fns[0]; } + return function piped(input) { + return fns.reduce(function (prev, fn) { return fn(prev); }, input); + }; +} +//# sourceMappingURL=pipe.js.map - var ro = moment.defineLocale('ro', { - months : 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split('_'), - monthsShort : 'ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'), - weekdaysShort : 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'), - weekdaysMin : 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'), - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY H:mm', - LLLL : 'dddd, D MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[azi la] LT', - nextDay: '[mâine la] LT', - nextWeek: 'dddd [la] LT', - lastDay: '[ieri la] LT', - lastWeek: '[fosta] dddd [la] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'peste %s', - past : '%s în urmă', - s : 'câteva secunde', - ss : relativeTimeWithPlural, - m : 'un minut', - mm : relativeTimeWithPlural, - h : 'o oră', - hh : relativeTimeWithPlural, - d : 'o zi', - dd : relativeTimeWithPlural, - M : 'o lună', - MM : relativeTimeWithPlural, - y : 'un an', - yy : relativeTimeWithPlural - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return ro; +/***/ }), +/* 156 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return noop; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function noop() { } +//# sourceMappingURL=noop.js.map /***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { +/* 157 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return ConnectableObservable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectableObservableDescriptor", function() { return connectableObservableDescriptor; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(148); +/* harmony import */ var _operators_refCount__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(161); +/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд', - 'mm': withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут', - 'hh': 'час_часа_часов', - 'dd': 'день_дня_дней', - 'MM': 'месяц_месяца_месяцев', - 'yy': 'год_года_лет' - }; - if (key === 'm') { - return withoutSuffix ? 'минута' : 'минуту'; - } - else { - return number + ' ' + plural(format[key], +number); - } - } - var monthsParse = [/^янв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[йя]/i, /^июн/i, /^июл/i, /^авг/i, /^сен/i, /^окт/i, /^ноя/i, /^дек/i]; - - // http://new.gramota.ru/spravka/rules/139-prop : § 103 - // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637 - // CLDR data: http://www.unicode.org/cldr/charts/28/summary/ru.html#1753 - var ru = moment.defineLocale('ru', { - months : { - format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split('_'), - standalone: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_') - }, - monthsShort : { - // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку ? - format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split('_'), - standalone: 'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split('_') - }, - weekdays : { - standalone: 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'), - format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split('_'), - isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/ - }, - weekdaysShort : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'вс_пн_вт_ср_чт_пт_сб'.split('_'), - monthsParse : monthsParse, - longMonthsParse : monthsParse, - shortMonthsParse : monthsParse, - - // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки - monthsRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - // копия предыдущего - monthsShortRegex: /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i, - // полные названия с падежами - monthsStrictRegex: /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i, - // Выражение, которое соотвествует только сокращённым формам - monthsShortStrictRegex: /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY г.', - LLL : 'D MMMM YYYY г., H:mm', - LLLL : 'dddd, D MMMM YYYY г., H:mm' - }, - calendar : { - sameDay: '[Сегодня, в] LT', - nextDay: '[Завтра, в] LT', - lastDay: '[Вчера, в] LT', - nextWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В следующее] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В следующий] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В следующую] dddd, [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd, [в] LT'; - } else { - return '[В] dddd, [в] LT'; - } - } - }, - lastWeek: function (now) { - if (now.week() !== this.week()) { - switch (this.day()) { - case 0: - return '[В прошлое] dddd, [в] LT'; - case 1: - case 2: - case 4: - return '[В прошлый] dddd, [в] LT'; - case 3: - case 5: - case 6: - return '[В прошлую] dddd, [в] LT'; - } - } else { - if (this.day() === 2) { - return '[Во] dddd, [в] LT'; - } else { - return '[В] dddd, [в] LT'; - } - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'через %s', - past : '%s назад', - s : 'несколько секунд', - ss : relativeTimeWithPlural, - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'час', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'месяц', - MM : relativeTimeWithPlural, - y : 'год', - yy : relativeTimeWithPlural - }, - meridiemParse: /ночи|утра|дня|вечера/i, - isPM : function (input) { - return /^(дня|вечера)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночи'; - } else if (hour < 12) { - return 'утра'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечера'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - return number + '-й'; - case 'D': - return number + '-го'; - case 'w': - case 'W': - return number + '-я'; - default: - return number; +var ConnectableObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableObservable, _super); + function ConnectableObservable(source, subjectFactory) { + var _this = _super.call(this) || this; + _this.source = source; + _this.subjectFactory = subjectFactory; + _this._refCount = 0; + _this._isComplete = false; + return _this; + } + ConnectableObservable.prototype._subscribe = function (subscriber) { + return this.getSubject().subscribe(subscriber); + }; + ConnectableObservable.prototype.getSubject = function () { + var subject = this._subject; + if (!subject || subject.isStopped) { + this._subject = this.subjectFactory(); + } + return this._subject; + }; + ConnectableObservable.prototype.connect = function () { + var connection = this._connection; + if (!connection) { + this._isComplete = false; + connection = this._connection = new _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"](); + connection.add(this.source + .subscribe(new ConnectableSubscriber(this.getSubject(), this))); + if (connection.closed) { + this._connection = null; + connection = _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"].EMPTY; } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. } - }); - - return ru; - -}))); - - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var months = [ - 'جنوري', - 'فيبروري', - 'مارچ', - 'اپريل', - 'مئي', - 'جون', - 'جولاءِ', - 'آگسٽ', - 'سيپٽمبر', - 'آڪٽوبر', - 'نومبر', - 'ڊسمبر' - ]; - var days = [ - 'آچر', - 'سومر', - 'اڱارو', - 'اربع', - 'خميس', - 'جمع', - 'ڇنڇر' - ]; + return connection; + }; + ConnectableObservable.prototype.refCount = function () { + return Object(_operators_refCount__WEBPACK_IMPORTED_MODULE_5__["refCount"])()(this); + }; + return ConnectableObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); - var sd = moment.defineLocale('sd', { - months : months, - monthsShort : months, - weekdays : days, - weekdaysShort : days, - weekdaysMin : days, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd، D MMMM YYYY HH:mm' - }, - meridiemParse: /صبح|شام/, - isPM : function (input) { - return 'شام' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'صبح'; +var connectableObservableDescriptor = /*@__PURE__*/ (function () { + var connectableProto = ConnectableObservable.prototype; + return { + operator: { value: null }, + _refCount: { value: 0, writable: true }, + _subject: { value: null, writable: true }, + _connection: { value: null, writable: true }, + _subscribe: { value: connectableProto._subscribe }, + _isComplete: { value: connectableProto._isComplete, writable: true }, + getSubject: { value: connectableProto.getSubject }, + connect: { value: connectableProto.connect }, + refCount: { value: connectableProto.refCount } + }; +})(); +var ConnectableSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableSubscriber, _super); + function ConnectableSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; + } + ConnectableSubscriber.prototype._error = function (err) { + this._unsubscribe(); + _super.prototype._error.call(this, err); + }; + ConnectableSubscriber.prototype._complete = function () { + this.connectable._isComplete = true; + this._unsubscribe(); + _super.prototype._complete.call(this); + }; + ConnectableSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (connectable) { + this.connectable = null; + var connection = connectable._connection; + connectable._refCount = 0; + connectable._subject = null; + connectable._connection = null; + if (connection) { + connection.unsubscribe(); } - return 'شام'; - }, - calendar : { - sameDay : '[اڄ] LT', - nextDay : '[سڀاڻي] LT', - nextWeek : 'dddd [اڳين هفتي تي] LT', - lastDay : '[ڪالهه] LT', - lastWeek : '[گزريل هفتي] dddd [تي] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s پوء', - past : '%s اڳ', - s : 'چند سيڪنڊ', - ss : '%d سيڪنڊ', - m : 'هڪ منٽ', - mm : '%d منٽ', - h : 'هڪ ڪلاڪ', - hh : '%d ڪلاڪ', - d : 'هڪ ڏينهن', - dd : '%d ڏينهن', - M : 'هڪ مهينو', - MM : '%d مهينا', - y : 'هڪ سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. } - }); - - return sd; - -}))); + }; + return ConnectableSubscriber; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["SubjectSubscriber"])); +var RefCountOperator = /*@__PURE__*/ (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; + } + RefCountOperator.prototype.call = function (subscriber, source) { + var connectable = this.connectable; + connectable._refCount++; + var refCounter = new RefCountSubscriber(subscriber, connectable); + var subscription = source.subscribe(refCounter); + if (!refCounter.closed) { + refCounter.connection = connectable.connect(); + } + return subscription; + }; + return RefCountOperator; +}()); +var RefCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; + } + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + return; + } + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; + } + connectable._refCount = refCount - 1; + if (refCount > 1) { + this.connection = null; + return; + } + var connection = this.connection; + var sharedConnection = connectable._connection; + this.connection = null; + if (sharedConnection && (!connection || sharedConnection === connection)) { + sharedConnection.unsubscribe(); + } + }; + return RefCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +//# sourceMappingURL=ConnectableObservable.js.map /***/ }), -/* 137 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - +/* 158 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var se = moment.defineLocale('se', { - months : 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split('_'), - monthsShort : 'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'), - weekdays : 'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split('_'), - weekdaysShort : 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'), - weekdaysMin : 's_v_m_g_d_b_L'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'MMMM D. [b.] YYYY', - LLL : 'MMMM D. [b.] YYYY [ti.] HH:mm', - LLLL : 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm' - }, - calendar : { - sameDay: '[otne ti] LT', - nextDay: '[ihttin ti] LT', - nextWeek: 'dddd [ti] LT', - lastDay: '[ikte ti] LT', - lastWeek: '[ovddit] dddd [ti] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s geažes', - past : 'maŋit %s', - s : 'moadde sekunddat', - ss: '%d sekunddat', - m : 'okta minuhta', - mm : '%d minuhtat', - h : 'okta diimmu', - hh : '%d diimmut', - d : 'okta beaivi', - dd : '%d beaivvit', - M : 'okta mánnu', - MM : '%d mánut', - y : 'okta jahki', - yy : '%d jagit' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscriber", function() { return SubjectSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnonymousSubject", function() { return AnonymousSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(148); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(159); +/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(160); +/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(152); +/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ - return se; -}))); -/***/ }), -/* 138 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +var SubjectSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscriber, _super); + function SubjectSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + return _this; + } + return SubjectSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); - /*jshint -W100*/ - var si = moment.defineLocale('si', { - months : 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split('_'), - monthsShort : 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split('_'), - weekdays : 'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split('_'), - weekdaysShort : 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'), - weekdaysMin : 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'a h:mm', - LTS : 'a h:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY MMMM D', - LLL : 'YYYY MMMM D, a h:mm', - LLLL : 'YYYY MMMM D [වැනි] dddd, a h:mm:ss' - }, - calendar : { - sameDay : '[අද] LT[ට]', - nextDay : '[හෙට] LT[ට]', - nextWeek : 'dddd LT[ට]', - lastDay : '[ඊයේ] LT[ට]', - lastWeek : '[පසුගිය] dddd LT[ට]', - sameElse : 'L' - }, - relativeTime : { - future : '%sකින්', - past : '%sකට පෙර', - s : 'තත්පර කිහිපය', - ss : 'තත්පර %d', - m : 'මිනිත්තුව', - mm : 'මිනිත්තු %d', - h : 'පැය', - hh : 'පැය %d', - d : 'දිනය', - dd : 'දින %d', - M : 'මාසය', - MM : 'මාස %d', - y : 'වසර', - yy : 'වසර %d' - }, - dayOfMonthOrdinalParse: /\d{1,2} වැනි/, - ordinal : function (number) { - return number + ' වැනි'; - }, - meridiemParse : /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./, - isPM : function (input) { - return input === 'ප.ව.' || input === 'පස් වරු'; - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'ප.ව.' : 'පස් වරු'; - } else { - return isLower ? 'පෙ.ව.' : 'පෙර වරු'; +var Subject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subject, _super); + function Subject() { + var _this = _super.call(this) || this; + _this.observers = []; + _this.closed = false; + _this.isStopped = false; + _this.hasError = false; + _this.thrownError = null; + return _this; + } + Subject.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__["rxSubscriber"]] = function () { + return new SubjectSubscriber(this); + }; + Subject.prototype.lift = function (operator) { + var subject = new AnonymousSubject(this, this); + subject.operator = operator; + return subject; + }; + Subject.prototype.next = function (value) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + if (!this.isStopped) { + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].next(value); } } - }); + }; + Subject.prototype.error = function (err) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + this.hasError = true; + this.thrownError = err; + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].error(err); + } + this.observers.length = 0; + }; + Subject.prototype.complete = function () { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].complete(); + } + this.observers.length = 0; + }; + Subject.prototype.unsubscribe = function () { + this.isStopped = true; + this.closed = true; + this.observers = null; + }; + Subject.prototype._trySubscribe = function (subscriber) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + else { + return _super.prototype._trySubscribe.call(this, subscriber); + } + }; + Subject.prototype._subscribe = function (subscriber) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + else if (this.hasError) { + subscriber.error(this.thrownError); + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else if (this.isStopped) { + subscriber.complete(); + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else { + this.observers.push(subscriber); + return new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__["SubjectSubscription"](this, subscriber); + } + }; + Subject.prototype.asObservable = function () { + var observable = new _Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"](); + observable.source = this; + return observable; + }; + Subject.create = function (destination, source) { + return new AnonymousSubject(destination, source); + }; + return Subject; +}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); - return si; +var AnonymousSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnonymousSubject, _super); + function AnonymousSubject(destination, source) { + var _this = _super.call(this) || this; + _this.destination = destination; + _this.source = source; + return _this; + } + AnonymousSubject.prototype.next = function (value) { + var destination = this.destination; + if (destination && destination.next) { + destination.next(value); + } + }; + AnonymousSubject.prototype.error = function (err) { + var destination = this.destination; + if (destination && destination.error) { + this.destination.error(err); + } + }; + AnonymousSubject.prototype.complete = function () { + var destination = this.destination; + if (destination && destination.complete) { + this.destination.complete(); + } + }; + AnonymousSubject.prototype._subscribe = function (subscriber) { + var source = this.source; + if (source) { + return this.source.subscribe(subscriber); + } + else { + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + }; + return AnonymousSubject; +}(Subject)); -}))); +//# sourceMappingURL=Subject.js.map /***/ }), -/* 139 */ -/***/ (function(module, exports, __webpack_require__) { +/* 159 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return ObjectUnsubscribedError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var ObjectUnsubscribedErrorImpl = /*@__PURE__*/ (function () { + function ObjectUnsubscribedErrorImpl() { + Error.call(this); + this.message = 'object unsubscribed'; + this.name = 'ObjectUnsubscribedError'; + return this; + } + ObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return ObjectUnsubscribedErrorImpl; +})(); +var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; +//# sourceMappingURL=ObjectUnsubscribedError.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 160 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var months = 'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split('_'), - monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_'); - function plural(n) { - return (n > 1) && (n < 5); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ + + +var SubjectSubscription = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscription, _super); + function SubjectSubscription(subject, subscriber) { + var _this = _super.call(this) || this; + _this.subject = subject; + _this.subscriber = subscriber; + _this.closed = false; + return _this; } - function translate(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': // a few seconds / in a few seconds / a few seconds ago - return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; - case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'sekundy' : 'sekúnd'); - } else { - return result + 'sekundami'; - } - break; - case 'm': // a minute / in a minute / a minute ago - return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); - case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'minúty' : 'minút'); - } else { - return result + 'minútami'; - } - break; - case 'h': // an hour / in an hour / an hour ago - return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); - case 'hh': // 9 hours / in 9 hours / 9 hours ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'hodiny' : 'hodín'); - } else { - return result + 'hodinami'; - } - break; - case 'd': // a day / in a day / a day ago - return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; - case 'dd': // 9 days / in 9 days / 9 days ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'dni' : 'dní'); - } else { - return result + 'dňami'; - } - break; - case 'M': // a month / in a month / a month ago - return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; - case 'MM': // 9 months / in 9 months / 9 months ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'mesiace' : 'mesiacov'); - } else { - return result + 'mesiacmi'; - } - break; - case 'y': // a year / in a year / a year ago - return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; - case 'yy': // 9 years / in 9 years / 9 years ago - if (withoutSuffix || isFuture) { - return result + (plural(number) ? 'roky' : 'rokov'); - } else { - return result + 'rokmi'; - } - break; + SubjectSubscription.prototype.unsubscribe = function () { + if (this.closed) { + return; } - } - - var sk = moment.defineLocale('sk', { - months : months, - monthsShort : monthsShort, - weekdays : 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'), - weekdaysShort : 'ne_po_ut_st_št_pi_so'.split('_'), - weekdaysMin : 'ne_po_ut_st_št_pi_so'.split('_'), - longDateFormat : { - LT: 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd D. MMMM YYYY H:mm' - }, - calendar : { - sameDay: '[dnes o] LT', - nextDay: '[zajtra o] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[v nedeľu o] LT'; - case 1: - case 2: - return '[v] dddd [o] LT'; - case 3: - return '[v stredu o] LT'; - case 4: - return '[vo štvrtok o] LT'; - case 5: - return '[v piatok o] LT'; - case 6: - return '[v sobotu o] LT'; - } - }, - lastDay: '[včera o] LT', - lastWeek: function () { - switch (this.day()) { - case 0: - return '[minulú nedeľu o] LT'; - case 1: - case 2: - return '[minulý] dddd [o] LT'; - case 3: - return '[minulú stredu o] LT'; - case 4: - case 5: - return '[minulý] dddd [o] LT'; - case 6: - return '[minulú sobotu o] LT'; - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pred %s', - s : translate, - ss : translate, - m : translate, - mm : translate, - h : translate, - hh : translate, - d : translate, - dd : translate, - M : translate, - MM : translate, - y : translate, - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + this.closed = true; + var subject = this.subject; + var observers = subject.observers; + this.subject = null; + if (!observers || observers.length === 0 || subject.isStopped || subject.closed) { + return; } - }); - - return sk; + var subscriberIndex = observers.indexOf(this.subscriber); + if (subscriberIndex !== -1) { + observers.splice(subscriberIndex, 1); + } + }; + return SubjectSubscription; +}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); -}))); +//# sourceMappingURL=SubjectSubscription.js.map /***/ }), -/* 140 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 161 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return refCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var result = number + ' '; - switch (key) { - case 's': - return withoutSuffix || isFuture ? 'nekaj sekund' : 'nekaj sekundami'; - case 'ss': - if (number === 1) { - result += withoutSuffix ? 'sekundo' : 'sekundi'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah'; - } else { - result += 'sekund'; - } - return result; - case 'm': - return withoutSuffix ? 'ena minuta' : 'eno minuto'; - case 'mm': - if (number === 1) { - result += withoutSuffix ? 'minuta' : 'minuto'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'minuti' : 'minutama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'minute' : 'minutami'; - } else { - result += withoutSuffix || isFuture ? 'minut' : 'minutami'; - } - return result; - case 'h': - return withoutSuffix ? 'ena ura' : 'eno uro'; - case 'hh': - if (number === 1) { - result += withoutSuffix ? 'ura' : 'uro'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'uri' : 'urama'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'ure' : 'urami'; - } else { - result += withoutSuffix || isFuture ? 'ur' : 'urami'; - } - return result; - case 'd': - return withoutSuffix || isFuture ? 'en dan' : 'enim dnem'; - case 'dd': - if (number === 1) { - result += withoutSuffix || isFuture ? 'dan' : 'dnem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'dni' : 'dnevoma'; - } else { - result += withoutSuffix || isFuture ? 'dni' : 'dnevi'; - } - return result; - case 'M': - return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem'; - case 'MM': - if (number === 1) { - result += withoutSuffix || isFuture ? 'mesec' : 'mesecem'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'meseca' : 'mesecema'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'mesece' : 'meseci'; - } else { - result += withoutSuffix || isFuture ? 'mesecev' : 'meseci'; - } - return result; - case 'y': - return withoutSuffix || isFuture ? 'eno leto' : 'enim letom'; - case 'yy': - if (number === 1) { - result += withoutSuffix || isFuture ? 'leto' : 'letom'; - } else if (number === 2) { - result += withoutSuffix || isFuture ? 'leti' : 'letoma'; - } else if (number < 5) { - result += withoutSuffix || isFuture ? 'leta' : 'leti'; - } else { - result += withoutSuffix || isFuture ? 'let' : 'leti'; - } - return result; +function refCount() { + return function refCountOperatorFunction(source) { + return source.lift(new RefCountOperator(source)); + }; +} +var RefCountOperator = /*@__PURE__*/ (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; + } + RefCountOperator.prototype.call = function (subscriber, source) { + var connectable = this.connectable; + connectable._refCount++; + var refCounter = new RefCountSubscriber(subscriber, connectable); + var subscription = source.subscribe(refCounter); + if (!refCounter.closed) { + refCounter.connection = connectable.connect(); } + return subscription; + }; + return RefCountOperator; +}()); +var RefCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + return; + } + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; + } + connectable._refCount = refCount - 1; + if (refCount > 1) { + this.connection = null; + return; + } + var connection = this.connection; + var sharedConnection = connectable._connection; + this.connection = null; + if (sharedConnection && (!connection || sharedConnection === connection)) { + sharedConnection.unsubscribe(); + } + }; + return RefCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=refCount.js.map - var sl = moment.defineLocale('sl', { - months : 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split('_'), - monthsShort : 'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays : 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'), - weekdaysShort : 'ned._pon._tor._sre._čet._pet._sob.'.split('_'), - weekdaysMin : 'ne_po_to_sr_če_pe_so'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM YYYY', - LLL : 'D. MMMM YYYY H:mm', - LLLL : 'dddd, D. MMMM YYYY H:mm' - }, - calendar : { - sameDay : '[danes ob] LT', - nextDay : '[jutri ob] LT', - nextWeek : function () { - switch (this.day()) { - case 0: - return '[v] [nedeljo] [ob] LT'; - case 3: - return '[v] [sredo] [ob] LT'; - case 6: - return '[v] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[v] dddd [ob] LT'; - } - }, - lastDay : '[včeraj ob] LT', - lastWeek : function () { - switch (this.day()) { - case 0: - return '[prejšnjo] [nedeljo] [ob] LT'; - case 3: - return '[prejšnjo] [sredo] [ob] LT'; - case 6: - return '[prejšnjo] [soboto] [ob] LT'; - case 1: - case 2: - case 4: - case 5: - return '[prejšnji] dddd [ob] LT'; - } - }, - sameElse : 'L' - }, - relativeTime : { - future : 'čez %s', - past : 'pred %s', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - - return sl; - -}))); +/***/ }), +/* 162 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return groupBy; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return GroupedObservable; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(141); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(158); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */ -/***/ }), -/* 141 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var sq = moment.defineLocale('sq', { - months : 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split('_'), - monthsShort : 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'), - weekdays : 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split('_'), - weekdaysShort : 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'), - weekdaysMin : 'D_H_Ma_Më_E_P_Sh'.split('_'), - weekdaysParseExact : true, - meridiemParse: /PD|MD/, - isPM: function (input) { - return input.charAt(0) === 'M'; - }, - meridiem : function (hours, minutes, isLower) { - return hours < 12 ? 'PD' : 'MD'; - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Sot në] LT', - nextDay : '[Nesër në] LT', - nextWeek : 'dddd [në] LT', - lastDay : '[Dje në] LT', - lastWeek : 'dddd [e kaluar në] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'në %s', - past : '%s më parë', - s : 'disa sekonda', - ss : '%d sekonda', - m : 'një minutë', - mm : '%d minuta', - h : 'një orë', - hh : '%d orë', - d : 'një ditë', - dd : '%d ditë', - M : 'një muaj', - MM : '%d muaj', - y : 'një vit', - yy : '%d vite' - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) { + return function (source) { + return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector)); + }; +} +var GroupByOperator = /*@__PURE__*/ (function () { + function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) { + this.keySelector = keySelector; + this.elementSelector = elementSelector; + this.durationSelector = durationSelector; + this.subjectSelector = subjectSelector; + } + GroupByOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector)); + }; + return GroupByOperator; +}()); +var GroupBySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupBySubscriber, _super); + function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) { + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.elementSelector = elementSelector; + _this.durationSelector = durationSelector; + _this.subjectSelector = subjectSelector; + _this.groups = null; + _this.attemptedToUnsubscribe = false; + _this.count = 0; + return _this; + } + GroupBySubscriber.prototype._next = function (value) { + var key; + try { + key = this.keySelector(value); } - }); - - return sq; + catch (err) { + this.error(err); + return; + } + this._group(value, key); + }; + GroupBySubscriber.prototype._group = function (value, key) { + var groups = this.groups; + if (!groups) { + groups = this.groups = new Map(); + } + var group = groups.get(key); + var element; + if (this.elementSelector) { + try { + element = this.elementSelector(value); + } + catch (err) { + this.error(err); + } + } + else { + element = value; + } + if (!group) { + group = (this.subjectSelector ? this.subjectSelector() : new _Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]()); + groups.set(key, group); + var groupedObservable = new GroupedObservable(key, group, this); + this.destination.next(groupedObservable); + if (this.durationSelector) { + var duration = void 0; + try { + duration = this.durationSelector(new GroupedObservable(key, group)); + } + catch (err) { + this.error(err); + return; + } + this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this))); + } + } + if (!group.closed) { + group.next(element); + } + }; + GroupBySubscriber.prototype._error = function (err) { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.error(err); + }); + groups.clear(); + } + this.destination.error(err); + }; + GroupBySubscriber.prototype._complete = function () { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.complete(); + }); + groups.clear(); + } + this.destination.complete(); + }; + GroupBySubscriber.prototype.removeGroup = function (key) { + this.groups.delete(key); + }; + GroupBySubscriber.prototype.unsubscribe = function () { + if (!this.closed) { + this.attemptedToUnsubscribe = true; + if (this.count === 0) { + _super.prototype.unsubscribe.call(this); + } + } + }; + return GroupBySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupDurationSubscriber, _super); + function GroupDurationSubscriber(key, group, parent) { + var _this = _super.call(this, group) || this; + _this.key = key; + _this.group = group; + _this.parent = parent; + return _this; + } + GroupDurationSubscriber.prototype._next = function (value) { + this.complete(); + }; + GroupDurationSubscriber.prototype._unsubscribe = function () { + var _a = this, parent = _a.parent, key = _a.key; + this.key = this.parent = null; + if (parent) { + parent.removeGroup(key); + } + }; + return GroupDurationSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var GroupedObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupedObservable, _super); + function GroupedObservable(key, groupSubject, refCountSubscription) { + var _this = _super.call(this) || this; + _this.key = key; + _this.groupSubject = groupSubject; + _this.refCountSubscription = refCountSubscription; + return _this; + } + GroupedObservable.prototype._subscribe = function (subscriber) { + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); + var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject; + if (refCountSubscription && !refCountSubscription.closed) { + subscription.add(new InnerRefCountSubscription(refCountSubscription)); + } + subscription.add(groupSubject.subscribe(subscriber)); + return subscription; + }; + return GroupedObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"])); -}))); +var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerRefCountSubscription, _super); + function InnerRefCountSubscription(parent) { + var _this = _super.call(this) || this; + _this.parent = parent; + parent.count++; + return _this; + } + InnerRefCountSubscription.prototype.unsubscribe = function () { + var parent = this.parent; + if (!parent.closed && !this.closed) { + _super.prototype.unsubscribe.call(this); + parent.count -= 1; + if (parent.count === 0 && parent.attemptedToUnsubscribe) { + parent.unsubscribe(); + } + } + }; + return InnerRefCountSubscription; +}(_Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"])); +//# sourceMappingURL=groupBy.js.map /***/ }), -/* 142 */ -/***/ (function(module, exports, __webpack_require__) { +/* 163 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return BehaviorSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(159); +/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var translator = { - words: { //Different grammatical cases - ss: ['sekunda', 'sekunde', 'sekundi'], - m: ['jedan minut', 'jedne minute'], - mm: ['minut', 'minute', 'minuta'], - h: ['jedan sat', 'jednog sata'], - hh: ['sat', 'sata', 'sati'], - dd: ['dan', 'dana', 'dana'], - MM: ['mesec', 'meseca', 'meseci'], - yy: ['godina', 'godine', 'godina'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); +var BehaviorSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BehaviorSubject, _super); + function BehaviorSubject(_value) { + var _this = _super.call(this) || this; + _this._value = _value; + return _this; + } + Object.defineProperty(BehaviorSubject.prototype, "value", { + get: function () { + return this.getValue(); }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } + enumerable: true, + configurable: true + }); + BehaviorSubject.prototype._subscribe = function (subscriber) { + var subscription = _super.prototype._subscribe.call(this, subscriber); + if (subscription && !subscription.closed) { + subscriber.next(this._value); } + return subscription; }; - - var sr = moment.defineLocale('sr', { - months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split('_'), - monthsShort: 'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'), - monthsParseExact: true, - weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split('_'), - weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'), - weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[danas u] LT', - nextDay: '[sutra u] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[u] [nedelju] [u] LT'; - case 3: - return '[u] [sredu] [u] LT'; - case 6: - return '[u] [subotu] [u] LT'; - case 1: - case 2: - case 4: - case 5: - return '[u] dddd [u] LT'; - } - }, - lastDay : '[juče u] LT', - lastWeek : function () { - var lastWeekDays = [ - '[prošle] [nedelje] [u] LT', - '[prošlog] [ponedeljka] [u] LT', - '[prošlog] [utorka] [u] LT', - '[prošle] [srede] [u] LT', - '[prošlog] [četvrtka] [u] LT', - '[prošlog] [petka] [u] LT', - '[prošle] [subote] [u] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'za %s', - past : 'pre %s', - s : 'nekoliko sekundi', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'dan', - dd : translator.translate, - M : 'mesec', - MM : translator.translate, - y : 'godinu', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + BehaviorSubject.prototype.getValue = function () { + if (this.hasError) { + throw this.thrownError; } - }); - - return sr; + else if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__["ObjectUnsubscribedError"](); + } + else { + return this._value; + } + }; + BehaviorSubject.prototype.next = function (value) { + _super.prototype.next.call(this, this._value = value); + }; + return BehaviorSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -}))); +//# sourceMappingURL=BehaviorSubject.js.map /***/ }), -/* 143 */ -/***/ (function(module, exports, __webpack_require__) { +/* 164 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return ReplaySubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(165); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(148); +/* harmony import */ var _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(172); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(159); +/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(160); +/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var translator = { - words: { //Different grammatical cases - ss: ['секунда', 'секунде', 'секунди'], - m: ['један минут', 'једне минуте'], - mm: ['минут', 'минуте', 'минута'], - h: ['један сат', 'једног сата'], - hh: ['сат', 'сата', 'сати'], - dd: ['дан', 'дана', 'дана'], - MM: ['месец', 'месеца', 'месеци'], - yy: ['година', 'године', 'година'] - }, - correctGrammaticalCase: function (number, wordKey) { - return number === 1 ? wordKey[0] : (number >= 2 && number <= 4 ? wordKey[1] : wordKey[2]); - }, - translate: function (number, withoutSuffix, key) { - var wordKey = translator.words[key]; - if (key.length === 1) { - return withoutSuffix ? wordKey[0] : wordKey[1]; - } else { - return number + ' ' + translator.correctGrammaticalCase(number, wordKey); - } + + + + +var ReplaySubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ReplaySubject, _super); + function ReplaySubject(bufferSize, windowTime, scheduler) { + if (bufferSize === void 0) { + bufferSize = Number.POSITIVE_INFINITY; + } + if (windowTime === void 0) { + windowTime = Number.POSITIVE_INFINITY; + } + var _this = _super.call(this) || this; + _this.scheduler = scheduler; + _this._events = []; + _this._infiniteTimeWindow = false; + _this._bufferSize = bufferSize < 1 ? 1 : bufferSize; + _this._windowTime = windowTime < 1 ? 1 : windowTime; + if (windowTime === Number.POSITIVE_INFINITY) { + _this._infiniteTimeWindow = true; + _this.next = _this.nextInfiniteTimeWindow; + } + else { + _this.next = _this.nextTimeWindow; + } + return _this; + } + ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) { + var _events = this._events; + _events.push(value); + if (_events.length > this._bufferSize) { + _events.shift(); } + _super.prototype.next.call(this, value); }; - - var srCyrl = moment.defineLocale('sr-cyrl', { - months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split('_'), - monthsShort: 'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'), - monthsParseExact: true, - weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'), - weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'), - weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'), - weekdaysParseExact : true, - longDateFormat: { - LT: 'H:mm', - LTS : 'H:mm:ss', - L: 'DD.MM.YYYY', - LL: 'D. MMMM YYYY', - LLL: 'D. MMMM YYYY H:mm', - LLLL: 'dddd, D. MMMM YYYY H:mm' - }, - calendar: { - sameDay: '[данас у] LT', - nextDay: '[сутра у] LT', - nextWeek: function () { - switch (this.day()) { - case 0: - return '[у] [недељу] [у] LT'; - case 3: - return '[у] [среду] [у] LT'; - case 6: - return '[у] [суботу] [у] LT'; - case 1: - case 2: - case 4: - case 5: - return '[у] dddd [у] LT'; - } - }, - lastDay : '[јуче у] LT', - lastWeek : function () { - var lastWeekDays = [ - '[прошле] [недеље] [у] LT', - '[прошлог] [понедељка] [у] LT', - '[прошлог] [уторка] [у] LT', - '[прошле] [среде] [у] LT', - '[прошлог] [четвртка] [у] LT', - '[прошлог] [петка] [у] LT', - '[прошле] [суботе] [у] LT' - ]; - return lastWeekDays[this.day()]; - }, - sameElse : 'L' - }, - relativeTime : { - future : 'за %s', - past : 'пре %s', - s : 'неколико секунди', - ss : translator.translate, - m : translator.translate, - mm : translator.translate, - h : translator.translate, - hh : translator.translate, - d : 'дан', - dd : translator.translate, - M : 'месец', - MM : translator.translate, - y : 'годину', - yy : translator.translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. + ReplaySubject.prototype.nextTimeWindow = function (value) { + this._events.push(new ReplayEvent(this._getNow(), value)); + this._trimBufferThenGetEvents(); + _super.prototype.next.call(this, value); + }; + ReplaySubject.prototype._subscribe = function (subscriber) { + var _infiniteTimeWindow = this._infiniteTimeWindow; + var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents(); + var scheduler = this.scheduler; + var len = _events.length; + var subscription; + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__["ObjectUnsubscribedError"](); } - }); - - return srCyrl; + else if (this.isStopped || this.hasError) { + subscription = _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else { + this.observers.push(subscriber); + subscription = new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__["SubjectSubscription"](this, subscriber); + } + if (scheduler) { + subscriber.add(subscriber = new _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__["ObserveOnSubscriber"](subscriber, scheduler)); + } + if (_infiniteTimeWindow) { + for (var i = 0; i < len && !subscriber.closed; i++) { + subscriber.next(_events[i]); + } + } + else { + for (var i = 0; i < len && !subscriber.closed; i++) { + subscriber.next(_events[i].value); + } + } + if (this.hasError) { + subscriber.error(this.thrownError); + } + else if (this.isStopped) { + subscriber.complete(); + } + return subscription; + }; + ReplaySubject.prototype._getNow = function () { + return (this.scheduler || _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__["queue"]).now(); + }; + ReplaySubject.prototype._trimBufferThenGetEvents = function () { + var now = this._getNow(); + var _bufferSize = this._bufferSize; + var _windowTime = this._windowTime; + var _events = this._events; + var eventsCount = _events.length; + var spliceCount = 0; + while (spliceCount < eventsCount) { + if ((now - _events[spliceCount].time) < _windowTime) { + break; + } + spliceCount++; + } + if (eventsCount > _bufferSize) { + spliceCount = Math.max(spliceCount, eventsCount - _bufferSize); + } + if (spliceCount > 0) { + _events.splice(0, spliceCount); + } + return _events; + }; + return ReplaySubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -}))); +var ReplayEvent = /*@__PURE__*/ (function () { + function ReplayEvent(time, value) { + this.time = time; + this.value = value; + } + return ReplayEvent; +}()); +//# sourceMappingURL=ReplaySubject.js.map /***/ }), -/* 144 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - +/* 165 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var ss = moment.defineLocale('ss', { - months : "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split('_'), - monthsShort : 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'), - weekdays : 'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split('_'), - weekdaysShort : 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'), - weekdaysMin : 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Namuhla nga] LT', - nextDay : '[Kusasa nga] LT', - nextWeek : 'dddd [nga] LT', - lastDay : '[Itolo nga] LT', - lastWeek : 'dddd [leliphelile] [nga] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'nga %s', - past : 'wenteka nga %s', - s : 'emizuzwana lomcane', - ss : '%d mzuzwana', - m : 'umzuzu', - mm : '%d emizuzu', - h : 'lihora', - hh : '%d emahora', - d : 'lilanga', - dd : '%d emalanga', - M : 'inyanga', - MM : '%d tinyanga', - y : 'umnyaka', - yy : '%d iminyaka' - }, - meridiemParse: /ekuseni|emini|entsambama|ebusuku/, - meridiem : function (hours, minutes, isLower) { - if (hours < 11) { - return 'ekuseni'; - } else if (hours < 15) { - return 'emini'; - } else if (hours < 19) { - return 'entsambama'; - } else { - return 'ebusuku'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'ekuseni') { - return hour; - } else if (meridiem === 'emini') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') { - if (hour === 0) { - return 0; - } - return hour + 12; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : '%d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queue", function() { return queue; }); +/* harmony import */ var _QueueAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(166); +/* harmony import */ var _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(169); +/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */ - return ss; -}))); +var queue = /*@__PURE__*/ new _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__["QueueScheduler"](_QueueAction__WEBPACK_IMPORTED_MODULE_0__["QueueAction"]); +//# sourceMappingURL=queue.js.map /***/ }), -/* 145 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 166 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueAction", function() { return QueueAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(167); +/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ - var sv = moment.defineLocale('sv', { - months : 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split('_'), - monthsShort : 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'), - weekdays : 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'), - weekdaysShort : 'sön_mån_tis_ons_tor_fre_lör'.split('_'), - weekdaysMin : 'sö_må_ti_on_to_fr_lö'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY-MM-DD', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY [kl.] HH:mm', - LLLL : 'dddd D MMMM YYYY [kl.] HH:mm', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Idag] LT', - nextDay: '[Imorgon] LT', - lastDay: '[Igår] LT', - nextWeek: '[På] dddd LT', - lastWeek: '[I] dddd[s] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'om %s', - past : 'för %s sedan', - s : 'några sekunder', - ss : '%d sekunder', - m : 'en minut', - mm : '%d minuter', - h : 'en timme', - hh : '%d timmar', - d : 'en dag', - dd : '%d dagar', - M : 'en månad', - MM : '%d månader', - y : 'ett år', - yy : '%d år' - }, - dayOfMonthOrdinalParse: /\d{1,2}(e|a)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'e' : - (b === 1) ? 'a' : - (b === 2) ? 'a' : - (b === 3) ? 'e' : 'e'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +var QueueAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueAction, _super); + function QueueAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; + } + QueueAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - }); - - return sv; + if (delay > 0) { + return _super.prototype.schedule.call(this, state, delay); + } + this.delay = delay; + this.state = state; + this.scheduler.flush(this); + return this; + }; + QueueAction.prototype.execute = function (state, delay) { + return (delay > 0 || this.closed) ? + _super.prototype.execute.call(this, state, delay) : + this._execute(state, delay); + }; + QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + return scheduler.flush(this); + }; + return QueueAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -}))); +//# sourceMappingURL=QueueAction.js.map /***/ }), -/* 146 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 167 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncAction", function() { return AsyncAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(168); +/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */ - var sw = moment.defineLocale('sw', { - months : 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split('_'), - monthsShort : 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'), - weekdays : 'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split('_'), - weekdaysShort : 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'), - weekdaysMin : 'J2_J3_J4_J5_Al_Ij_J1'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[leo saa] LT', - nextDay : '[kesho saa] LT', - nextWeek : '[wiki ijayo] dddd [saat] LT', - lastDay : '[jana] LT', - lastWeek : '[wiki iliyopita] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s baadaye', - past : 'tokea %s', - s : 'hivi punde', - ss : 'sekunde %d', - m : 'dakika moja', - mm : 'dakika %d', - h : 'saa limoja', - hh : 'masaa %d', - d : 'siku moja', - dd : 'masiku %d', - M : 'mwezi mmoja', - MM : 'miezi %d', - y : 'mwaka mmoja', - yy : 'miaka %d' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. +var AsyncAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncAction, _super); + function AsyncAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + _this.pending = false; + return _this; + } + AsyncAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - }); - - return sw; + if (this.closed) { + return this; + } + this.state = state; + var id = this.id; + var scheduler = this.scheduler; + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, delay); + } + this.pending = true; + this.delay = delay; + this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); + return this; + }; + AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + return setInterval(scheduler.flush.bind(scheduler, this), delay); + }; + AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay !== null && this.delay === delay && this.pending === false) { + return id; + } + clearInterval(id); + return undefined; + }; + AsyncAction.prototype.execute = function (state, delay) { + if (this.closed) { + return new Error('executing a cancelled action'); + } + this.pending = false; + var error = this._execute(state, delay); + if (error) { + return error; + } + else if (this.pending === false && this.id != null) { + this.id = this.recycleAsyncId(this.scheduler, this.id, null); + } + }; + AsyncAction.prototype._execute = function (state, delay) { + var errored = false; + var errorValue = undefined; + try { + this.work(state); + } + catch (e) { + errored = true; + errorValue = !!e && e || new Error(e); + } + if (errored) { + this.unsubscribe(); + return errorValue; + } + }; + AsyncAction.prototype._unsubscribe = function () { + var id = this.id; + var scheduler = this.scheduler; + var actions = scheduler.actions; + var index = actions.indexOf(this); + this.work = null; + this.state = null; + this.pending = false; + this.scheduler = null; + if (index !== -1) { + actions.splice(index, 1); + } + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, null); + } + this.delay = null; + }; + return AsyncAction; +}(_Action__WEBPACK_IMPORTED_MODULE_1__["Action"])); -}))); +//# sourceMappingURL=AsyncAction.js.map /***/ }), -/* 147 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 168 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Action", function() { return Action; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ - var symbolMap = { - '1': '௧', - '2': '௨', - '3': '௩', - '4': '௪', - '5': '௫', - '6': '௬', - '7': '௭', - '8': '௮', - '9': '௯', - '0': '௦' - }, numberMap = { - '௧': '1', - '௨': '2', - '௩': '3', - '௪': '4', - '௫': '5', - '௬': '6', - '௭': '7', - '௮': '8', - '௯': '9', - '௦': '0' +var Action = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Action, _super); + function Action(scheduler, work) { + return _super.call(this) || this; + } + Action.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; + } + return this; }; + return Action; +}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); - var ta = moment.defineLocale('ta', { - months : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - monthsShort : 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split('_'), - weekdays : 'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split('_'), - weekdaysShort : 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split('_'), - weekdaysMin : 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, HH:mm', - LLLL : 'dddd, D MMMM YYYY, HH:mm' - }, - calendar : { - sameDay : '[இன்று] LT', - nextDay : '[நாளை] LT', - nextWeek : 'dddd, LT', - lastDay : '[நேற்று] LT', - lastWeek : '[கடந்த வாரம்] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s இல்', - past : '%s முன்', - s : 'ஒரு சில விநாடிகள்', - ss : '%d விநாடிகள்', - m : 'ஒரு நிமிடம்', - mm : '%d நிமிடங்கள்', - h : 'ஒரு மணி நேரம்', - hh : '%d மணி நேரம்', - d : 'ஒரு நாள்', - dd : '%d நாட்கள்', - M : 'ஒரு மாதம்', - MM : '%d மாதங்கள்', - y : 'ஒரு வருடம்', - yy : '%d ஆண்டுகள்' - }, - dayOfMonthOrdinalParse: /\d{1,2}வது/, - ordinal : function (number) { - return number + 'வது'; - }, - preparse: function (string) { - return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) { - return numberMap[match]; - }); - }, - postformat: function (string) { - return string.replace(/\d/g, function (match) { - return symbolMap[match]; - }); - }, - // refer http://ta.wikipedia.org/s/1er1 - meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/, - meridiem : function (hour, minute, isLower) { - if (hour < 2) { - return ' யாமம்'; - } else if (hour < 6) { - return ' வைகறை'; // வைகறை - } else if (hour < 10) { - return ' காலை'; // காலை - } else if (hour < 14) { - return ' நண்பகல்'; // நண்பகல் - } else if (hour < 18) { - return ' எற்பாடு'; // எற்பாடு - } else if (hour < 22) { - return ' மாலை'; // மாலை - } else { - return ' யாமம்'; - } - }, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'யாமம்') { - return hour < 2 ? hour : hour + 12; - } else if (meridiem === 'வைகறை' || meridiem === 'காலை') { - return hour; - } else if (meridiem === 'நண்பகல்') { - return hour >= 10 ? hour : hour + 12; - } else { - return hour + 12; - } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. - } - }); +//# sourceMappingURL=Action.js.map - return ta; -}))); +/***/ }), +/* 169 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueScheduler", function() { return QueueScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -/***/ }), -/* 148 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration +var QueueScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueScheduler, _super); + function QueueScheduler() { + return _super !== null && _super.apply(this, arguments) || this; + } + return QueueScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +//# sourceMappingURL=QueueScheduler.js.map - var te = moment.defineLocale('te', { - months : 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split('_'), - monthsShort : 'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split('_'), - monthsParseExact : true, - weekdays : 'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split('_'), - weekdaysShort : 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'), - weekdaysMin : 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'), - longDateFormat : { - LT : 'A h:mm', - LTS : 'A h:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY, A h:mm', - LLLL : 'dddd, D MMMM YYYY, A h:mm' - }, - calendar : { - sameDay : '[నేడు] LT', - nextDay : '[రేపు] LT', - nextWeek : 'dddd, LT', - lastDay : '[నిన్న] LT', - lastWeek : '[గత] dddd, LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s లో', - past : '%s క్రితం', - s : 'కొన్ని క్షణాలు', - ss : '%d సెకన్లు', - m : 'ఒక నిమిషం', - mm : '%d నిమిషాలు', - h : 'ఒక గంట', - hh : '%d గంటలు', - d : 'ఒక రోజు', - dd : '%d రోజులు', - M : 'ఒక నెల', - MM : '%d నెలలు', - y : 'ఒక సంవత్సరం', - yy : '%d సంవత్సరాలు' - }, - dayOfMonthOrdinalParse : /\d{1,2}వ/, - ordinal : '%dవ', - meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; +/***/ }), +/* 170 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncScheduler", function() { return AsyncScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Scheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); +/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */ + + +var AsyncScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncScheduler, _super); + function AsyncScheduler(SchedulerAction, now) { + if (now === void 0) { + now = _Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"].now; + } + var _this = _super.call(this, SchedulerAction, function () { + if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) { + return AsyncScheduler.delegate.now(); } - if (meridiem === 'రాత్రి') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'ఉదయం') { - return hour; - } else if (meridiem === 'మధ్యాహ్నం') { - return hour >= 10 ? hour : hour + 12; - } else if (meridiem === 'సాయంత్రం') { - return hour + 12; + else { + return now(); } - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'రాత్రి'; - } else if (hour < 10) { - return 'ఉదయం'; - } else if (hour < 17) { - return 'మధ్యాహ్నం'; - } else if (hour < 20) { - return 'సాయంత్రం'; - } else { - return 'రాత్రి'; + }) || this; + _this.actions = []; + _this.active = false; + _this.scheduled = undefined; + return _this; + } + AsyncScheduler.prototype.schedule = function (work, delay, state) { + if (delay === void 0) { + delay = 0; + } + if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) { + return AsyncScheduler.delegate.schedule(work, delay, state); + } + else { + return _super.prototype.schedule.call(this, work, delay, state); + } + }; + AsyncScheduler.prototype.flush = function (action) { + var actions = this.actions; + if (this.active) { + actions.push(action); + return; + } + var error; + this.active = true; + do { + if (error = action.execute(action.state, action.delay)) { + break; } - }, - week : { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 6th is the first week of the year. + } while (action = actions.shift()); + this.active = false; + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); + } + throw error; } - }); + }; + return AsyncScheduler; +}(_Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"])); - return te; +//# sourceMappingURL=AsyncScheduler.js.map -}))); + +/***/ }), +/* 171 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return Scheduler; }); +var Scheduler = /*@__PURE__*/ (function () { + function Scheduler(SchedulerAction, now) { + if (now === void 0) { + now = Scheduler.now; + } + this.SchedulerAction = SchedulerAction; + this.now = now; + } + Scheduler.prototype.schedule = function (work, delay, state) { + if (delay === void 0) { + delay = 0; + } + return new this.SchedulerAction(this, work).schedule(state, delay); + }; + Scheduler.now = function () { return Date.now(); }; + return Scheduler; +}()); + +//# sourceMappingURL=Scheduler.js.map /***/ }), -/* 149 */ -/***/ (function(module, exports, __webpack_require__) { +/* 172 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return observeOn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnOperator", function() { return ObserveOnOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnSubscriber", function() { return ObserveOnSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnMessage", function() { return ObserveOnMessage; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); +/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var tet = moment.defineLocale('tet', { - months : 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split('_'), - monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'), - weekdays : 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'), - weekdaysShort : 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'), - weekdaysMin : 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Ohin iha] LT', - nextDay: '[Aban iha] LT', - nextWeek: 'dddd [iha] LT', - lastDay: '[Horiseik iha] LT', - lastWeek: 'dddd [semana kotuk] [iha] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'iha %s', - past : '%s liuba', - s : 'minutu balun', - ss : 'minutu %d', - m : 'minutu ida', - mm : 'minutu %d', - h : 'oras ida', - hh : 'oras %d', - d : 'loron ida', - dd : 'loron %d', - M : 'fulan ida', - MM : 'fulan %d', - y : 'tinan ida', - yy : 'tinan %d' - }, - dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +function observeOn(scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + return function observeOnOperatorFunction(source) { + return source.lift(new ObserveOnOperator(scheduler, delay)); + }; +} +var ObserveOnOperator = /*@__PURE__*/ (function () { + function ObserveOnOperator(scheduler, delay) { + if (delay === void 0) { + delay = 0; } - }); + this.scheduler = scheduler; + this.delay = delay; + } + ObserveOnOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); + }; + return ObserveOnOperator; +}()); - return tet; +var ObserveOnSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ObserveOnSubscriber, _super); + function ObserveOnSubscriber(destination, scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + var _this = _super.call(this, destination) || this; + _this.scheduler = scheduler; + _this.delay = delay; + return _this; + } + ObserveOnSubscriber.dispatch = function (arg) { + var notification = arg.notification, destination = arg.destination; + notification.observe(destination); + this.unsubscribe(); + }; + ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { + var destination = this.destination; + destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); + }; + ObserveOnSubscriber.prototype._next = function (value) { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + }; + ObserveOnSubscriber.prototype._error = function (err) { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); + this.unsubscribe(); + }; + ObserveOnSubscriber.prototype._complete = function () { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); + this.unsubscribe(); + }; + return ObserveOnSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -}))); +var ObserveOnMessage = /*@__PURE__*/ (function () { + function ObserveOnMessage(notification, destination) { + this.notification = notification; + this.destination = destination; + } + return ObserveOnMessage; +}()); + +//# sourceMappingURL=observeOn.js.map /***/ }), -/* 150 */ -/***/ (function(module, exports, __webpack_require__) { +/* 173 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return NotificationKind; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return Notification; }); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(174); +/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(175); +/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(180); +/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var suffixes = { - 0: '-ум', - 1: '-ум', - 2: '-юм', - 3: '-юм', - 4: '-ум', - 5: '-ум', - 6: '-ум', - 7: '-ум', - 8: '-ум', - 9: '-ум', - 10: '-ум', - 12: '-ум', - 13: '-ум', - 20: '-ум', - 30: '-юм', - 40: '-ум', - 50: '-ум', - 60: '-ум', - 70: '-ум', - 80: '-ум', - 90: '-ум', - 100: '-ум' +var NotificationKind; +/*@__PURE__*/ (function (NotificationKind) { + NotificationKind["NEXT"] = "N"; + NotificationKind["ERROR"] = "E"; + NotificationKind["COMPLETE"] = "C"; +})(NotificationKind || (NotificationKind = {})); +var Notification = /*@__PURE__*/ (function () { + function Notification(kind, value, error) { + this.kind = kind; + this.value = value; + this.error = error; + this.hasValue = kind === 'N'; + } + Notification.prototype.observe = function (observer) { + switch (this.kind) { + case 'N': + return observer.next && observer.next(this.value); + case 'E': + return observer.error && observer.error(this.error); + case 'C': + return observer.complete && observer.complete(); + } }; - - var tg = moment.defineLocale('tg', { - months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), - monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split('_'), - weekdaysShort : 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'), - weekdaysMin : 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[Имрӯз соати] LT', - nextDay : '[Пагоҳ соати] LT', - lastDay : '[Дирӯз соати] LT', - nextWeek : 'dddd[и] [ҳафтаи оянда соати] LT', - lastWeek : 'dddd[и] [ҳафтаи гузашта соати] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'баъди %s', - past : '%s пеш', - s : 'якчанд сония', - m : 'як дақиқа', - mm : '%d дақиқа', - h : 'як соат', - hh : '%d соат', - d : 'як рӯз', - dd : '%d рӯз', - M : 'як моҳ', - MM : '%d моҳ', - y : 'як сол', - yy : '%d сол' - }, - meridiemParse: /шаб|субҳ|рӯз|бегоҳ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === 'шаб') { - return hour < 4 ? hour : hour + 12; - } else if (meridiem === 'субҳ') { - return hour; - } else if (meridiem === 'рӯз') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === 'бегоҳ') { - return hour + 12; - } - }, - meridiem: function (hour, minute, isLower) { - if (hour < 4) { - return 'шаб'; - } else if (hour < 11) { - return 'субҳ'; - } else if (hour < 16) { - return 'рӯз'; - } else if (hour < 19) { - return 'бегоҳ'; - } else { - return 'шаб'; - } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/, - ordinal: function (number) { - var a = number % 10, - b = number >= 100 ? 100 : null; - return number + (suffixes[number] || suffixes[a] || suffixes[b]); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 1th is the first week of the year. + Notification.prototype.do = function (next, error, complete) { + var kind = this.kind; + switch (kind) { + case 'N': + return next && next(this.value); + case 'E': + return error && error(this.error); + case 'C': + return complete && complete(); } - }); + }; + Notification.prototype.accept = function (nextOrObserver, error, complete) { + if (nextOrObserver && typeof nextOrObserver.next === 'function') { + return this.observe(nextOrObserver); + } + else { + return this.do(nextOrObserver, error, complete); + } + }; + Notification.prototype.toObservable = function () { + var kind = this.kind; + switch (kind) { + case 'N': + return Object(_observable_of__WEBPACK_IMPORTED_MODULE_1__["of"])(this.value); + case 'E': + return Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_2__["throwError"])(this.error); + case 'C': + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_0__["empty"])(); + } + throw new Error('unexpected notification kind value'); + }; + Notification.createNext = function (value) { + if (typeof value !== 'undefined') { + return new Notification('N', value); + } + return Notification.undefinedValueNotification; + }; + Notification.createError = function (err) { + return new Notification('E', undefined, err); + }; + Notification.createComplete = function () { + return Notification.completeNotification; + }; + Notification.completeNotification = new Notification('C'); + Notification.undefinedValueNotification = new Notification('N', undefined); + return Notification; +}()); - return tg; +//# sourceMappingURL=Notification.js.map -}))); + +/***/ }), +/* 174 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return EMPTY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ + +var EMPTY = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.complete(); }); +function empty(scheduler) { + return scheduler ? emptyScheduled(scheduler) : EMPTY; +} +function emptyScheduled(scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); }); +} +//# sourceMappingURL=empty.js.map /***/ }), -/* 151 */ -/***/ (function(module, exports, __webpack_require__) { +/* 175 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "of", function() { return of; }); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(176); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(179); +/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_scheduled_scheduleArray PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var th = moment.defineLocale('th', { - months : 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split('_'), - monthsShort : 'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split('_'), - monthsParseExact: true, - weekdays : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'), - weekdaysShort : 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference - weekdaysMin : 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'H:mm', - LTS : 'H:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY เวลา H:mm', - LLLL : 'วันddddที่ D MMMM YYYY เวลา H:mm' - }, - meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/, - isPM: function (input) { - return input === 'หลังเที่ยง'; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'ก่อนเที่ยง'; - } else { - return 'หลังเที่ยง'; - } - }, - calendar : { - sameDay : '[วันนี้ เวลา] LT', - nextDay : '[พรุ่งนี้ เวลา] LT', - nextWeek : 'dddd[หน้า เวลา] LT', - lastDay : '[เมื่อวานนี้ เวลา] LT', - lastWeek : '[วัน]dddd[ที่แล้ว เวลา] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'อีก %s', - past : '%sที่แล้ว', - s : 'ไม่กี่วินาที', - ss : '%d วินาที', - m : '1 นาที', - mm : '%d นาที', - h : '1 ชั่วโมง', - hh : '%d ชั่วโมง', - d : '1 วัน', - dd : '%d วัน', - M : '1 เดือน', - MM : '%d เดือน', - y : '1 ปี', - yy : '%d ปี' - } - }); +function of() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var scheduler = args[args.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_0__["isScheduler"])(scheduler)) { + args.pop(); + return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(args, scheduler); + } + else { + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(args); + } +} +//# sourceMappingURL=of.js.map - return th; -}))); +/***/ }), +/* 176 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isScheduler", function() { return isScheduler; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isScheduler(value) { + return value && typeof value.schedule === 'function'; +} +//# sourceMappingURL=isScheduler.js.map /***/ }), -/* 152 */ -/***/ (function(module, exports, __webpack_require__) { +/* 177 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromArray", function() { return fromArray; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); +/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(179); +/** PURE_IMPORTS_START _Observable,_util_subscribeToArray,_scheduled_scheduleArray PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var tlPh = moment.defineLocale('tl-ph', { - months : 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split('_'), - monthsShort : 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'), - weekdays : 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split('_'), - weekdaysShort : 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'), - weekdaysMin : 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'MM/D/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY HH:mm', - LLLL : 'dddd, MMMM DD, YYYY HH:mm' - }, - calendar : { - sameDay: 'LT [ngayong araw]', - nextDay: '[Bukas ng] LT', - nextWeek: 'LT [sa susunod na] dddd', - lastDay: 'LT [kahapon]', - lastWeek: 'LT [noong nakaraang] dddd', - sameElse: 'L' - }, - relativeTime : { - future : 'sa loob ng %s', - past : '%s ang nakalipas', - s : 'ilang segundo', - ss : '%d segundo', - m : 'isang minuto', - mm : '%d minuto', - h : 'isang oras', - hh : '%d oras', - d : 'isang araw', - dd : '%d araw', - M : 'isang buwan', - MM : '%d buwan', - y : 'isang taon', - yy : '%d taon' - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +function fromArray(input, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__["subscribeToArray"])(input)); + } + else { + return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); + } +} +//# sourceMappingURL=fromArray.js.map - return tlPh; -}))); +/***/ }), +/* 178 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToArray", function() { return subscribeToArray; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var subscribeToArray = function (array) { + return function (subscriber) { + for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) { + subscriber.next(array[i]); + } + subscriber.complete(); + }; +}; +//# sourceMappingURL=subscribeToArray.js.map /***/ }), -/* 153 */ -/***/ (function(module, exports, __webpack_require__) { +/* 179 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleArray", function() { return scheduleArray; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; + +function scheduleArray(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var i = 0; + sub.add(scheduler.schedule(function () { + if (i === input.length) { + subscriber.complete(); + return; + } + subscriber.next(input[i++]); + if (!subscriber.closed) { + sub.add(this.schedule()); + } + })); + return sub; + }); +} +//# sourceMappingURL=scheduleArray.js.map - var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_'); +/***/ }), +/* 180 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - function translateFuture(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'leS' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'waQ' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'nem' : - time + ' pIq'; - return time; - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return throwError; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ - function translatePast(output) { - var time = output; - time = (output.indexOf('jaj') !== -1) ? - time.slice(0, -3) + 'Hu’' : - (output.indexOf('jar') !== -1) ? - time.slice(0, -3) + 'wen' : - (output.indexOf('DIS') !== -1) ? - time.slice(0, -3) + 'ben' : - time + ' ret'; - return time; +function throwError(error, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.error(error); }); } - - function translate(number, withoutSuffix, string, isFuture) { - var numberNoun = numberAsNoun(number); - switch (string) { - case 'ss': - return numberNoun + ' lup'; - case 'mm': - return numberNoun + ' tup'; - case 'hh': - return numberNoun + ' rep'; - case 'dd': - return numberNoun + ' jaj'; - case 'MM': - return numberNoun + ' jar'; - case 'yy': - return numberNoun + ' DIS'; - } + else { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); } +} +function dispatch(_a) { + var error = _a.error, subscriber = _a.subscriber; + subscriber.error(error); +} +//# sourceMappingURL=throwError.js.map - function numberAsNoun(number) { - var hundred = Math.floor((number % 1000) / 100), - ten = Math.floor((number % 100) / 10), - one = number % 10, - word = ''; - if (hundred > 0) { - word += numbersNouns[hundred] + 'vatlh'; + +/***/ }), +/* 181 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return AsyncSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */ + + + +var AsyncSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncSubject, _super); + function AsyncSubject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.value = null; + _this.hasNext = false; + _this.hasCompleted = false; + return _this; + } + AsyncSubject.prototype._subscribe = function (subscriber) { + if (this.hasError) { + subscriber.error(this.thrownError); + return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; } - if (ten > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[ten] + 'maH'; + else if (this.hasCompleted && this.hasNext) { + subscriber.next(this.value); + subscriber.complete(); + return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; } - if (one > 0) { - word += ((word !== '') ? ' ' : '') + numbersNouns[one]; + return _super.prototype._subscribe.call(this, subscriber); + }; + AsyncSubject.prototype.next = function (value) { + if (!this.hasCompleted) { + this.value = value; + this.hasNext = true; } - return (word === '') ? 'pagh' : word; - } - - var tlh = moment.defineLocale('tlh', { - months : 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split('_'), - monthsShort : 'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split('_'), - monthsParseExact : true, - weekdays : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysShort : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - weekdaysMin : 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[DaHjaj] LT', - nextDay: '[wa’leS] LT', - nextWeek: 'LLL', - lastDay: '[wa’Hu’] LT', - lastWeek: 'LLL', - sameElse: 'L' - }, - relativeTime : { - future : translateFuture, - past : translatePast, - s : 'puS lup', - ss : translate, - m : 'wa’ tup', - mm : translate, - h : 'wa’ rep', - hh : translate, - d : 'wa’ jaj', - dd : translate, - M : 'wa’ jar', - MM : translate, - y : 'wa’ DIS', - yy : translate - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + }; + AsyncSubject.prototype.error = function (error) { + if (!this.hasCompleted) { + _super.prototype.error.call(this, error); } - }); - - return tlh; + }; + AsyncSubject.prototype.complete = function () { + this.hasCompleted = true; + if (this.hasNext) { + _super.prototype.next.call(this, this.value); + } + _super.prototype.complete.call(this); + }; + return AsyncSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -}))); +//# sourceMappingURL=AsyncSubject.js.map /***/ }), -/* 154 */ -/***/ (function(module, exports, __webpack_require__) { +/* 182 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asap", function() { return asap; }); +/* harmony import */ var _AsapAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); +/* harmony import */ var _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(185); +/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var suffixes = { - 1: '\'inci', - 5: '\'inci', - 8: '\'inci', - 70: '\'inci', - 80: '\'inci', - 2: '\'nci', - 7: '\'nci', - 20: '\'nci', - 50: '\'nci', - 3: '\'üncü', - 4: '\'üncü', - 100: '\'üncü', - 6: '\'ncı', - 9: '\'uncu', - 10: '\'uncu', - 30: '\'uncu', - 60: '\'ıncı', - 90: '\'ıncı' - }; +var asap = /*@__PURE__*/ new _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__["AsapScheduler"](_AsapAction__WEBPACK_IMPORTED_MODULE_0__["AsapAction"]); +//# sourceMappingURL=asap.js.map - var tr = moment.defineLocale('tr', { - months : 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split('_'), - monthsShort : 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'), - weekdays : 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split('_'), - weekdaysShort : 'Paz_Pts_Sal_Çar_Per_Cum_Cts'.split('_'), - weekdaysMin : 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[bugün saat] LT', - nextDay : '[yarın saat] LT', - nextWeek : '[gelecek] dddd [saat] LT', - lastDay : '[dün] LT', - lastWeek : '[geçen] dddd [saat] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s sonra', - past : '%s önce', - s : 'birkaç saniye', - ss : '%d saniye', - m : 'bir dakika', - mm : '%d dakika', - h : 'bir saat', - hh : '%d saat', - d : 'bir gün', - dd : '%d gün', - M : 'bir ay', - MM : '%d ay', - y : 'bir yıl', - yy : '%d yıl' - }, - ordinal: function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'Do': - case 'DD': - return number; - default: - if (number === 0) { // special case for zero - return number + '\'ıncı'; - } - var a = number % 10, - b = number % 100 - a, - c = number >= 100 ? 100 : null; - return number + (suffixes[a] || suffixes[b] || suffixes[c]); - } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return tr; +/***/ }), +/* 183 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapAction", function() { return AsapAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_Immediate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(184); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(167); +/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */ + + + +var AsapAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapAction, _super); + function AsapAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; + } + AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay !== null && delay > 0) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + scheduler.actions.push(this); + return scheduler.scheduled || (scheduler.scheduled = _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].setImmediate(scheduler.flush.bind(scheduler, null))); + }; + AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); + } + if (scheduler.actions.length === 0) { + _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].clearImmediate(id); + scheduler.scheduled = undefined; + } + return undefined; + }; + return AsapAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_2__["AsyncAction"])); + +//# sourceMappingURL=AsapAction.js.map /***/ }), -/* 155 */ -/***/ (function(module, exports, __webpack_require__) { +/* 184 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Immediate", function() { return Immediate; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var nextHandle = 1; +var tasksByHandle = {}; +function runIfPresent(handle) { + var cb = tasksByHandle[handle]; + if (cb) { + cb(); + } +} +var Immediate = { + setImmediate: function (cb) { + var handle = nextHandle++; + tasksByHandle[handle] = cb; + Promise.resolve().then(function () { return runIfPresent(handle); }); + return handle; + }, + clearImmediate: function (handle) { + delete tasksByHandle[handle]; + }, +}; +//# sourceMappingURL=Immediate.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 185 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapScheduler", function() { return AsapScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ - // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals. - // This is currently too difficult (maybe even impossible) to add. - var tzl = moment.defineLocale('tzl', { - months : 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split('_'), - monthsShort : 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'), - weekdays : 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'), - weekdaysShort : 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'), - weekdaysMin : 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'), - longDateFormat : { - LT : 'HH.mm', - LTS : 'HH.mm.ss', - L : 'DD.MM.YYYY', - LL : 'D. MMMM [dallas] YYYY', - LLL : 'D. MMMM [dallas] YYYY HH.mm', - LLLL : 'dddd, [li] D. MMMM [dallas] YYYY HH.mm' - }, - meridiemParse: /d\'o|d\'a/i, - isPM : function (input) { - return 'd\'o' === input.toLowerCase(); - }, - meridiem : function (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'd\'o' : 'D\'O'; - } else { - return isLower ? 'd\'a' : 'D\'A'; + +var AsapScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapScheduler, _super); + function AsapScheduler() { + return _super !== null && _super.apply(this, arguments) || this; + } + AsapScheduler.prototype.flush = function (action) { + this.active = true; + this.scheduled = undefined; + var actions = this.actions; + var error; + var index = -1; + var count = actions.length; + action = action || actions.shift(); + do { + if (error = action.execute(action.state, action.delay)) { + break; } - }, - calendar : { - sameDay : '[oxhi à] LT', - nextDay : '[demà à] LT', - nextWeek : 'dddd [à] LT', - lastDay : '[ieiri à] LT', - lastWeek : '[sür el] dddd [lasteu à] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'osprei %s', - past : 'ja%s', - s : processRelativeTime, - ss : processRelativeTime, - m : processRelativeTime, - mm : processRelativeTime, - h : processRelativeTime, - hh : processRelativeTime, - d : processRelativeTime, - dd : processRelativeTime, - M : processRelativeTime, - MM : processRelativeTime, - y : processRelativeTime, - yy : processRelativeTime - }, - dayOfMonthOrdinalParse: /\d{1,2}\./, - ordinal : '%d.', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + } while (++index < count && (action = actions.shift())); + this.active = false; + if (error) { + while (++index < count && (action = actions.shift())) { + action.unsubscribe(); + } + throw error; } - }); + }; + return AsapScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); - function processRelativeTime(number, withoutSuffix, key, isFuture) { - var format = { - 's': ['viensas secunds', '\'iensas secunds'], - 'ss': [number + ' secunds', '' + number + ' secunds'], - 'm': ['\'n míut', '\'iens míut'], - 'mm': [number + ' míuts', '' + number + ' míuts'], - 'h': ['\'n þora', '\'iensa þora'], - 'hh': [number + ' þoras', '' + number + ' þoras'], - 'd': ['\'n ziua', '\'iensa ziua'], - 'dd': [number + ' ziuas', '' + number + ' ziuas'], - 'M': ['\'n mes', '\'iens mes'], - 'MM': [number + ' mesen', '' + number + ' mesen'], - 'y': ['\'n ar', '\'iens ar'], - 'yy': [number + ' ars', '' + number + ' ars'] - }; - return isFuture ? format[key][0] : (withoutSuffix ? format[key][0] : format[key][1]); - } +//# sourceMappingURL=AsapScheduler.js.map - return tzl; -}))); +/***/ }), +/* 186 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "async", function() { return async; }); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(167); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -/***/ }), -/* 156 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration +var async = /*@__PURE__*/ new _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"](_AsyncAction__WEBPACK_IMPORTED_MODULE_0__["AsyncAction"]); +//# sourceMappingURL=async.js.map -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/***/ }), +/* 187 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var tzm = moment.defineLocale('tzm', { - months : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - monthsShort : 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split('_'), - weekdays : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysShort : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - weekdaysMin : 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS: 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[ⴰⵙⴷⵅ ⴴ] LT', - nextDay: '[ⴰⵙⴽⴰ ⴴ] LT', - nextWeek: 'dddd [ⴴ] LT', - lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT', - lastWeek: 'dddd [ⴴ] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s', - past : 'ⵢⴰⵏ %s', - s : 'ⵉⵎⵉⴽ', - ss : '%d ⵉⵎⵉⴽ', - m : 'ⵎⵉⵏⵓⴺ', - mm : '%d ⵎⵉⵏⵓⴺ', - h : 'ⵙⴰⵄⴰ', - hh : '%d ⵜⴰⵙⵙⴰⵄⵉⵏ', - d : 'ⴰⵙⵙ', - dd : '%d oⵙⵙⴰⵏ', - M : 'ⴰⵢoⵓⵔ', - MM : '%d ⵉⵢⵢⵉⵔⵏ', - y : 'ⴰⵙⴳⴰⵙ', - yy : '%d ⵉⵙⴳⴰⵙⵏ' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. - } - }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animationFrame", function() { return animationFrame; }); +/* harmony import */ var _AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(188); +/* harmony import */ var _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(189); +/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */ - return tzm; -}))); +var animationFrame = /*@__PURE__*/ new _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__["AnimationFrameScheduler"](_AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__["AnimationFrameAction"]); +//# sourceMappingURL=animationFrame.js.map /***/ }), -/* 157 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 188 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameAction", function() { return AnimationFrameAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(167); +/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ - var tzmLatn = moment.defineLocale('tzm-latn', { - months : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - monthsShort : 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split('_'), - weekdays : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysShort : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - weekdaysMin : 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd D MMMM YYYY HH:mm' - }, - calendar : { - sameDay: '[asdkh g] LT', - nextDay: '[aska g] LT', - nextWeek: 'dddd [g] LT', - lastDay: '[assant g] LT', - lastWeek: 'dddd [g] LT', - sameElse: 'L' - }, - relativeTime : { - future : 'dadkh s yan %s', - past : 'yan %s', - s : 'imik', - ss : '%d imik', - m : 'minuḍ', - mm : '%d minuḍ', - h : 'saɛa', - hh : '%d tassaɛin', - d : 'ass', - dd : '%d ossan', - M : 'ayowr', - MM : '%d iyyirn', - y : 'asgas', - yy : '%d isgasn' - }, - week : { - dow : 6, // Saturday is the first day of the week. - doy : 12 // The week that contains Jan 12th is the first week of the year. +var AnimationFrameAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameAction, _super); + function AnimationFrameAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; + } + AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; } - }); - - return tzmLatn; + if (delay !== null && delay > 0) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + scheduler.actions.push(this); + return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); })); + }; + AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); + } + if (scheduler.actions.length === 0) { + cancelAnimationFrame(id); + scheduler.scheduled = undefined; + } + return undefined; + }; + return AnimationFrameAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -}))); +//# sourceMappingURL=AnimationFrameAction.js.map /***/ }), -/* 158 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js language configuration +/* 189 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameScheduler", function() { return AnimationFrameScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ - var ugCn = moment.defineLocale('ug-cn', { - months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( - '_' - ), - monthsShort: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split( - '_' - ), - weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split( - '_' - ), - weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), - weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'), - longDateFormat: { - LT: 'HH:mm', - LTS: 'HH:mm:ss', - L: 'YYYY-MM-DD', - LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى', - LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', - LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm' - }, - meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; +var AnimationFrameScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameScheduler, _super); + function AnimationFrameScheduler() { + return _super !== null && _super.apply(this, arguments) || this; + } + AnimationFrameScheduler.prototype.flush = function (action) { + this.active = true; + this.scheduled = undefined; + var actions = this.actions; + var error; + var index = -1; + var count = actions.length; + action = action || actions.shift(); + do { + if (error = action.execute(action.state, action.delay)) { + break; } - if ( - meridiem === 'يېرىم كېچە' || - meridiem === 'سەھەر' || - meridiem === 'چۈشتىن بۇرۇن' - ) { - return hour; - } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') { - return hour + 12; - } else { - return hour >= 11 ? hour : hour + 12; + } while (++index < count && (action = actions.shift())); + this.active = false; + if (error) { + while (++index < count && (action = actions.shift())) { + action.unsubscribe(); } - }, - meridiem: function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return 'يېرىم كېچە'; - } else if (hm < 900) { - return 'سەھەر'; - } else if (hm < 1130) { - return 'چۈشتىن بۇرۇن'; - } else if (hm < 1230) { - return 'چۈش'; - } else if (hm < 1800) { - return 'چۈشتىن كېيىن'; - } else { - return 'كەچ'; - } - }, - calendar: { - sameDay: '[بۈگۈن سائەت] LT', - nextDay: '[ئەتە سائەت] LT', - nextWeek: '[كېلەركى] dddd [سائەت] LT', - lastDay: '[تۆنۈگۈن] LT', - lastWeek: '[ئالدىنقى] dddd [سائەت] LT', - sameElse: 'L' - }, - relativeTime: { - future: '%s كېيىن', - past: '%s بۇرۇن', - s: 'نەچچە سېكونت', - ss: '%d سېكونت', - m: 'بىر مىنۇت', - mm: '%d مىنۇت', - h: 'بىر سائەت', - hh: '%d سائەت', - d: 'بىر كۈن', - dd: '%d كۈن', - M: 'بىر ئاي', - MM: '%d ئاي', - y: 'بىر يىل', - yy: '%d يىل' - }, - - dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/, - ordinal: function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '-كۈنى'; - case 'w': - case 'W': - return number + '-ھەپتە'; - default: - return number; - } - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week: { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow: 1, // Monday is the first day of the week. - doy: 7 // The week that contains Jan 1st is the first week of the year. + throw error; } - }); - - return ugCn; + }; + return AnimationFrameScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -}))); +//# sourceMappingURL=AnimationFrameScheduler.js.map /***/ }), -/* 159 */ -/***/ (function(module, exports, __webpack_require__) { +/* 190 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -//! moment.js locale configuration +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return VirtualTimeScheduler; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return VirtualAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(167); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); +/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - function plural(word, num) { - var forms = word.split('_'); - return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); - } - function relativeTimeWithPlural(number, withoutSuffix, key) { - var format = { - 'ss': withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд', - 'mm': withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин', - 'hh': withoutSuffix ? 'година_години_годин' : 'годину_години_годин', - 'dd': 'день_дні_днів', - 'MM': 'місяць_місяці_місяців', - 'yy': 'рік_роки_років' - }; - if (key === 'm') { - return withoutSuffix ? 'хвилина' : 'хвилину'; - } - else if (key === 'h') { - return withoutSuffix ? 'година' : 'годину'; +var VirtualTimeScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualTimeScheduler, _super); + function VirtualTimeScheduler(SchedulerAction, maxFrames) { + if (SchedulerAction === void 0) { + SchedulerAction = VirtualAction; } - else { - return number + ' ' + plural(format[key], +number); + if (maxFrames === void 0) { + maxFrames = Number.POSITIVE_INFINITY; } + var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this; + _this.maxFrames = maxFrames; + _this.frame = 0; + _this.index = -1; + return _this; } - function weekdaysCaseReplace(m, format) { - var weekdays = { - 'nominative': 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), - 'accusative': 'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split('_'), - 'genitive': 'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split('_') - }; - - if (m === true) { - return weekdays['nominative'].slice(1, 7).concat(weekdays['nominative'].slice(0, 1)); + VirtualTimeScheduler.prototype.flush = function () { + var _a = this, actions = _a.actions, maxFrames = _a.maxFrames; + var error, action; + while ((action = actions[0]) && action.delay <= maxFrames) { + actions.shift(); + this.frame = action.delay; + if (error = action.execute(action.state, action.delay)) { + break; + } } - if (!m) { - return weekdays['nominative']; + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); + } + throw error; } + }; + VirtualTimeScheduler.frameTimeFactor = 10; + return VirtualTimeScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__["AsyncScheduler"])); - var nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? - 'accusative' : - ((/\[?(?:минулої|наступної)? ?\] ?dddd/).test(format) ? - 'genitive' : - 'nominative'); - return weekdays[nounCase][m.day()]; - } - function processHoursFunction(str) { - return function () { - return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; - }; +var VirtualAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualAction, _super); + function VirtualAction(scheduler, work, index) { + if (index === void 0) { + index = scheduler.index += 1; + } + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + _this.index = index; + _this.active = true; + _this.index = scheduler.index = index; + return _this; } - - var uk = moment.defineLocale('uk', { - months : { - 'format': 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_'), - 'standalone': 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') - }, - monthsShort : 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), - weekdays : weekdaysCaseReplace, - weekdaysShort : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - weekdaysMin : 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD.MM.YYYY', - LL : 'D MMMM YYYY р.', - LLL : 'D MMMM YYYY р., HH:mm', - LLLL : 'dddd, D MMMM YYYY р., HH:mm' - }, - calendar : { - sameDay: processHoursFunction('[Сьогодні '), - nextDay: processHoursFunction('[Завтра '), - lastDay: processHoursFunction('[Вчора '), - nextWeek: processHoursFunction('[У] dddd ['), - lastWeek: function () { - switch (this.day()) { - case 0: - case 3: - case 5: - case 6: - return processHoursFunction('[Минулої] dddd [').call(this); - case 1: - case 2: - case 4: - return processHoursFunction('[Минулого] dddd [').call(this); - } - }, - sameElse: 'L' - }, - relativeTime : { - future : 'за %s', - past : '%s тому', - s : 'декілька секунд', - ss : relativeTimeWithPlural, - m : relativeTimeWithPlural, - mm : relativeTimeWithPlural, - h : 'годину', - hh : relativeTimeWithPlural, - d : 'день', - dd : relativeTimeWithPlural, - M : 'місяць', - MM : relativeTimeWithPlural, - y : 'рік', - yy : relativeTimeWithPlural - }, - // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason - meridiemParse: /ночі|ранку|дня|вечора/, - isPM: function (input) { - return /^(дня|вечора)$/.test(input); - }, - meridiem : function (hour, minute, isLower) { - if (hour < 4) { - return 'ночі'; - } else if (hour < 12) { - return 'ранку'; - } else if (hour < 17) { - return 'дня'; - } else { - return 'вечора'; + VirtualAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; + } + if (!this.id) { + return _super.prototype.schedule.call(this, state, delay); + } + this.active = false; + var action = new VirtualAction(this.scheduler, this.work); + this.add(action); + return action.schedule(state, delay); + }; + VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + this.delay = scheduler.frame + delay; + var actions = scheduler.actions; + actions.push(this); + actions.sort(VirtualAction.sortActions); + return true; + }; + VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + return undefined; + }; + VirtualAction.prototype._execute = function (state, delay) { + if (this.active === true) { + return _super.prototype._execute.call(this, state, delay); + } + }; + VirtualAction.sortActions = function (a, b) { + if (a.delay === b.delay) { + if (a.index === b.index) { + return 0; } - }, - dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/, - ordinal: function (number, period) { - switch (period) { - case 'M': - case 'd': - case 'DDD': - case 'w': - case 'W': - return number + '-й'; - case 'D': - return number + '-го'; - default: - return number; + else if (a.index > b.index) { + return 1; + } + else { + return -1; } - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. } - }); - - return uk; + else if (a.delay > b.delay) { + return 1; + } + else { + return -1; + } + }; + return VirtualAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -}))); +//# sourceMappingURL=VirtualTimeScheduler.js.map /***/ }), -/* 160 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* 191 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function identity(x) { + return x; +} +//# sourceMappingURL=identity.js.map - var months = [ - 'جنوری', - 'فروری', - 'مارچ', - 'اپریل', - 'مئی', - 'جون', - 'جولائی', - 'اگست', - 'ستمبر', - 'اکتوبر', - 'نومبر', - 'دسمبر' - ]; - var days = [ - 'اتوار', - 'پیر', - 'منگل', - 'بدھ', - 'جمعرات', - 'جمعہ', - 'ہفتہ' - ]; - var ur = moment.defineLocale('ur', { - months : months, - monthsShort : months, - weekdays : days, - weekdaysShort : days, - weekdaysMin : days, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd، D MMMM YYYY HH:mm' - }, - meridiemParse: /صبح|شام/, - isPM : function (input) { - return 'شام' === input; - }, - meridiem : function (hour, minute, isLower) { - if (hour < 12) { - return 'صبح'; - } - return 'شام'; - }, - calendar : { - sameDay : '[آج بوقت] LT', - nextDay : '[کل بوقت] LT', - nextWeek : 'dddd [بوقت] LT', - lastDay : '[گذشتہ روز بوقت] LT', - lastWeek : '[گذشتہ] dddd [بوقت] LT', - sameElse : 'L' - }, - relativeTime : { - future : '%s بعد', - past : '%s قبل', - s : 'چند سیکنڈ', - ss : '%d سیکنڈ', - m : 'ایک منٹ', - mm : '%d منٹ', - h : 'ایک گھنٹہ', - hh : '%d گھنٹے', - d : 'ایک دن', - dd : '%d دن', - M : 'ایک ماہ', - MM : '%d ماہ', - y : 'ایک سال', - yy : '%d سال' - }, - preparse: function (string) { - return string.replace(/،/g, ','); - }, - postformat: function (string) { - return string.replace(/,/g, '،'); - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); +/***/ }), +/* 192 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return ur; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return isObservable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -}))); +function isObservable(obj) { + return !!obj && (obj instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function')); +} +//# sourceMappingURL=isObservable.js.map /***/ }), -/* 161 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* 193 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return ArgumentOutOfRangeError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var ArgumentOutOfRangeErrorImpl = /*@__PURE__*/ (function () { + function ArgumentOutOfRangeErrorImpl() { + Error.call(this); + this.message = 'argument out of range'; + this.name = 'ArgumentOutOfRangeError'; + return this; + } + ArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return ArgumentOutOfRangeErrorImpl; +})(); +var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl; +//# sourceMappingURL=ArgumentOutOfRangeError.js.map - var uz = moment.defineLocale('uz', { - months : 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split('_'), - monthsShort : 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'), - weekdays : 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'), - weekdaysShort : 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'), - weekdaysMin : 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'D MMMM YYYY, dddd HH:mm' - }, - calendar : { - sameDay : '[Бугун соат] LT [да]', - nextDay : '[Эртага] LT [да]', - nextWeek : 'dddd [куни соат] LT [да]', - lastDay : '[Кеча соат] LT [да]', - lastWeek : '[Утган] dddd [куни соат] LT [да]', - sameElse : 'L' - }, - relativeTime : { - future : 'Якин %s ичида', - past : 'Бир неча %s олдин', - s : 'фурсат', - ss : '%d фурсат', - m : 'бир дакика', - mm : '%d дакика', - h : 'бир соат', - hh : '%d соат', - d : 'бир кун', - dd : '%d кун', - M : 'бир ой', - MM : '%d ой', - y : 'бир йил', - yy : '%d йил' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 4th is the first week of the year. - } - }); - return uz; +/***/ }), +/* 194 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return EmptyError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var EmptyErrorImpl = /*@__PURE__*/ (function () { + function EmptyErrorImpl() { + Error.call(this); + this.message = 'no elements in sequence'; + this.name = 'EmptyError'; + return this; + } + EmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return EmptyErrorImpl; +})(); +var EmptyError = EmptyErrorImpl; +//# sourceMappingURL=EmptyError.js.map /***/ }), -/* 162 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +/* 195 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var TimeoutErrorImpl = /*@__PURE__*/ (function () { + function TimeoutErrorImpl() { + Error.call(this); + this.message = 'Timeout has occurred'; + this.name = 'TimeoutError'; + return this; + } + TimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return TimeoutErrorImpl; +})(); +var TimeoutError = TimeoutErrorImpl; +//# sourceMappingURL=TimeoutError.js.map - var uzLatn = moment.defineLocale('uz-latn', { - months : 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split('_'), - monthsShort : 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'), - weekdays : 'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split('_'), - weekdaysShort : 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'), - weekdaysMin : 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'D MMMM YYYY, dddd HH:mm' - }, - calendar : { - sameDay : '[Bugun soat] LT [da]', - nextDay : '[Ertaga] LT [da]', - nextWeek : 'dddd [kuni soat] LT [da]', - lastDay : '[Kecha soat] LT [da]', - lastWeek : '[O\'tgan] dddd [kuni soat] LT [da]', - sameElse : 'L' - }, - relativeTime : { - future : 'Yaqin %s ichida', - past : 'Bir necha %s oldin', - s : 'soniya', - ss : '%d soniya', - m : 'bir daqiqa', - mm : '%d daqiqa', - h : 'bir soat', - hh : '%d soat', - d : 'bir kun', - dd : '%d kun', - M : 'bir oy', - MM : '%d oy', - y : 'bir yil', - yy : '%d yil' - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 7 // The week that contains Jan 7th is the first week of the year. - } - }); - return uzLatn; +/***/ }), +/* 196 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return bindCallback; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(197); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(142); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(149); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(176); +/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */ -/***/ }), -/* 163 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var vi = moment.defineLocale('vi', { - months : 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split('_'), - monthsShort : 'Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12'.split('_'), - monthsParseExact : true, - weekdays : 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split('_'), - weekdaysShort : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysMin : 'CN_T2_T3_T4_T5_T6_T7'.split('_'), - weekdaysParseExact : true, - meridiemParse: /sa|ch/i, - isPM : function (input) { - return /^ch$/i.test(input); - }, - meridiem : function (hours, minutes, isLower) { - if (hours < 12) { - return isLower ? 'sa' : 'SA'; - } else { - return isLower ? 'ch' : 'CH'; +function bindCallback(callbackFunc, resultSelector, scheduler) { + if (resultSelector) { + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(resultSelector)) { + scheduler = resultSelector; + } + else { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_4__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + }; + } + } + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var context = this; + var subject; + var params = { + context: context, + subject: subject, + callbackFunc: callbackFunc, + scheduler: scheduler, + }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + if (!scheduler) { + if (!subject) { + subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); + subject.complete(); + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { + subject.error(err); + } + else { + console.warn(err); + } + } + } + return subject.subscribe(subscriber); } - }, - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'DD/MM/YYYY', - LL : 'D MMMM [năm] YYYY', - LLL : 'D MMMM [năm] YYYY HH:mm', - LLLL : 'dddd, D MMMM [năm] YYYY HH:mm', - l : 'DD/M/YYYY', - ll : 'D MMM YYYY', - lll : 'D MMM YYYY HH:mm', - llll : 'ddd, D MMM YYYY HH:mm' - }, - calendar : { - sameDay: '[Hôm nay lúc] LT', - nextDay: '[Ngày mai lúc] LT', - nextWeek: 'dddd [tuần tới lúc] LT', - lastDay: '[Hôm qua lúc] LT', - lastWeek: 'dddd [tuần rồi lúc] LT', - sameElse: 'L' - }, - relativeTime : { - future : '%s tới', - past : '%s trước', - s : 'vài giây', - ss : '%d giây' , - m : 'một phút', - mm : '%d phút', - h : 'một giờ', - hh : '%d giờ', - d : 'một ngày', - dd : '%d ngày', - M : 'một tháng', - MM : '%d tháng', - y : 'một năm', - yy : '%d năm' - }, - dayOfMonthOrdinalParse: /\d{1,2}/, - ordinal : function (number) { - return number; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + else { + var state = { + args: args, subscriber: subscriber, params: params, + }; + return scheduler.schedule(dispatch, 0, state); + } + }); + }; +} +function dispatch(state) { + var _this = this; + var self = this; + var args = state.args, subscriber = state.subscriber, params = state.params; + var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler; + var subject = params.subject; + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; + _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); + }; + try { + callbackFunc.apply(context, args.concat([handler])); } - }); - - return vi; - -}))); + catch (err) { + subject.error(err); + } + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(state) { + var value = state.value, subject = state.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(state) { + var err = state.err, subject = state.subject; + subject.error(err); +} +//# sourceMappingURL=bindCallback.js.map /***/ }), -/* 164 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration +/* 197 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapOperator", function() { return MapOperator; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - var xPseudo = moment.defineLocale('x-pseudo', { - months : 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split('_'), - monthsShort : 'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split('_'), - monthsParseExact : true, - weekdays : 'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split('_'), - weekdaysShort : 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'), - weekdaysMin : 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'), - weekdaysParseExact : true, - longDateFormat : { - LT : 'HH:mm', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY HH:mm', - LLLL : 'dddd, D MMMM YYYY HH:mm' - }, - calendar : { - sameDay : '[T~ódá~ý át] LT', - nextDay : '[T~ómó~rró~w át] LT', - nextWeek : 'dddd [át] LT', - lastDay : '[Ý~ést~érdá~ý át] LT', - lastWeek : '[L~ást] dddd [át] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'í~ñ %s', - past : '%s á~gó', - s : 'á ~féw ~sécó~ñds', - ss : '%d s~écóñ~ds', - m : 'á ~míñ~úté', - mm : '%d m~íñú~tés', - h : 'á~ñ hó~úr', - hh : '%d h~óúrs', - d : 'á ~dáý', - dd : '%d d~áýs', - M : 'á ~móñ~th', - MM : '%d m~óñt~hs', - y : 'á ~ýéár', - yy : '%d ý~éárs' - }, - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (~~(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - }, - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. +function map(project, thisArg) { + return function mapOperation(source) { + if (typeof project !== 'function') { + throw new TypeError('argument is not a function. Are you looking for `mapTo()`?'); } - }); - - return xPseudo; + return source.lift(new MapOperator(project, thisArg)); + }; +} +var MapOperator = /*@__PURE__*/ (function () { + function MapOperator(project, thisArg) { + this.project = project; + this.thisArg = thisArg; + } + MapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); + }; + return MapOperator; +}()); -}))); +var MapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapSubscriber, _super); + function MapSubscriber(destination, project, thisArg) { + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.count = 0; + _this.thisArg = thisArg || _this; + return _this; + } + MapSubscriber.prototype._next = function (value) { + var result; + try { + result = this.project.call(this.thisArg, value, this.count++); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return MapSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=map.js.map /***/ }), -/* 165 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var yo = moment.defineLocale('yo', { - months : 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split('_'), - monthsShort : 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'), - weekdays : 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'), - weekdaysShort : 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'), - weekdaysMin : 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'), - longDateFormat : { - LT : 'h:mm A', - LTS : 'h:mm:ss A', - L : 'DD/MM/YYYY', - LL : 'D MMMM YYYY', - LLL : 'D MMMM YYYY h:mm A', - LLLL : 'dddd, D MMMM YYYY h:mm A' - }, - calendar : { - sameDay : '[Ònì ni] LT', - nextDay : '[Ọ̀la ni] LT', - nextWeek : 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', - lastDay : '[Àna ni] LT', - lastWeek : 'dddd [Ọsẹ̀ tólọ́] [ni] LT', - sameElse : 'L' - }, - relativeTime : { - future : 'ní %s', - past : '%s kọjá', - s : 'ìsẹjú aayá die', - ss :'aayá %d', - m : 'ìsẹjú kan', - mm : 'ìsẹjú %d', - h : 'wákati kan', - hh : 'wákati %d', - d : 'ọjọ́ kan', - dd : 'ọjọ́ %d', - M : 'osù kan', - MM : 'osù %d', - y : 'ọdún kan', - yy : 'ọdún %d' - }, - dayOfMonthOrdinalParse : /ọjọ́\s\d{1,2}/, - ordinal : 'ọjọ́ %d', - week : { - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. - } - }); - - return yo; +/* 198 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -}))); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return bindNodeCallback; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(197); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(142); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(176); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(149); +/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */ -/***/ }), -/* 166 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - var zhCn = moment.defineLocale('zh-cn', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日Ah点mm分', - LLLL : 'YYYY年M月D日ddddAh点mm分', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour: function (hour, meridiem) { - if (hour === 12) { - hour = 0; +function bindNodeCallback(callbackFunc, resultSelector, scheduler) { + if (resultSelector) { + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_4__["isScheduler"])(resultSelector)) { + scheduler = resultSelector; + } + else { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_5__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + }; + } + } + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var params = { + subject: undefined, + args: args, + callbackFunc: callbackFunc, + scheduler: scheduler, + context: this, + }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var context = params.context; + var subject = params.subject; + if (!scheduler) { + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + var err = innerArgs.shift(); + if (err) { + subject.error(err); + return; + } + subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); + subject.complete(); + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { + subject.error(err); + } + else { + console.warn(err); + } + } + } + return subject.subscribe(subscriber); } - if (meridiem === '凌晨' || meridiem === '早上' || - meridiem === '上午') { - return hour; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } else { - // '中午' - return hour >= 11 ? hour : hour + 12; + else { + return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context }); } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; + }); + }; +} +function dispatch(state) { + var _this = this; + var params = state.params, subscriber = state.subscriber, context = state.context; + var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler; + var subject = params.subject; + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/, - ordinal : function (number, period) { - switch (period) { - case 'd': - case 'D': - case 'DDD': - return number + '日'; - case 'M': - return number + '月'; - case 'w': - case 'W': - return number + '周'; - default: - return number; + var err = innerArgs.shift(); + if (err) { + _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); } - }, - relativeTime : { - future : '%s内', - past : '%s前', - s : '几秒', - ss : '%d 秒', - m : '1 分钟', - mm : '%d 分钟', - h : '1 小时', - hh : '%d 小时', - d : '1 天', - dd : '%d 天', - M : '1 个月', - MM : '%d 个月', - y : '1 年', - yy : '%d 年' - }, - week : { - // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 - dow : 1, // Monday is the first day of the week. - doy : 4 // The week that contains Jan 4th is the first week of the year. + else { + var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; + _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); + } + }; + try { + callbackFunc.apply(context, args.concat([handler])); } - }); - - return zhCn; - -}))); + catch (err) { + this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); + } + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(arg) { + var value = arg.value, subject = arg.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(arg) { + var err = arg.err, subject = arg.subject; + subject.error(err); +} +//# sourceMappingURL=bindNodeCallback.js.map /***/ }), -/* 167 */ -/***/ (function(module, exports, __webpack_require__) { - -//! moment.js locale configuration - -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; - - - var zhHk = moment.defineLocale('zh-hk', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日dddd HH:mm', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; - } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; - } - }, - calendar : { - sameDay : '[今天]LT', - nextDay : '[明天]LT', - nextWeek : '[下]ddddLT', - lastDay : '[昨天]LT', - lastWeek : '[上]ddddLT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; - } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - ss : '%d 秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' - } - }); +/* 199 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return zhHk; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestOperator", function() { return CombineLatestOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestSubscriber", function() { return CombineLatestSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(177); +/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */ -}))); -/***/ }), -/* 168 */ -/***/ (function(module, exports, __webpack_require__) { -//! moment.js locale configuration -;(function (global, factory) { - true ? factory(__webpack_require__(40)) : - undefined -}(this, (function (moment) { 'use strict'; +var NONE = {}; +function combineLatest() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var resultSelector = null; + var scheduler = null; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(observables[observables.length - 1])) { + scheduler = observables.pop(); + } + if (typeof observables[observables.length - 1] === 'function') { + resultSelector = observables.pop(); + } + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(observables[0])) { + observables = observables[0]; + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_5__["fromArray"])(observables, scheduler).lift(new CombineLatestOperator(resultSelector)); +} +var CombineLatestOperator = /*@__PURE__*/ (function () { + function CombineLatestOperator(resultSelector) { + this.resultSelector = resultSelector; + } + CombineLatestOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector)); + }; + return CombineLatestOperator; +}()); - var zhTw = moment.defineLocale('zh-tw', { - months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'), - monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'), - weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'), - weekdaysShort : '週日_週一_週二_週三_週四_週五_週六'.split('_'), - weekdaysMin : '日_一_二_三_四_五_六'.split('_'), - longDateFormat : { - LT : 'HH:mm', - LTS : 'HH:mm:ss', - L : 'YYYY/MM/DD', - LL : 'YYYY年M月D日', - LLL : 'YYYY年M月D日 HH:mm', - LLLL : 'YYYY年M月D日dddd HH:mm', - l : 'YYYY/M/D', - ll : 'YYYY年M月D日', - lll : 'YYYY年M月D日 HH:mm', - llll : 'YYYY年M月D日dddd HH:mm' - }, - meridiemParse: /凌晨|早上|上午|中午|下午|晚上/, - meridiemHour : function (hour, meridiem) { - if (hour === 12) { - hour = 0; - } - if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') { - return hour; - } else if (meridiem === '中午') { - return hour >= 11 ? hour : hour + 12; - } else if (meridiem === '下午' || meridiem === '晚上') { - return hour + 12; +var CombineLatestSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CombineLatestSubscriber, _super); + function CombineLatestSubscriber(destination, resultSelector) { + var _this = _super.call(this, destination) || this; + _this.resultSelector = resultSelector; + _this.active = 0; + _this.values = []; + _this.observables = []; + return _this; + } + CombineLatestSubscriber.prototype._next = function (observable) { + this.values.push(NONE); + this.observables.push(observable); + }; + CombineLatestSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { + this.destination.complete(); + } + else { + this.active = len; + this.toRespond = len; + for (var i = 0; i < len; i++) { + var observable = observables[i]; + this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i)); } - }, - meridiem : function (hour, minute, isLower) { - var hm = hour * 100 + minute; - if (hm < 600) { - return '凌晨'; - } else if (hm < 900) { - return '早上'; - } else if (hm < 1130) { - return '上午'; - } else if (hm < 1230) { - return '中午'; - } else if (hm < 1800) { - return '下午'; - } else { - return '晚上'; + } + }; + CombineLatestSubscriber.prototype.notifyComplete = function (unused) { + if ((this.active -= 1) === 0) { + this.destination.complete(); + } + }; + CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var values = this.values; + var oldVal = values[outerIndex]; + var toRespond = !this.toRespond + ? 0 + : oldVal === NONE ? --this.toRespond : this.toRespond; + values[outerIndex] = innerValue; + if (toRespond === 0) { + if (this.resultSelector) { + this._tryResultSelector(values); } - }, - calendar : { - sameDay : '[今天] LT', - nextDay : '[明天] LT', - nextWeek : '[下]dddd LT', - lastDay : '[昨天] LT', - lastWeek : '[上]dddd LT', - sameElse : 'L' - }, - dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/, - ordinal : function (number, period) { - switch (period) { - case 'd' : - case 'D' : - case 'DDD' : - return number + '日'; - case 'M' : - return number + '月'; - case 'w' : - case 'W' : - return number + '週'; - default : - return number; + else { + this.destination.next(values.slice()); } - }, - relativeTime : { - future : '%s內', - past : '%s前', - s : '幾秒', - ss : '%d 秒', - m : '1 分鐘', - mm : '%d 分鐘', - h : '1 小時', - hh : '%d 小時', - d : '1 天', - dd : '%d 天', - M : '1 個月', - MM : '%d 個月', - y : '1 年', - yy : '%d 年' } - }); - - return zhTw; + }; + CombineLatestSubscriber.prototype._tryResultSelector = function (values) { + var result; + try { + result = this.resultSelector.apply(this, values); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return CombineLatestSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -}))); +//# sourceMappingURL=combineLatest.js.map /***/ }), -/* 169 */ +/* 200 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return _internal_Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]; }); - -/* harmony import */ var _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__["ConnectableObservable"]; }); - -/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(191); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__["GroupedObservable"]; }); - -/* harmony import */ var _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(183); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__["observable"]; }); - -/* harmony import */ var _internal_Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(187); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _internal_Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]; }); - -/* harmony import */ var _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(192); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__["BehaviorSubject"]; }); - -/* harmony import */ var _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(193); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__["ReplaySubject"]; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OuterSubscriber", function() { return OuterSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -/* harmony import */ var _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(210); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__["AsyncSubject"]; }); -/* harmony import */ var _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(211); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__["asap"]; }); +var OuterSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OuterSubscriber, _super); + function OuterSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + OuterSubscriber.prototype.notifyError = function (error, innerSub) { + this.destination.error(error); + }; + OuterSubscriber.prototype.notifyComplete = function (innerSub) { + this.destination.complete(); + }; + return OuterSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -/* harmony import */ var _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(215); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asyncScheduler", function() { return _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__["async"]; }); +//# sourceMappingURL=OuterSubscriber.js.map -/* harmony import */ var _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(194); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "queueScheduler", function() { return _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__["queue"]; }); -/* harmony import */ var _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(216); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "animationFrameScheduler", function() { return _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__["animationFrame"]; }); +/***/ }), +/* 201 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(219); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualTimeScheduler"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToResult", function() { return subscribeToResult; }); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(202); +/* harmony import */ var _subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo,_Observable PURE_IMPORTS_END */ -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualAction"]; }); -/* harmony import */ var _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(200); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__["Scheduler"]; }); -/* harmony import */ var _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(177); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__["Subscription"]; }); +function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { + if (destination === void 0) { + destination = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__["InnerSubscriber"](outerSubscriber, outerValue, outerIndex); + } + if (destination.closed) { + return undefined; + } + if (result instanceof _Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"]) { + return result.subscribe(destination); + } + return Object(_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(result)(destination); +} +//# sourceMappingURL=subscribeToResult.js.map -/* harmony import */ var _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(172); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__["Subscriber"]; }); -/* harmony import */ var _internal_Notification__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(202); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["Notification"]; }); +/***/ }), +/* 202 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["NotificationKind"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InnerSubscriber", function() { return InnerSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -/* harmony import */ var _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(184); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__["pipe"]; }); -/* harmony import */ var _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(185); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__["noop"]; }); +var InnerSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerSubscriber, _super); + function InnerSubscriber(parent, outerValue, outerIndex) { + var _this = _super.call(this) || this; + _this.parent = parent; + _this.outerValue = outerValue; + _this.outerIndex = outerIndex; + _this.index = 0; + return _this; + } + InnerSubscriber.prototype._next = function (value) { + this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); + }; + InnerSubscriber.prototype._error = function (error) { + this.parent.notifyError(error, this); + this.unsubscribe(); + }; + InnerSubscriber.prototype._complete = function () { + this.parent.notifyComplete(this); + this.unsubscribe(); + }; + return InnerSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -/* harmony import */ var _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(220); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__["identity"]; }); +//# sourceMappingURL=InnerSubscriber.js.map -/* harmony import */ var _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(221); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__["isObservable"]; }); -/* harmony import */ var _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(222); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__["ArgumentOutOfRangeError"]; }); +/***/ }), +/* 203 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(223); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__["EmptyError"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeTo", function() { return subscribeTo; }); +/* harmony import */ var _subscribeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); +/* harmony import */ var _subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); +/* harmony import */ var _subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(205); +/* harmony import */ var _subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(207); +/* harmony import */ var _isArrayLike__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(208); +/* harmony import */ var _isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(209); +/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(150); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(206); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(154); +/** PURE_IMPORTS_START _subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */ -/* harmony import */ var _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(188); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__["ObjectUnsubscribedError"]; }); -/* harmony import */ var _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(180); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__["UnsubscriptionError"]; }); -/* harmony import */ var _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(224); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__["TimeoutError"]; }); -/* harmony import */ var _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(225); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__["bindCallback"]; }); -/* harmony import */ var _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(227); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__["bindNodeCallback"]; }); -/* harmony import */ var _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(228); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__["combineLatest"]; }); -/* harmony import */ var _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(239); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__["concat"]; }); -/* harmony import */ var _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(250); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__["defer"]; }); -/* harmony import */ var _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(203); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["empty"]; }); - -/* harmony import */ var _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(251); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__["forkJoin"]; }); - -/* harmony import */ var _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(243); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "from", function() { return _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__["from"]; }); - -/* harmony import */ var _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(252); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__["fromEvent"]; }); - -/* harmony import */ var _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(253); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__["fromEventPattern"]; }); - -/* harmony import */ var _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(254); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__["generate"]; }); - -/* harmony import */ var _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(255); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__["iif"]; }); - -/* harmony import */ var _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(256); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__["interval"]; }); - -/* harmony import */ var _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(258); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__["merge"]; }); - -/* harmony import */ var _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(259); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "never", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["never"]; }); - -/* harmony import */ var _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(204); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "of", function() { return _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__["of"]; }); - -/* harmony import */ var _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(260); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__["onErrorResumeNext"]; }); - -/* harmony import */ var _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(261); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__["pairs"]; }); - -/* harmony import */ var _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(262); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__["partition"]; }); +var subscribeTo = function (result) { + if (!!result && typeof result[_symbol_observable__WEBPACK_IMPORTED_MODULE_8__["observable"]] === 'function') { + return Object(_subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__["subscribeToObservable"])(result); + } + else if (Object(_isArrayLike__WEBPACK_IMPORTED_MODULE_4__["isArrayLike"])(result)) { + return Object(_subscribeToArray__WEBPACK_IMPORTED_MODULE_0__["subscribeToArray"])(result); + } + else if (Object(_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(result)) { + return Object(_subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__["subscribeToPromise"])(result); + } + else if (!!result && typeof result[_symbol_iterator__WEBPACK_IMPORTED_MODULE_7__["iterator"]] === 'function') { + return Object(_subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__["subscribeToIterable"])(result); + } + else { + var value = Object(_isObject__WEBPACK_IMPORTED_MODULE_6__["isObject"])(result) ? 'an invalid object' : "'" + result + "'"; + var msg = "You provided " + value + " where a stream was expected." + + ' You can provide an Observable, Promise, Array, or Iterable.'; + throw new TypeError(msg); + } +}; +//# sourceMappingURL=subscribeTo.js.map -/* harmony import */ var _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(265); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__["race"]; }); -/* harmony import */ var _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(266); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__["range"]; }); +/***/ }), +/* 204 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(209); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__["throwError"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToPromise", function() { return subscribeToPromise; }); +/* harmony import */ var _hostReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(147); +/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */ -/* harmony import */ var _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(267); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__["timer"]; }); +var subscribeToPromise = function (promise) { + return function (subscriber) { + promise.then(function (value) { + if (!subscriber.closed) { + subscriber.next(value); + subscriber.complete(); + } + }, function (err) { return subscriber.error(err); }) + .then(null, _hostReportError__WEBPACK_IMPORTED_MODULE_0__["hostReportError"]); + return subscriber; + }; +}; +//# sourceMappingURL=subscribeToPromise.js.map -/* harmony import */ var _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(268); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "using", function() { return _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__["using"]; }); -/* harmony import */ var _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(269); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__["zip"]; }); +/***/ }), +/* 205 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(244); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__["scheduled"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToIterable", function() { return subscribeToIterable; }); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(206); +/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["EMPTY"]; }); +var subscribeToIterable = function (iterable) { + return function (subscriber) { + var iterator = iterable[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]](); + do { + var item = iterator.next(); + if (item.done) { + subscriber.complete(); + break; + } + subscriber.next(item.value); + if (subscriber.closed) { + break; + } + } while (true); + if (typeof iterator.return === 'function') { + subscriber.add(function () { + if (iterator.return) { + iterator.return(); + } + }); + } + return subscriber; + }; +}; +//# sourceMappingURL=subscribeToIterable.js.map -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["NEVER"]; }); -/* harmony import */ var _internal_config__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(175); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "config", function() { return _internal_config__WEBPACK_IMPORTED_MODULE_52__["config"]; }); +/***/ }), +/* 206 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSymbolIterator", function() { return getSymbolIterator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iterator", function() { return iterator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$iterator", function() { return $$iterator; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ +function getSymbolIterator() { + if (typeof Symbol !== 'function' || !Symbol.iterator) { + return '@@iterator'; + } + return Symbol.iterator; +} +var iterator = /*@__PURE__*/ getSymbolIterator(); +var $$iterator = iterator; +//# sourceMappingURL=iterator.js.map +/***/ }), +/* 207 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToObservable", function() { return subscribeToObservable; }); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(154); +/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ +var subscribeToObservable = function (obj) { + return function (subscriber) { + var obs = obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]](); + if (typeof obs.subscribe !== 'function') { + throw new TypeError('Provided object does not correctly implement Symbol.observable'); + } + else { + return obs.subscribe(subscriber); + } + }; +}; +//# sourceMappingURL=subscribeToObservable.js.map +/***/ }), +/* 208 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return isArrayLike; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; }); +//# sourceMappingURL=isArrayLike.js.map +/***/ }), +/* 209 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPromise", function() { return isPromise; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isPromise(value) { + return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; +} +//# sourceMappingURL=isPromise.js.map +/***/ }), +/* 210 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony import */ var _of__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(175); +/* harmony import */ var _operators_concatAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(211); +/** PURE_IMPORTS_START _of,_operators_concatAll PURE_IMPORTS_END */ +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return Object(_operators_concatAll__WEBPACK_IMPORTED_MODULE_1__["concatAll"])()(_of__WEBPACK_IMPORTED_MODULE_0__["of"].apply(void 0, observables)); +} +//# sourceMappingURL=concat.js.map +/***/ }), +/* 211 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return concatAll; }); +/* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(212); +/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */ +function concatAll() { + return Object(_mergeAll__WEBPACK_IMPORTED_MODULE_0__["mergeAll"])(1); +} +//# sourceMappingURL=concatAll.js.map +/***/ }), +/* 212 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return mergeAll; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(213); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(191); +/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//# sourceMappingURL=index.js.map +function mergeAll(concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"], concurrent); +} +//# sourceMappingURL=mergeAll.js.map /***/ }), -/* 170 */ +/* 213 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return Observable; }); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(171); -/* harmony import */ var _util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(182); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(184); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(175); -/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return mergeMap; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapOperator", function() { return MergeMapOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapSubscriber", function() { return MergeMapSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(201); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(202); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(197); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(214); +/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */ -var Observable = /*@__PURE__*/ (function () { - function Observable(subscribe) { - this._isScalar = false; - if (subscribe) { - this._subscribe = subscribe; + +function mergeMap(project, resultSelector, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + if (typeof resultSelector === 'function') { + return function (source) { return source.pipe(mergeMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); }; + } + else if (typeof resultSelector === 'number') { + concurrent = resultSelector; + } + return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); }; +} +var MergeMapOperator = /*@__PURE__*/ (function () { + function MergeMapOperator(project, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } + this.project = project; + this.concurrent = concurrent; } - Observable.prototype.lift = function (operator) { - var observable = new Observable(); - observable.source = this; - observable.operator = operator; - return observable; + MergeMapOperator.prototype.call = function (observer, source) { + return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent)); }; - Observable.prototype.subscribe = function (observerOrNext, error, complete) { - var operator = this.operator; - var sink = Object(_util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__["toSubscriber"])(observerOrNext, error, complete); - if (operator) { - sink.add(operator.call(sink, this.source)); + return MergeMapOperator; +}()); + +var MergeMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeMapSubscriber, _super); + function MergeMapSubscriber(destination, project, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - else { - sink.add(this.source || (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? - this._subscribe(sink) : - this._trySubscribe(sink)); + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.concurrent = concurrent; + _this.hasCompleted = false; + _this.buffer = []; + _this.active = 0; + _this.index = 0; + return _this; + } + MergeMapSubscriber.prototype._next = function (value) { + if (this.active < this.concurrent) { + this._tryNext(value); } - if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { - if (sink.syncErrorThrowable) { - sink.syncErrorThrowable = false; - if (sink.syncErrorThrown) { - throw sink.syncErrorValue; - } - } + else { + this.buffer.push(value); } - return sink; }; - Observable.prototype._trySubscribe = function (sink) { + MergeMapSubscriber.prototype._tryNext = function (value) { + var result; + var index = this.index++; try { - return this._subscribe(sink); + result = this.project(value, index); } catch (err) { - if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { - sink.syncErrorThrown = true; - sink.syncErrorValue = err; - } - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_0__["canReportError"])(sink)) { - sink.error(err); - } - else { - console.warn(err); - } + this.destination.error(err); + return; } + this.active++; + this._innerSub(result, value, index); }; - Observable.prototype.forEach = function (next, promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var subscription; - subscription = _this.subscribe(function (value) { - try { - next(value); - } - catch (err) { - reject(err); - if (subscription) { - subscription.unsubscribe(); - } - } - }, reject, resolve); - }); + MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); }; - Observable.prototype._subscribe = function (subscriber) { - var source = this.source; - return source && source.subscribe(subscriber); + MergeMapSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { + this.destination.complete(); + } + this.unsubscribe(); }; - Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () { - return this; + MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); }; - Observable.prototype.pipe = function () { - var operations = []; - for (var _i = 0; _i < arguments.length; _i++) { - operations[_i] = arguments[_i]; + MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + this.remove(innerSub); + this.active--; + if (buffer.length > 0) { + this._next(buffer.shift()); } - if (operations.length === 0) { - return this; + else if (this.active === 0 && this.hasCompleted) { + this.destination.complete(); } - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipeFromArray"])(operations)(this); - }; - Observable.prototype.toPromise = function (promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var value; - _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); - }); - }; - Observable.create = function (subscribe) { - return new Observable(subscribe); }; - return Observable; -}()); + return MergeMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -function getPromiseCtor(promiseCtor) { - if (!promiseCtor) { - promiseCtor = _config__WEBPACK_IMPORTED_MODULE_4__["config"].Promise || Promise; +//# sourceMappingURL=mergeMap.js.map + + +/***/ }), +/* 214 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "from", function() { return from; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); +/* harmony import */ var _scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); +/** PURE_IMPORTS_START _Observable,_util_subscribeTo,_scheduled_scheduled PURE_IMPORTS_END */ + + + +function from(input, scheduler) { + if (!scheduler) { + if (input instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { + return input; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(input)); } - if (!promiseCtor) { - throw new Error('no Promise impl found'); + else { + return Object(_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__["scheduled"])(input, scheduler); } - return promiseCtor; } -//# sourceMappingURL=Observable.js.map +//# sourceMappingURL=from.js.map /***/ }), -/* 171 */ +/* 215 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canReportError", function() { return canReportError; }); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); -/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return scheduled; }); +/* harmony import */ var _scheduleObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(216); +/* harmony import */ var _schedulePromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(217); +/* harmony import */ var _scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(179); +/* harmony import */ var _scheduleIterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(218); +/* harmony import */ var _util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(219); +/* harmony import */ var _util_isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(209); +/* harmony import */ var _util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(208); +/* harmony import */ var _util_isIterable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(220); +/** PURE_IMPORTS_START _scheduleObservable,_schedulePromise,_scheduleArray,_scheduleIterable,_util_isInteropObservable,_util_isPromise,_util_isArrayLike,_util_isIterable PURE_IMPORTS_END */ -function canReportError(observer) { - while (observer) { - var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped; - if (closed_1 || isStopped) { - return false; + + + + + + + +function scheduled(input, scheduler) { + if (input != null) { + if (Object(_util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__["isInteropObservable"])(input)) { + return Object(_scheduleObservable__WEBPACK_IMPORTED_MODULE_0__["scheduleObservable"])(input, scheduler); } - else if (destination && destination instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { - observer = destination; + else if (Object(_util_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(input)) { + return Object(_schedulePromise__WEBPACK_IMPORTED_MODULE_1__["schedulePromise"])(input, scheduler); } - else { - observer = null; + else if (Object(_util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__["isArrayLike"])(input)) { + return Object(_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); + } + else if (Object(_util_isIterable__WEBPACK_IMPORTED_MODULE_7__["isIterable"])(input) || typeof input === 'string') { + return Object(_scheduleIterable__WEBPACK_IMPORTED_MODULE_3__["scheduleIterable"])(input, scheduler); } } - return true; + throw new TypeError((input !== null && typeof input || input) + ' is not observable'); } -//# sourceMappingURL=canReportError.js.map +//# sourceMappingURL=scheduled.js.map /***/ }), -/* 172 */ +/* 216 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return Subscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SafeSubscriber", function() { return SafeSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(173); -/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(181); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(175); -/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(176); -/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleObservable", function() { return scheduleObservable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(154); +/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable PURE_IMPORTS_END */ +function scheduleObservable(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + sub.add(scheduler.schedule(function () { + var observable = input[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]](); + sub.add(observable.subscribe({ + next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); }, + error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); }, + complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); }, + })); + })); + return sub; + }); +} +//# sourceMappingURL=scheduleObservable.js.map +/***/ }), +/* 217 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "schedulePromise", function() { return schedulePromise; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -var Subscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subscriber, _super); - function Subscriber(destinationOrNext, error, complete) { - var _this = _super.call(this) || this; - _this.syncErrorValue = null; - _this.syncErrorThrown = false; - _this.syncErrorThrowable = false; - _this.isStopped = false; - switch (arguments.length) { - case 0: - _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; - break; - case 1: - if (!destinationOrNext) { - _this.destination = _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]; - break; - } - if (typeof destinationOrNext === 'object') { - if (destinationOrNext instanceof Subscriber) { - _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; - _this.destination = destinationOrNext; - destinationOrNext.add(_this); - } - else { - _this.syncErrorThrowable = true; - _this.destination = new SafeSubscriber(_this, destinationOrNext); - } - break; - } - default: - _this.syncErrorThrowable = true; - _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete); - break; - } - return _this; - } - Subscriber.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__["rxSubscriber"]] = function () { return this; }; - Subscriber.create = function (next, error, complete) { - var subscriber = new Subscriber(next, error, complete); - subscriber.syncErrorThrowable = false; - return subscriber; - }; - Subscriber.prototype.next = function (value) { - if (!this.isStopped) { - this._next(value); - } - }; - Subscriber.prototype.error = function (err) { - if (!this.isStopped) { - this.isStopped = true; - this._error(err); - } - }; - Subscriber.prototype.complete = function () { - if (!this.isStopped) { - this.isStopped = true; - this._complete(); - } - }; - Subscriber.prototype.unsubscribe = function () { - if (this.closed) { - return; - } - this.isStopped = true; - _super.prototype.unsubscribe.call(this); - }; - Subscriber.prototype._next = function (value) { - this.destination.next(value); - }; - Subscriber.prototype._error = function (err) { - this.destination.error(err); - this.unsubscribe(); - }; - Subscriber.prototype._complete = function () { - this.destination.complete(); - this.unsubscribe(); - }; - Subscriber.prototype._unsubscribeAndRecycle = function () { - var _parentOrParents = this._parentOrParents; - this._parentOrParents = null; - this.unsubscribe(); - this.closed = false; - this.isStopped = false; - this._parentOrParents = _parentOrParents; - return this; - }; - return Subscriber; -}(_Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"])); -var SafeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SafeSubscriber, _super); - function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) { - var _this = _super.call(this) || this; - _this._parentSubscriber = _parentSubscriber; - var next; - var context = _this; - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(observerOrNext)) { - next = observerOrNext; - } - else if (observerOrNext) { - next = observerOrNext.next; - error = observerOrNext.error; - complete = observerOrNext.complete; - if (observerOrNext !== _Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]) { - context = Object.create(observerOrNext); - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__["isFunction"])(context.unsubscribe)) { - _this.add(context.unsubscribe.bind(context)); - } - context.unsubscribe = _this.unsubscribe.bind(_this); - } - } - _this._context = context; - _this._next = next; - _this._error = error; - _this._complete = complete; - return _this; +function schedulePromise(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + sub.add(scheduler.schedule(function () { + return input.then(function (value) { + sub.add(scheduler.schedule(function () { + subscriber.next(value); + sub.add(scheduler.schedule(function () { return subscriber.complete(); })); + })); + }, function (err) { + sub.add(scheduler.schedule(function () { return subscriber.error(err); })); + }); + })); + return sub; + }); +} +//# sourceMappingURL=schedulePromise.js.map + + +/***/ }), +/* 218 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleIterable", function() { return scheduleIterable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(206); +/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator PURE_IMPORTS_END */ + + + +function scheduleIterable(input, scheduler) { + if (!input) { + throw new Error('Iterable cannot be null'); } - SafeSubscriber.prototype.next = function (value) { - if (!this.isStopped && this._next) { - var _parentSubscriber = this._parentSubscriber; - if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { - this.__tryOrUnsub(this._next, value); - } - else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var _parentSubscriber = this._parentSubscriber; - var useDeprecatedSynchronousErrorHandling = _config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling; - if (this._error) { - if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { - this.__tryOrUnsub(this._error, err); - this.unsubscribe(); - } - else { - this.__tryOrSetError(_parentSubscriber, this._error, err); - this.unsubscribe(); - } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var iterator; + sub.add(function () { + if (iterator && typeof iterator.return === 'function') { + iterator.return(); } - else if (!_parentSubscriber.syncErrorThrowable) { - this.unsubscribe(); - if (useDeprecatedSynchronousErrorHandling) { - throw err; + }); + sub.add(scheduler.schedule(function () { + iterator = input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__["iterator"]](); + sub.add(scheduler.schedule(function () { + if (subscriber.closed) { + return; } - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); - } - else { - if (useDeprecatedSynchronousErrorHandling) { - _parentSubscriber.syncErrorValue = err; - _parentSubscriber.syncErrorThrown = true; + var value; + var done; + try { + var result = iterator.next(); + value = result.value; + done = result.done; } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); + catch (err) { + subscriber.error(err); + return; } - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.complete = function () { - var _this = this; - if (!this.isStopped) { - var _parentSubscriber = this._parentSubscriber; - if (this._complete) { - var wrappedComplete = function () { return _this._complete.call(_this._context); }; - if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { - this.__tryOrUnsub(wrappedComplete); - this.unsubscribe(); + if (done) { + subscriber.complete(); } else { - this.__tryOrSetError(_parentSubscriber, wrappedComplete); - this.unsubscribe(); + subscriber.next(value); + this.schedule(); } - } - else { - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { - try { - fn.call(this._context, value); - } - catch (err) { - this.unsubscribe(); - if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { - throw err; - } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); - } - } - }; - SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) { - if (!_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { - throw new Error('bad call'); - } - try { - fn.call(this._context, value); - } - catch (err) { - if (_config__WEBPACK_IMPORTED_MODULE_5__["config"].useDeprecatedSynchronousErrorHandling) { - parent.syncErrorValue = err; - parent.syncErrorThrown = true; - return true; - } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__["hostReportError"])(err); - return true; - } - } - return false; - }; - SafeSubscriber.prototype._unsubscribe = function () { - var _parentSubscriber = this._parentSubscriber; - this._context = null; - this._parentSubscriber = null; - _parentSubscriber.unsubscribe(); - }; - return SafeSubscriber; -}(Subscriber)); + })); + })); + return sub; + }); +} +//# sourceMappingURL=scheduleIterable.js.map -//# sourceMappingURL=Subscriber.js.map + +/***/ }), +/* 219 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInteropObservable", function() { return isInteropObservable; }); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(154); +/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ + +function isInteropObservable(input) { + return input && typeof input[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]] === 'function'; +} +//# sourceMappingURL=isInteropObservable.js.map /***/ }), -/* 173 */ +/* 220 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFunction", function() { return isFunction; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isFunction(x) { - return typeof x === 'function'; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; }); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(206); +/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ + +function isIterable(input) { + return input && typeof input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]] === 'function'; } -//# sourceMappingURL=isFunction.js.map +//# sourceMappingURL=isIterable.js.map /***/ }), -/* 174 */ +/* 221 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(175); -/* harmony import */ var _util_hostReportError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); -/** PURE_IMPORTS_START _config,_util_hostReportError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return defer; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); +/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ -var empty = { - closed: true, - next: function (value) { }, - error: function (err) { - if (_config__WEBPACK_IMPORTED_MODULE_0__["config"].useDeprecatedSynchronousErrorHandling) { - throw err; + +function defer(observableFactory) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var input; + try { + input = observableFactory(); } - else { - Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_1__["hostReportError"])(err); + catch (err) { + subscriber.error(err); + return undefined; } - }, - complete: function () { } -}; -//# sourceMappingURL=Observer.js.map + var source = input ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(input) : Object(_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); + return source.subscribe(subscriber); + }); +} +//# sourceMappingURL=defer.js.map /***/ }), -/* 175 */ +/* 222 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "config", function() { return config; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var _enable_super_gross_mode_that_will_cause_bad_things = false; -var config = { - Promise: undefined, - set useDeprecatedSynchronousErrorHandling(value) { - if (value) { - var error = /*@__PURE__*/ new Error(); - /*@__PURE__*/ console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return forkJoin; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(197); +/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(150); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(214); +/** PURE_IMPORTS_START _Observable,_util_isArray,_operators_map,_util_isObject,_from PURE_IMPORTS_END */ + + + + + +function forkJoin() { + var sources = []; + for (var _i = 0; _i < arguments.length; _i++) { + sources[_i] = arguments[_i]; + } + if (sources.length === 1) { + var first_1 = sources[0]; + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(first_1)) { + return forkJoinInternal(first_1, null); } - else if (_enable_super_gross_mode_that_will_cause_bad_things) { - /*@__PURE__*/ console.log('RxJS: Back to a better error behavior. Thank you. <3'); + if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_3__["isObject"])(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) { + var keys = Object.keys(first_1); + return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys); } - _enable_super_gross_mode_that_will_cause_bad_things = value; - }, - get useDeprecatedSynchronousErrorHandling() { - return _enable_super_gross_mode_that_will_cause_bad_things; - }, -}; -//# sourceMappingURL=config.js.map + } + if (typeof sources[sources.length - 1] === 'function') { + var resultSelector_1 = sources.pop(); + sources = (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(sources[0])) ? sources[0] : sources; + return forkJoinInternal(sources, null).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return resultSelector_1.apply(void 0, args); })); + } + return forkJoinInternal(sources, null); +} +function forkJoinInternal(sources, keys) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var len = sources.length; + if (len === 0) { + subscriber.complete(); + return; + } + var values = new Array(len); + var completed = 0; + var emitted = 0; + var _loop_1 = function (i) { + var source = Object(_from__WEBPACK_IMPORTED_MODULE_4__["from"])(sources[i]); + var hasValue = false; + subscriber.add(source.subscribe({ + next: function (value) { + if (!hasValue) { + hasValue = true; + emitted++; + } + values[i] = value; + }, + error: function (err) { return subscriber.error(err); }, + complete: function () { + completed++; + if (completed === len || !hasValue) { + if (emitted === len) { + subscriber.next(keys ? + keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) : + values); + } + subscriber.complete(); + } + } + })); + }; + for (var i = 0; i < len; i++) { + _loop_1(i); + } + }); +} +//# sourceMappingURL=forkJoin.js.map /***/ }), -/* 176 */ +/* 223 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hostReportError", function() { return hostReportError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function hostReportError(err) { - setTimeout(function () { throw err; }, 0); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return fromEvent; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(197); +/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ + + + + +var toString = /*@__PURE__*/ (function () { return Object.prototype.toString; })(); +function fromEvent(target, eventName, options, resultSelector) { + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(options)) { + resultSelector = options; + options = undefined; + } + if (resultSelector) { + return fromEvent(target, eventName, options).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + function handler(e) { + if (arguments.length > 1) { + subscriber.next(Array.prototype.slice.call(arguments)); + } + else { + subscriber.next(e); + } + } + setupSubscription(target, eventName, handler, subscriber, options); + }); } -//# sourceMappingURL=hostReportError.js.map +function setupSubscription(sourceObj, eventName, handler, subscriber, options) { + var unsubscribe; + if (isEventTarget(sourceObj)) { + var source_1 = sourceObj; + sourceObj.addEventListener(eventName, handler, options); + unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); }; + } + else if (isJQueryStyleEventEmitter(sourceObj)) { + var source_2 = sourceObj; + sourceObj.on(eventName, handler); + unsubscribe = function () { return source_2.off(eventName, handler); }; + } + else if (isNodeStyleEventEmitter(sourceObj)) { + var source_3 = sourceObj; + sourceObj.addListener(eventName, handler); + unsubscribe = function () { return source_3.removeListener(eventName, handler); }; + } + else if (sourceObj && sourceObj.length) { + for (var i = 0, len = sourceObj.length; i < len; i++) { + setupSubscription(sourceObj[i], eventName, handler, subscriber, options); + } + } + else { + throw new TypeError('Invalid event target'); + } + subscriber.add(unsubscribe); +} +function isNodeStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; +} +function isJQueryStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; +} +function isEventTarget(sourceObj) { + return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; +} +//# sourceMappingURL=fromEvent.js.map /***/ }), -/* 177 */ +/* 224 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return Subscription; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(179); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(180); -/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_UnsubscriptionError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return fromEventPattern; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(197); +/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ -var Subscription = /*@__PURE__*/ (function () { - function Subscription(unsubscribe) { - this.closed = false; - this._parentOrParents = null; - this._subscriptions = null; - if (unsubscribe) { - this._unsubscribe = unsubscribe; - } +function fromEventPattern(addHandler, removeHandler, resultSelector) { + if (resultSelector) { + return fromEventPattern(addHandler, removeHandler).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); } - Subscription.prototype.unsubscribe = function () { - var errors; - if (this.closed) { - return; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var handler = function () { + var e = []; + for (var _i = 0; _i < arguments.length; _i++) { + e[_i] = arguments[_i]; + } + return subscriber.next(e.length === 1 ? e[0] : e); + }; + var retValue; + try { + retValue = addHandler(handler); } - var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; - this.closed = true; - this._parentOrParents = null; - this._subscriptions = null; - if (_parentOrParents instanceof Subscription) { - _parentOrParents.remove(this); - } - else if (_parentOrParents !== null) { - for (var index = 0; index < _parentOrParents.length; ++index) { - var parent_1 = _parentOrParents[index]; - parent_1.remove(this); - } - } - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(_unsubscribe)) { - try { - _unsubscribe.call(this); - } - catch (e) { - errors = e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"] ? flattenUnsubscriptionErrors(e.errors) : [e]; - } - } - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(_subscriptions)) { - var index = -1; - var len = _subscriptions.length; - while (++index < len) { - var sub = _subscriptions[index]; - if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_1__["isObject"])(sub)) { - try { - sub.unsubscribe(); - } - catch (e) { - errors = errors || []; - if (e instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) { - errors = errors.concat(flattenUnsubscriptionErrors(e.errors)); - } - else { - errors.push(e); - } - } - } - } + catch (err) { + subscriber.error(err); + return undefined; } - if (errors) { - throw new _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"](errors); + if (!Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(removeHandler)) { + return undefined; } - }; - Subscription.prototype.add = function (teardown) { - var subscription = teardown; - if (!teardown) { - return Subscription.EMPTY; + return function () { return removeHandler(handler, retValue); }; + }); +} +//# sourceMappingURL=fromEventPattern.js.map + + +/***/ }), +/* 225 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return generate; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(191); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(176); +/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */ + + + +function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) { + var resultSelector; + var initialState; + if (arguments.length == 1) { + var options = initialStateOrOptions; + initialState = options.initialState; + condition = options.condition; + iterate = options.iterate; + resultSelector = options.resultSelector || _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; + scheduler = options.scheduler; + } + else if (resultSelectorOrObservable === undefined || Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_2__["isScheduler"])(resultSelectorOrObservable)) { + initialState = initialStateOrOptions; + resultSelector = _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; + scheduler = resultSelectorOrObservable; + } + else { + initialState = initialStateOrOptions; + resultSelector = resultSelectorOrObservable; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var state = initialState; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + subscriber: subscriber, + iterate: iterate, + condition: condition, + resultSelector: resultSelector, + state: state + }); } - switch (typeof teardown) { - case 'function': - subscription = new Subscription(teardown); - case 'object': - if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') { - return subscription; + do { + if (condition) { + var conditionResult = void 0; + try { + conditionResult = condition(state); } - else if (this.closed) { - subscription.unsubscribe(); - return subscription; + catch (err) { + subscriber.error(err); + return undefined; } - else if (!(subscription instanceof Subscription)) { - var tmp = subscription; - subscription = new Subscription(); - subscription._subscriptions = [tmp]; + if (!conditionResult) { + subscriber.complete(); + break; } + } + var value = void 0; + try { + value = resultSelector(state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + subscriber.next(value); + if (subscriber.closed) { break; - default: { - throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); } - } - var _parentOrParents = subscription._parentOrParents; - if (_parentOrParents === null) { - subscription._parentOrParents = this; - } - else if (_parentOrParents instanceof Subscription) { - if (_parentOrParents === this) { - return subscription; + try { + state = iterate(state); } - subscription._parentOrParents = [_parentOrParents, this]; + catch (err) { + subscriber.error(err); + return undefined; + } + } while (true); + return undefined; + }); +} +function dispatch(state) { + var subscriber = state.subscriber, condition = state.condition; + if (subscriber.closed) { + return undefined; + } + if (state.needIterate) { + try { + state.state = state.iterate(state.state); } - else if (_parentOrParents.indexOf(this) === -1) { - _parentOrParents.push(this); + catch (err) { + subscriber.error(err); + return undefined; } - else { - return subscription; + } + else { + state.needIterate = true; + } + if (condition) { + var conditionResult = void 0; + try { + conditionResult = condition(state.state); } - var subscriptions = this._subscriptions; - if (subscriptions === null) { - this._subscriptions = [subscription]; + catch (err) { + subscriber.error(err); + return undefined; } - else { - subscriptions.push(subscription); + if (!conditionResult) { + subscriber.complete(); + return undefined; } - return subscription; - }; - Subscription.prototype.remove = function (subscription) { - var subscriptions = this._subscriptions; - if (subscriptions) { - var subscriptionIndex = subscriptions.indexOf(subscription); - if (subscriptionIndex !== -1) { - subscriptions.splice(subscriptionIndex, 1); - } + if (subscriber.closed) { + return undefined; } - }; - Subscription.EMPTY = (function (empty) { - empty.closed = true; - return empty; - }(new Subscription())); - return Subscription; -}()); - -function flattenUnsubscriptionErrors(errors) { - return errors.reduce(function (errs, err) { return errs.concat((err instanceof _util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_3__["UnsubscriptionError"]) ? err.errors : err); }, []); + } + var value; + try { + value = state.resultSelector(state.state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + if (subscriber.closed) { + return undefined; + } + subscriber.next(value); + if (subscriber.closed) { + return undefined; + } + return this.schedule(state); } -//# sourceMappingURL=Subscription.js.map +//# sourceMappingURL=generate.js.map /***/ }), -/* 178 */ +/* 226 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArray", function() { return isArray; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var isArray = /*@__PURE__*/ (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })(); -//# sourceMappingURL=isArray.js.map - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return iif; }); +/* harmony import */ var _defer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(221); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(174); +/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */ -/***/ }), -/* 179 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return isObject; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isObject(x) { - return x !== null && typeof x === 'object'; +function iif(condition, trueResult, falseResult) { + if (trueResult === void 0) { + trueResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; + } + if (falseResult === void 0) { + falseResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; + } + return Object(_defer__WEBPACK_IMPORTED_MODULE_0__["defer"])(function () { return condition() ? trueResult : falseResult; }); } -//# sourceMappingURL=isObject.js.map +//# sourceMappingURL=iif.js.map /***/ }), -/* 180 */ +/* 227 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return UnsubscriptionError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var UnsubscriptionErrorImpl = /*@__PURE__*/ (function () { - function UnsubscriptionErrorImpl(errors) { - Error.call(this); - this.message = errors ? - errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n ') : ''; - this.name = 'UnsubscriptionError'; - this.errors = errors; - return this; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return interval; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(228); +/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */ + + + +function interval(period, scheduler) { + if (period === void 0) { + period = 0; } - UnsubscriptionErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return UnsubscriptionErrorImpl; -})(); -var UnsubscriptionError = UnsubscriptionErrorImpl; -//# sourceMappingURL=UnsubscriptionError.js.map + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(period) || period < 0) { + period = 0; + } + if (!scheduler || typeof scheduler.schedule !== 'function') { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period })); + return subscriber; + }); +} +function dispatch(state) { + var subscriber = state.subscriber, counter = state.counter, period = state.period; + subscriber.next(counter); + this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period); +} +//# sourceMappingURL=interval.js.map /***/ }), -/* 181 */ +/* 228 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rxSubscriber", function() { return rxSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$rxSubscriber", function() { return $$rxSubscriber; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var rxSubscriber = /*@__PURE__*/ (function () { - return typeof Symbol === 'function' - ? /*@__PURE__*/ Symbol('rxSubscriber') - : '@@rxSubscriber_' + /*@__PURE__*/ Math.random(); -})(); -var $$rxSubscriber = rxSubscriber; -//# sourceMappingURL=rxSubscriber.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNumeric", function() { return isNumeric; }); +/* harmony import */ var _isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */ + +function isNumeric(val) { + return !Object(_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(val) && (val - parseFloat(val) + 1) >= 0; +} +//# sourceMappingURL=isNumeric.js.map /***/ }), -/* 182 */ +/* 229 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toSubscriber", function() { return toSubscriber; }); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); -/* harmony import */ var _symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); -/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); -/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); +/* harmony import */ var _operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(212); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); +/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */ -function toSubscriber(nextOrObserver, error, complete) { - if (nextOrObserver) { - if (nextOrObserver instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { - return nextOrObserver; - } - if (nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]]) { - return nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]](); + +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var concurrent = Number.POSITIVE_INFINITY; + var scheduler = null; + var last = observables[observables.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(last)) { + scheduler = observables.pop(); + if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { + concurrent = observables.pop(); } } - if (!nextOrObserver && !error && !complete) { - return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](_Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]); + else if (typeof last === 'number') { + concurrent = observables.pop(); } - return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](nextOrObserver, error, complete); + if (scheduler === null && observables.length === 1 && observables[0] instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { + return observables[0]; + } + return Object(_operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__["mergeAll"])(concurrent)(Object(_fromArray__WEBPACK_IMPORTED_MODULE_3__["fromArray"])(observables, scheduler)); } -//# sourceMappingURL=toSubscriber.js.map +//# sourceMappingURL=merge.js.map /***/ }), -/* 183 */ +/* 230 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return observable; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var observable = /*@__PURE__*/ (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })(); -//# sourceMappingURL=observable.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return NEVER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "never", function() { return never; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(156); +/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */ + + +var NEVER = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](_util_noop__WEBPACK_IMPORTED_MODULE_1__["noop"]); +function never() { + return NEVER; +} +//# sourceMappingURL=never.js.map /***/ }), -/* 184 */ +/* 231 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipeFromArray", function() { return pipeFromArray; }); -/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(185); -/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174); +/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */ -function pipe() { - var fns = []; + + + +function onErrorResumeNext() { + var sources = []; for (var _i = 0; _i < arguments.length; _i++) { - fns[_i] = arguments[_i]; + sources[_i] = arguments[_i]; } - return pipeFromArray(fns); -} -function pipeFromArray(fns) { - if (!fns) { - return _noop__WEBPACK_IMPORTED_MODULE_0__["noop"]; + if (sources.length === 0) { + return _empty__WEBPACK_IMPORTED_MODULE_3__["EMPTY"]; } - if (fns.length === 1) { - return fns[0]; + var first = sources[0], remainder = sources.slice(1); + if (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(first)) { + return onErrorResumeNext.apply(void 0, first); } - return function piped(input) { - return fns.reduce(function (prev, fn) { return fn(prev); }, input); - }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); }; + return Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(first).subscribe({ + next: function (value) { subscriber.next(value); }, + error: subNext, + complete: subNext, + }); + }); } -//# sourceMappingURL=pipe.js.map +//# sourceMappingURL=onErrorResumeNext.js.map /***/ }), -/* 185 */ +/* 232 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return noop; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function noop() { } -//# sourceMappingURL=noop.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return pairs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ + + +function pairs(obj, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length && !subscriber.closed; i++) { + var key = keys[i]; + if (obj.hasOwnProperty(key)) { + subscriber.next([key, obj[key]]); + } + } + subscriber.complete(); + }); + } + else { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var keys = Object.keys(obj); + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj })); + return subscription; + }); + } +} +function dispatch(state) { + var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj; + if (!subscriber.closed) { + if (index < keys.length) { + var key = keys[index]; + subscriber.next([key, obj[key]]); + subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj })); + } + else { + subscriber.complete(); + } + } +} +//# sourceMappingURL=pairs.js.map /***/ }), -/* 186 */ +/* 233 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return ConnectableObservable; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectableObservableDescriptor", function() { return connectableObservableDescriptor; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(177); -/* harmony import */ var _operators_refCount__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(190); -/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); +/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(234); +/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); +/* harmony import */ var _operators_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(235); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(141); +/** PURE_IMPORTS_START _util_not,_util_subscribeTo,_operators_filter,_Observable PURE_IMPORTS_END */ +function partition(source, predicate, thisArg) { + return [ + Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(predicate, thisArg)(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))), + Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))) + ]; +} +//# sourceMappingURL=partition.js.map -var ConnectableObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableObservable, _super); - function ConnectableObservable(source, subjectFactory) { - var _this = _super.call(this) || this; - _this.source = source; - _this.subjectFactory = subjectFactory; - _this._refCount = 0; - _this._isComplete = false; - return _this; +/***/ }), +/* 234 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "not", function() { return not; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function not(pred, thisArg) { + function notPred() { + return !(notPred.pred.apply(notPred.thisArg, arguments)); } - ConnectableObservable.prototype._subscribe = function (subscriber) { - return this.getSubject().subscribe(subscriber); - }; - ConnectableObservable.prototype.getSubject = function () { - var subject = this._subject; - if (!subject || subject.isStopped) { - this._subject = this.subjectFactory(); - } - return this._subject; - }; - ConnectableObservable.prototype.connect = function () { - var connection = this._connection; - if (!connection) { - this._isComplete = false; - connection = this._connection = new _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"](); - connection.add(this.source - .subscribe(new ConnectableSubscriber(this.getSubject(), this))); - if (connection.closed) { - this._connection = null; - connection = _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"].EMPTY; - } - } - return connection; - }; - ConnectableObservable.prototype.refCount = function () { - return Object(_operators_refCount__WEBPACK_IMPORTED_MODULE_5__["refCount"])()(this); - }; - return ConnectableObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); + notPred.pred = pred; + notPred.thisArg = thisArg; + return notPred; +} +//# sourceMappingURL=not.js.map -var connectableObservableDescriptor = /*@__PURE__*/ (function () { - var connectableProto = ConnectableObservable.prototype; - return { - operator: { value: null }, - _refCount: { value: 0, writable: true }, - _subject: { value: null, writable: true }, - _connection: { value: null, writable: true }, - _subscribe: { value: connectableProto._subscribe }, - _isComplete: { value: connectableProto._isComplete, writable: true }, - getSubject: { value: connectableProto.getSubject }, - connect: { value: connectableProto.connect }, - refCount: { value: connectableProto.refCount } - }; -})(); -var ConnectableSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableSubscriber, _super); - function ConnectableSubscriber(destination, connectable) { - var _this = _super.call(this, destination) || this; - _this.connectable = connectable; - return _this; - } - ConnectableSubscriber.prototype._error = function (err) { - this._unsubscribe(); - _super.prototype._error.call(this, err); - }; - ConnectableSubscriber.prototype._complete = function () { - this.connectable._isComplete = true; - this._unsubscribe(); - _super.prototype._complete.call(this); - }; - ConnectableSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (connectable) { - this.connectable = null; - var connection = connectable._connection; - connectable._refCount = 0; - connectable._subject = null; - connectable._connection = null; - if (connection) { - connection.unsubscribe(); - } - } + +/***/ }), +/* 235 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function filter(predicate, thisArg) { + return function filterOperatorFunction(source) { + return source.lift(new FilterOperator(predicate, thisArg)); }; - return ConnectableSubscriber; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["SubjectSubscriber"])); -var RefCountOperator = /*@__PURE__*/ (function () { - function RefCountOperator(connectable) { - this.connectable = connectable; +} +var FilterOperator = /*@__PURE__*/ (function () { + function FilterOperator(predicate, thisArg) { + this.predicate = predicate; + this.thisArg = thisArg; } - RefCountOperator.prototype.call = function (subscriber, source) { - var connectable = this.connectable; - connectable._refCount++; - var refCounter = new RefCountSubscriber(subscriber, connectable); - var subscription = source.subscribe(refCounter); - if (!refCounter.closed) { - refCounter.connection = connectable.connect(); - } - return subscription; + FilterOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); }; - return RefCountOperator; + return FilterOperator; }()); -var RefCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); - function RefCountSubscriber(destination, connectable) { +var FilterSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FilterSubscriber, _super); + function FilterSubscriber(destination, predicate, thisArg) { var _this = _super.call(this, destination) || this; - _this.connectable = connectable; + _this.predicate = predicate; + _this.thisArg = thisArg; + _this.count = 0; return _this; } - RefCountSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (!connectable) { - this.connection = null; - return; - } - this.connectable = null; - var refCount = connectable._refCount; - if (refCount <= 0) { - this.connection = null; - return; + FilterSubscriber.prototype._next = function (value) { + var result; + try { + result = this.predicate.call(this.thisArg, value, this.count++); } - connectable._refCount = refCount - 1; - if (refCount > 1) { - this.connection = null; + catch (err) { + this.destination.error(err); return; } - var connection = this.connection; - var sharedConnection = connectable._connection; - this.connection = null; - if (sharedConnection && (!connection || sharedConnection === connection)) { - sharedConnection.unsubscribe(); + if (result) { + this.destination.next(value); } }; - return RefCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -//# sourceMappingURL=ConnectableObservable.js.map + return FilterSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=filter.js.map /***/ }), -/* 187 */ +/* 236 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscriber", function() { return SubjectSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnonymousSubject", function() { return AnonymousSubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(188); -/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(189); -/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(181); -/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceOperator", function() { return RaceOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceSubscriber", function() { return RaceSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(149); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var SubjectSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscriber, _super); - function SubjectSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - return _this; - } - return SubjectSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -var Subject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subject, _super); - function Subject() { - var _this = _super.call(this) || this; - _this.observers = []; - _this.closed = false; - _this.isStopped = false; - _this.hasError = false; - _this.thrownError = null; - return _this; +function race() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - Subject.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__["rxSubscriber"]] = function () { - return new SubjectSubscriber(this); - }; - Subject.prototype.lift = function (operator) { - var subject = new AnonymousSubject(this, this); - subject.operator = operator; - return subject; - }; - Subject.prototype.next = function (value) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - if (!this.isStopped) { - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].next(value); - } - } - }; - Subject.prototype.error = function (err) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - this.hasError = true; - this.thrownError = err; - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].error(err); - } - this.observers.length = 0; - }; - Subject.prototype.complete = function () { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].complete(); - } - this.observers.length = 0; - }; - Subject.prototype.unsubscribe = function () { - this.isStopped = true; - this.closed = true; - this.observers = null; - }; - Subject.prototype._trySubscribe = function (subscriber) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - else { - return _super.prototype._trySubscribe.call(this, subscriber); - } - }; - Subject.prototype._subscribe = function (subscriber) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - else if (this.hasError) { - subscriber.error(this.thrownError); - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; - } - else if (this.isStopped) { - subscriber.complete(); - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + if (observables.length === 1) { + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(observables[0])) { + observables = observables[0]; } else { - this.observers.push(subscriber); - return new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__["SubjectSubscription"](this, subscriber); + return observables[0]; } + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_2__["fromArray"])(observables, undefined).lift(new RaceOperator()); +} +var RaceOperator = /*@__PURE__*/ (function () { + function RaceOperator() { + } + RaceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RaceSubscriber(subscriber)); }; - Subject.prototype.asObservable = function () { - var observable = new _Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"](); - observable.source = this; - return observable; - }; - Subject.create = function (destination, source) { - return new AnonymousSubject(destination, source); - }; - return Subject; -}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); + return RaceOperator; +}()); -var AnonymousSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnonymousSubject, _super); - function AnonymousSubject(destination, source) { - var _this = _super.call(this) || this; - _this.destination = destination; - _this.source = source; +var RaceSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RaceSubscriber, _super); + function RaceSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.hasFirst = false; + _this.observables = []; + _this.subscriptions = []; return _this; } - AnonymousSubject.prototype.next = function (value) { - var destination = this.destination; - if (destination && destination.next) { - destination.next(value); - } - }; - AnonymousSubject.prototype.error = function (err) { - var destination = this.destination; - if (destination && destination.error) { - this.destination.error(err); - } + RaceSubscriber.prototype._next = function (observable) { + this.observables.push(observable); }; - AnonymousSubject.prototype.complete = function () { - var destination = this.destination; - if (destination && destination.complete) { + RaceSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { this.destination.complete(); } - }; - AnonymousSubject.prototype._subscribe = function (subscriber) { - var source = this.source; - if (source) { - return this.source.subscribe(subscriber); - } else { - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + for (var i = 0; i < len && !this.hasFirst; i++) { + var observable = observables[i]; + var subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i); + if (this.subscriptions) { + this.subscriptions.push(subscription); + } + this.add(subscription); + } + this.observables = null; } }; - return AnonymousSubject; -}(Subject)); + RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (!this.hasFirst) { + this.hasFirst = true; + for (var i = 0; i < this.subscriptions.length; i++) { + if (i !== outerIndex) { + var subscription = this.subscriptions[i]; + subscription.unsubscribe(); + this.remove(subscription); + } + } + this.subscriptions = null; + } + this.destination.next(innerValue); + }; + return RaceSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=Subject.js.map +//# sourceMappingURL=race.js.map /***/ }), -/* 188 */ +/* 237 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return ObjectUnsubscribedError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var ObjectUnsubscribedErrorImpl = /*@__PURE__*/ (function () { - function ObjectUnsubscribedErrorImpl() { - Error.call(this); - this.message = 'object unsubscribed'; - this.name = 'ObjectUnsubscribedError'; - return this; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ + +function range(start, count, scheduler) { + if (start === void 0) { + start = 0; } - ObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return ObjectUnsubscribedErrorImpl; -})(); -var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; -//# sourceMappingURL=ObjectUnsubscribedError.js.map + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + if (count === undefined) { + count = start; + start = 0; + } + var index = 0; + var current = start; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + index: index, count: count, start: start, subscriber: subscriber + }); + } + else { + do { + if (index++ >= count) { + subscriber.complete(); + break; + } + subscriber.next(current++); + if (subscriber.closed) { + break; + } + } while (true); + } + return undefined; + }); +} +function dispatch(state) { + var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber; + if (index >= count) { + subscriber.complete(); + return; + } + subscriber.next(start); + if (subscriber.closed) { + return; + } + state.index = index + 1; + state.start = start + 1; + this.schedule(state); +} +//# sourceMappingURL=range.js.map /***/ }), -/* 189 */ +/* 238 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(228); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(176); +/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -var SubjectSubscription = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscription, _super); - function SubjectSubscription(subject, subscriber) { - var _this = _super.call(this) || this; - _this.subject = subject; - _this.subscriber = subscriber; - _this.closed = false; - return _this; - } - SubjectSubscription.prototype.unsubscribe = function () { - if (this.closed) { - return; - } - this.closed = true; - var subject = this.subject; - var observers = subject.observers; - this.subject = null; - if (!observers || observers.length === 0 || subject.isStopped || subject.closed) { - return; - } - var subscriberIndex = observers.indexOf(this.subscriber); - if (subscriberIndex !== -1) { - observers.splice(subscriberIndex, 1); - } - }; - return SubjectSubscription; -}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); -//# sourceMappingURL=SubjectSubscription.js.map + +function timer(dueTime, periodOrScheduler, scheduler) { + if (dueTime === void 0) { + dueTime = 0; + } + var period = -1; + if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(periodOrScheduler)) { + period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler); + } + else if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(periodOrScheduler)) { + scheduler = periodOrScheduler; + } + if (!Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(scheduler)) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var due = Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(dueTime) + ? dueTime + : (+dueTime - scheduler.now()); + return scheduler.schedule(dispatch, due, { + index: 0, period: period, subscriber: subscriber + }); + }); +} +function dispatch(state) { + var index = state.index, period = state.period, subscriber = state.subscriber; + subscriber.next(index); + if (subscriber.closed) { + return; + } + else if (period === -1) { + return subscriber.complete(); + } + state.index = index + 1; + this.schedule(state, period); +} +//# sourceMappingURL=timer.js.map /***/ }), -/* 190 */ +/* 239 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return refCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "using", function() { return using; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(141); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); +/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ -function refCount() { - return function refCountOperatorFunction(source) { - return source.lift(new RefCountOperator(source)); - }; -} -var RefCountOperator = /*@__PURE__*/ (function () { - function RefCountOperator(connectable) { - this.connectable = connectable; - } - RefCountOperator.prototype.call = function (subscriber, source) { - var connectable = this.connectable; - connectable._refCount++; - var refCounter = new RefCountSubscriber(subscriber, connectable); - var subscription = source.subscribe(refCounter); - if (!refCounter.closed) { - refCounter.connection = connectable.connect(); + +function using(resourceFactory, observableFactory) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var resource; + try { + resource = resourceFactory(); } - return subscription; - }; - return RefCountOperator; -}()); -var RefCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); - function RefCountSubscriber(destination, connectable) { - var _this = _super.call(this, destination) || this; - _this.connectable = connectable; - return _this; - } - RefCountSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (!connectable) { - this.connection = null; - return; - } - this.connectable = null; - var refCount = connectable._refCount; - if (refCount <= 0) { - this.connection = null; - return; + catch (err) { + subscriber.error(err); + return undefined; } - connectable._refCount = refCount - 1; - if (refCount > 1) { - this.connection = null; - return; + var result; + try { + result = observableFactory(resource); } - var connection = this.connection; - var sharedConnection = connectable._connection; - this.connection = null; - if (sharedConnection && (!connection || sharedConnection === connection)) { - sharedConnection.unsubscribe(); + catch (err) { + subscriber.error(err); + return undefined; } - }; - return RefCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=refCount.js.map + var source = result ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(result) : _empty__WEBPACK_IMPORTED_MODULE_2__["EMPTY"]; + var subscription = source.subscribe(subscriber); + return function () { + subscription.unsubscribe(); + if (resource) { + resource.unsubscribe(); + } + }; + }); +} +//# sourceMappingURL=using.js.map /***/ }), -/* 191 */ +/* 240 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return groupBy; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return GroupedObservable; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(170); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(187); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipOperator", function() { return ZipOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipSubscriber", function() { return ZipSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(201); +/* harmony import */ var _internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(206); +/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */ -function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) { - return function (source) { - return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector)); - }; + + +function zip() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var resultSelector = observables[observables.length - 1]; + if (typeof resultSelector === 'function') { + observables.pop(); + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(observables, undefined).lift(new ZipOperator(resultSelector)); } -var GroupByOperator = /*@__PURE__*/ (function () { - function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) { - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.durationSelector = durationSelector; - this.subjectSelector = subjectSelector; +var ZipOperator = /*@__PURE__*/ (function () { + function ZipOperator(resultSelector) { + this.resultSelector = resultSelector; } - GroupByOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector)); + ZipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector)); }; - return GroupByOperator; + return ZipOperator; }()); -var GroupBySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupBySubscriber, _super); - function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) { + +var ZipSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipSubscriber, _super); + function ZipSubscriber(destination, resultSelector, values) { + if (values === void 0) { + values = Object.create(null); + } var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.elementSelector = elementSelector; - _this.durationSelector = durationSelector; - _this.subjectSelector = subjectSelector; - _this.groups = null; - _this.attemptedToUnsubscribe = false; - _this.count = 0; + _this.iterators = []; + _this.active = 0; + _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null; + _this.values = values; return _this; } - GroupBySubscriber.prototype._next = function (value) { - var key; - try { - key = this.keySelector(value); + ZipSubscriber.prototype._next = function (value) { + var iterators = this.iterators; + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(value)) { + iterators.push(new StaticArrayIterator(value)); } - catch (err) { - this.error(err); - return; + else if (typeof value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] === 'function') { + iterators.push(new StaticIterator(value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]]())); + } + else { + iterators.push(new ZipBufferIterator(this.destination, this, value)); } - this._group(value, key); }; - GroupBySubscriber.prototype._group = function (value, key) { - var groups = this.groups; - if (!groups) { - groups = this.groups = new Map(); + ZipSubscriber.prototype._complete = function () { + var iterators = this.iterators; + var len = iterators.length; + this.unsubscribe(); + if (len === 0) { + this.destination.complete(); + return; } - var group = groups.get(key); - var element; - if (this.elementSelector) { - try { - element = this.elementSelector(value); + this.active = len; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (iterator.stillUnsubscribed) { + var destination = this.destination; + destination.add(iterator.subscribe(iterator, i)); } - catch (err) { - this.error(err); + else { + this.active--; } } - else { - element = value; + }; + ZipSubscriber.prototype.notifyInactive = function () { + this.active--; + if (this.active === 0) { + this.destination.complete(); } - if (!group) { - group = (this.subjectSelector ? this.subjectSelector() : new _Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]()); - groups.set(key, group); - var groupedObservable = new GroupedObservable(key, group, this); - this.destination.next(groupedObservable); - if (this.durationSelector) { - var duration = void 0; - try { - duration = this.durationSelector(new GroupedObservable(key, group)); - } - catch (err) { - this.error(err); - return; - } - this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this))); + }; + ZipSubscriber.prototype.checkIterators = function () { + var iterators = this.iterators; + var len = iterators.length; + var destination = this.destination; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { + return; } } - if (!group.closed) { - group.next(element); + var shouldComplete = false; + var args = []; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + var result = iterator.next(); + if (iterator.hasCompleted()) { + shouldComplete = true; + } + if (result.done) { + destination.complete(); + return; + } + args.push(result.value); } - }; - GroupBySubscriber.prototype._error = function (err) { - var groups = this.groups; - if (groups) { - groups.forEach(function (group, key) { - group.error(err); - }); - groups.clear(); + if (this.resultSelector) { + this._tryresultSelector(args); } - this.destination.error(err); - }; - GroupBySubscriber.prototype._complete = function () { - var groups = this.groups; - if (groups) { - groups.forEach(function (group, key) { - group.complete(); - }); - groups.clear(); + else { + destination.next(args); + } + if (shouldComplete) { + destination.complete(); } - this.destination.complete(); - }; - GroupBySubscriber.prototype.removeGroup = function (key) { - this.groups.delete(key); }; - GroupBySubscriber.prototype.unsubscribe = function () { - if (!this.closed) { - this.attemptedToUnsubscribe = true; - if (this.count === 0) { - _super.prototype.unsubscribe.call(this); - } + ZipSubscriber.prototype._tryresultSelector = function (args) { + var result; + try { + result = this.resultSelector.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; } + this.destination.next(result); }; - return GroupBySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupDurationSubscriber, _super); - function GroupDurationSubscriber(key, group, parent) { - var _this = _super.call(this, group) || this; - _this.key = key; - _this.group = group; - _this.parent = parent; - return _this; + return ZipSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); + +var StaticIterator = /*@__PURE__*/ (function () { + function StaticIterator(iterator) { + this.iterator = iterator; + this.nextResult = iterator.next(); } - GroupDurationSubscriber.prototype._next = function (value) { - this.complete(); + StaticIterator.prototype.hasValue = function () { + return true; }; - GroupDurationSubscriber.prototype._unsubscribe = function () { - var _a = this, parent = _a.parent, key = _a.key; - this.key = this.parent = null; - if (parent) { - parent.removeGroup(key); - } + StaticIterator.prototype.next = function () { + var result = this.nextResult; + this.nextResult = this.iterator.next(); + return result; }; - return GroupDurationSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var GroupedObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupedObservable, _super); - function GroupedObservable(key, groupSubject, refCountSubscription) { - var _this = _super.call(this) || this; - _this.key = key; - _this.groupSubject = groupSubject; - _this.refCountSubscription = refCountSubscription; - return _this; + StaticIterator.prototype.hasCompleted = function () { + var nextResult = this.nextResult; + return nextResult && nextResult.done; + }; + return StaticIterator; +}()); +var StaticArrayIterator = /*@__PURE__*/ (function () { + function StaticArrayIterator(array) { + this.array = array; + this.index = 0; + this.length = 0; + this.length = array.length; } - GroupedObservable.prototype._subscribe = function (subscriber) { - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); - var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject; - if (refCountSubscription && !refCountSubscription.closed) { - subscription.add(new InnerRefCountSubscription(refCountSubscription)); - } - subscription.add(groupSubject.subscribe(subscriber)); - return subscription; + StaticArrayIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { + return this; }; - return GroupedObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"])); - -var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerRefCountSubscription, _super); - function InnerRefCountSubscription(parent) { - var _this = _super.call(this) || this; + StaticArrayIterator.prototype.next = function (value) { + var i = this.index++; + var array = this.array; + return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; + }; + StaticArrayIterator.prototype.hasValue = function () { + return this.array.length > this.index; + }; + StaticArrayIterator.prototype.hasCompleted = function () { + return this.array.length === this.index; + }; + return StaticArrayIterator; +}()); +var ZipBufferIterator = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipBufferIterator, _super); + function ZipBufferIterator(destination, parent, observable) { + var _this = _super.call(this, destination) || this; _this.parent = parent; - parent.count++; + _this.observable = observable; + _this.stillUnsubscribed = true; + _this.buffer = []; + _this.isComplete = false; return _this; } - InnerRefCountSubscription.prototype.unsubscribe = function () { - var parent = this.parent; - if (!parent.closed && !this.closed) { - _super.prototype.unsubscribe.call(this); - parent.count -= 1; - if (parent.count === 0 && parent.attemptedToUnsubscribe) { - parent.unsubscribe(); - } + ZipBufferIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { + return this; + }; + ZipBufferIterator.prototype.next = function () { + var buffer = this.buffer; + if (buffer.length === 0 && this.isComplete) { + return { value: null, done: true }; + } + else { + return { value: buffer.shift(), done: false }; } }; - return InnerRefCountSubscription; -}(_Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"])); -//# sourceMappingURL=groupBy.js.map + ZipBufferIterator.prototype.hasValue = function () { + return this.buffer.length > 0; + }; + ZipBufferIterator.prototype.hasCompleted = function () { + return this.buffer.length === 0 && this.isComplete; + }; + ZipBufferIterator.prototype.notifyComplete = function () { + if (this.buffer.length > 0) { + this.isComplete = true; + this.parent.notifyInactive(); + } + else { + this.destination.complete(); + } + }; + ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.buffer.push(innerValue); + this.parent.checkIterators(); + }; + ZipBufferIterator.prototype.subscribe = function (value, index) { + return Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, this.observable, this, index); + }; + return ZipBufferIterator; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__["OuterSubscriber"])); +//# sourceMappingURL=zip.js.map /***/ }), -/* 192 */ +/* 241 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return BehaviorSubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(188); -/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); +/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); +/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(244); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); -var BehaviorSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BehaviorSubject, _super); - function BehaviorSubject(_value) { - var _this = _super.call(this) || this; - _this._value = _value; - return _this; - } - Object.defineProperty(BehaviorSubject.prototype, "value", { - get: function () { - return this.getValue(); - }, - enumerable: true, - configurable: true - }); - BehaviorSubject.prototype._subscribe = function (subscriber) { - var subscription = _super.prototype._subscribe.call(this, subscriber); - if (subscription && !subscription.closed) { - subscriber.next(this._value); - } - return subscription; - }; - BehaviorSubject.prototype.getValue = function () { - if (this.hasError) { - throw this.thrownError; - } - else if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__["ObjectUnsubscribedError"](); - } - else { - return this._value; - } - }; - BehaviorSubject.prototype.next = function (value) { - _super.prototype.next.call(this, this._value = value); - }; - return BehaviorSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(245); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); -//# sourceMappingURL=BehaviorSubject.js.map +/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(246); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); +/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(247); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); -/***/ }), -/* 193 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(248); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return ReplaySubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(194); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(188); -/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(189); -/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(249); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); +/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(250); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); +/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(251); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); +/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(252); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); +/* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(211); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); +/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(253); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); +/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(254); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); -var ReplaySubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ReplaySubject, _super); - function ReplaySubject(bufferSize, windowTime, scheduler) { - if (bufferSize === void 0) { - bufferSize = Number.POSITIVE_INFINITY; - } - if (windowTime === void 0) { - windowTime = Number.POSITIVE_INFINITY; - } - var _this = _super.call(this) || this; - _this.scheduler = scheduler; - _this._events = []; - _this._infiniteTimeWindow = false; - _this._bufferSize = bufferSize < 1 ? 1 : bufferSize; - _this._windowTime = windowTime < 1 ? 1 : windowTime; - if (windowTime === Number.POSITIVE_INFINITY) { - _this._infiniteTimeWindow = true; - _this.next = _this.nextInfiniteTimeWindow; - } - else { - _this.next = _this.nextTimeWindow; - } - return _this; - } - ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) { - var _events = this._events; - _events.push(value); - if (_events.length > this._bufferSize) { - _events.shift(); - } - _super.prototype.next.call(this, value); - }; - ReplaySubject.prototype.nextTimeWindow = function (value) { - this._events.push(new ReplayEvent(this._getNow(), value)); - this._trimBufferThenGetEvents(); - _super.prototype.next.call(this, value); - }; - ReplaySubject.prototype._subscribe = function (subscriber) { - var _infiniteTimeWindow = this._infiniteTimeWindow; - var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents(); - var scheduler = this.scheduler; - var len = _events.length; - var subscription; - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__["ObjectUnsubscribedError"](); - } - else if (this.isStopped || this.hasError) { - subscription = _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; - } - else { - this.observers.push(subscriber); - subscription = new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__["SubjectSubscription"](this, subscriber); - } - if (scheduler) { - subscriber.add(subscriber = new _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__["ObserveOnSubscriber"](subscriber, scheduler)); - } - if (_infiniteTimeWindow) { - for (var i = 0; i < len && !subscriber.closed; i++) { - subscriber.next(_events[i]); - } - } - else { - for (var i = 0; i < len && !subscriber.closed; i++) { - subscriber.next(_events[i].value); - } - } - if (this.hasError) { - subscriber.error(this.thrownError); - } - else if (this.isStopped) { - subscriber.complete(); - } - return subscription; - }; - ReplaySubject.prototype._getNow = function () { - return (this.scheduler || _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__["queue"]).now(); - }; - ReplaySubject.prototype._trimBufferThenGetEvents = function () { - var now = this._getNow(); - var _bufferSize = this._bufferSize; - var _windowTime = this._windowTime; - var _events = this._events; - var eventsCount = _events.length; - var spliceCount = 0; - while (spliceCount < eventsCount) { - if ((now - _events[spliceCount].time) < _windowTime) { - break; - } - spliceCount++; - } - if (eventsCount > _bufferSize) { - spliceCount = Math.max(spliceCount, eventsCount - _bufferSize); - } - if (spliceCount > 0) { - _events.splice(0, spliceCount); - } - return _events; - }; - return ReplaySubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(255); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); -var ReplayEvent = /*@__PURE__*/ (function () { - function ReplayEvent(time, value) { - this.time = time; - this.value = value; - } - return ReplayEvent; -}()); -//# sourceMappingURL=ReplaySubject.js.map +/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(256); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); +/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(257); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -/***/ }), -/* 194 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(258); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queue", function() { return queue; }); -/* harmony import */ var _QueueAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(195); -/* harmony import */ var _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(198); -/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(259); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); +/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(261); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); -var queue = /*@__PURE__*/ new _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__["QueueScheduler"](_QueueAction__WEBPACK_IMPORTED_MODULE_0__["QueueAction"]); -//# sourceMappingURL=queue.js.map +/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(262); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); +/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(263); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); -/***/ }), -/* 195 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(264); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueAction", function() { return QueueAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); -/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(265); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); +/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(266); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); -var QueueAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueAction, _super); - function QueueAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; - } - QueueAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay > 0) { - return _super.prototype.schedule.call(this, state, delay); - } - this.delay = delay; - this.state = state; - this.scheduler.flush(this); - return this; - }; - QueueAction.prototype.execute = function (state, delay) { - return (delay > 0 || this.closed) ? - _super.prototype.execute.call(this, state, delay) : - this._execute(state, delay); - }; - QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); - } - return scheduler.flush(this); - }; - return QueueAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); +/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(269); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); -//# sourceMappingURL=QueueAction.js.map +/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(270); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); +/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(271); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); -/***/ }), -/* 196 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(272); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncAction", function() { return AsyncAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(197); -/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(273); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); +/* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(235); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); -var AsyncAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncAction, _super); - function AsyncAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - _this.pending = false; - return _this; - } - AsyncAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (this.closed) { - return this; - } - this.state = state; - var id = this.id; - var scheduler = this.scheduler; - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, delay); - } - this.pending = true; - this.delay = delay; - this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); - return this; - }; - AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - return setInterval(scheduler.flush.bind(scheduler, this), delay); - }; - AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && this.delay === delay && this.pending === false) { - return id; - } - clearInterval(id); - return undefined; - }; - AsyncAction.prototype.execute = function (state, delay) { - if (this.closed) { - return new Error('executing a cancelled action'); - } - this.pending = false; - var error = this._execute(state, delay); - if (error) { - return error; - } - else if (this.pending === false && this.id != null) { - this.id = this.recycleAsyncId(this.scheduler, this.id, null); - } - }; - AsyncAction.prototype._execute = function (state, delay) { - var errored = false; - var errorValue = undefined; - try { - this.work(state); - } - catch (e) { - errored = true; - errorValue = !!e && e || new Error(e); - } - if (errored) { - this.unsubscribe(); - return errorValue; - } - }; - AsyncAction.prototype._unsubscribe = function () { - var id = this.id; - var scheduler = this.scheduler; - var actions = scheduler.actions; - var index = actions.indexOf(this); - this.work = null; - this.state = null; - this.pending = false; - this.scheduler = null; - if (index !== -1) { - actions.splice(index, 1); - } - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, null); - } - this.delay = null; - }; - return AsyncAction; -}(_Action__WEBPACK_IMPORTED_MODULE_1__["Action"])); +/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(274); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); -//# sourceMappingURL=AsyncAction.js.map +/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(275); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); +/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(276); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); -/***/ }), -/* 197 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(277); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Action", function() { return Action; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(162); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); +/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(278); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); -var Action = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Action, _super); - function Action(scheduler, work) { - return _super.call(this) || this; - } - Action.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - return this; - }; - return Action; -}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); +/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(279); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); -//# sourceMappingURL=Action.js.map +/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(280); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); +/* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(197); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); -/***/ }), -/* 198 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(282); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueScheduler", function() { return QueueScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(283); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); +/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(284); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); -var QueueScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueScheduler, _super); - function QueueScheduler() { - return _super !== null && _super.apply(this, arguments) || this; - } - return QueueScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); +/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(287); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); -//# sourceMappingURL=QueueScheduler.js.map +/* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(212); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); +/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(213); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -/***/ }), -/* 199 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncScheduler", function() { return AsyncScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Scheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); -/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(288); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); +/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(289); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); -var AsyncScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncScheduler, _super); - function AsyncScheduler(SchedulerAction, now) { - if (now === void 0) { - now = _Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"].now; - } - var _this = _super.call(this, SchedulerAction, function () { - if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) { - return AsyncScheduler.delegate.now(); - } - else { - return now(); - } - }) || this; - _this.actions = []; - _this.active = false; - _this.scheduled = undefined; - return _this; - } - AsyncScheduler.prototype.schedule = function (work, delay, state) { - if (delay === void 0) { - delay = 0; - } - if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) { - return AsyncScheduler.delegate.schedule(work, delay, state); - } - else { - return _super.prototype.schedule.call(this, work, delay, state); - } - }; - AsyncScheduler.prototype.flush = function (action) { - var actions = this.actions; - if (this.active) { - actions.push(action); - return; - } - var error; - this.active = true; - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (action = actions.shift()); - this.active = false; - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); - } - throw error; - } - }; - return AsyncScheduler; -}(_Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"])); +/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(290); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); -//# sourceMappingURL=AsyncScheduler.js.map +/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(291); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); +/* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(172); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); -/***/ }), -/* 200 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(292); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return Scheduler; }); -var Scheduler = /*@__PURE__*/ (function () { - function Scheduler(SchedulerAction, now) { - if (now === void 0) { - now = Scheduler.now; - } - this.SchedulerAction = SchedulerAction; - this.now = now; - } - Scheduler.prototype.schedule = function (work, delay, state) { - if (delay === void 0) { - delay = 0; - } - return new this.SchedulerAction(this, work).schedule(state, delay); - }; - Scheduler.now = function () { return Date.now(); }; - return Scheduler; -}()); +/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(293); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -//# sourceMappingURL=Scheduler.js.map +/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(294); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); +/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(295); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); -/***/ }), -/* 201 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(296); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return observeOn; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnOperator", function() { return ObserveOnOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnSubscriber", function() { return ObserveOnSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnMessage", function() { return ObserveOnMessage; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(297); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); +/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(298); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); +/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(299); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); -function observeOn(scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - return function observeOnOperatorFunction(source) { - return source.lift(new ObserveOnOperator(scheduler, delay)); - }; -} -var ObserveOnOperator = /*@__PURE__*/ (function () { - function ObserveOnOperator(scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - this.scheduler = scheduler; - this.delay = delay; - } - ObserveOnOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); - }; - return ObserveOnOperator; -}()); +/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(300); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); -var ObserveOnSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ObserveOnSubscriber, _super); - function ObserveOnSubscriber(destination, scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - var _this = _super.call(this, destination) || this; - _this.scheduler = scheduler; - _this.delay = delay; - return _this; - } - ObserveOnSubscriber.dispatch = function (arg) { - var notification = arg.notification, destination = arg.destination; - notification.observe(destination); - this.unsubscribe(); - }; - ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { - var destination = this.destination; - destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); - }; - ObserveOnSubscriber.prototype._next = function (value) { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); - }; - ObserveOnSubscriber.prototype._error = function (err) { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); - this.unsubscribe(); - }; - ObserveOnSubscriber.prototype._complete = function () { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); - this.unsubscribe(); - }; - return ObserveOnSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(285); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); -var ObserveOnMessage = /*@__PURE__*/ (function () { - function ObserveOnMessage(notification, destination) { - this.notification = notification; - this.destination = destination; - } - return ObserveOnMessage; -}()); +/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(301); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); -//# sourceMappingURL=observeOn.js.map +/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(302); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); +/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(303); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); -/***/ }), -/* 202 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(304); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return NotificationKind; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return Notification; }); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(203); -/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); -/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(209); -/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(161); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); +/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(305); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); +/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(306); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); -var NotificationKind; -/*@__PURE__*/ (function (NotificationKind) { - NotificationKind["NEXT"] = "N"; - NotificationKind["ERROR"] = "E"; - NotificationKind["COMPLETE"] = "C"; -})(NotificationKind || (NotificationKind = {})); -var Notification = /*@__PURE__*/ (function () { - function Notification(kind, value, error) { - this.kind = kind; - this.value = value; - this.error = error; - this.hasValue = kind === 'N'; - } - Notification.prototype.observe = function (observer) { - switch (this.kind) { - case 'N': - return observer.next && observer.next(this.value); - case 'E': - return observer.error && observer.error(this.error); - case 'C': - return observer.complete && observer.complete(); - } - }; - Notification.prototype.do = function (next, error, complete) { - var kind = this.kind; - switch (kind) { - case 'N': - return next && next(this.value); - case 'E': - return error && error(this.error); - case 'C': - return complete && complete(); - } - }; - Notification.prototype.accept = function (nextOrObserver, error, complete) { - if (nextOrObserver && typeof nextOrObserver.next === 'function') { - return this.observe(nextOrObserver); - } - else { - return this.do(nextOrObserver, error, complete); - } - }; - Notification.prototype.toObservable = function () { - var kind = this.kind; - switch (kind) { - case 'N': - return Object(_observable_of__WEBPACK_IMPORTED_MODULE_1__["of"])(this.value); - case 'E': - return Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_2__["throwError"])(this.error); - case 'C': - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_0__["empty"])(); - } - throw new Error('unexpected notification kind value'); - }; - Notification.createNext = function (value) { - if (typeof value !== 'undefined') { - return new Notification('N', value); - } - return Notification.undefinedValueNotification; - }; - Notification.createError = function (err) { - return new Notification('E', undefined, err); - }; - Notification.createComplete = function () { - return Notification.completeNotification; - }; - Notification.completeNotification = new Notification('C'); - Notification.undefinedValueNotification = new Notification('N', undefined); - return Notification; -}()); +/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(286); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); -//# sourceMappingURL=Notification.js.map +/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(307); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); +/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(308); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); -/***/ }), -/* 203 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(309); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return EMPTY; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(310); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); -var EMPTY = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.complete(); }); -function empty(scheduler) { - return scheduler ? emptyScheduled(scheduler) : EMPTY; -} -function emptyScheduled(scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); }); -} -//# sourceMappingURL=empty.js.map +/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(311); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); +/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(312); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); -/***/ }), -/* 204 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(313); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "of", function() { return of; }); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(205); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); -/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); -/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_scheduled_scheduleArray PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(314); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); +/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(315); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); +/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(316); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); -function of() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var scheduler = args[args.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_0__["isScheduler"])(scheduler)) { - args.pop(); - return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(args, scheduler); - } - else { - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(args); - } -} -//# sourceMappingURL=of.js.map +/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(318); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); +/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(319); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); -/***/ }), -/* 205 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(320); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isScheduler", function() { return isScheduler; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isScheduler(value) { - return value && typeof value.schedule === 'function'; -} -//# sourceMappingURL=isScheduler.js.map +/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(268); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); +/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(281); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); -/***/ }), -/* 206 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(321); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromArray", function() { return fromArray; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(207); -/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); -/** PURE_IMPORTS_START _Observable,_util_subscribeToArray,_scheduled_scheduleArray PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(322); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); +/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(323); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); +/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(324); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); -function fromArray(input, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__["subscribeToArray"])(input)); - } - else { - return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); - } -} -//# sourceMappingURL=fromArray.js.map +/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(325); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); +/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(267); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); -/***/ }), -/* 207 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(326); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); + +/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(327); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); + +/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(328); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); + +/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(329); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); + +/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(330); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); + +/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(331); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); + +/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(332); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); + +/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(333); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); + +/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(334); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); + +/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(335); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); + +/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(336); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); + +/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(337); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); + +/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(338); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToArray", function() { return subscribeToArray; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ -var subscribeToArray = function (array) { - return function (subscriber) { - for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) { - subscriber.next(array[i]); - } - subscriber.complete(); - }; -}; -//# sourceMappingURL=subscribeToArray.js.map -/***/ }), -/* 208 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleArray", function() { return scheduleArray; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -function scheduleArray(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var i = 0; - sub.add(scheduler.schedule(function () { - if (i === input.length) { - subscriber.complete(); - return; - } - subscriber.next(input[i++]); - if (!subscriber.closed) { - sub.add(this.schedule()); - } - })); - return sub; - }); -} -//# sourceMappingURL=scheduleArray.js.map -/***/ }), -/* 209 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return throwError; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -function throwError(error, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.error(error); }); - } - else { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); - } -} -function dispatch(_a) { - var error = _a.error, subscriber = _a.subscriber; - subscriber.error(error); -} -//# sourceMappingURL=throwError.js.map -/***/ }), -/* 210 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return AsyncSubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */ -var AsyncSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncSubject, _super); - function AsyncSubject() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.value = null; - _this.hasNext = false; - _this.hasCompleted = false; - return _this; - } - AsyncSubject.prototype._subscribe = function (subscriber) { - if (this.hasError) { - subscriber.error(this.thrownError); - return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; - } - else if (this.hasCompleted && this.hasNext) { - subscriber.next(this.value); - subscriber.complete(); - return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; - } - return _super.prototype._subscribe.call(this, subscriber); - }; - AsyncSubject.prototype.next = function (value) { - if (!this.hasCompleted) { - this.value = value; - this.hasNext = true; - } - }; - AsyncSubject.prototype.error = function (error) { - if (!this.hasCompleted) { - _super.prototype.error.call(this, error); - } - }; - AsyncSubject.prototype.complete = function () { - this.hasCompleted = true; - if (this.hasNext) { - _super.prototype.next.call(this, this.value); - } - _super.prototype.complete.call(this); - }; - return AsyncSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -//# sourceMappingURL=AsyncSubject.js.map -/***/ }), -/* 211 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asap", function() { return asap; }); -/* harmony import */ var _AsapAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(212); -/* harmony import */ var _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); -/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */ -var asap = /*@__PURE__*/ new _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__["AsapScheduler"](_AsapAction__WEBPACK_IMPORTED_MODULE_0__["AsapAction"]); -//# sourceMappingURL=asap.js.map -/***/ }), -/* 212 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapAction", function() { return AsapAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_Immediate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(213); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(196); -/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */ -var AsapAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapAction, _super); - function AsapAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; - } - AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && delay > 0) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); - } - scheduler.actions.push(this); - return scheduler.scheduled || (scheduler.scheduled = _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].setImmediate(scheduler.flush.bind(scheduler, null))); - }; - AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); - } - if (scheduler.actions.length === 0) { - _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].clearImmediate(id); - scheduler.scheduled = undefined; - } - return undefined; - }; - return AsapAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_2__["AsyncAction"])); -//# sourceMappingURL=AsapAction.js.map -/***/ }), -/* 213 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Immediate", function() { return Immediate; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var nextHandle = 1; -var tasksByHandle = {}; -function runIfPresent(handle) { - var cb = tasksByHandle[handle]; - if (cb) { - cb(); - } -} -var Immediate = { - setImmediate: function (cb) { - var handle = nextHandle++; - tasksByHandle[handle] = cb; - Promise.resolve().then(function () { return runIfPresent(handle); }); - return handle; - }, - clearImmediate: function (handle) { - delete tasksByHandle[handle]; - }, -}; -//# sourceMappingURL=Immediate.js.map -/***/ }), -/* 214 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapScheduler", function() { return AsapScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -var AsapScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapScheduler, _super); - function AsapScheduler() { - return _super !== null && _super.apply(this, arguments) || this; - } - AsapScheduler.prototype.flush = function (action) { - this.active = true; - this.scheduled = undefined; - var actions = this.actions; - var error; - var index = -1; - var count = actions.length; - action = action || actions.shift(); - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (++index < count && (action = actions.shift())); - this.active = false; - if (error) { - while (++index < count && (action = actions.shift())) { - action.unsubscribe(); - } - throw error; - } - }; - return AsapScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -//# sourceMappingURL=AsapScheduler.js.map -/***/ }), -/* 215 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "async", function() { return async; }); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(196); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -var async = /*@__PURE__*/ new _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"](_AsyncAction__WEBPACK_IMPORTED_MODULE_0__["AsyncAction"]); -//# sourceMappingURL=async.js.map -/***/ }), -/* 216 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animationFrame", function() { return animationFrame; }); -/* harmony import */ var _AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(217); -/* harmony import */ var _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(218); -/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */ -var animationFrame = /*@__PURE__*/ new _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__["AnimationFrameScheduler"](_AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__["AnimationFrameAction"]); -//# sourceMappingURL=animationFrame.js.map -/***/ }), -/* 217 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameAction", function() { return AnimationFrameAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); -/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ -var AnimationFrameAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameAction, _super); - function AnimationFrameAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; - } - AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && delay > 0) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); - } - scheduler.actions.push(this); - return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); })); - }; - AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); - } - if (scheduler.actions.length === 0) { - cancelAnimationFrame(id); - scheduler.scheduled = undefined; - } - return undefined; - }; - return AnimationFrameAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -//# sourceMappingURL=AnimationFrameAction.js.map -/***/ }), -/* 218 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameScheduler", function() { return AnimationFrameScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -var AnimationFrameScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameScheduler, _super); - function AnimationFrameScheduler() { - return _super !== null && _super.apply(this, arguments) || this; - } - AnimationFrameScheduler.prototype.flush = function (action) { - this.active = true; - this.scheduled = undefined; - var actions = this.actions; - var error; - var index = -1; - var count = actions.length; - action = action || actions.shift(); - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (++index < count && (action = actions.shift())); - this.active = false; - if (error) { - while (++index < count && (action = actions.shift())) { - action.unsubscribe(); - } - throw error; - } - }; - return AnimationFrameScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -//# sourceMappingURL=AnimationFrameScheduler.js.map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//# sourceMappingURL=index.js.map /***/ }), -/* 219 */ +/* 242 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return VirtualTimeScheduler; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return VirtualAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var VirtualTimeScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualTimeScheduler, _super); - function VirtualTimeScheduler(SchedulerAction, maxFrames) { - if (SchedulerAction === void 0) { - SchedulerAction = VirtualAction; - } - if (maxFrames === void 0) { - maxFrames = Number.POSITIVE_INFINITY; - } - var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this; - _this.maxFrames = maxFrames; - _this.frame = 0; - _this.index = -1; - return _this; +function audit(durationSelector) { + return function auditOperatorFunction(source) { + return source.lift(new AuditOperator(durationSelector)); + }; +} +var AuditOperator = /*@__PURE__*/ (function () { + function AuditOperator(durationSelector) { + this.durationSelector = durationSelector; } - VirtualTimeScheduler.prototype.flush = function () { - var _a = this, actions = _a.actions, maxFrames = _a.maxFrames; - var error, action; - while ((action = actions[0]) && action.delay <= maxFrames) { - actions.shift(); - this.frame = action.delay; - if (error = action.execute(action.state, action.delay)) { - break; - } - } - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); - } - throw error; - } + AuditOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); }; - VirtualTimeScheduler.frameTimeFactor = 10; - return VirtualTimeScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__["AsyncScheduler"])); - -var VirtualAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualAction, _super); - function VirtualAction(scheduler, work, index) { - if (index === void 0) { - index = scheduler.index += 1; - } - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - _this.index = index; - _this.active = true; - _this.index = scheduler.index = index; + return AuditOperator; +}()); +var AuditSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AuditSubscriber, _super); + function AuditSubscriber(destination, durationSelector) { + var _this = _super.call(this, destination) || this; + _this.durationSelector = durationSelector; + _this.hasValue = false; return _this; } - VirtualAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (!this.id) { - return _super.prototype.schedule.call(this, state, delay); - } - this.active = false; - var action = new VirtualAction(this.scheduler, this.work); - this.add(action); - return action.schedule(state, delay); - }; - VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - this.delay = scheduler.frame + delay; - var actions = scheduler.actions; - actions.push(this); - actions.sort(VirtualAction.sortActions); - return true; - }; - VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - return undefined; - }; - VirtualAction.prototype._execute = function (state, delay) { - if (this.active === true) { - return _super.prototype._execute.call(this, state, delay); - } - }; - VirtualAction.sortActions = function (a, b) { - if (a.delay === b.delay) { - if (a.index === b.index) { - return 0; + AuditSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; + if (!this.throttled) { + var duration = void 0; + try { + var durationSelector = this.durationSelector; + duration = durationSelector(value); } - else if (a.index > b.index) { - return 1; + catch (err) { + return this.destination.error(err); + } + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (!innerSubscription || innerSubscription.closed) { + this.clearThrottle(); } else { - return -1; + this.add(this.throttled = innerSubscription); } } - else if (a.delay > b.delay) { - return 1; + }; + AuditSubscriber.prototype.clearThrottle = function () { + var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled; + if (throttled) { + this.remove(throttled); + this.throttled = null; + throttled.unsubscribe(); } - else { - return -1; + if (hasValue) { + this.value = null; + this.hasValue = false; + this.destination.next(value); } }; - return VirtualAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); - -//# sourceMappingURL=VirtualTimeScheduler.js.map + AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { + this.clearThrottle(); + }; + AuditSubscriber.prototype.notifyComplete = function () { + this.clearThrottle(); + }; + return AuditSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=audit.js.map /***/ }), -/* 220 */ +/* 243 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function identity(x) { - return x; -} -//# sourceMappingURL=identity.js.map - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(242); +/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(238); +/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ -/***/ }), -/* 221 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return isObservable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -function isObservable(obj) { - return !!obj && (obj instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function')); +function auditTime(duration, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); } -//# sourceMappingURL=isObservable.js.map +//# sourceMappingURL=auditTime.js.map /***/ }), -/* 222 */ +/* 244 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return ArgumentOutOfRangeError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var ArgumentOutOfRangeErrorImpl = /*@__PURE__*/ (function () { - function ArgumentOutOfRangeErrorImpl() { - Error.call(this); - this.message = 'argument out of range'; - this.name = 'ArgumentOutOfRangeError'; - return this; - } - ArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return ArgumentOutOfRangeErrorImpl; -})(); -var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl; -//# sourceMappingURL=ArgumentOutOfRangeError.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 223 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return EmptyError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var EmptyErrorImpl = /*@__PURE__*/ (function () { - function EmptyErrorImpl() { - Error.call(this); - this.message = 'no elements in sequence'; - this.name = 'EmptyError'; - return this; +function buffer(closingNotifier) { + return function bufferOperatorFunction(source) { + return source.lift(new BufferOperator(closingNotifier)); + }; +} +var BufferOperator = /*@__PURE__*/ (function () { + function BufferOperator(closingNotifier) { + this.closingNotifier = closingNotifier; } - EmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return EmptyErrorImpl; -})(); -var EmptyError = EmptyErrorImpl; -//# sourceMappingURL=EmptyError.js.map - - -/***/ }), -/* 224 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var TimeoutErrorImpl = /*@__PURE__*/ (function () { - function TimeoutErrorImpl() { - Error.call(this); - this.message = 'Timeout has occurred'; - this.name = 'TimeoutError'; - return this; + BufferOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); + }; + return BufferOperator; +}()); +var BufferSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); + function BufferSubscriber(destination, closingNotifier) { + var _this = _super.call(this, destination) || this; + _this.buffer = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, closingNotifier)); + return _this; } - TimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return TimeoutErrorImpl; -})(); -var TimeoutError = TimeoutErrorImpl; -//# sourceMappingURL=TimeoutError.js.map + BufferSubscriber.prototype._next = function (value) { + this.buffer.push(value); + }; + BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var buffer = this.buffer; + this.buffer = []; + this.destination.next(buffer); + }; + return BufferSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=buffer.js.map /***/ }), -/* 225 */ +/* 245 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return bindCallback; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(210); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(178); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(205); -/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */ - - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function bindCallback(callbackFunc, resultSelector, scheduler) { - if (resultSelector) { - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(resultSelector)) { - scheduler = resultSelector; - } - else { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_4__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - }; - } +function bufferCount(bufferSize, startBufferEvery) { + if (startBufferEvery === void 0) { + startBufferEvery = null; } - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var context = this; - var subject; - var params = { - context: context, - subject: subject, - callbackFunc: callbackFunc, - scheduler: scheduler, - }; - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - if (!scheduler) { - if (!subject) { - subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); - subject.complete(); - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { - subject.error(err); - } - else { - console.warn(err); - } - } - } - return subject.subscribe(subscriber); - } - else { - var state = { - args: args, subscriber: subscriber, params: params, - }; - return scheduler.schedule(dispatch, 0, state); - } - }); + return function bufferCountOperatorFunction(source) { + return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); }; } -function dispatch(state) { - var _this = this; - var self = this; - var args = state.args, subscriber = state.subscriber, params = state.params; - var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler; - var subject = params.subject; - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; - _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); - }; - try { - callbackFunc.apply(context, args.concat([handler])); +var BufferCountOperator = /*@__PURE__*/ (function () { + function BufferCountOperator(bufferSize, startBufferEvery) { + this.bufferSize = bufferSize; + this.startBufferEvery = startBufferEvery; + if (!startBufferEvery || bufferSize === startBufferEvery) { + this.subscriberClass = BufferCountSubscriber; } - catch (err) { - subject.error(err); + else { + this.subscriberClass = BufferSkipCountSubscriber; } } - this.add(subject.subscribe(subscriber)); -} -function dispatchNext(state) { - var value = state.value, subject = state.subject; - subject.next(value); - subject.complete(); -} -function dispatchError(state) { - var err = state.err, subject = state.subject; - subject.error(err); -} -//# sourceMappingURL=bindCallback.js.map - - -/***/ }), -/* 226 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapOperator", function() { return MapOperator; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function map(project, thisArg) { - return function mapOperation(source) { - if (typeof project !== 'function') { - throw new TypeError('argument is not a function. Are you looking for `mapTo()`?'); - } - return source.lift(new MapOperator(project, thisArg)); + BufferCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); }; -} -var MapOperator = /*@__PURE__*/ (function () { - function MapOperator(project, thisArg) { - this.project = project; - this.thisArg = thisArg; + return BufferCountOperator; +}()); +var BufferCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferCountSubscriber, _super); + function BufferCountSubscriber(destination, bufferSize) { + var _this = _super.call(this, destination) || this; + _this.bufferSize = bufferSize; + _this.buffer = []; + return _this; } - MapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); + BufferCountSubscriber.prototype._next = function (value) { + var buffer = this.buffer; + buffer.push(value); + if (buffer.length == this.bufferSize) { + this.destination.next(buffer); + this.buffer = []; + } }; - return MapOperator; -}()); - -var MapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapSubscriber, _super); - function MapSubscriber(destination, project, thisArg) { + BufferCountSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer.length > 0) { + this.destination.next(buffer); + } + _super.prototype._complete.call(this); + }; + return BufferCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSkipCountSubscriber, _super); + function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { var _this = _super.call(this, destination) || this; - _this.project = project; + _this.bufferSize = bufferSize; + _this.startBufferEvery = startBufferEvery; + _this.buffers = []; _this.count = 0; - _this.thisArg = thisArg || _this; return _this; } - MapSubscriber.prototype._next = function (value) { - var result; - try { - result = this.project.call(this.thisArg, value, this.count++); + BufferSkipCountSubscriber.prototype._next = function (value) { + var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; + this.count++; + if (count % startBufferEvery === 0) { + buffers.push([]); } - catch (err) { - this.destination.error(err); - return; + for (var i = buffers.length; i--;) { + var buffer = buffers[i]; + buffer.push(value); + if (buffer.length === bufferSize) { + buffers.splice(i, 1); + this.destination.next(buffer); + } } - this.destination.next(result); }; - return MapSubscriber; + BufferSkipCountSubscriber.prototype._complete = function () { + var _a = this, buffers = _a.buffers, destination = _a.destination; + while (buffers.length > 0) { + var buffer = buffers.shift(); + if (buffer.length > 0) { + destination.next(buffer); + } + } + _super.prototype._complete.call(this); + }; + return BufferSkipCountSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=map.js.map +//# sourceMappingURL=bufferCount.js.map /***/ }), -/* 227 */ +/* 246 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return bindNodeCallback; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(210); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(205); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(178); -/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(176); +/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ -function bindNodeCallback(callbackFunc, resultSelector, scheduler) { - if (resultSelector) { - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_4__["isScheduler"])(resultSelector)) { - scheduler = resultSelector; - } - else { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_5__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - }; - } +function bufferTime(bufferTimeSpan) { + var length = arguments.length; + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(arguments[arguments.length - 1])) { + scheduler = arguments[arguments.length - 1]; + length--; } - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var params = { - subject: undefined, - args: args, - callbackFunc: callbackFunc, - scheduler: scheduler, - context: this, - }; - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var context = params.context; - var subject = params.subject; - if (!scheduler) { - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var err = innerArgs.shift(); - if (err) { - subject.error(err); - return; - } - subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); - subject.complete(); - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { - subject.error(err); - } - else { - console.warn(err); - } - } - } - return subject.subscribe(subscriber); - } - else { - return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context }); - } - }); + var bufferCreationInterval = null; + if (length >= 2) { + bufferCreationInterval = arguments[1]; + } + var maxBufferSize = Number.POSITIVE_INFINITY; + if (length >= 3) { + maxBufferSize = arguments[2]; + } + return function bufferTimeOperatorFunction(source) { + return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler)); }; } -function dispatch(state) { - var _this = this; - var params = state.params, subscriber = state.subscriber, context = state.context; - var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler; - var subject = params.subject; - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var err = innerArgs.shift(); - if (err) { - _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); - } - else { - var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; - _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); +var BufferTimeOperator = /*@__PURE__*/ (function () { + function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { + this.bufferTimeSpan = bufferTimeSpan; + this.bufferCreationInterval = bufferCreationInterval; + this.maxBufferSize = maxBufferSize; + this.scheduler = scheduler; + } + BufferTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler)); + }; + return BufferTimeOperator; +}()); +var Context = /*@__PURE__*/ (function () { + function Context() { + this.buffer = []; + } + return Context; +}()); +var BufferTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferTimeSubscriber, _super); + function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { + var _this = _super.call(this, destination) || this; + _this.bufferTimeSpan = bufferTimeSpan; + _this.bufferCreationInterval = bufferCreationInterval; + _this.maxBufferSize = maxBufferSize; + _this.scheduler = scheduler; + _this.contexts = []; + var context = _this.openContext(); + _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0; + if (_this.timespanOnly) { + var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan }; + _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); + } + else { + var closeState = { subscriber: _this, context: context }; + var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler }; + _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState)); + _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState)); + } + return _this; + } + BufferTimeSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + var len = contexts.length; + var filledBufferContext; + for (var i = 0; i < len; i++) { + var context_1 = contexts[i]; + var buffer = context_1.buffer; + buffer.push(value); + if (buffer.length == this.maxBufferSize) { + filledBufferContext = context_1; } - }; - try { - callbackFunc.apply(context, args.concat([handler])); } - catch (err) { - this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); + if (filledBufferContext) { + this.onBufferFull(filledBufferContext); + } + }; + BufferTimeSubscriber.prototype._error = function (err) { + this.contexts.length = 0; + _super.prototype._error.call(this, err); + }; + BufferTimeSubscriber.prototype._complete = function () { + var _a = this, contexts = _a.contexts, destination = _a.destination; + while (contexts.length > 0) { + var context_2 = contexts.shift(); + destination.next(context_2.buffer); + } + _super.prototype._complete.call(this); + }; + BufferTimeSubscriber.prototype._unsubscribe = function () { + this.contexts = null; + }; + BufferTimeSubscriber.prototype.onBufferFull = function (context) { + this.closeContext(context); + var closeAction = context.closeAction; + closeAction.unsubscribe(); + this.remove(closeAction); + if (!this.closed && this.timespanOnly) { + context = this.openContext(); + var bufferTimeSpan = this.bufferTimeSpan; + var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan }; + this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); + } + }; + BufferTimeSubscriber.prototype.openContext = function () { + var context = new Context(); + this.contexts.push(context); + return context; + }; + BufferTimeSubscriber.prototype.closeContext = function (context) { + this.destination.next(context.buffer); + var contexts = this.contexts; + var spliceIndex = contexts ? contexts.indexOf(context) : -1; + if (spliceIndex >= 0) { + contexts.splice(contexts.indexOf(context), 1); } + }; + return BufferTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); +function dispatchBufferTimeSpanOnly(state) { + var subscriber = state.subscriber; + var prevContext = state.context; + if (prevContext) { + subscriber.closeContext(prevContext); + } + if (!subscriber.closed) { + state.context = subscriber.openContext(); + state.context.closeAction = this.schedule(state, state.bufferTimeSpan); } - this.add(subject.subscribe(subscriber)); } -function dispatchNext(arg) { - var value = arg.value, subject = arg.subject; - subject.next(value); - subject.complete(); +function dispatchBufferCreation(state) { + var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler; + var context = subscriber.openContext(); + var action = this; + if (!subscriber.closed) { + subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context })); + action.schedule(state, bufferCreationInterval); + } } -function dispatchError(arg) { - var err = arg.err, subject = arg.subject; - subject.error(err); +function dispatchBufferClose(arg) { + var subscriber = arg.subscriber, context = arg.context; + subscriber.closeContext(context); } -//# sourceMappingURL=bindNodeCallback.js.map +//# sourceMappingURL=bufferTime.js.map /***/ }), -/* 228 */ +/* 247 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestOperator", function() { return CombineLatestOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestSubscriber", function() { return CombineLatestSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(206); -/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ -var NONE = {}; -function combineLatest() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var resultSelector = null; - var scheduler = null; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(observables[observables.length - 1])) { - scheduler = observables.pop(); - } - if (typeof observables[observables.length - 1] === 'function') { - resultSelector = observables.pop(); - } - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(observables[0])) { - observables = observables[0]; - } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_5__["fromArray"])(observables, scheduler).lift(new CombineLatestOperator(resultSelector)); +function bufferToggle(openings, closingSelector) { + return function bufferToggleOperatorFunction(source) { + return source.lift(new BufferToggleOperator(openings, closingSelector)); + }; } -var CombineLatestOperator = /*@__PURE__*/ (function () { - function CombineLatestOperator(resultSelector) { - this.resultSelector = resultSelector; +var BufferToggleOperator = /*@__PURE__*/ (function () { + function BufferToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; } - CombineLatestOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector)); + BufferToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); }; - return CombineLatestOperator; + return BufferToggleOperator; }()); - -var CombineLatestSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CombineLatestSubscriber, _super); - function CombineLatestSubscriber(destination, resultSelector) { +var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferToggleSubscriber, _super); + function BufferToggleSubscriber(destination, openings, closingSelector) { var _this = _super.call(this, destination) || this; - _this.resultSelector = resultSelector; - _this.active = 0; - _this.values = []; - _this.observables = []; + _this.openings = openings; + _this.closingSelector = closingSelector; + _this.contexts = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, openings)); return _this; } - CombineLatestSubscriber.prototype._next = function (observable) { - this.values.push(NONE); - this.observables.push(observable); - }; - CombineLatestSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); - } - else { - this.active = len; - this.toRespond = len; - for (var i = 0; i < len; i++) { - var observable = observables[i]; - this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i)); - } + BufferToggleSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + var len = contexts.length; + for (var i = 0; i < len; i++) { + contexts[i].buffer.push(value); } }; - CombineLatestSubscriber.prototype.notifyComplete = function (unused) { - if ((this.active -= 1) === 0) { - this.destination.complete(); + BufferToggleSubscriber.prototype._error = function (err) { + var contexts = this.contexts; + while (contexts.length > 0) { + var context_1 = contexts.shift(); + context_1.subscription.unsubscribe(); + context_1.buffer = null; + context_1.subscription = null; } + this.contexts = null; + _super.prototype._error.call(this, err); }; - CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var values = this.values; - var oldVal = values[outerIndex]; - var toRespond = !this.toRespond - ? 0 - : oldVal === NONE ? --this.toRespond : this.toRespond; - values[outerIndex] = innerValue; - if (toRespond === 0) { - if (this.resultSelector) { - this._tryResultSelector(values); - } - else { - this.destination.next(values.slice()); - } + BufferToggleSubscriber.prototype._complete = function () { + var contexts = this.contexts; + while (contexts.length > 0) { + var context_2 = contexts.shift(); + this.destination.next(context_2.buffer); + context_2.subscription.unsubscribe(); + context_2.buffer = null; + context_2.subscription = null; } + this.contexts = null; + _super.prototype._complete.call(this); }; - CombineLatestSubscriber.prototype._tryResultSelector = function (values) { - var result; + BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); + }; + BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) { + this.closeBuffer(innerSub.context); + }; + BufferToggleSubscriber.prototype.openBuffer = function (value) { try { - result = this.resultSelector.apply(this, values); + var closingSelector = this.closingSelector; + var closingNotifier = closingSelector.call(this, value); + if (closingNotifier) { + this.trySubscribe(closingNotifier); + } } catch (err) { - this.destination.error(err); - return; + this._error(err); } - this.destination.next(result); }; - return CombineLatestSubscriber; + BufferToggleSubscriber.prototype.closeBuffer = function (context) { + var contexts = this.contexts; + if (contexts && context) { + var buffer = context.buffer, subscription = context.subscription; + this.destination.next(buffer); + contexts.splice(contexts.indexOf(context), 1); + this.remove(subscription); + subscription.unsubscribe(); + } + }; + BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) { + var contexts = this.contexts; + var buffer = []; + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var context = { buffer: buffer, subscription: subscription }; + contexts.push(context); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); + if (!innerSubscription || innerSubscription.closed) { + this.closeBuffer(context); + } + else { + innerSubscription.context = context; + this.add(innerSubscription); + subscription.add(innerSubscription); + } + }; + return BufferToggleSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); - -//# sourceMappingURL=combineLatest.js.map +//# sourceMappingURL=bufferToggle.js.map /***/ }), -/* 229 */ +/* 248 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OuterSubscriber", function() { return OuterSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(148); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var OuterSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OuterSubscriber, _super); - function OuterSubscriber() { - return _super !== null && _super.apply(this, arguments) || this; + + +function bufferWhen(closingSelector) { + return function (source) { + return source.lift(new BufferWhenOperator(closingSelector)); + }; +} +var BufferWhenOperator = /*@__PURE__*/ (function () { + function BufferWhenOperator(closingSelector) { + this.closingSelector = closingSelector; } - OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); + BufferWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); }; - OuterSubscriber.prototype.notifyError = function (error, innerSub) { - this.destination.error(error); + return BufferWhenOperator; +}()); +var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferWhenSubscriber, _super); + function BufferWhenSubscriber(destination, closingSelector) { + var _this = _super.call(this, destination) || this; + _this.closingSelector = closingSelector; + _this.subscribing = false; + _this.openBuffer(); + return _this; + } + BufferWhenSubscriber.prototype._next = function (value) { + this.buffer.push(value); }; - OuterSubscriber.prototype.notifyComplete = function (innerSub) { - this.destination.complete(); + BufferWhenSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer) { + this.destination.next(buffer); + } + _super.prototype._complete.call(this); }; - return OuterSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=OuterSubscriber.js.map + BufferWhenSubscriber.prototype._unsubscribe = function () { + this.buffer = null; + this.subscribing = false; + }; + BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openBuffer(); + }; + BufferWhenSubscriber.prototype.notifyComplete = function () { + if (this.subscribing) { + this.complete(); + } + else { + this.openBuffer(); + } + }; + BufferWhenSubscriber.prototype.openBuffer = function () { + var closingSubscription = this.closingSubscription; + if (closingSubscription) { + this.remove(closingSubscription); + closingSubscription.unsubscribe(); + } + var buffer = this.buffer; + if (this.buffer) { + this.destination.next(buffer); + } + this.buffer = []; + var closingNotifier; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(); + } + catch (err) { + return this.error(err); + } + closingSubscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + this.closingSubscription = closingSubscription; + this.add(closingSubscription); + this.subscribing = true; + closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); + this.subscribing = false; + }; + return BufferWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=bufferWhen.js.map /***/ }), -/* 230 */ +/* 249 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToResult", function() { return subscribeToResult; }); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(231); -/* harmony import */ var _subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); -/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo,_Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { - if (destination === void 0) { - destination = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__["InnerSubscriber"](outerSubscriber, outerValue, outerIndex); - } - if (destination.closed) { - return undefined; + +function catchError(selector) { + return function catchErrorOperatorFunction(source) { + var operator = new CatchOperator(selector); + var caught = source.lift(operator); + return (operator.caught = caught); + }; +} +var CatchOperator = /*@__PURE__*/ (function () { + function CatchOperator(selector) { + this.selector = selector; } - if (result instanceof _Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"]) { - return result.subscribe(destination); + CatchOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); + }; + return CatchOperator; +}()); +var CatchSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); + function CatchSubscriber(destination, selector, caught) { + var _this = _super.call(this, destination) || this; + _this.selector = selector; + _this.caught = caught; + return _this; } - return Object(_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(result)(destination); -} -//# sourceMappingURL=subscribeToResult.js.map + CatchSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var result = void 0; + try { + result = this.selector(err, this.caught); + } + catch (err2) { + _super.prototype.error.call(this, err2); + return; + } + this._unsubscribeAndRecycle(); + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + this.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); + } + }; + return CatchSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=catchError.js.map /***/ }), -/* 231 */ +/* 250 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InnerSubscriber", function() { return InnerSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(199); +/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ - -var InnerSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerSubscriber, _super); - function InnerSubscriber(parent, outerValue, outerIndex) { - var _this = _super.call(this) || this; - _this.parent = parent; - _this.outerValue = outerValue; - _this.outerIndex = outerIndex; - _this.index = 0; - return _this; - } - InnerSubscriber.prototype._next = function (value) { - this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); - }; - InnerSubscriber.prototype._error = function (error) { - this.parent.notifyError(error, this); - this.unsubscribe(); - }; - InnerSubscriber.prototype._complete = function () { - this.parent.notifyComplete(this); - this.unsubscribe(); - }; - return InnerSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=InnerSubscriber.js.map +function combineAll(project) { + return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; +} +//# sourceMappingURL=combineAll.js.map /***/ }), -/* 232 */ +/* 251 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeTo", function() { return subscribeTo; }); -/* harmony import */ var _subscribeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(207); -/* harmony import */ var _subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(233); -/* harmony import */ var _subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(234); -/* harmony import */ var _subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(236); -/* harmony import */ var _isArrayLike__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(237); -/* harmony import */ var _isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(238); -/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(179); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(235); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(183); -/** PURE_IMPORTS_START _subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */ - - - - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(214); +/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ -var subscribeTo = function (result) { - if (!!result && typeof result[_symbol_observable__WEBPACK_IMPORTED_MODULE_8__["observable"]] === 'function') { - return Object(_subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__["subscribeToObservable"])(result); - } - else if (Object(_isArrayLike__WEBPACK_IMPORTED_MODULE_4__["isArrayLike"])(result)) { - return Object(_subscribeToArray__WEBPACK_IMPORTED_MODULE_0__["subscribeToArray"])(result); - } - else if (Object(_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(result)) { - return Object(_subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__["subscribeToPromise"])(result); +var none = {}; +function combineLatest() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - else if (!!result && typeof result[_symbol_iterator__WEBPACK_IMPORTED_MODULE_7__["iterator"]] === 'function') { - return Object(_subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__["subscribeToIterable"])(result); + var project = null; + if (typeof observables[observables.length - 1] === 'function') { + project = observables.pop(); } - else { - var value = Object(_isObject__WEBPACK_IMPORTED_MODULE_6__["isObject"])(result) ? 'an invalid object' : "'" + result + "'"; - var msg = "You provided " + value + " where a stream was expected." - + ' You can provide an Observable, Promise, Array, or Iterable.'; - throw new TypeError(msg); + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0].slice(); } -}; -//# sourceMappingURL=subscribeTo.js.map + return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; +} +//# sourceMappingURL=combineLatest.js.map /***/ }), -/* 233 */ +/* 252 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToPromise", function() { return subscribeToPromise; }); -/* harmony import */ var _hostReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(176); -/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); +/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ -var subscribeToPromise = function (promise) { - return function (subscriber) { - promise.then(function (value) { - if (!subscriber.closed) { - subscriber.next(value); - subscriber.complete(); - } - }, function (err) { return subscriber.error(err); }) - .then(null, _hostReportError__WEBPACK_IMPORTED_MODULE_0__["hostReportError"]); - return subscriber; - }; -}; -//# sourceMappingURL=subscribeToPromise.js.map +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; +} +//# sourceMappingURL=concat.js.map /***/ }), -/* 234 */ +/* 253 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToIterable", function() { return subscribeToIterable; }); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); -/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(213); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ -var subscribeToIterable = function (iterable) { - return function (subscriber) { - var iterator = iterable[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]](); - do { - var item = iterator.next(); - if (item.done) { - subscriber.complete(); - break; - } - subscriber.next(item.value); - if (subscriber.closed) { - break; - } - } while (true); - if (typeof iterator.return === 'function') { - subscriber.add(function () { - if (iterator.return) { - iterator.return(); - } - }); - } - return subscriber; - }; -}; -//# sourceMappingURL=subscribeToIterable.js.map +function concatMap(project, resultSelector) { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); +} +//# sourceMappingURL=concatMap.js.map /***/ }), -/* 235 */ +/* 254 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSymbolIterator", function() { return getSymbolIterator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iterator", function() { return iterator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$iterator", function() { return $$iterator; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function getSymbolIterator() { - if (typeof Symbol !== 'function' || !Symbol.iterator) { - return '@@iterator'; - } - return Symbol.iterator; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); +/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(253); +/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ + +function concatMapTo(innerObservable, resultSelector) { + return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); } -var iterator = /*@__PURE__*/ getSymbolIterator(); -var $$iterator = iterator; -//# sourceMappingURL=iterator.js.map +//# sourceMappingURL=concatMapTo.js.map /***/ }), -/* 236 */ +/* 255 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToObservable", function() { return subscribeToObservable; }); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); -/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -var subscribeToObservable = function (obj) { - return function (subscriber) { - var obs = obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]](); - if (typeof obs.subscribe !== 'function') { - throw new TypeError('Provided object does not correctly implement Symbol.observable'); + +function count(predicate) { + return function (source) { return source.lift(new CountOperator(predicate, source)); }; +} +var CountOperator = /*@__PURE__*/ (function () { + function CountOperator(predicate, source) { + this.predicate = predicate; + this.source = source; + } + CountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); + }; + return CountOperator; +}()); +var CountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountSubscriber, _super); + function CountSubscriber(destination, predicate, source) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.source = source; + _this.count = 0; + _this.index = 0; + return _this; + } + CountSubscriber.prototype._next = function (value) { + if (this.predicate) { + this._tryPredicate(value); } else { - return obs.subscribe(subscriber); + this.count++; } }; -}; -//# sourceMappingURL=subscribeToObservable.js.map + CountSubscriber.prototype._tryPredicate = function (value) { + var result; + try { + result = this.predicate(value, this.index++, this.source); + } + catch (err) { + this.destination.error(err); + return; + } + if (result) { + this.count++; + } + }; + CountSubscriber.prototype._complete = function () { + this.destination.next(this.count); + this.destination.complete(); + }; + return CountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=count.js.map /***/ }), -/* 237 */ +/* 256 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return isArrayLike; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; }); -//# sourceMappingURL=isArrayLike.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 238 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPromise", function() { return isPromise; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isPromise(value) { - return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; +function debounce(durationSelector) { + return function (source) { return source.lift(new DebounceOperator(durationSelector)); }; } -//# sourceMappingURL=isPromise.js.map +var DebounceOperator = /*@__PURE__*/ (function () { + function DebounceOperator(durationSelector) { + this.durationSelector = durationSelector; + } + DebounceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector)); + }; + return DebounceOperator; +}()); +var DebounceSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceSubscriber, _super); + function DebounceSubscriber(destination, durationSelector) { + var _this = _super.call(this, destination) || this; + _this.durationSelector = durationSelector; + _this.hasValue = false; + _this.durationSubscription = null; + return _this; + } + DebounceSubscriber.prototype._next = function (value) { + try { + var result = this.durationSelector.call(this, value); + if (result) { + this._tryNext(value, result); + } + } + catch (err) { + this.destination.error(err); + } + }; + DebounceSubscriber.prototype._complete = function () { + this.emitValue(); + this.destination.complete(); + }; + DebounceSubscriber.prototype._tryNext = function (value, duration) { + var subscription = this.durationSubscription; + this.value = value; + this.hasValue = true; + if (subscription) { + subscription.unsubscribe(); + this.remove(subscription); + } + subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (subscription && !subscription.closed) { + this.add(this.durationSubscription = subscription); + } + }; + DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.emitValue(); + }; + DebounceSubscriber.prototype.notifyComplete = function () { + this.emitValue(); + }; + DebounceSubscriber.prototype.emitValue = function () { + if (this.hasValue) { + var value = this.value; + var subscription = this.durationSubscription; + if (subscription) { + this.durationSubscription = null; + subscription.unsubscribe(); + this.remove(subscription); + } + this.value = null; + this.hasValue = false; + _super.prototype._next.call(this, value); + } + }; + return DebounceSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=debounce.js.map /***/ }), -/* 239 */ +/* 257 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* harmony import */ var _of__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(204); -/* harmony import */ var _operators_concatAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(240); -/** PURE_IMPORTS_START _of,_operators_concatAll PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ -function concat() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; + +function debounceTime(dueTime, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; } - return Object(_operators_concatAll__WEBPACK_IMPORTED_MODULE_1__["concatAll"])()(_of__WEBPACK_IMPORTED_MODULE_0__["of"].apply(void 0, observables)); + return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; } -//# sourceMappingURL=concat.js.map - - -/***/ }), -/* 240 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return concatAll; }); -/* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(241); -/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */ - -function concatAll() { - return Object(_mergeAll__WEBPACK_IMPORTED_MODULE_0__["mergeAll"])(1); +var DebounceTimeOperator = /*@__PURE__*/ (function () { + function DebounceTimeOperator(dueTime, scheduler) { + this.dueTime = dueTime; + this.scheduler = scheduler; + } + DebounceTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + }; + return DebounceTimeOperator; +}()); +var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceTimeSubscriber, _super); + function DebounceTimeSubscriber(destination, dueTime, scheduler) { + var _this = _super.call(this, destination) || this; + _this.dueTime = dueTime; + _this.scheduler = scheduler; + _this.debouncedSubscription = null; + _this.lastValue = null; + _this.hasValue = false; + return _this; + } + DebounceTimeSubscriber.prototype._next = function (value) { + this.clearDebounce(); + this.lastValue = value; + this.hasValue = true; + this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); + }; + DebounceTimeSubscriber.prototype._complete = function () { + this.debouncedNext(); + this.destination.complete(); + }; + DebounceTimeSubscriber.prototype.debouncedNext = function () { + this.clearDebounce(); + if (this.hasValue) { + var lastValue = this.lastValue; + this.lastValue = null; + this.hasValue = false; + this.destination.next(lastValue); + } + }; + DebounceTimeSubscriber.prototype.clearDebounce = function () { + var debouncedSubscription = this.debouncedSubscription; + if (debouncedSubscription !== null) { + this.remove(debouncedSubscription); + debouncedSubscription.unsubscribe(); + this.debouncedSubscription = null; + } + }; + return DebounceTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNext(subscriber) { + subscriber.debouncedNext(); } -//# sourceMappingURL=concatAll.js.map +//# sourceMappingURL=debounceTime.js.map /***/ }), -/* 241 */ +/* 258 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return mergeAll; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); -/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function mergeAll(concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; +function defaultIfEmpty(defaultValue) { + if (defaultValue === void 0) { + defaultValue = null; } - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"], concurrent); + return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; } -//# sourceMappingURL=mergeAll.js.map +var DefaultIfEmptyOperator = /*@__PURE__*/ (function () { + function DefaultIfEmptyOperator(defaultValue) { + this.defaultValue = defaultValue; + } + DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); + }; + return DefaultIfEmptyOperator; +}()); +var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultIfEmptySubscriber, _super); + function DefaultIfEmptySubscriber(destination, defaultValue) { + var _this = _super.call(this, destination) || this; + _this.defaultValue = defaultValue; + _this.isEmpty = true; + return _this; + } + DefaultIfEmptySubscriber.prototype._next = function (value) { + this.isEmpty = false; + this.destination.next(value); + }; + DefaultIfEmptySubscriber.prototype._complete = function () { + if (this.isEmpty) { + this.destination.next(this.defaultValue); + } + this.destination.complete(); + }; + return DefaultIfEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=defaultIfEmpty.js.map /***/ }), -/* 242 */ +/* 259 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return mergeMap; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapOperator", function() { return MergeMapOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapSubscriber", function() { return MergeMapSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(230); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); -/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(260); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(173); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ -function mergeMap(project, resultSelector, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (typeof resultSelector === 'function') { - return function (source) { return source.pipe(mergeMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); }; - } - else if (typeof resultSelector === 'number') { - concurrent = resultSelector; +function delay(delay, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; } - return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); }; + var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(delay); + var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); + return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; } -var MergeMapOperator = /*@__PURE__*/ (function () { - function MergeMapOperator(project, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - this.project = project; - this.concurrent = concurrent; +var DelayOperator = /*@__PURE__*/ (function () { + function DelayOperator(delay, scheduler) { + this.delay = delay; + this.scheduler = scheduler; } - MergeMapOperator.prototype.call = function (observer, source) { - return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent)); + DelayOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); }; - return MergeMapOperator; + return DelayOperator; }()); - -var MergeMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeMapSubscriber, _super); - function MergeMapSubscriber(destination, project, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } +var DelaySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelaySubscriber, _super); + function DelaySubscriber(destination, delay, scheduler) { var _this = _super.call(this, destination) || this; - _this.project = project; - _this.concurrent = concurrent; - _this.hasCompleted = false; - _this.buffer = []; - _this.active = 0; - _this.index = 0; + _this.delay = delay; + _this.scheduler = scheduler; + _this.queue = []; + _this.active = false; + _this.errored = false; return _this; } - MergeMapSubscriber.prototype._next = function (value) { - if (this.active < this.concurrent) { - this._tryNext(value); + DelaySubscriber.dispatch = function (state) { + var source = state.source; + var queue = source.queue; + var scheduler = state.scheduler; + var destination = state.destination; + while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { + queue.shift().notification.observe(destination); + } + if (queue.length > 0) { + var delay_1 = Math.max(0, queue[0].time - scheduler.now()); + this.schedule(state, delay_1); } else { - this.buffer.push(value); + this.unsubscribe(); + source.active = false; } }; - MergeMapSubscriber.prototype._tryNext = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (err) { - this.destination.error(err); + DelaySubscriber.prototype._schedule = function (scheduler) { + this.active = true; + var destination = this.destination; + destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { + source: this, destination: this.destination, scheduler: scheduler + })); + }; + DelaySubscriber.prototype.scheduleNotification = function (notification) { + if (this.errored === true) { return; } - this.active++; - this._innerSub(result, value, index); + var scheduler = this.scheduler; + var message = new DelayMessage(scheduler.now() + this.delay, notification); + this.queue.push(message); + if (this.active === false) { + this._schedule(scheduler); + } }; - MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); + DelaySubscriber.prototype._next = function (value) { + this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createNext(value)); }; - MergeMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - this.destination.complete(); - } + DelaySubscriber.prototype._error = function (err) { + this.errored = true; + this.queue = []; + this.destination.error(err); this.unsubscribe(); }; - MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - this.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); - } - else if (this.active === 0 && this.hasCompleted) { - this.destination.complete(); - } + DelaySubscriber.prototype._complete = function () { + this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); + this.unsubscribe(); }; - return MergeMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); - -//# sourceMappingURL=mergeMap.js.map + return DelaySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +var DelayMessage = /*@__PURE__*/ (function () { + function DelayMessage(time, notification) { + this.time = time; + this.notification = notification; + } + return DelayMessage; +}()); +//# sourceMappingURL=delay.js.map /***/ }), -/* 243 */ +/* 260 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "from", function() { return from; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/* harmony import */ var _scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(244); -/** PURE_IMPORTS_START _Observable,_util_subscribeTo,_scheduled_scheduled PURE_IMPORTS_END */ - - - -function from(input, scheduler) { - if (!scheduler) { - if (input instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { - return input; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(input)); - } - else { - return Object(_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__["scheduled"])(input, scheduler); - } +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isDate(value) { + return value instanceof Date && !isNaN(+value); } -//# sourceMappingURL=from.js.map +//# sourceMappingURL=isDate.js.map /***/ }), -/* 244 */ +/* 261 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return scheduled; }); -/* harmony import */ var _scheduleObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(245); -/* harmony import */ var _schedulePromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(246); -/* harmony import */ var _scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); -/* harmony import */ var _scheduleIterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(247); -/* harmony import */ var _util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(248); -/* harmony import */ var _util_isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(238); -/* harmony import */ var _util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(237); -/* harmony import */ var _util_isIterable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(249); -/** PURE_IMPORTS_START _scheduleObservable,_schedulePromise,_scheduleArray,_scheduleIterable,_util_isInteropObservable,_util_isPromise,_util_isArrayLike,_util_isIterable PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function scheduled(input, scheduler) { - if (input != null) { - if (Object(_util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__["isInteropObservable"])(input)) { - return Object(_scheduleObservable__WEBPACK_IMPORTED_MODULE_0__["scheduleObservable"])(input, scheduler); +function delayWhen(delayDurationSelector, subscriptionDelay) { + if (subscriptionDelay) { + return function (source) { + return new SubscriptionDelayObservable(source, subscriptionDelay) + .lift(new DelayWhenOperator(delayDurationSelector)); + }; + } + return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); }; +} +var DelayWhenOperator = /*@__PURE__*/ (function () { + function DelayWhenOperator(delayDurationSelector) { + this.delayDurationSelector = delayDurationSelector; + } + DelayWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector)); + }; + return DelayWhenOperator; +}()); +var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelayWhenSubscriber, _super); + function DelayWhenSubscriber(destination, delayDurationSelector) { + var _this = _super.call(this, destination) || this; + _this.delayDurationSelector = delayDurationSelector; + _this.completed = false; + _this.delayNotifierSubscriptions = []; + _this.index = 0; + return _this; + } + DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(outerValue); + this.removeSubscription(innerSub); + this.tryComplete(); + }; + DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) { + var value = this.removeSubscription(innerSub); + if (value) { + this.destination.next(value); } - else if (Object(_util_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(input)) { - return Object(_schedulePromise__WEBPACK_IMPORTED_MODULE_1__["schedulePromise"])(input, scheduler); + this.tryComplete(); + }; + DelayWhenSubscriber.prototype._next = function (value) { + var index = this.index++; + try { + var delayNotifier = this.delayDurationSelector(value, index); + if (delayNotifier) { + this.tryDelay(delayNotifier, value); + } } - else if (Object(_util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__["isArrayLike"])(input)) { - return Object(_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); + catch (err) { + this.destination.error(err); } - else if (Object(_util_isIterable__WEBPACK_IMPORTED_MODULE_7__["isIterable"])(input) || typeof input === 'string') { - return Object(_scheduleIterable__WEBPACK_IMPORTED_MODULE_3__["scheduleIterable"])(input, scheduler); + }; + DelayWhenSubscriber.prototype._complete = function () { + this.completed = true; + this.tryComplete(); + this.unsubscribe(); + }; + DelayWhenSubscriber.prototype.removeSubscription = function (subscription) { + subscription.unsubscribe(); + var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription); + if (subscriptionIdx !== -1) { + this.delayNotifierSubscriptions.splice(subscriptionIdx, 1); + } + return subscription.outerValue; + }; + DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) { + var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, delayNotifier, value); + if (notifierSubscription && !notifierSubscription.closed) { + var destination = this.destination; + destination.add(notifierSubscription); + this.delayNotifierSubscriptions.push(notifierSubscription); + } + }; + DelayWhenSubscriber.prototype.tryComplete = function () { + if (this.completed && this.delayNotifierSubscriptions.length === 0) { + this.destination.complete(); } + }; + return DelayWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelayObservable, _super); + function SubscriptionDelayObservable(source, subscriptionDelay) { + var _this = _super.call(this) || this; + _this.source = source; + _this.subscriptionDelay = subscriptionDelay; + return _this; } - throw new TypeError((input !== null && typeof input || input) + ' is not observable'); -} -//# sourceMappingURL=scheduled.js.map + SubscriptionDelayObservable.prototype._subscribe = function (subscriber) { + this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source)); + }; + return SubscriptionDelayObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); +var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelaySubscriber, _super); + function SubscriptionDelaySubscriber(parent, source) { + var _this = _super.call(this) || this; + _this.parent = parent; + _this.source = source; + _this.sourceSubscribed = false; + return _this; + } + SubscriptionDelaySubscriber.prototype._next = function (unused) { + this.subscribeToSource(); + }; + SubscriptionDelaySubscriber.prototype._error = function (err) { + this.unsubscribe(); + this.parent.error(err); + }; + SubscriptionDelaySubscriber.prototype._complete = function () { + this.unsubscribe(); + this.subscribeToSource(); + }; + SubscriptionDelaySubscriber.prototype.subscribeToSource = function () { + if (!this.sourceSubscribed) { + this.sourceSubscribed = true; + this.unsubscribe(); + this.source.subscribe(this.parent); + } + }; + return SubscriptionDelaySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=delayWhen.js.map /***/ }), -/* 245 */ +/* 262 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleObservable", function() { return scheduleObservable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function scheduleObservable(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - sub.add(scheduler.schedule(function () { - var observable = input[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]](); - sub.add(observable.subscribe({ - next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); }, - error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); }, - complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); }, - })); - })); - return sub; - }); +function dematerialize() { + return function dematerializeOperatorFunction(source) { + return source.lift(new DeMaterializeOperator()); + }; } -//# sourceMappingURL=scheduleObservable.js.map +var DeMaterializeOperator = /*@__PURE__*/ (function () { + function DeMaterializeOperator() { + } + DeMaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DeMaterializeSubscriber(subscriber)); + }; + return DeMaterializeOperator; +}()); +var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); + function DeMaterializeSubscriber(destination) { + return _super.call(this, destination) || this; + } + DeMaterializeSubscriber.prototype._next = function (value) { + value.observe(this.destination); + }; + return DeMaterializeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=dematerialize.js.map /***/ }), -/* 246 */ +/* 263 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "schedulePromise", function() { return schedulePromise; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function schedulePromise(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - sub.add(scheduler.schedule(function () { - return input.then(function (value) { - sub.add(scheduler.schedule(function () { - subscriber.next(value); - sub.add(scheduler.schedule(function () { return subscriber.complete(); })); - })); - }, function (err) { - sub.add(scheduler.schedule(function () { return subscriber.error(err); })); - }); - })); - return sub; - }); + +function distinct(keySelector, flushes) { + return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; } -//# sourceMappingURL=schedulePromise.js.map +var DistinctOperator = /*@__PURE__*/ (function () { + function DistinctOperator(keySelector, flushes) { + this.keySelector = keySelector; + this.flushes = flushes; + } + DistinctOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); + }; + return DistinctOperator; +}()); +var DistinctSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctSubscriber, _super); + function DistinctSubscriber(destination, keySelector, flushes) { + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.values = new Set(); + if (flushes) { + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, flushes)); + } + return _this; + } + DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values.clear(); + }; + DistinctSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + DistinctSubscriber.prototype._next = function (value) { + if (this.keySelector) { + this._useKeySelector(value); + } + else { + this._finalizeNext(value, value); + } + }; + DistinctSubscriber.prototype._useKeySelector = function (value) { + var key; + var destination = this.destination; + try { + key = this.keySelector(value); + } + catch (err) { + destination.error(err); + return; + } + this._finalizeNext(key, value); + }; + DistinctSubscriber.prototype._finalizeNext = function (key, value) { + var values = this.values; + if (!values.has(key)) { + values.add(key); + this.destination.next(value); + } + }; + return DistinctSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); + +//# sourceMappingURL=distinct.js.map /***/ }), -/* 247 */ +/* 264 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleIterable", function() { return scheduleIterable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(235); -/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function scheduleIterable(input, scheduler) { - if (!input) { - throw new Error('Iterable cannot be null'); +function distinctUntilChanged(compare, keySelector) { + return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; +} +var DistinctUntilChangedOperator = /*@__PURE__*/ (function () { + function DistinctUntilChangedOperator(compare, keySelector) { + this.compare = compare; + this.keySelector = keySelector; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var iterator; - sub.add(function () { - if (iterator && typeof iterator.return === 'function') { - iterator.return(); + DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); + }; + return DistinctUntilChangedOperator; +}()); +var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctUntilChangedSubscriber, _super); + function DistinctUntilChangedSubscriber(destination, compare, keySelector) { + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.hasKey = false; + if (typeof compare === 'function') { + _this.compare = compare; + } + return _this; + } + DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { + return x === y; + }; + DistinctUntilChangedSubscriber.prototype._next = function (value) { + var key; + try { + var keySelector = this.keySelector; + key = keySelector ? keySelector(value) : value; + } + catch (err) { + return this.destination.error(err); + } + var result = false; + if (this.hasKey) { + try { + var compare = this.compare; + result = compare(this.key, key); } - }); - sub.add(scheduler.schedule(function () { - iterator = input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__["iterator"]](); - sub.add(scheduler.schedule(function () { - if (subscriber.closed) { - return; - } - var value; - var done; - try { - var result = iterator.next(); - value = result.value; - done = result.done; - } - catch (err) { - subscriber.error(err); - return; - } - if (done) { - subscriber.complete(); - } - else { - subscriber.next(value); - this.schedule(); - } - })); - })); - return sub; - }); -} -//# sourceMappingURL=scheduleIterable.js.map + catch (err) { + return this.destination.error(err); + } + } + else { + this.hasKey = true; + } + if (!result) { + this.key = key; + this.destination.next(value); + } + }; + return DistinctUntilChangedSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=distinctUntilChanged.js.map /***/ }), -/* 248 */ +/* 265 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInteropObservable", function() { return isInteropObservable; }); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); -/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); +/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(264); +/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ -function isInteropObservable(input) { - return input && typeof input[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]] === 'function'; +function distinctUntilKeyChanged(key, compare) { + return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); } -//# sourceMappingURL=isInteropObservable.js.map +//# sourceMappingURL=distinctUntilKeyChanged.js.map /***/ }), -/* 249 */ +/* 266 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; }); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); -/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(267); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(258); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(268); +/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ -function isIterable(input) { - return input && typeof input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]] === 'function'; + + + + +function elementAt(index, defaultValue) { + if (index < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); + } + var hasDefaultValue = arguments.length >= 2; + return function (source) { + return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue + ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) + : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); + }; } -//# sourceMappingURL=isIterable.js.map +//# sourceMappingURL=elementAt.js.map /***/ }), -/* 250 */ +/* 267 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return defer; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); -/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(194); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ -function defer(observableFactory) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var input; - try { - input = observableFactory(); +function throwIfEmpty(errorFactory) { + if (errorFactory === void 0) { + errorFactory = defaultErrorFactory; + } + return function (source) { + return source.lift(new ThrowIfEmptyOperator(errorFactory)); + }; +} +var ThrowIfEmptyOperator = /*@__PURE__*/ (function () { + function ThrowIfEmptyOperator(errorFactory) { + this.errorFactory = errorFactory; + } + ThrowIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory)); + }; + return ThrowIfEmptyOperator; +}()); +var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrowIfEmptySubscriber, _super); + function ThrowIfEmptySubscriber(destination, errorFactory) { + var _this = _super.call(this, destination) || this; + _this.errorFactory = errorFactory; + _this.hasValue = false; + return _this; + } + ThrowIfEmptySubscriber.prototype._next = function (value) { + this.hasValue = true; + this.destination.next(value); + }; + ThrowIfEmptySubscriber.prototype._complete = function () { + if (!this.hasValue) { + var err = void 0; + try { + err = this.errorFactory(); + } + catch (e) { + err = e; + } + this.destination.error(err); } - catch (err) { - subscriber.error(err); - return undefined; + else { + return this.destination.complete(); } - var source = input ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(input) : Object(_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); - return source.subscribe(subscriber); - }); + }; + return ThrowIfEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); +function defaultErrorFactory() { + return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); } -//# sourceMappingURL=defer.js.map +//# sourceMappingURL=throwIfEmpty.js.map /***/ }), -/* 251 */ +/* 268 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return forkJoin; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); -/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(179); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(243); -/** PURE_IMPORTS_START _Observable,_util_isArray,_operators_map,_util_isObject,_from PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ -function forkJoin() { - var sources = []; - for (var _i = 0; _i < arguments.length; _i++) { - sources[_i] = arguments[_i]; - } - if (sources.length === 1) { - var first_1 = sources[0]; - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(first_1)) { - return forkJoinInternal(first_1, null); +function take(count) { + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); } - if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_3__["isObject"])(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) { - var keys = Object.keys(first_1); - return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys); + else { + return source.lift(new TakeOperator(count)); } - } - if (typeof sources[sources.length - 1] === 'function') { - var resultSelector_1 = sources.pop(); - sources = (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(sources[0])) ? sources[0] : sources; - return forkJoinInternal(sources, null).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return resultSelector_1.apply(void 0, args); })); - } - return forkJoinInternal(sources, null); + }; } -function forkJoinInternal(sources, keys) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var len = sources.length; - if (len === 0) { - subscriber.complete(); - return; +var TakeOperator = /*@__PURE__*/ (function () { + function TakeOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; } - var values = new Array(len); - var completed = 0; - var emitted = 0; - var _loop_1 = function (i) { - var source = Object(_from__WEBPACK_IMPORTED_MODULE_4__["from"])(sources[i]); - var hasValue = false; - subscriber.add(source.subscribe({ - next: function (value) { - if (!hasValue) { - hasValue = true; - emitted++; - } - values[i] = value; - }, - error: function (err) { return subscriber.error(err); }, - complete: function () { - completed++; - if (completed === len || !hasValue) { - if (emitted === len) { - subscriber.next(keys ? - keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) : - values); - } - subscriber.complete(); - } - } - })); - }; - for (var i = 0; i < len; i++) { - _loop_1(i); + } + TakeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeSubscriber(subscriber, this.total)); + }; + return TakeOperator; +}()); +var TakeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeSubscriber, _super); + function TakeSubscriber(destination, total) { + var _this = _super.call(this, destination) || this; + _this.total = total; + _this.count = 0; + return _this; + } + TakeSubscriber.prototype._next = function (value) { + var total = this.total; + var count = ++this.count; + if (count <= total) { + this.destination.next(value); + if (count === total) { + this.destination.complete(); + this.unsubscribe(); + } } - }); -} -//# sourceMappingURL=forkJoin.js.map + }; + return TakeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=take.js.map /***/ }), -/* 252 */ +/* 269 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return fromEvent; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); -/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); +/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(175); +/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ -var toString = /*@__PURE__*/ (function () { return Object.prototype.toString; })(); -function fromEvent(target, eventName, options, resultSelector) { - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(options)) { - resultSelector = options; - options = undefined; - } - if (resultSelector) { - return fromEvent(target, eventName, options).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - function handler(e) { - if (arguments.length > 1) { - subscriber.next(Array.prototype.slice.call(arguments)); - } - else { - subscriber.next(e); - } - } - setupSubscription(target, eventName, handler, subscriber, options); - }); -} -function setupSubscription(sourceObj, eventName, handler, subscriber, options) { - var unsubscribe; - if (isEventTarget(sourceObj)) { - var source_1 = sourceObj; - sourceObj.addEventListener(eventName, handler, options); - unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); }; - } - else if (isJQueryStyleEventEmitter(sourceObj)) { - var source_2 = sourceObj; - sourceObj.on(eventName, handler); - unsubscribe = function () { return source_2.off(eventName, handler); }; - } - else if (isNodeStyleEventEmitter(sourceObj)) { - var source_3 = sourceObj; - sourceObj.addListener(eventName, handler); - unsubscribe = function () { return source_3.removeListener(eventName, handler); }; - } - else if (sourceObj && sourceObj.length) { - for (var i = 0, len = sourceObj.length; i < len; i++) { - setupSubscription(sourceObj[i], eventName, handler, subscriber, options); - } - } - else { - throw new TypeError('Invalid event target'); +function endWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; } - subscriber.add(unsubscribe); -} -function isNodeStyleEventEmitter(sourceObj) { - return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; -} -function isJQueryStyleEventEmitter(sourceObj) { - return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; -} -function isEventTarget(sourceObj) { - return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; } -//# sourceMappingURL=fromEvent.js.map +//# sourceMappingURL=endWith.js.map /***/ }), -/* 253 */ +/* 270 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return fromEventPattern; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); -/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function fromEventPattern(addHandler, removeHandler, resultSelector) { - if (resultSelector) { - return fromEventPattern(addHandler, removeHandler).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); +function every(predicate, thisArg) { + return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); }; +} +var EveryOperator = /*@__PURE__*/ (function () { + function EveryOperator(predicate, thisArg, source) { + this.predicate = predicate; + this.thisArg = thisArg; + this.source = source; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var handler = function () { - var e = []; - for (var _i = 0; _i < arguments.length; _i++) { - e[_i] = arguments[_i]; - } - return subscriber.next(e.length === 1 ? e[0] : e); - }; - var retValue; + EveryOperator.prototype.call = function (observer, source) { + return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source)); + }; + return EveryOperator; +}()); +var EverySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](EverySubscriber, _super); + function EverySubscriber(destination, predicate, thisArg, source) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.thisArg = thisArg; + _this.source = source; + _this.index = 0; + _this.thisArg = thisArg || _this; + return _this; + } + EverySubscriber.prototype.notifyComplete = function (everyValueMatch) { + this.destination.next(everyValueMatch); + this.destination.complete(); + }; + EverySubscriber.prototype._next = function (value) { + var result = false; try { - retValue = addHandler(handler); + result = this.predicate.call(this.thisArg, value, this.index++, this.source); } catch (err) { - subscriber.error(err); - return undefined; + this.destination.error(err); + return; } - if (!Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(removeHandler)) { - return undefined; + if (!result) { + this.notifyComplete(false); } - return function () { return removeHandler(handler, retValue); }; - }); -} -//# sourceMappingURL=fromEventPattern.js.map + }; + EverySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return EverySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=every.js.map /***/ }), -/* 254 */ +/* 271 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return generate; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(205); -/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) { - var resultSelector; - var initialState; - if (arguments.length == 1) { - var options = initialStateOrOptions; - initialState = options.initialState; - condition = options.condition; - iterate = options.iterate; - resultSelector = options.resultSelector || _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; - scheduler = options.scheduler; - } - else if (resultSelectorOrObservable === undefined || Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_2__["isScheduler"])(resultSelectorOrObservable)) { - initialState = initialStateOrOptions; - resultSelector = _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; - scheduler = resultSelectorOrObservable; - } - else { - initialState = initialStateOrOptions; - resultSelector = resultSelectorOrObservable; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var state = initialState; - if (scheduler) { - return scheduler.schedule(dispatch, 0, { - subscriber: subscriber, - iterate: iterate, - condition: condition, - resultSelector: resultSelector, - state: state - }); - } - do { - if (condition) { - var conditionResult = void 0; - try { - conditionResult = condition(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (!conditionResult) { - subscriber.complete(); - break; - } - } - var value = void 0; - try { - value = resultSelector(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - subscriber.next(value); - if (subscriber.closed) { - break; - } - try { - state = iterate(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - } while (true); - return undefined; - }); +function exhaust() { + return function (source) { return source.lift(new SwitchFirstOperator()); }; } -function dispatch(state) { - var subscriber = state.subscriber, condition = state.condition; - if (subscriber.closed) { - return undefined; - } - if (state.needIterate) { - try { - state.state = state.iterate(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; - } +var SwitchFirstOperator = /*@__PURE__*/ (function () { + function SwitchFirstOperator() { } - else { - state.needIterate = true; + SwitchFirstOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchFirstSubscriber(subscriber)); + }; + return SwitchFirstOperator; +}()); +var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchFirstSubscriber, _super); + function SwitchFirstSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.hasCompleted = false; + _this.hasSubscription = false; + return _this; } - if (condition) { - var conditionResult = void 0; - try { - conditionResult = condition(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; + SwitchFirstSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.hasSubscription = true; + this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, value)); } - if (!conditionResult) { - subscriber.complete(); - return undefined; + }; + SwitchFirstSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (!this.hasSubscription) { + this.destination.complete(); } - if (subscriber.closed) { - return undefined; + }; + SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) { + this.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); } - } - var value; - try { - value = state.resultSelector(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (subscriber.closed) { - return undefined; - } - subscriber.next(value); - if (subscriber.closed) { - return undefined; - } - return this.schedule(state); -} -//# sourceMappingURL=generate.js.map + }; + return SwitchFirstSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=exhaust.js.map /***/ }), -/* 255 */ +/* 272 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return iif; }); -/* harmony import */ var _defer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(250); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); -/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */ - - -function iif(condition, trueResult, falseResult) { - if (trueResult === void 0) { - trueResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; - } - if (falseResult === void 0) { - falseResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; - } - return Object(_defer__WEBPACK_IMPORTED_MODULE_0__["defer"])(function () { return condition() ? trueResult : falseResult; }); -} -//# sourceMappingURL=iif.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(197); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(214); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -/***/ }), -/* 256 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return interval; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(257); -/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */ -function interval(period, scheduler) { - if (period === void 0) { - period = 0; +function exhaustMap(project, resultSelector) { + if (resultSelector) { + return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; } - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + return function (source) { + return source.lift(new ExhaustMapOperator(project)); + }; +} +var ExhaustMapOperator = /*@__PURE__*/ (function () { + function ExhaustMapOperator(project) { + this.project = project; } - if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(period) || period < 0) { - period = 0; + ExhaustMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); + }; + return ExhaustMapOperator; +}()); +var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExhaustMapSubscriber, _super); + function ExhaustMapSubscriber(destination, project) { + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.hasSubscription = false; + _this.hasCompleted = false; + _this.index = 0; + return _this; } - if (!scheduler || typeof scheduler.schedule !== 'function') { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period })); - return subscriber; - }); -} -function dispatch(state) { - var subscriber = state.subscriber, counter = state.counter, period = state.period; - subscriber.next(counter); - this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period); -} -//# sourceMappingURL=interval.js.map - - -/***/ }), -/* 257 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNumeric", function() { return isNumeric; }); -/* harmony import */ var _isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */ - -function isNumeric(val) { - return !Object(_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(val) && (val - parseFloat(val) + 1) >= 0; -} -//# sourceMappingURL=isNumeric.js.map + ExhaustMapSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.tryNext(value); + } + }; + ExhaustMapSubscriber.prototype.tryNext = function (value) { + var result; + var index = this.index++; + try { + result = this.project(value, index); + } + catch (err) { + this.destination.error(err); + return; + } + this.hasSubscription = true; + this._innerSub(result, value, index); + }; + ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); + }; + ExhaustMapSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (!this.hasSubscription) { + this.destination.complete(); + } + this.unsubscribe(); + }; + ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + ExhaustMapSubscriber.prototype.notifyError = function (err) { + this.destination.error(err); + }; + ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) { + var destination = this.destination; + destination.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); + } + }; + return ExhaustMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=exhaustMap.js.map /***/ }), -/* 258 */ +/* 273 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); -/* harmony import */ var _operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(241); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(206); -/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +function expand(project, concurrent, scheduler) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - var concurrent = Number.POSITIVE_INFINITY; - var scheduler = null; - var last = observables[observables.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(last)) { - scheduler = observables.pop(); - if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { - concurrent = observables.pop(); - } + if (scheduler === void 0) { + scheduler = undefined; } - else if (typeof last === 'number') { - concurrent = observables.pop(); + concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; + return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); }; +} +var ExpandOperator = /*@__PURE__*/ (function () { + function ExpandOperator(project, concurrent, scheduler) { + this.project = project; + this.concurrent = concurrent; + this.scheduler = scheduler; } - if (scheduler === null && observables.length === 1 && observables[0] instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { - return observables[0]; + ExpandOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); + }; + return ExpandOperator; +}()); + +var ExpandSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExpandSubscriber, _super); + function ExpandSubscriber(destination, project, concurrent, scheduler) { + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.concurrent = concurrent; + _this.scheduler = scheduler; + _this.index = 0; + _this.active = 0; + _this.hasCompleted = false; + if (concurrent < Number.POSITIVE_INFINITY) { + _this.buffer = []; + } + return _this; } - return Object(_operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__["mergeAll"])(concurrent)(Object(_fromArray__WEBPACK_IMPORTED_MODULE_3__["fromArray"])(observables, scheduler)); -} -//# sourceMappingURL=merge.js.map + ExpandSubscriber.dispatch = function (arg) { + var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; + subscriber.subscribeToProjection(result, value, index); + }; + ExpandSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (destination.closed) { + this._complete(); + return; + } + var index = this.index++; + if (this.active < this.concurrent) { + destination.next(value); + try { + var project = this.project; + var result = project(value, index); + if (!this.scheduler) { + this.subscribeToProjection(result, value, index); + } + else { + var state = { subscriber: this, result: result, value: value, index: index }; + var destination_1 = this.destination; + destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); + } + } + catch (e) { + destination.error(e); + } + } + else { + this.buffer.push(value); + } + }; + ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { + this.active++; + var destination = this.destination; + destination.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, result, value, index)); + }; + ExpandSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); + } + this.unsubscribe(); + }; + ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this._next(innerValue); + }; + ExpandSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + var destination = this.destination; + destination.remove(innerSub); + this.active--; + if (buffer && buffer.length > 0) { + this._next(buffer.shift()); + } + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); + } + }; + return ExpandSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); + +//# sourceMappingURL=expand.js.map /***/ }), -/* 259 */ +/* 274 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return NEVER; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "never", function() { return never; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(185); -/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ -var NEVER = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](_util_noop__WEBPACK_IMPORTED_MODULE_1__["noop"]); -function never() { - return NEVER; + +function finalize(callback) { + return function (source) { return source.lift(new FinallyOperator(callback)); }; } -//# sourceMappingURL=never.js.map +var FinallyOperator = /*@__PURE__*/ (function () { + function FinallyOperator(callback) { + this.callback = callback; + } + FinallyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FinallySubscriber(subscriber, this.callback)); + }; + return FinallyOperator; +}()); +var FinallySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); + function FinallySubscriber(destination, callback) { + var _this = _super.call(this, destination) || this; + _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); + return _this; + } + return FinallySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=finalize.js.map /***/ }), -/* 260 */ +/* 275 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); -/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function onErrorResumeNext() { - var sources = []; - for (var _i = 0; _i < arguments.length; _i++) { - sources[_i] = arguments[_i]; +function find(predicate, thisArg) { + if (typeof predicate !== 'function') { + throw new TypeError('predicate is not a function'); } - if (sources.length === 0) { - return _empty__WEBPACK_IMPORTED_MODULE_3__["EMPTY"]; + return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); }; +} +var FindValueOperator = /*@__PURE__*/ (function () { + function FindValueOperator(predicate, source, yieldIndex, thisArg) { + this.predicate = predicate; + this.source = source; + this.yieldIndex = yieldIndex; + this.thisArg = thisArg; } - var first = sources[0], remainder = sources.slice(1); - if (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(first)) { - return onErrorResumeNext.apply(void 0, first); + FindValueOperator.prototype.call = function (observer, source) { + return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); + }; + return FindValueOperator; +}()); + +var FindValueSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FindValueSubscriber, _super); + function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.source = source; + _this.yieldIndex = yieldIndex; + _this.thisArg = thisArg; + _this.index = 0; + return _this; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); }; - return Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(first).subscribe({ - next: function (value) { subscriber.next(value); }, - error: subNext, - complete: subNext, - }); - }); -} -//# sourceMappingURL=onErrorResumeNext.js.map + FindValueSubscriber.prototype.notifyComplete = function (value) { + var destination = this.destination; + destination.next(value); + destination.complete(); + this.unsubscribe(); + }; + FindValueSubscriber.prototype._next = function (value) { + var _a = this, predicate = _a.predicate, thisArg = _a.thisArg; + var index = this.index++; + try { + var result = predicate.call(thisArg || this, value, index, this.source); + if (result) { + this.notifyComplete(this.yieldIndex ? index : value); + } + } + catch (err) { + this.destination.error(err); + } + }; + FindValueSubscriber.prototype._complete = function () { + this.notifyComplete(this.yieldIndex ? -1 : undefined); + }; + return FindValueSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); + +//# sourceMappingURL=find.js.map /***/ }), -/* 261 */ +/* 276 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return pairs; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); +/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(275); +/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ -function pairs(obj, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var keys = Object.keys(obj); - for (var i = 0; i < keys.length && !subscriber.closed; i++) { - var key = keys[i]; - if (obj.hasOwnProperty(key)) { - subscriber.next([key, obj[key]]); - } - } - subscriber.complete(); - }); - } - else { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var keys = Object.keys(obj); - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj })); - return subscription; - }); - } -} -function dispatch(state) { - var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj; - if (!subscriber.closed) { - if (index < keys.length) { - var key = keys[index]; - subscriber.next([key, obj[key]]); - subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj })); - } - else { - subscriber.complete(); - } - } +function findIndex(predicate, thisArg) { + return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; } -//# sourceMappingURL=pairs.js.map +//# sourceMappingURL=findIndex.js.map /***/ }), -/* 262 */ +/* 277 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); -/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(263); -/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/* harmony import */ var _operators_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(264); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(170); -/** PURE_IMPORTS_START _util_not,_util_subscribeTo,_operators_filter,_Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(194); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(268); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(258); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(267); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(191); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ -function partition(source, predicate, thisArg) { - return [ - Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(predicate, thisArg)(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))), - Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))) - ]; + + +function first(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; } -//# sourceMappingURL=partition.js.map +//# sourceMappingURL=first.js.map /***/ }), -/* 263 */ +/* 278 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "not", function() { return not; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function not(pred, thisArg) { - function notPred() { - return !(notPred.pred.apply(notPred.thisArg, arguments)); - } - notPred.pred = pred; - notPred.thisArg = thisArg; - return notPred; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function ignoreElements() { + return function ignoreElementsOperatorFunction(source) { + return source.lift(new IgnoreElementsOperator()); + }; } -//# sourceMappingURL=not.js.map +var IgnoreElementsOperator = /*@__PURE__*/ (function () { + function IgnoreElementsOperator() { + } + IgnoreElementsOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new IgnoreElementsSubscriber(subscriber)); + }; + return IgnoreElementsOperator; +}()); +var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); + function IgnoreElementsSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + IgnoreElementsSubscriber.prototype._next = function (unused) { + }; + return IgnoreElementsSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=ignoreElements.js.map /***/ }), -/* 264 */ +/* 279 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function filter(predicate, thisArg) { - return function filterOperatorFunction(source) { - return source.lift(new FilterOperator(predicate, thisArg)); - }; +function isEmpty() { + return function (source) { return source.lift(new IsEmptyOperator()); }; } -var FilterOperator = /*@__PURE__*/ (function () { - function FilterOperator(predicate, thisArg) { - this.predicate = predicate; - this.thisArg = thisArg; +var IsEmptyOperator = /*@__PURE__*/ (function () { + function IsEmptyOperator() { } - FilterOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); + IsEmptyOperator.prototype.call = function (observer, source) { + return source.subscribe(new IsEmptySubscriber(observer)); }; - return FilterOperator; + return IsEmptyOperator; }()); -var FilterSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FilterSubscriber, _super); - function FilterSubscriber(destination, predicate, thisArg) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.thisArg = thisArg; - _this.count = 0; - return _this; +var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IsEmptySubscriber, _super); + function IsEmptySubscriber(destination) { + return _super.call(this, destination) || this; } - FilterSubscriber.prototype._next = function (value) { - var result; - try { - result = this.predicate.call(this.thisArg, value, this.count++); - } - catch (err) { - this.destination.error(err); - return; - } - if (result) { - this.destination.next(value); - } + IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) { + var destination = this.destination; + destination.next(isEmpty); + destination.complete(); }; - return FilterSubscriber; + IsEmptySubscriber.prototype._next = function (value) { + this.notifyComplete(false); + }; + IsEmptySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return IsEmptySubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=filter.js.map +//# sourceMappingURL=isEmpty.js.map /***/ }), -/* 265 */ +/* 280 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceOperator", function() { return RaceOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceSubscriber", function() { return RaceSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(206); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(194); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(281); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(267); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(258); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(191); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ -function race() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - if (observables.length === 1) { - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(observables[0])) { - observables = observables[0]; - } - else { - return observables[0]; - } - } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_2__["fromArray"])(observables, undefined).lift(new RaceOperator()); -} -var RaceOperator = /*@__PURE__*/ (function () { - function RaceOperator() { - } - RaceOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RaceSubscriber(subscriber)); - }; - return RaceOperator; -}()); -var RaceSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RaceSubscriber, _super); - function RaceSubscriber(destination) { +function last(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +} +//# sourceMappingURL=last.js.map + + +/***/ }), +/* 281 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(174); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ + + + + +function takeLast(count) { + return function takeLastOperatorFunction(source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); + } + else { + return source.lift(new TakeLastOperator(count)); + } + }; +} +var TakeLastOperator = /*@__PURE__*/ (function () { + function TakeLastOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + } + } + TakeLastOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); + }; + return TakeLastOperator; +}()); +var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeLastSubscriber, _super); + function TakeLastSubscriber(destination, total) { var _this = _super.call(this, destination) || this; - _this.hasFirst = false; - _this.observables = []; - _this.subscriptions = []; + _this.total = total; + _this.ring = new Array(); + _this.count = 0; return _this; } - RaceSubscriber.prototype._next = function (observable) { - this.observables.push(observable); - }; - RaceSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); + TakeLastSubscriber.prototype._next = function (value) { + var ring = this.ring; + var total = this.total; + var count = this.count++; + if (ring.length < total) { + ring.push(value); } else { - for (var i = 0; i < len && !this.hasFirst; i++) { - var observable = observables[i]; - var subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i); - if (this.subscriptions) { - this.subscriptions.push(subscription); - } - this.add(subscription); - } - this.observables = null; + var index = count % total; + ring[index] = value; } }; - RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (!this.hasFirst) { - this.hasFirst = true; - for (var i = 0; i < this.subscriptions.length; i++) { - if (i !== outerIndex) { - var subscription = this.subscriptions[i]; - subscription.unsubscribe(); - this.remove(subscription); - } + TakeLastSubscriber.prototype._complete = function () { + var destination = this.destination; + var count = this.count; + if (count > 0) { + var total = this.count >= this.total ? this.total : this.count; + var ring = this.ring; + for (var i = 0; i < total; i++) { + var idx = (count++) % total; + destination.next(ring[idx]); } - this.subscriptions = null; } - this.destination.next(innerValue); + destination.complete(); }; - return RaceSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); - -//# sourceMappingURL=race.js.map + return TakeLastSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=takeLast.js.map /***/ }), -/* 266 */ +/* 282 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function range(start, count, scheduler) { - if (start === void 0) { - start = 0; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - if (count === undefined) { - count = start; - start = 0; - } - var index = 0; - var current = start; - if (scheduler) { - return scheduler.schedule(dispatch, 0, { - index: index, count: count, start: start, subscriber: subscriber - }); - } - else { - do { - if (index++ >= count) { - subscriber.complete(); - break; - } - subscriber.next(current++); - if (subscriber.closed) { - break; - } - } while (true); - } - return undefined; - }); + +function mapTo(value) { + return function (source) { return source.lift(new MapToOperator(value)); }; } -function dispatch(state) { - var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber; - if (index >= count) { - subscriber.complete(); - return; +var MapToOperator = /*@__PURE__*/ (function () { + function MapToOperator(value) { + this.value = value; } - subscriber.next(start); - if (subscriber.closed) { - return; + MapToOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MapToSubscriber(subscriber, this.value)); + }; + return MapToOperator; +}()); +var MapToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapToSubscriber, _super); + function MapToSubscriber(destination, value) { + var _this = _super.call(this, destination) || this; + _this.value = value; + return _this; } - state.index = index + 1; - state.start = start + 1; - this.schedule(state); -} -//# sourceMappingURL=range.js.map + MapToSubscriber.prototype._next = function (x) { + this.destination.next(this.value); + }; + return MapToSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=mapTo.js.map /***/ }), -/* 267 */ +/* 283 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(257); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(205); -/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); +/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -function timer(dueTime, periodOrScheduler, scheduler) { - if (dueTime === void 0) { - dueTime = 0; - } - var period = -1; - if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(periodOrScheduler)) { - period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler); - } - else if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(periodOrScheduler)) { - scheduler = periodOrScheduler; - } - if (!Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(scheduler)) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var due = Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(dueTime) - ? dueTime - : (+dueTime - scheduler.now()); - return scheduler.schedule(dispatch, due, { - index: 0, period: period, subscriber: subscriber - }); - }); +function materialize() { + return function materializeOperatorFunction(source) { + return source.lift(new MaterializeOperator()); + }; } -function dispatch(state) { - var index = state.index, period = state.period, subscriber = state.subscriber; - subscriber.next(index); - if (subscriber.closed) { - return; +var MaterializeOperator = /*@__PURE__*/ (function () { + function MaterializeOperator() { } - else if (period === -1) { - return subscriber.complete(); + MaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MaterializeSubscriber(subscriber)); + }; + return MaterializeOperator; +}()); +var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); + function MaterializeSubscriber(destination) { + return _super.call(this, destination) || this; } - state.index = index + 1; - this.schedule(state, period); + MaterializeSubscriber.prototype._next = function (value) { + this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + }; + MaterializeSubscriber.prototype._error = function (err) { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); + destination.complete(); + }; + MaterializeSubscriber.prototype._complete = function () { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); + destination.complete(); + }; + return MaterializeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=materialize.js.map + + +/***/ }), +/* 284 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(285); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + +function max(comparer) { + var max = (typeof comparer === 'function') + ? function (x, y) { return comparer(x, y) > 0 ? x : y; } + : function (x, y) { return x > y ? x : y; }; + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); } -//# sourceMappingURL=timer.js.map +//# sourceMappingURL=max.js.map /***/ }), -/* 268 */ +/* 285 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "using", function() { return using; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); -/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(286); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(281); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(258); +/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(155); +/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ -function using(resourceFactory, observableFactory) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var resource; - try { - resource = resourceFactory(); + +function reduce(accumulator, seed) { + if (arguments.length >= 2) { + return function reduceOperatorFunctionWithSeed(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); + }; + } + return function reduceOperatorFunction(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); + }; +} +//# sourceMappingURL=reduce.js.map + + +/***/ }), +/* 286 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function scan(accumulator, seed) { + var hasSeed = false; + if (arguments.length >= 2) { + hasSeed = true; + } + return function scanOperatorFunction(source) { + return source.lift(new ScanOperator(accumulator, seed, hasSeed)); + }; +} +var ScanOperator = /*@__PURE__*/ (function () { + function ScanOperator(accumulator, seed, hasSeed) { + if (hasSeed === void 0) { + hasSeed = false; } - catch (err) { - subscriber.error(err); - return undefined; + this.accumulator = accumulator; + this.seed = seed; + this.hasSeed = hasSeed; + } + ScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); + }; + return ScanOperator; +}()); +var ScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ScanSubscriber, _super); + function ScanSubscriber(destination, accumulator, _seed, hasSeed) { + var _this = _super.call(this, destination) || this; + _this.accumulator = accumulator; + _this._seed = _seed; + _this.hasSeed = hasSeed; + _this.index = 0; + return _this; + } + Object.defineProperty(ScanSubscriber.prototype, "seed", { + get: function () { + return this._seed; + }, + set: function (value) { + this.hasSeed = true; + this._seed = value; + }, + enumerable: true, + configurable: true + }); + ScanSubscriber.prototype._next = function (value) { + if (!this.hasSeed) { + this.seed = value; + this.destination.next(value); + } + else { + return this._tryNext(value); } + }; + ScanSubscriber.prototype._tryNext = function (value) { + var index = this.index++; var result; try { - result = observableFactory(resource); + result = this.accumulator(this.seed, value, index); } catch (err) { - subscriber.error(err); - return undefined; + this.destination.error(err); } - var source = result ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(result) : _empty__WEBPACK_IMPORTED_MODULE_2__["EMPTY"]; - var subscription = source.subscribe(subscriber); - return function () { - subscription.unsubscribe(); - if (resource) { - resource.unsubscribe(); - } - }; - }); + this.seed = result; + this.destination.next(result); + }; + return ScanSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=scan.js.map + + +/***/ }), +/* 287 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); +/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(229); +/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ + +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; } -//# sourceMappingURL=using.js.map +//# sourceMappingURL=merge.js.map /***/ }), -/* 269 */ +/* 288 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipOperator", function() { return ZipOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipSubscriber", function() { return ZipSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(230); -/* harmony import */ var _internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(235); -/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(213); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ + +function mergeMapTo(innerObservable, resultSelector, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + if (typeof resultSelector === 'function') { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); + } + if (typeof resultSelector === 'number') { + concurrent = resultSelector; + } + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); +} +//# sourceMappingURL=mergeMapTo.js.map +/***/ }), +/* 289 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(201); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(202); +/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var resultSelector = observables[observables.length - 1]; - if (typeof resultSelector === 'function') { - observables.pop(); +function mergeScan(accumulator, seed, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(observables, undefined).lift(new ZipOperator(resultSelector)); + return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); }; } -var ZipOperator = /*@__PURE__*/ (function () { - function ZipOperator(resultSelector) { - this.resultSelector = resultSelector; +var MergeScanOperator = /*@__PURE__*/ (function () { + function MergeScanOperator(accumulator, seed, concurrent) { + this.accumulator = accumulator; + this.seed = seed; + this.concurrent = concurrent; } - ZipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector)); + MergeScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); }; - return ZipOperator; + return MergeScanOperator; }()); -var ZipSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipSubscriber, _super); - function ZipSubscriber(destination, resultSelector, values) { - if (values === void 0) { - values = Object.create(null); - } +var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); + function MergeScanSubscriber(destination, accumulator, acc, concurrent) { var _this = _super.call(this, destination) || this; - _this.iterators = []; + _this.accumulator = accumulator; + _this.acc = acc; + _this.concurrent = concurrent; + _this.hasValue = false; + _this.hasCompleted = false; + _this.buffer = []; _this.active = 0; - _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null; - _this.values = values; + _this.index = 0; return _this; } - ZipSubscriber.prototype._next = function (value) { - var iterators = this.iterators; - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(value)) { - iterators.push(new StaticArrayIterator(value)); - } - else if (typeof value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] === 'function') { - iterators.push(new StaticIterator(value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]]())); + MergeScanSubscriber.prototype._next = function (value) { + if (this.active < this.concurrent) { + var index = this.index++; + var destination = this.destination; + var ish = void 0; + try { + var accumulator = this.accumulator; + ish = accumulator(this.acc, value, index); + } + catch (e) { + return destination.error(e); + } + this.active++; + this._innerSub(ish, value, index); } else { - iterators.push(new ZipBufferIterator(this.destination, this, value)); + this.buffer.push(value); } }; - ZipSubscriber.prototype._complete = function () { - var iterators = this.iterators; - var len = iterators.length; - this.unsubscribe(); - if (len === 0) { + MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); + }; + MergeScanSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { + if (this.hasValue === false) { + this.destination.next(this.acc); + } this.destination.complete(); - return; - } - this.active = len; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (iterator.stillUnsubscribed) { - var destination = this.destination; - destination.add(iterator.subscribe(iterator, i)); - } - else { - this.active--; - } } + this.unsubscribe(); }; - ZipSubscriber.prototype.notifyInactive = function () { - this.active--; - if (this.active === 0) { - this.destination.complete(); - } + MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var destination = this.destination; + this.acc = innerValue; + this.hasValue = true; + destination.next(innerValue); }; - ZipSubscriber.prototype.checkIterators = function () { - var iterators = this.iterators; - var len = iterators.length; + MergeScanSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; var destination = this.destination; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { - return; - } + destination.remove(innerSub); + this.active--; + if (buffer.length > 0) { + this._next(buffer.shift()); } - var shouldComplete = false; - var args = []; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - var result = iterator.next(); - if (iterator.hasCompleted()) { - shouldComplete = true; - } - if (result.done) { - destination.complete(); - return; + else if (this.active === 0 && this.hasCompleted) { + if (this.hasValue === false) { + this.destination.next(this.acc); } - args.push(result.value); + this.destination.complete(); } - if (this.resultSelector) { - this._tryresultSelector(args); + }; + return MergeScanSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); + +//# sourceMappingURL=mergeScan.js.map + + +/***/ }), +/* 290 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(285); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + +function min(comparer) { + var min = (typeof comparer === 'function') + ? function (x, y) { return comparer(x, y) < 0 ? x : y; } + : function (x, y) { return x < y ? x : y; }; + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); +} +//# sourceMappingURL=min.js.map + + +/***/ }), +/* 291 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); +/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(157); +/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ + +function multicast(subjectOrSubjectFactory, selector) { + return function multicastOperatorFunction(source) { + var subjectFactory; + if (typeof subjectOrSubjectFactory === 'function') { + subjectFactory = subjectOrSubjectFactory; } else { - destination.next(args); - } - if (shouldComplete) { - destination.complete(); - } - }; - ZipSubscriber.prototype._tryresultSelector = function (args) { - var result; - try { - result = this.resultSelector.apply(this, args); + subjectFactory = function subjectFactory() { + return subjectOrSubjectFactory; + }; } - catch (err) { - this.destination.error(err); - return; + if (typeof selector === 'function') { + return source.lift(new MulticastOperator(subjectFactory, selector)); } - this.destination.next(result); + var connectable = Object.create(source, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); + connectable.source = source; + connectable.subjectFactory = subjectFactory; + return connectable; }; - return ZipSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); - -var StaticIterator = /*@__PURE__*/ (function () { - function StaticIterator(iterator) { - this.iterator = iterator; - this.nextResult = iterator.next(); +} +var MulticastOperator = /*@__PURE__*/ (function () { + function MulticastOperator(subjectFactory, selector) { + this.subjectFactory = subjectFactory; + this.selector = selector; } - StaticIterator.prototype.hasValue = function () { - return true; - }; - StaticIterator.prototype.next = function () { - var result = this.nextResult; - this.nextResult = this.iterator.next(); - return result; - }; - StaticIterator.prototype.hasCompleted = function () { - var nextResult = this.nextResult; - return nextResult && nextResult.done; + MulticastOperator.prototype.call = function (subscriber, source) { + var selector = this.selector; + var subject = this.subjectFactory(); + var subscription = selector(subject).subscribe(subscriber); + subscription.add(source.subscribe(subject)); + return subscription; }; - return StaticIterator; + return MulticastOperator; }()); -var StaticArrayIterator = /*@__PURE__*/ (function () { - function StaticArrayIterator(array) { - this.array = array; - this.index = 0; - this.length = 0; - this.length = array.length; + +//# sourceMappingURL=multicast.js.map + + +/***/ }), +/* 292 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(149); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + + + + + + +function onErrorResumeNext() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; } - StaticArrayIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { - return this; - }; - StaticArrayIterator.prototype.next = function (value) { - var i = this.index++; - var array = this.array; - return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; - }; - StaticArrayIterator.prototype.hasValue = function () { - return this.array.length > this.index; - }; - StaticArrayIterator.prototype.hasCompleted = function () { - return this.array.length === this.index; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; +} +function onErrorResumeNextStatic() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; + } + var source = null; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + source = nextSources.shift(); + return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(source, null).lift(new OnErrorResumeNextOperator(nextSources)); +} +var OnErrorResumeNextOperator = /*@__PURE__*/ (function () { + function OnErrorResumeNextOperator(nextSources) { + this.nextSources = nextSources; + } + OnErrorResumeNextOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources)); }; - return StaticArrayIterator; + return OnErrorResumeNextOperator; }()); -var ZipBufferIterator = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipBufferIterator, _super); - function ZipBufferIterator(destination, parent, observable) { +var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); + function OnErrorResumeNextSubscriber(destination, nextSources) { var _this = _super.call(this, destination) || this; - _this.parent = parent; - _this.observable = observable; - _this.stillUnsubscribed = true; - _this.buffer = []; - _this.isComplete = false; + _this.destination = destination; + _this.nextSources = nextSources; return _this; } - ZipBufferIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { - return this; + OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { + this.subscribeToNextSource(); }; - ZipBufferIterator.prototype.next = function () { - var buffer = this.buffer; - if (buffer.length === 0 && this.isComplete) { - return { value: null, done: true }; - } - else { - return { value: buffer.shift(), done: false }; - } + OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { + this.subscribeToNextSource(); }; - ZipBufferIterator.prototype.hasValue = function () { - return this.buffer.length > 0; + OnErrorResumeNextSubscriber.prototype._error = function (err) { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ZipBufferIterator.prototype.hasCompleted = function () { - return this.buffer.length === 0 && this.isComplete; + OnErrorResumeNextSubscriber.prototype._complete = function () { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ZipBufferIterator.prototype.notifyComplete = function () { - if (this.buffer.length > 0) { - this.isComplete = true; - this.parent.notifyInactive(); + OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { + var next = this.nextSources.shift(); + if (!!next) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); } else { this.destination.complete(); } }; - ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.buffer.push(innerValue); - this.parent.checkIterators(); - }; - ZipBufferIterator.prototype.subscribe = function (value, index) { - return Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, this.observable, this, index); - }; - return ZipBufferIterator; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__["OuterSubscriber"])); -//# sourceMappingURL=zip.js.map + return OnErrorResumeNextSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=onErrorResumeNext.js.map /***/ }), -/* 270 */ +/* 293 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(271); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); - -/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(272); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); - -/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(273); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); - -/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(274); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); - -/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(275); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); - -/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(276); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); - -/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(277); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); - -/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(278); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); - -/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(279); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); - -/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(280); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); - -/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(281); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); - -/* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(240); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); - -/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(282); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); - -/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(283); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(284); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); -/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(285); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); +function pairwise() { + return function (source) { return source.lift(new PairwiseOperator()); }; +} +var PairwiseOperator = /*@__PURE__*/ (function () { + function PairwiseOperator() { + } + PairwiseOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new PairwiseSubscriber(subscriber)); + }; + return PairwiseOperator; +}()); +var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](PairwiseSubscriber, _super); + function PairwiseSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.hasPrev = false; + return _this; + } + PairwiseSubscriber.prototype._next = function (value) { + var pair; + if (this.hasPrev) { + pair = [this.prev, value]; + } + else { + this.hasPrev = true; + } + this.prev = value; + if (pair) { + this.destination.next(pair); + } + }; + return PairwiseSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=pairwise.js.map -/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(286); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(287); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); +/***/ }), +/* 294 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(288); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); +/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(234); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(290); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); -/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(291); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); +function partition(predicate, thisArg) { + return function (source) { + return [ + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) + ]; + }; +} +//# sourceMappingURL=partition.js.map -/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(292); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); -/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(293); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); +/***/ }), +/* 295 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(294); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(197); +/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(295); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); +function pluck() { + var properties = []; + for (var _i = 0; _i < arguments.length; _i++) { + properties[_i] = arguments[_i]; + } + var length = properties.length; + if (length === 0) { + throw new Error('list of properties cannot be empty.'); + } + return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])(plucker(properties, length))(source); }; +} +function plucker(props, length) { + var mapper = function (x) { + var currentProp = x; + for (var i = 0; i < length; i++) { + var p = currentProp[props[i]]; + if (typeof p !== 'undefined') { + currentProp = p; + } + else { + return undefined; + } + } + return currentProp; + }; + return mapper; +} +//# sourceMappingURL=pluck.js.map -/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(298); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); -/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(299); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); +/***/ }), +/* 296 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(300); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(158); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(301); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); -/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(302); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); +function publish(selector) { + return selector ? + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); +} +//# sourceMappingURL=publish.js.map -/* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(264); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); -/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(303); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); +/***/ }), +/* 297 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(304); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); +/* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(163); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(305); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); -/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(306); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); +function publishBehavior(value) { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; +} +//# sourceMappingURL=publishBehavior.js.map -/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(191); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); -/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(307); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); +/***/ }), +/* 298 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(308); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(181); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(309); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); -/* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(226); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); +function publishLast() { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; +} +//# sourceMappingURL=publishLast.js.map -/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(311); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(312); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); +/***/ }), +/* 299 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(313); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); +/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(291); +/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(316); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); -/* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(241); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); +function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { + if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { + scheduler = selectorOrScheduler; + } + var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; + var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; +} +//# sourceMappingURL=publishReplay.js.map -/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(242); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); +/***/ }), +/* 300 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(317); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(149); +/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(236); +/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(318); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); -/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(319); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); +function race() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function raceOperatorFunction(source) { + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0]; + } + return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); + }; +} +//# sourceMappingURL=race.js.map -/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(320); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); -/* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(201); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); +/***/ }), +/* 301 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(321); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); +/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ -/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(322); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(323); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); -/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(324); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); - -/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(325); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); - -/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(326); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); - -/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(327); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); - -/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(328); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); - -/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(329); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); - -/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(314); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); - -/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(330); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); - -/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(331); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); - -/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(332); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); - -/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(333); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); - -/* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(190); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); - -/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(334); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); - -/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(335); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); - -/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(315); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); - -/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(336); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); - -/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(337); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); - -/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(338); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); - -/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(339); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); - -/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(340); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); - -/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(341); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); - -/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(342); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); - -/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(343); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); - -/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(344); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); - -/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(345); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); - -/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(347); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); - -/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(348); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); - -/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(349); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); - -/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(297); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); - -/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(310); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); - -/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(350); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); - -/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(351); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); - -/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(352); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); - -/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(353); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); - -/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(354); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); - -/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(296); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); - -/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(355); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); - -/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(356); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); - -/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(357); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); - -/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(358); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); - -/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(359); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); - -/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(360); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); - -/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(361); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); - -/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(362); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); - -/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(363); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); - -/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(364); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); - -/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(365); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); - -/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(366); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); - -/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(367); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); - -/** PURE_IMPORTS_START PURE_IMPORTS_END */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//# sourceMappingURL=index.js.map +function repeat(count) { + if (count === void 0) { + count = -1; + } + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); + } + else if (count < 0) { + return source.lift(new RepeatOperator(-1, source)); + } + else { + return source.lift(new RepeatOperator(count - 1, source)); + } + }; +} +var RepeatOperator = /*@__PURE__*/ (function () { + function RepeatOperator(count, source) { + this.count = count; + this.source = source; + } + RepeatOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); + }; + return RepeatOperator; +}()); +var RepeatSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatSubscriber, _super); + function RepeatSubscriber(destination, count, source) { + var _this = _super.call(this, destination) || this; + _this.count = count; + _this.source = source; + return _this; + } + RepeatSubscriber.prototype.complete = function () { + if (!this.isStopped) { + var _a = this, source = _a.source, count = _a.count; + if (count === 0) { + return _super.prototype.complete.call(this); + } + else if (count > -1) { + this.count = count - 1; + } + source.subscribe(this._unsubscribeAndRecycle()); + } + }; + return RepeatSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=repeat.js.map /***/ }), -/* 271 */ +/* 302 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function audit(durationSelector) { - return function auditOperatorFunction(source) { - return source.lift(new AuditOperator(durationSelector)); - }; + +function repeatWhen(notifier) { + return function (source) { return source.lift(new RepeatWhenOperator(notifier)); }; } -var AuditOperator = /*@__PURE__*/ (function () { - function AuditOperator(durationSelector) { - this.durationSelector = durationSelector; +var RepeatWhenOperator = /*@__PURE__*/ (function () { + function RepeatWhenOperator(notifier) { + this.notifier = notifier; } - AuditOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); + RepeatWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source)); }; - return AuditOperator; + return RepeatWhenOperator; }()); -var AuditSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AuditSubscriber, _super); - function AuditSubscriber(destination, durationSelector) { +var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatWhenSubscriber, _super); + function RepeatWhenSubscriber(destination, notifier, source) { var _this = _super.call(this, destination) || this; - _this.durationSelector = durationSelector; - _this.hasValue = false; + _this.notifier = notifier; + _this.source = source; + _this.sourceIsBeingSubscribedTo = true; return _this; } - AuditSubscriber.prototype._next = function (value) { - this.value = value; - this.hasValue = true; - if (!this.throttled) { - var duration = void 0; - try { - var durationSelector = this.durationSelector; - duration = durationSelector(value); - } - catch (err) { - return this.destination.error(err); - } - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); - if (!innerSubscription || innerSubscription.closed) { - this.clearThrottle(); + RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.sourceIsBeingSubscribedTo = true; + this.source.subscribe(this); + }; + RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) { + if (this.sourceIsBeingSubscribedTo === false) { + return _super.prototype.complete.call(this); + } + }; + RepeatWhenSubscriber.prototype.complete = function () { + this.sourceIsBeingSubscribedTo = false; + if (!this.isStopped) { + if (!this.retries) { + this.subscribeToRetries(); } - else { - this.add(this.throttled = innerSubscription); + if (!this.retriesSubscription || this.retriesSubscription.closed) { + return _super.prototype.complete.call(this); } + this._unsubscribeAndRecycle(); + this.notifications.next(); } }; - AuditSubscriber.prototype.clearThrottle = function () { - var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled; - if (throttled) { - this.remove(throttled); - this.throttled = null; - throttled.unsubscribe(); + RepeatWhenSubscriber.prototype._unsubscribe = function () { + var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription; + if (notifications) { + notifications.unsubscribe(); + this.notifications = null; } - if (hasValue) { - this.value = null; - this.hasValue = false; - this.destination.next(value); + if (retriesSubscription) { + retriesSubscription.unsubscribe(); + this.retriesSubscription = null; } + this.retries = null; }; - AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { - this.clearThrottle(); + RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () { + var _unsubscribe = this._unsubscribe; + this._unsubscribe = null; + _super.prototype._unsubscribeAndRecycle.call(this); + this._unsubscribe = _unsubscribe; + return this; }; - AuditSubscriber.prototype.notifyComplete = function () { - this.clearThrottle(); + RepeatWhenSubscriber.prototype.subscribeToRetries = function () { + this.notifications = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + var retries; + try { + var notifier = this.notifier; + retries = notifier(this.notifications); + } + catch (e) { + return _super.prototype.complete.call(this); + } + this.retries = retries; + this.retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); }; - return AuditSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=audit.js.map + return RepeatWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=repeatWhen.js.map /***/ }), -/* 272 */ +/* 303 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(271); -/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(267); -/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function auditTime(duration, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; +function retry(count) { + if (count === void 0) { + count = -1; } - return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); -} -//# sourceMappingURL=auditTime.js.map - - -/***/ }), -/* 273 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - -function buffer(closingNotifier) { - return function bufferOperatorFunction(source) { - return source.lift(new BufferOperator(closingNotifier)); - }; + return function (source) { return source.lift(new RetryOperator(count, source)); }; } -var BufferOperator = /*@__PURE__*/ (function () { - function BufferOperator(closingNotifier) { - this.closingNotifier = closingNotifier; +var RetryOperator = /*@__PURE__*/ (function () { + function RetryOperator(count, source) { + this.count = count; + this.source = source; } - BufferOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); + RetryOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source)); }; - return BufferOperator; + return RetryOperator; }()); -var BufferSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); - function BufferSubscriber(destination, closingNotifier) { +var RetrySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetrySubscriber, _super); + function RetrySubscriber(destination, count, source) { var _this = _super.call(this, destination) || this; - _this.buffer = []; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, closingNotifier)); + _this.count = count; + _this.source = source; return _this; } - BufferSubscriber.prototype._next = function (value) { - this.buffer.push(value); - }; - BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var buffer = this.buffer; - this.buffer = []; - this.destination.next(buffer); + RetrySubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _a = this, source = _a.source, count = _a.count; + if (count === 0) { + return _super.prototype.error.call(this, err); + } + else if (count > -1) { + this.count = count - 1; + } + source.subscribe(this._unsubscribeAndRecycle()); + } }; - return BufferSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=buffer.js.map + return RetrySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=retry.js.map /***/ }), -/* 274 */ +/* 304 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function bufferCount(bufferSize, startBufferEvery) { - if (startBufferEvery === void 0) { - startBufferEvery = null; - } - return function bufferCountOperatorFunction(source) { - return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); - }; + + +function retryWhen(notifier) { + return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); }; } -var BufferCountOperator = /*@__PURE__*/ (function () { - function BufferCountOperator(bufferSize, startBufferEvery) { - this.bufferSize = bufferSize; - this.startBufferEvery = startBufferEvery; - if (!startBufferEvery || bufferSize === startBufferEvery) { - this.subscriberClass = BufferCountSubscriber; - } - else { - this.subscriberClass = BufferSkipCountSubscriber; - } +var RetryWhenOperator = /*@__PURE__*/ (function () { + function RetryWhenOperator(notifier, source) { + this.notifier = notifier; + this.source = source; } - BufferCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); + RetryWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source)); }; - return BufferCountOperator; + return RetryWhenOperator; }()); -var BufferCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferCountSubscriber, _super); - function BufferCountSubscriber(destination, bufferSize) { +var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetryWhenSubscriber, _super); + function RetryWhenSubscriber(destination, notifier, source) { var _this = _super.call(this, destination) || this; - _this.bufferSize = bufferSize; - _this.buffer = []; + _this.notifier = notifier; + _this.source = source; return _this; } - BufferCountSubscriber.prototype._next = function (value) { - var buffer = this.buffer; - buffer.push(value); - if (buffer.length == this.bufferSize) { - this.destination.next(buffer); - this.buffer = []; - } - }; - BufferCountSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer.length > 0) { - this.destination.next(buffer); - } - _super.prototype._complete.call(this); - }; - return BufferCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSkipCountSubscriber, _super); - function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { - var _this = _super.call(this, destination) || this; - _this.bufferSize = bufferSize; - _this.startBufferEvery = startBufferEvery; - _this.buffers = []; - _this.count = 0; - return _this; - } - BufferSkipCountSubscriber.prototype._next = function (value) { - var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; - this.count++; - if (count % startBufferEvery === 0) { - buffers.push([]); - } - for (var i = buffers.length; i--;) { - var buffer = buffers[i]; - buffer.push(value); - if (buffer.length === bufferSize) { - buffers.splice(i, 1); - this.destination.next(buffer); + RetryWhenSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var errors = this.errors; + var retries = this.retries; + var retriesSubscription = this.retriesSubscription; + if (!retries) { + errors = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + try { + var notifier = this.notifier; + retries = notifier(errors); + } + catch (e) { + return _super.prototype.error.call(this, e); + } + retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); } + else { + this.errors = null; + this.retriesSubscription = null; + } + this._unsubscribeAndRecycle(); + this.errors = errors; + this.retries = retries; + this.retriesSubscription = retriesSubscription; + errors.next(err); } }; - BufferSkipCountSubscriber.prototype._complete = function () { - var _a = this, buffers = _a.buffers, destination = _a.destination; - while (buffers.length > 0) { - var buffer = buffers.shift(); - if (buffer.length > 0) { - destination.next(buffer); - } + RetryWhenSubscriber.prototype._unsubscribe = function () { + var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription; + if (errors) { + errors.unsubscribe(); + this.errors = null; } - _super.prototype._complete.call(this); + if (retriesSubscription) { + retriesSubscription.unsubscribe(); + this.retriesSubscription = null; + } + this.retries = null; }; - return BufferSkipCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=bufferCount.js.map + RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var _unsubscribe = this._unsubscribe; + this._unsubscribe = null; + this._unsubscribeAndRecycle(); + this._unsubscribe = _unsubscribe; + this.source.subscribe(this); + }; + return RetryWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=retryWhen.js.map /***/ }), -/* 275 */ +/* 305 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(205); -/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function bufferTime(bufferTimeSpan) { - var length = arguments.length; - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(arguments[arguments.length - 1])) { - scheduler = arguments[arguments.length - 1]; - length--; - } - var bufferCreationInterval = null; - if (length >= 2) { - bufferCreationInterval = arguments[1]; - } - var maxBufferSize = Number.POSITIVE_INFINITY; - if (length >= 3) { - maxBufferSize = arguments[2]; - } - return function bufferTimeOperatorFunction(source) { - return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler)); - }; +function sample(notifier) { + return function (source) { return source.lift(new SampleOperator(notifier)); }; } -var BufferTimeOperator = /*@__PURE__*/ (function () { - function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { - this.bufferTimeSpan = bufferTimeSpan; - this.bufferCreationInterval = bufferCreationInterval; - this.maxBufferSize = maxBufferSize; - this.scheduler = scheduler; +var SampleOperator = /*@__PURE__*/ (function () { + function SampleOperator(notifier) { + this.notifier = notifier; } - BufferTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler)); + SampleOperator.prototype.call = function (subscriber, source) { + var sampleSubscriber = new SampleSubscriber(subscriber); + var subscription = source.subscribe(sampleSubscriber); + subscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); + return subscription; }; - return BufferTimeOperator; -}()); -var Context = /*@__PURE__*/ (function () { - function Context() { - this.buffer = []; - } - return Context; + return SampleOperator; }()); -var BufferTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferTimeSubscriber, _super); - function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { - var _this = _super.call(this, destination) || this; - _this.bufferTimeSpan = bufferTimeSpan; - _this.bufferCreationInterval = bufferCreationInterval; - _this.maxBufferSize = maxBufferSize; - _this.scheduler = scheduler; - _this.contexts = []; - var context = _this.openContext(); - _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0; - if (_this.timespanOnly) { - var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan }; - _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); - } - else { - var closeState = { subscriber: _this, context: context }; - var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler }; - _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState)); - _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState)); - } +var SampleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleSubscriber, _super); + function SampleSubscriber() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.hasValue = false; return _this; } - BufferTimeSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - var len = contexts.length; - var filledBufferContext; - for (var i = 0; i < len; i++) { - var context_1 = contexts[i]; - var buffer = context_1.buffer; - buffer.push(value); - if (buffer.length == this.maxBufferSize) { - filledBufferContext = context_1; - } - } - if (filledBufferContext) { - this.onBufferFull(filledBufferContext); - } - }; - BufferTimeSubscriber.prototype._error = function (err) { - this.contexts.length = 0; - _super.prototype._error.call(this, err); - }; - BufferTimeSubscriber.prototype._complete = function () { - var _a = this, contexts = _a.contexts, destination = _a.destination; - while (contexts.length > 0) { - var context_2 = contexts.shift(); - destination.next(context_2.buffer); - } - _super.prototype._complete.call(this); - }; - BufferTimeSubscriber.prototype._unsubscribe = function () { - this.contexts = null; + SampleSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; }; - BufferTimeSubscriber.prototype.onBufferFull = function (context) { - this.closeContext(context); - var closeAction = context.closeAction; - closeAction.unsubscribe(); - this.remove(closeAction); - if (!this.closed && this.timespanOnly) { - context = this.openContext(); - var bufferTimeSpan = this.bufferTimeSpan; - var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan }; - this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); - } + SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.emitValue(); }; - BufferTimeSubscriber.prototype.openContext = function () { - var context = new Context(); - this.contexts.push(context); - return context; + SampleSubscriber.prototype.notifyComplete = function () { + this.emitValue(); }; - BufferTimeSubscriber.prototype.closeContext = function (context) { - this.destination.next(context.buffer); - var contexts = this.contexts; - var spliceIndex = contexts ? contexts.indexOf(context) : -1; - if (spliceIndex >= 0) { - contexts.splice(contexts.indexOf(context), 1); + SampleSubscriber.prototype.emitValue = function () { + if (this.hasValue) { + this.hasValue = false; + this.destination.next(this.value); } }; - return BufferTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -function dispatchBufferTimeSpanOnly(state) { - var subscriber = state.subscriber; - var prevContext = state.context; - if (prevContext) { - subscriber.closeContext(prevContext); - } - if (!subscriber.closed) { - state.context = subscriber.openContext(); - state.context.closeAction = this.schedule(state, state.bufferTimeSpan); - } -} -function dispatchBufferCreation(state) { - var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler; - var context = subscriber.openContext(); - var action = this; - if (!subscriber.closed) { - subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context })); - action.schedule(state, bufferCreationInterval); - } -} -function dispatchBufferClose(arg) { - var subscriber = arg.subscriber, context = arg.context; - subscriber.closeContext(context); -} -//# sourceMappingURL=bufferTime.js.map + return SampleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=sample.js.map /***/ }), -/* 276 */ +/* 306 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ -function bufferToggle(openings, closingSelector) { - return function bufferToggleOperatorFunction(source) { - return source.lift(new BufferToggleOperator(openings, closingSelector)); - }; +function sampleTime(period, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); }; } -var BufferToggleOperator = /*@__PURE__*/ (function () { - function BufferToggleOperator(openings, closingSelector) { - this.openings = openings; - this.closingSelector = closingSelector; +var SampleTimeOperator = /*@__PURE__*/ (function () { + function SampleTimeOperator(period, scheduler) { + this.period = period; + this.scheduler = scheduler; } - BufferToggleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); + SampleTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler)); }; - return BufferToggleOperator; + return SampleTimeOperator; }()); -var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferToggleSubscriber, _super); - function BufferToggleSubscriber(destination, openings, closingSelector) { +var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleTimeSubscriber, _super); + function SampleTimeSubscriber(destination, period, scheduler) { var _this = _super.call(this, destination) || this; - _this.openings = openings; - _this.closingSelector = closingSelector; - _this.contexts = []; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, openings)); + _this.period = period; + _this.scheduler = scheduler; + _this.hasValue = false; + _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period })); return _this; } - BufferToggleSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - var len = contexts.length; - for (var i = 0; i < len; i++) { - contexts[i].buffer.push(value); - } - }; - BufferToggleSubscriber.prototype._error = function (err) { - var contexts = this.contexts; - while (contexts.length > 0) { - var context_1 = contexts.shift(); - context_1.subscription.unsubscribe(); - context_1.buffer = null; - context_1.subscription = null; - } - this.contexts = null; - _super.prototype._error.call(this, err); - }; - BufferToggleSubscriber.prototype._complete = function () { - var contexts = this.contexts; - while (contexts.length > 0) { - var context_2 = contexts.shift(); - this.destination.next(context_2.buffer); - context_2.subscription.unsubscribe(); - context_2.buffer = null; - context_2.subscription = null; - } - this.contexts = null; - _super.prototype._complete.call(this); - }; - BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); - }; - BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) { - this.closeBuffer(innerSub.context); - }; - BufferToggleSubscriber.prototype.openBuffer = function (value) { - try { - var closingSelector = this.closingSelector; - var closingNotifier = closingSelector.call(this, value); - if (closingNotifier) { - this.trySubscribe(closingNotifier); - } - } - catch (err) { - this._error(err); - } - }; - BufferToggleSubscriber.prototype.closeBuffer = function (context) { - var contexts = this.contexts; - if (contexts && context) { - var buffer = context.buffer, subscription = context.subscription; - this.destination.next(buffer); - contexts.splice(contexts.indexOf(context), 1); - this.remove(subscription); - subscription.unsubscribe(); - } + SampleTimeSubscriber.prototype._next = function (value) { + this.lastValue = value; + this.hasValue = true; }; - BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) { - var contexts = this.contexts; - var buffer = []; - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var context = { buffer: buffer, subscription: subscription }; - contexts.push(context); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); - if (!innerSubscription || innerSubscription.closed) { - this.closeBuffer(context); - } - else { - innerSubscription.context = context; - this.add(innerSubscription); - subscription.add(innerSubscription); + SampleTimeSubscriber.prototype.notifyNext = function () { + if (this.hasValue) { + this.hasValue = false; + this.destination.next(this.lastValue); } }; - return BufferToggleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=bufferToggle.js.map + return SampleTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNotification(state) { + var subscriber = state.subscriber, period = state.period; + subscriber.notifyNext(); + this.schedule(state, period); +} +//# sourceMappingURL=sampleTime.js.map /***/ }), -/* 277 */ +/* 307 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function bufferWhen(closingSelector) { - return function (source) { - return source.lift(new BufferWhenOperator(closingSelector)); - }; +function sequenceEqual(compareTo, comparator) { + return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); }; } -var BufferWhenOperator = /*@__PURE__*/ (function () { - function BufferWhenOperator(closingSelector) { - this.closingSelector = closingSelector; +var SequenceEqualOperator = /*@__PURE__*/ (function () { + function SequenceEqualOperator(compareTo, comparator) { + this.compareTo = compareTo; + this.comparator = comparator; } - BufferWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); + SequenceEqualOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator)); }; - return BufferWhenOperator; + return SequenceEqualOperator; }()); -var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferWhenSubscriber, _super); - function BufferWhenSubscriber(destination, closingSelector) { + +var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualSubscriber, _super); + function SequenceEqualSubscriber(destination, compareTo, comparator) { var _this = _super.call(this, destination) || this; - _this.closingSelector = closingSelector; - _this.subscribing = false; - _this.openBuffer(); + _this.compareTo = compareTo; + _this.comparator = comparator; + _this._a = []; + _this._b = []; + _this._oneComplete = false; + _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this))); return _this; } - BufferWhenSubscriber.prototype._next = function (value) { - this.buffer.push(value); + SequenceEqualSubscriber.prototype._next = function (value) { + if (this._oneComplete && this._b.length === 0) { + this.emit(false); + } + else { + this._a.push(value); + this.checkValues(); + } }; - BufferWhenSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer) { - this.destination.next(buffer); + SequenceEqualSubscriber.prototype._complete = function () { + if (this._oneComplete) { + this.emit(this._a.length === 0 && this._b.length === 0); } - _super.prototype._complete.call(this); + else { + this._oneComplete = true; + } + this.unsubscribe(); }; - BufferWhenSubscriber.prototype._unsubscribe = function () { - this.buffer = null; - this.subscribing = false; + SequenceEqualSubscriber.prototype.checkValues = function () { + var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator; + while (_a.length > 0 && _b.length > 0) { + var a = _a.shift(); + var b = _b.shift(); + var areEqual = false; + try { + areEqual = comparator ? comparator(a, b) : a === b; + } + catch (e) { + this.destination.error(e); + } + if (!areEqual) { + this.emit(false); + } + } }; - BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openBuffer(); + SequenceEqualSubscriber.prototype.emit = function (value) { + var destination = this.destination; + destination.next(value); + destination.complete(); }; - BufferWhenSubscriber.prototype.notifyComplete = function () { - if (this.subscribing) { - this.complete(); + SequenceEqualSubscriber.prototype.nextB = function (value) { + if (this._oneComplete && this._a.length === 0) { + this.emit(false); } else { - this.openBuffer(); + this._b.push(value); + this.checkValues(); } }; - BufferWhenSubscriber.prototype.openBuffer = function () { - var closingSubscription = this.closingSubscription; - if (closingSubscription) { - this.remove(closingSubscription); - closingSubscription.unsubscribe(); - } - var buffer = this.buffer; - if (this.buffer) { - this.destination.next(buffer); - } - this.buffer = []; - var closingNotifier; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(); + SequenceEqualSubscriber.prototype.completeB = function () { + if (this._oneComplete) { + this.emit(this._a.length === 0 && this._b.length === 0); } - catch (err) { - return this.error(err); + else { + this._oneComplete = true; } - closingSubscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - this.closingSubscription = closingSubscription; - this.add(closingSubscription); - this.subscribing = true; - closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); - this.subscribing = false; }; - return BufferWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=bufferWhen.js.map - - -/***/ }), -/* 278 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - + return SequenceEqualSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function catchError(selector) { - return function catchErrorOperatorFunction(source) { - var operator = new CatchOperator(selector); - var caught = source.lift(operator); - return (operator.caught = caught); - }; -} -var CatchOperator = /*@__PURE__*/ (function () { - function CatchOperator(selector) { - this.selector = selector; - } - CatchOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); - }; - return CatchOperator; -}()); -var CatchSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); - function CatchSubscriber(destination, selector, caught) { +var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualCompareToSubscriber, _super); + function SequenceEqualCompareToSubscriber(destination, parent) { var _this = _super.call(this, destination) || this; - _this.selector = selector; - _this.caught = caught; + _this.parent = parent; return _this; } - CatchSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var result = void 0; - try { - result = this.selector(err, this.caught); - } - catch (err2) { - _super.prototype.error.call(this, err2); - return; - } - this._unsubscribeAndRecycle(); - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - this.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); - } + SequenceEqualCompareToSubscriber.prototype._next = function (value) { + this.parent.nextB(value); }; - return CatchSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=catchError.js.map - - -/***/ }), -/* 279 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(228); -/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ - -function combineAll(project) { - return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; -} -//# sourceMappingURL=combineAll.js.map + SequenceEqualCompareToSubscriber.prototype._error = function (err) { + this.parent.error(err); + this.unsubscribe(); + }; + SequenceEqualCompareToSubscriber.prototype._complete = function () { + this.parent.completeB(); + this.unsubscribe(); + }; + return SequenceEqualCompareToSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=sequenceEqual.js.map /***/ }), -/* 280 */ +/* 308 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(228); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(243); -/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(291); +/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(161); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(158); +/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ -var none = {}; -function combineLatest() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var project = null; - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); - } - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0].slice(); - } - return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; +function shareSubjectFactory() { + return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); } -//# sourceMappingURL=combineLatest.js.map +function share() { + return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; +} +//# sourceMappingURL=share.js.map /***/ }), -/* 281 */ +/* 309 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); -/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); +/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ -function concat() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +function shareReplay(configOrBufferSize, windowTime, scheduler) { + var config; + if (configOrBufferSize && typeof configOrBufferSize === 'object') { + config = configOrBufferSize; } - return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; + else { + config = { + bufferSize: configOrBufferSize, + windowTime: windowTime, + refCount: false, + scheduler: scheduler + }; + } + return function (source) { return source.lift(shareReplayOperator(config)); }; } -//# sourceMappingURL=concat.js.map - - -/***/ }), -/* 282 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ - -function concatMap(project, resultSelector) { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); +function shareReplayOperator(_a) { + var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler; + var subject; + var refCount = 0; + var subscription; + var hasError = false; + var isComplete = false; + return function shareReplayOperation(source) { + refCount++; + if (!subject || hasError) { + hasError = false; + subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); + subscription = source.subscribe({ + next: function (value) { subject.next(value); }, + error: function (err) { + hasError = true; + subject.error(err); + }, + complete: function () { + isComplete = true; + subject.complete(); + }, + }); + } + var innerSub = subject.subscribe(this); + this.add(function () { + refCount--; + innerSub.unsubscribe(); + if (subscription && !isComplete && useRefCount && refCount === 0) { + subscription.unsubscribe(); + subscription = undefined; + subject = undefined; + } + }); + }; } -//# sourceMappingURL=concatMap.js.map +//# sourceMappingURL=shareReplay.js.map /***/ }), -/* 283 */ +/* 310 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); -/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(282); -/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ - -function concatMapTo(innerObservable, resultSelector) { - return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); -} -//# sourceMappingURL=concatMapTo.js.map - - -/***/ }), -/* 284 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(194); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function count(predicate) { - return function (source) { return source.lift(new CountOperator(predicate, source)); }; +function single(predicate) { + return function (source) { return source.lift(new SingleOperator(predicate, source)); }; } -var CountOperator = /*@__PURE__*/ (function () { - function CountOperator(predicate, source) { +var SingleOperator = /*@__PURE__*/ (function () { + function SingleOperator(predicate, source) { this.predicate = predicate; this.source = source; } - CountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); + SingleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source)); }; - return CountOperator; + return SingleOperator; }()); -var CountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountSubscriber, _super); - function CountSubscriber(destination, predicate, source) { +var SingleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SingleSubscriber, _super); + function SingleSubscriber(destination, predicate, source) { var _this = _super.call(this, destination) || this; _this.predicate = predicate; _this.source = source; - _this.count = 0; + _this.seenValue = false; _this.index = 0; return _this; } - CountSubscriber.prototype._next = function (value) { + SingleSubscriber.prototype.applySingleValue = function (value) { + if (this.seenValue) { + this.destination.error('Sequence contains more than one element'); + } + else { + this.seenValue = true; + this.singleValue = value; + } + }; + SingleSubscriber.prototype._next = function (value) { + var index = this.index++; if (this.predicate) { - this._tryPredicate(value); + this.tryNext(value, index); } else { - this.count++; + this.applySingleValue(value); } }; - CountSubscriber.prototype._tryPredicate = function (value) { - var result; + SingleSubscriber.prototype.tryNext = function (value, index) { try { - result = this.predicate(value, this.index++, this.source); + if (this.predicate(value, index, this.source)) { + this.applySingleValue(value); + } } catch (err) { this.destination.error(err); - return; - } - if (result) { - this.count++; } }; - CountSubscriber.prototype._complete = function () { - this.destination.next(this.count); - this.destination.complete(); + SingleSubscriber.prototype._complete = function () { + var destination = this.destination; + if (this.index > 0) { + destination.next(this.seenValue ? this.singleValue : undefined); + destination.complete(); + } + else { + destination.error(new _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); + } }; - return CountSubscriber; + return SingleSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=count.js.map +//# sourceMappingURL=single.js.map /***/ }), -/* 285 */ +/* 311 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function debounce(durationSelector) { - return function (source) { return source.lift(new DebounceOperator(durationSelector)); }; +function skip(count) { + return function (source) { return source.lift(new SkipOperator(count)); }; } -var DebounceOperator = /*@__PURE__*/ (function () { - function DebounceOperator(durationSelector) { - this.durationSelector = durationSelector; +var SkipOperator = /*@__PURE__*/ (function () { + function SkipOperator(total) { + this.total = total; } - DebounceOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector)); + SkipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipSubscriber(subscriber, this.total)); }; - return DebounceOperator; + return SkipOperator; }()); -var DebounceSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceSubscriber, _super); - function DebounceSubscriber(destination, durationSelector) { +var SkipSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipSubscriber, _super); + function SkipSubscriber(destination, total) { var _this = _super.call(this, destination) || this; - _this.durationSelector = durationSelector; - _this.hasValue = false; - _this.durationSubscription = null; + _this.total = total; + _this.count = 0; return _this; } - DebounceSubscriber.prototype._next = function (value) { - try { - var result = this.durationSelector.call(this, value); - if (result) { - this._tryNext(value, result); - } - } - catch (err) { - this.destination.error(err); - } - }; - DebounceSubscriber.prototype._complete = function () { - this.emitValue(); - this.destination.complete(); - }; - DebounceSubscriber.prototype._tryNext = function (value, duration) { - var subscription = this.durationSubscription; - this.value = value; - this.hasValue = true; - if (subscription) { - subscription.unsubscribe(); - this.remove(subscription); - } - subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); - if (subscription && !subscription.closed) { - this.add(this.durationSubscription = subscription); - } - }; - DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.emitValue(); - }; - DebounceSubscriber.prototype.notifyComplete = function () { - this.emitValue(); - }; - DebounceSubscriber.prototype.emitValue = function () { - if (this.hasValue) { - var value = this.value; - var subscription = this.durationSubscription; - if (subscription) { - this.durationSubscription = null; - subscription.unsubscribe(); - this.remove(subscription); - } - this.value = null; - this.hasValue = false; - _super.prototype._next.call(this, value); + SkipSubscriber.prototype._next = function (x) { + if (++this.count > this.total) { + this.destination.next(x); } }; - return DebounceSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=debounce.js.map + return SkipSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skip.js.map /***/ }), -/* 286 */ +/* 312 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ -function debounceTime(dueTime, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; +function skipLast(count) { + return function (source) { return source.lift(new SkipLastOperator(count)); }; } -var DebounceTimeOperator = /*@__PURE__*/ (function () { - function DebounceTimeOperator(dueTime, scheduler) { - this.dueTime = dueTime; - this.scheduler = scheduler; +var SkipLastOperator = /*@__PURE__*/ (function () { + function SkipLastOperator(_skipCount) { + this._skipCount = _skipCount; + if (this._skipCount < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + } } - DebounceTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + SkipLastOperator.prototype.call = function (subscriber, source) { + if (this._skipCount === 0) { + return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); + } + else { + return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); + } }; - return DebounceTimeOperator; + return SkipLastOperator; }()); -var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceTimeSubscriber, _super); - function DebounceTimeSubscriber(destination, dueTime, scheduler) { +var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipLastSubscriber, _super); + function SkipLastSubscriber(destination, _skipCount) { var _this = _super.call(this, destination) || this; - _this.dueTime = dueTime; - _this.scheduler = scheduler; - _this.debouncedSubscription = null; - _this.lastValue = null; - _this.hasValue = false; + _this._skipCount = _skipCount; + _this._count = 0; + _this._ring = new Array(_skipCount); return _this; } - DebounceTimeSubscriber.prototype._next = function (value) { - this.clearDebounce(); - this.lastValue = value; - this.hasValue = true; - this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); - }; - DebounceTimeSubscriber.prototype._complete = function () { - this.debouncedNext(); - this.destination.complete(); - }; - DebounceTimeSubscriber.prototype.debouncedNext = function () { - this.clearDebounce(); - if (this.hasValue) { - var lastValue = this.lastValue; - this.lastValue = null; - this.hasValue = false; - this.destination.next(lastValue); + SkipLastSubscriber.prototype._next = function (value) { + var skipCount = this._skipCount; + var count = this._count++; + if (count < skipCount) { + this._ring[count] = value; } - }; - DebounceTimeSubscriber.prototype.clearDebounce = function () { - var debouncedSubscription = this.debouncedSubscription; - if (debouncedSubscription !== null) { - this.remove(debouncedSubscription); - debouncedSubscription.unsubscribe(); - this.debouncedSubscription = null; + else { + var currentIndex = count % skipCount; + var ring = this._ring; + var oldValue = ring[currentIndex]; + ring[currentIndex] = value; + this.destination.next(oldValue); } }; - return DebounceTimeSubscriber; + return SkipLastSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(subscriber) { - subscriber.debouncedNext(); -} -//# sourceMappingURL=debounceTime.js.map +//# sourceMappingURL=skipLast.js.map /***/ }), -/* 287 */ +/* 313 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function defaultIfEmpty(defaultValue) { - if (defaultValue === void 0) { - defaultValue = null; - } - return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; + + +function skipUntil(notifier) { + return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; } -var DefaultIfEmptyOperator = /*@__PURE__*/ (function () { - function DefaultIfEmptyOperator(defaultValue) { - this.defaultValue = defaultValue; +var SkipUntilOperator = /*@__PURE__*/ (function () { + function SkipUntilOperator(notifier) { + this.notifier = notifier; } - DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); + SkipUntilOperator.prototype.call = function (destination, source) { + return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); }; - return DefaultIfEmptyOperator; + return SkipUntilOperator; }()); -var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultIfEmptySubscriber, _super); - function DefaultIfEmptySubscriber(destination, defaultValue) { +var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); + function SkipUntilSubscriber(destination, notifier) { var _this = _super.call(this, destination) || this; - _this.defaultValue = defaultValue; - _this.isEmpty = true; + _this.hasValue = false; + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); + _this.add(innerSubscriber); + _this.innerSubscription = innerSubscriber; + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(_this, notifier, undefined, undefined, innerSubscriber); return _this; } - DefaultIfEmptySubscriber.prototype._next = function (value) { - this.isEmpty = false; - this.destination.next(value); + SkipUntilSubscriber.prototype._next = function (value) { + if (this.hasValue) { + _super.prototype._next.call(this, value); + } }; - DefaultIfEmptySubscriber.prototype._complete = function () { - if (this.isEmpty) { - this.destination.next(this.defaultValue); + SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.hasValue = true; + if (this.innerSubscription) { + this.innerSubscription.unsubscribe(); } - this.destination.complete(); }; - return DefaultIfEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=defaultIfEmpty.js.map + SkipUntilSubscriber.prototype.notifyComplete = function () { + }; + return SkipUntilSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=skipUntil.js.map /***/ }), -/* 288 */ +/* 314 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(289); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + +function skipWhile(predicate) { + return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; +} +var SkipWhileOperator = /*@__PURE__*/ (function () { + function SkipWhileOperator(predicate) { + this.predicate = predicate; + } + SkipWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); + }; + return SkipWhileOperator; +}()); +var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipWhileSubscriber, _super); + function SkipWhileSubscriber(destination, predicate) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.skipping = true; + _this.index = 0; + return _this; + } + SkipWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (this.skipping) { + this.tryCallPredicate(value); + } + if (!this.skipping) { + destination.next(value); + } + }; + SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { + try { + var result = this.predicate(value, this.index++); + this.skipping = Boolean(result); + } + catch (err) { + this.destination.error(err); + } + }; + return SkipWhileSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skipWhile.js.map +/***/ }), +/* 315 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(176); +/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ -function delay(delay, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + +function startWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; + } + var scheduler = array[array.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { + array.pop(); + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; + } + else { + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; } - var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(delay); - var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); - return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; } -var DelayOperator = /*@__PURE__*/ (function () { - function DelayOperator(delay, scheduler) { - this.delay = delay; +//# sourceMappingURL=startWith.js.map + + +/***/ }), +/* 316 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); +/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(317); +/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ + +function subscribeOn(scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + return function subscribeOnOperatorFunction(source) { + return source.lift(new SubscribeOnOperator(scheduler, delay)); + }; +} +var SubscribeOnOperator = /*@__PURE__*/ (function () { + function SubscribeOnOperator(scheduler, delay) { this.scheduler = scheduler; + this.delay = delay; } - DelayOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); + SubscribeOnOperator.prototype.call = function (subscriber, source) { + return new _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); }; - return DelayOperator; + return SubscribeOnOperator; }()); -var DelaySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelaySubscriber, _super); - function DelaySubscriber(destination, delay, scheduler) { - var _this = _super.call(this, destination) || this; - _this.delay = delay; +//# sourceMappingURL=subscribeOn.js.map + + +/***/ }), +/* 317 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(141); +/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(228); +/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ + + + + +var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); + function SubscribeOnObservable(source, delayTime, scheduler) { + if (delayTime === void 0) { + delayTime = 0; + } + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } + var _this = _super.call(this) || this; + _this.source = source; + _this.delayTime = delayTime; _this.scheduler = scheduler; - _this.queue = []; - _this.active = false; - _this.errored = false; + if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { + _this.delayTime = 0; + } + if (!scheduler || typeof scheduler.schedule !== 'function') { + _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } return _this; } - DelaySubscriber.dispatch = function (state) { - var source = state.source; - var queue = source.queue; - var scheduler = state.scheduler; - var destination = state.destination; - while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { - queue.shift().notification.observe(destination); - } - if (queue.length > 0) { - var delay_1 = Math.max(0, queue[0].time - scheduler.now()); - this.schedule(state, delay_1); + SubscribeOnObservable.create = function (source, delay, scheduler) { + if (delay === void 0) { + delay = 0; } - else { - this.unsubscribe(); - source.active = false; + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; } + return new SubscribeOnObservable(source, delay, scheduler); }; - DelaySubscriber.prototype._schedule = function (scheduler) { - this.active = true; - var destination = this.destination; - destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { - source: this, destination: this.destination, scheduler: scheduler - })); + SubscribeOnObservable.dispatch = function (arg) { + var source = arg.source, subscriber = arg.subscriber; + return this.add(source.subscribe(subscriber)); }; - DelaySubscriber.prototype.scheduleNotification = function (notification) { - if (this.errored === true) { - return; - } + SubscribeOnObservable.prototype._subscribe = function (subscriber) { + var delay = this.delayTime; + var source = this.source; var scheduler = this.scheduler; - var message = new DelayMessage(scheduler.now() + this.delay, notification); - this.queue.push(message); - if (this.active === false) { - this._schedule(scheduler); - } - }; - DelaySubscriber.prototype._next = function (value) { - this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createNext(value)); - }; - DelaySubscriber.prototype._error = function (err) { - this.errored = true; - this.queue = []; - this.destination.error(err); - this.unsubscribe(); - }; - DelaySubscriber.prototype._complete = function () { - this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); - this.unsubscribe(); + return scheduler.schedule(SubscribeOnObservable.dispatch, delay, { + source: source, subscriber: subscriber + }); }; - return DelaySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -var DelayMessage = /*@__PURE__*/ (function () { - function DelayMessage(time, notification) { - this.time = time; - this.notification = notification; - } - return DelayMessage; -}()); -//# sourceMappingURL=delay.js.map + return SubscribeOnObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); + +//# sourceMappingURL=SubscribeOnObservable.js.map /***/ }), -/* 289 */ +/* 318 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isDate(value) { - return value instanceof Date && !isNaN(+value); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(319); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(191); +/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ + + +function switchAll() { + return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); } -//# sourceMappingURL=isDate.js.map +//# sourceMappingURL=switchAll.js.map /***/ }), -/* 290 */ +/* 319 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(197); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(214); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -function delayWhen(delayDurationSelector, subscriptionDelay) { - if (subscriptionDelay) { - return function (source) { - return new SubscriptionDelayObservable(source, subscriptionDelay) - .lift(new DelayWhenOperator(delayDurationSelector)); - }; + +function switchMap(project, resultSelector) { + if (typeof resultSelector === 'function') { + return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; } - return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); }; + return function (source) { return source.lift(new SwitchMapOperator(project)); }; } -var DelayWhenOperator = /*@__PURE__*/ (function () { - function DelayWhenOperator(delayDurationSelector) { - this.delayDurationSelector = delayDurationSelector; +var SwitchMapOperator = /*@__PURE__*/ (function () { + function SwitchMapOperator(project) { + this.project = project; } - DelayWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector)); + SwitchMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); }; - return DelayWhenOperator; + return SwitchMapOperator; }()); -var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelayWhenSubscriber, _super); - function DelayWhenSubscriber(destination, delayDurationSelector) { +var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchMapSubscriber, _super); + function SwitchMapSubscriber(destination, project) { var _this = _super.call(this, destination) || this; - _this.delayDurationSelector = delayDurationSelector; - _this.completed = false; - _this.delayNotifierSubscriptions = []; + _this.project = project; _this.index = 0; return _this; } - DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(outerValue); - this.removeSubscription(innerSub); - this.tryComplete(); - }; - DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) { - var value = this.removeSubscription(innerSub); - if (value) { - this.destination.next(value); - } - this.tryComplete(); - }; - DelayWhenSubscriber.prototype._next = function (value) { + SwitchMapSubscriber.prototype._next = function (value) { + var result; var index = this.index++; try { - var delayNotifier = this.delayDurationSelector(value, index); - if (delayNotifier) { - this.tryDelay(delayNotifier, value); - } - } - catch (err) { - this.destination.error(err); + result = this.project(value, index); } - }; - DelayWhenSubscriber.prototype._complete = function () { - this.completed = true; - this.tryComplete(); - this.unsubscribe(); - }; - DelayWhenSubscriber.prototype.removeSubscription = function (subscription) { - subscription.unsubscribe(); - var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription); - if (subscriptionIdx !== -1) { - this.delayNotifierSubscriptions.splice(subscriptionIdx, 1); + catch (error) { + this.destination.error(error); + return; } - return subscription.outerValue; + this._innerSub(result, value, index); }; - DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) { - var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, delayNotifier, value); - if (notifierSubscription && !notifierSubscription.closed) { - var destination = this.destination; - destination.add(notifierSubscription); - this.delayNotifierSubscriptions.push(notifierSubscription); + SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscription = this.innerSubscription; + if (innerSubscription) { + innerSubscription.unsubscribe(); } + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); }; - DelayWhenSubscriber.prototype.tryComplete = function () { - if (this.completed && this.delayNotifierSubscriptions.length === 0) { - this.destination.complete(); + SwitchMapSubscriber.prototype._complete = function () { + var innerSubscription = this.innerSubscription; + if (!innerSubscription || innerSubscription.closed) { + _super.prototype._complete.call(this); } - }; - return DelayWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelayObservable, _super); - function SubscriptionDelayObservable(source, subscriptionDelay) { - var _this = _super.call(this) || this; - _this.source = source; - _this.subscriptionDelay = subscriptionDelay; - return _this; - } - SubscriptionDelayObservable.prototype._subscribe = function (subscriber) { - this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source)); - }; - return SubscriptionDelayObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); -var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelaySubscriber, _super); - function SubscriptionDelaySubscriber(parent, source) { - var _this = _super.call(this) || this; - _this.parent = parent; - _this.source = source; - _this.sourceSubscribed = false; - return _this; - } - SubscriptionDelaySubscriber.prototype._next = function (unused) { - this.subscribeToSource(); - }; - SubscriptionDelaySubscriber.prototype._error = function (err) { this.unsubscribe(); - this.parent.error(err); }; - SubscriptionDelaySubscriber.prototype._complete = function () { - this.unsubscribe(); - this.subscribeToSource(); + SwitchMapSubscriber.prototype._unsubscribe = function () { + this.innerSubscription = null; }; - SubscriptionDelaySubscriber.prototype.subscribeToSource = function () { - if (!this.sourceSubscribed) { - this.sourceSubscribed = true; - this.unsubscribe(); - this.source.subscribe(this.parent); + SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { + var destination = this.destination; + destination.remove(innerSub); + this.innerSubscription = null; + if (this.isStopped) { + _super.prototype._complete.call(this); } }; - return SubscriptionDelaySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=delayWhen.js.map + SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + return SwitchMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=switchMap.js.map /***/ }), -/* 291 */ +/* 320 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(319); +/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ -function dematerialize() { - return function dematerializeOperatorFunction(source) { - return source.lift(new DeMaterializeOperator()); - }; +function switchMapTo(innerObservable, resultSelector) { + return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); } -var DeMaterializeOperator = /*@__PURE__*/ (function () { - function DeMaterializeOperator() { - } - DeMaterializeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DeMaterializeSubscriber(subscriber)); - }; - return DeMaterializeOperator; -}()); -var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); - function DeMaterializeSubscriber(destination) { - return _super.call(this, destination) || this; - } - DeMaterializeSubscriber.prototype._next = function (value) { - value.observe(this.destination); - }; - return DeMaterializeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=dematerialize.js.map +//# sourceMappingURL=switchMapTo.js.map /***/ }), -/* 292 */ +/* 321 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); /** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function distinct(keySelector, flushes) { - return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; +function takeUntil(notifier) { + return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; } -var DistinctOperator = /*@__PURE__*/ (function () { - function DistinctOperator(keySelector, flushes) { - this.keySelector = keySelector; - this.flushes = flushes; +var TakeUntilOperator = /*@__PURE__*/ (function () { + function TakeUntilOperator(notifier) { + this.notifier = notifier; } - DistinctOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); + TakeUntilOperator.prototype.call = function (subscriber, source) { + var takeUntilSubscriber = new TakeUntilSubscriber(subscriber); + var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(takeUntilSubscriber, this.notifier); + if (notifierSubscription && !takeUntilSubscriber.seenValue) { + takeUntilSubscriber.add(notifierSubscription); + return source.subscribe(takeUntilSubscriber); + } + return takeUntilSubscriber; }; - return DistinctOperator; + return TakeUntilOperator; }()); -var DistinctSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctSubscriber, _super); - function DistinctSubscriber(destination, keySelector, flushes) { +var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeUntilSubscriber, _super); + function TakeUntilSubscriber(destination) { var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.values = new Set(); - if (flushes) { - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, flushes)); - } + _this.seenValue = false; return _this; } - DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values.clear(); - }; - DistinctSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - DistinctSubscriber.prototype._next = function (value) { - if (this.keySelector) { - this._useKeySelector(value); - } - else { - this._finalizeNext(value, value); - } - }; - DistinctSubscriber.prototype._useKeySelector = function (value) { - var key; - var destination = this.destination; - try { - key = this.keySelector(value); - } - catch (err) { - destination.error(err); - return; - } - this._finalizeNext(key, value); + TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.seenValue = true; + this.complete(); }; - DistinctSubscriber.prototype._finalizeNext = function (key, value) { - var values = this.values; - if (!values.has(key)) { - values.add(key); - this.destination.next(value); - } + TakeUntilSubscriber.prototype.notifyComplete = function () { }; - return DistinctSubscriber; + return TakeUntilSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); - -//# sourceMappingURL=distinct.js.map +//# sourceMappingURL=takeUntil.js.map /***/ }), -/* 293 */ +/* 322 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function distinctUntilChanged(compare, keySelector) { - return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; +function takeWhile(predicate, inclusive) { + if (inclusive === void 0) { + inclusive = false; + } + return function (source) { + return source.lift(new TakeWhileOperator(predicate, inclusive)); + }; } -var DistinctUntilChangedOperator = /*@__PURE__*/ (function () { - function DistinctUntilChangedOperator(compare, keySelector) { - this.compare = compare; - this.keySelector = keySelector; +var TakeWhileOperator = /*@__PURE__*/ (function () { + function TakeWhileOperator(predicate, inclusive) { + this.predicate = predicate; + this.inclusive = inclusive; } - DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); + TakeWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive)); }; - return DistinctUntilChangedOperator; + return TakeWhileOperator; }()); -var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctUntilChangedSubscriber, _super); - function DistinctUntilChangedSubscriber(destination, compare, keySelector) { +var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeWhileSubscriber, _super); + function TakeWhileSubscriber(destination, predicate, inclusive) { var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.hasKey = false; - if (typeof compare === 'function') { - _this.compare = compare; - } + _this.predicate = predicate; + _this.inclusive = inclusive; + _this.index = 0; return _this; } - DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { - return x === y; - }; - DistinctUntilChangedSubscriber.prototype._next = function (value) { - var key; + TakeWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + var result; try { - var keySelector = this.keySelector; - key = keySelector ? keySelector(value) : value; + result = this.predicate(value, this.index++); } catch (err) { - return this.destination.error(err); + destination.error(err); + return; } - var result = false; - if (this.hasKey) { - try { - var compare = this.compare; - result = compare(this.key, key); - } - catch (err) { - return this.destination.error(err); - } + this.nextOrComplete(value, result); + }; + TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { + var destination = this.destination; + if (Boolean(predicateResult)) { + destination.next(value); } else { - this.hasKey = true; - } - if (!result) { - this.key = key; - this.destination.next(value); + if (this.inclusive) { + destination.next(value); + } + destination.complete(); } }; - return DistinctUntilChangedSubscriber; + return TakeWhileSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=distinctUntilChanged.js.map - - -/***/ }), -/* 294 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); -/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(293); -/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ - -function distinctUntilKeyChanged(key, compare) { - return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); -} -//# sourceMappingURL=distinctUntilKeyChanged.js.map +//# sourceMappingURL=takeWhile.js.map /***/ }), -/* 295 */ +/* 323 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(222); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(296); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(287); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(297); -/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ - - - - - -function elementAt(index, defaultValue) { - if (index < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); - } - var hasDefaultValue = arguments.length >= 2; - return function (source) { - return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue - ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) - : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); - }; -} -//# sourceMappingURL=elementAt.js.map - - -/***/ }), -/* 296 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(156); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(223); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ -function throwIfEmpty(errorFactory) { - if (errorFactory === void 0) { - errorFactory = defaultErrorFactory; - } - return function (source) { - return source.lift(new ThrowIfEmptyOperator(errorFactory)); +function tap(nextOrObserver, error, complete) { + return function tapOperatorFunction(source) { + return source.lift(new DoOperator(nextOrObserver, error, complete)); }; } -var ThrowIfEmptyOperator = /*@__PURE__*/ (function () { - function ThrowIfEmptyOperator(errorFactory) { - this.errorFactory = errorFactory; +var DoOperator = /*@__PURE__*/ (function () { + function DoOperator(nextOrObserver, error, complete) { + this.nextOrObserver = nextOrObserver; + this.error = error; + this.complete = complete; } - ThrowIfEmptyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory)); + DoOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); }; - return ThrowIfEmptyOperator; + return DoOperator; }()); -var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrowIfEmptySubscriber, _super); - function ThrowIfEmptySubscriber(destination, errorFactory) { +var TapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); + function TapSubscriber(destination, observerOrNext, error, complete) { var _this = _super.call(this, destination) || this; - _this.errorFactory = errorFactory; - _this.hasValue = false; + _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { + _this._context = _this; + _this._tapNext = observerOrNext; + } + else if (observerOrNext) { + _this._context = observerOrNext; + _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + } return _this; } - ThrowIfEmptySubscriber.prototype._next = function (value) { - this.hasValue = true; - this.destination.next(value); - }; - ThrowIfEmptySubscriber.prototype._complete = function () { - if (!this.hasValue) { - var err = void 0; - try { - err = this.errorFactory(); - } - catch (e) { - err = e; - } - this.destination.error(err); + TapSubscriber.prototype._next = function (value) { + try { + this._tapNext.call(this._context, value); } - else { - return this.destination.complete(); + catch (err) { + this.destination.error(err); + return; } + this.destination.next(value); }; - return ThrowIfEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -function defaultErrorFactory() { - return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); -} -//# sourceMappingURL=throwIfEmpty.js.map - - -/***/ }), -/* 297 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ - - - - -function take(count) { - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); + TapSubscriber.prototype._error = function (err) { + try { + this._tapError.call(this._context, err); } - else { - return source.lift(new TakeOperator(count)); + catch (err) { + this.destination.error(err); + return; } + this.destination.error(err); }; -} -var TakeOperator = /*@__PURE__*/ (function () { - function TakeOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + TapSubscriber.prototype._complete = function () { + try { + this._tapComplete.call(this._context); } - } - TakeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeSubscriber(subscriber, this.total)); - }; - return TakeOperator; -}()); -var TakeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeSubscriber, _super); - function TakeSubscriber(destination, total) { - var _this = _super.call(this, destination) || this; - _this.total = total; - _this.count = 0; - return _this; - } - TakeSubscriber.prototype._next = function (value) { - var total = this.total; - var count = ++this.count; - if (count <= total) { - this.destination.next(value); - if (count === total) { - this.destination.complete(); - this.unsubscribe(); - } + catch (err) { + this.destination.error(err); + return; } + return this.destination.complete(); }; - return TakeSubscriber; + return TapSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=take.js.map +//# sourceMappingURL=tap.js.map /***/ }), -/* 298 */ +/* 324 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); -/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); -/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ - - -function endWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; - } - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; -} -//# sourceMappingURL=endWith.js.map - - -/***/ }), -/* 299 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function every(predicate, thisArg) { - return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); }; +var defaultThrottleConfig = { + leading: true, + trailing: false +}; +function throttle(durationSelector, config) { + if (config === void 0) { + config = defaultThrottleConfig; + } + return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); }; } -var EveryOperator = /*@__PURE__*/ (function () { - function EveryOperator(predicate, thisArg, source) { - this.predicate = predicate; - this.thisArg = thisArg; - this.source = source; +var ThrottleOperator = /*@__PURE__*/ (function () { + function ThrottleOperator(durationSelector, leading, trailing) { + this.durationSelector = durationSelector; + this.leading = leading; + this.trailing = trailing; } - EveryOperator.prototype.call = function (observer, source) { - return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source)); + ThrottleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); }; - return EveryOperator; + return ThrottleOperator; }()); -var EverySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](EverySubscriber, _super); - function EverySubscriber(destination, predicate, thisArg, source) { +var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleSubscriber, _super); + function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.thisArg = thisArg; - _this.source = source; - _this.index = 0; - _this.thisArg = thisArg || _this; + _this.destination = destination; + _this.durationSelector = durationSelector; + _this._leading = _leading; + _this._trailing = _trailing; + _this._hasValue = false; return _this; } - EverySubscriber.prototype.notifyComplete = function (everyValueMatch) { - this.destination.next(everyValueMatch); - this.destination.complete(); + ThrottleSubscriber.prototype._next = function (value) { + this._hasValue = true; + this._sendValue = value; + if (!this._throttled) { + if (this._leading) { + this.send(); + } + else { + this.throttle(value); + } + } }; - EverySubscriber.prototype._next = function (value) { - var result = false; + ThrottleSubscriber.prototype.send = function () { + var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; + if (_hasValue) { + this.destination.next(_sendValue); + this.throttle(_sendValue); + } + this._hasValue = false; + this._sendValue = null; + }; + ThrottleSubscriber.prototype.throttle = function (value) { + var duration = this.tryDurationSelector(value); + if (!!duration) { + this.add(this._throttled = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration)); + } + }; + ThrottleSubscriber.prototype.tryDurationSelector = function (value) { try { - result = this.predicate.call(this.thisArg, value, this.index++, this.source); + return this.durationSelector(value); } catch (err) { this.destination.error(err); - return; + return null; } - if (!result) { - this.notifyComplete(false); + }; + ThrottleSubscriber.prototype.throttlingDone = function () { + var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; + if (_throttled) { + _throttled.unsubscribe(); + } + this._throttled = null; + if (_trailing) { + this.send(); } }; - EverySubscriber.prototype._complete = function () { - this.notifyComplete(true); + ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.throttlingDone(); }; - return EverySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=every.js.map + ThrottleSubscriber.prototype.notifyComplete = function () { + this.throttlingDone(); + }; + return ThrottleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=throttle.js.map /***/ }), -/* 300 */ +/* 325 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(324); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ -function exhaust() { - return function (source) { return source.lift(new SwitchFirstOperator()); }; + +function throttleTime(duration, scheduler, config) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + if (config === void 0) { + config = _throttle__WEBPACK_IMPORTED_MODULE_3__["defaultThrottleConfig"]; + } + return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); }; } -var SwitchFirstOperator = /*@__PURE__*/ (function () { - function SwitchFirstOperator() { +var ThrottleTimeOperator = /*@__PURE__*/ (function () { + function ThrottleTimeOperator(duration, scheduler, leading, trailing) { + this.duration = duration; + this.scheduler = scheduler; + this.leading = leading; + this.trailing = trailing; } - SwitchFirstOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchFirstSubscriber(subscriber)); + ThrottleTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); }; - return SwitchFirstOperator; + return ThrottleTimeOperator; }()); -var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchFirstSubscriber, _super); - function SwitchFirstSubscriber(destination) { +var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleTimeSubscriber, _super); + function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { var _this = _super.call(this, destination) || this; - _this.hasCompleted = false; - _this.hasSubscription = false; + _this.duration = duration; + _this.scheduler = scheduler; + _this.leading = leading; + _this.trailing = trailing; + _this._hasTrailingValue = false; + _this._trailingValue = null; return _this; } - SwitchFirstSubscriber.prototype._next = function (value) { - if (!this.hasSubscription) { - this.hasSubscription = true; - this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, value)); + ThrottleTimeSubscriber.prototype._next = function (value) { + if (this.throttled) { + if (this.trailing) { + this._trailingValue = value; + this._hasTrailingValue = true; + } + } + else { + this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); + if (this.leading) { + this.destination.next(value); + } + else if (this.trailing) { + this._trailingValue = value; + this._hasTrailingValue = true; + } } }; - SwitchFirstSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (!this.hasSubscription) { + ThrottleTimeSubscriber.prototype._complete = function () { + if (this._hasTrailingValue) { + this.destination.next(this._trailingValue); this.destination.complete(); } - }; - SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) { - this.remove(innerSub); - this.hasSubscription = false; - if (this.hasCompleted) { + else { this.destination.complete(); } }; - return SwitchFirstSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaust.js.map + ThrottleTimeSubscriber.prototype.clearThrottle = function () { + var throttled = this.throttled; + if (throttled) { + if (this.trailing && this._hasTrailingValue) { + this.destination.next(this._trailingValue); + this._trailingValue = null; + this._hasTrailingValue = false; + } + throttled.unsubscribe(); + this.remove(throttled); + this.throttled = null; + } + }; + return ThrottleTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNext(arg) { + var subscriber = arg.subscriber; + subscriber.clearThrottle(); +} +//# sourceMappingURL=throttleTime.js.map /***/ }), -/* 301 */ +/* 326 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(286); +/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(221); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(197); +/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ -function exhaustMap(project, resultSelector) { - if (resultSelector) { - return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; - } - return function (source) { - return source.lift(new ExhaustMapOperator(project)); +function timeInterval(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return function (source) { + return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { + return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { + var current = _a.current; + return ({ value: value, current: scheduler.now(), last: current }); + }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (_a) { + var current = _a.current, last = _a.last, value = _a.value; + return new TimeInterval(value, current - last); + })); + }); }; } -var ExhaustMapOperator = /*@__PURE__*/ (function () { - function ExhaustMapOperator(project) { - this.project = project; +var TimeInterval = /*@__PURE__*/ (function () { + function TimeInterval(value, interval) { + this.value = value; + this.interval = interval; } - ExhaustMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); - }; - return ExhaustMapOperator; + return TimeInterval; }()); -var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExhaustMapSubscriber, _super); - function ExhaustMapSubscriber(destination, project) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.hasSubscription = false; - _this.hasCompleted = false; - _this.index = 0; - return _this; - } - ExhaustMapSubscriber.prototype._next = function (value) { - if (!this.hasSubscription) { - this.tryNext(value); - } - }; - ExhaustMapSubscriber.prototype.tryNext = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (err) { - this.destination.error(err); - return; - } - this.hasSubscription = true; - this._innerSub(result, value, index); - }; - ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); - }; - ExhaustMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (!this.hasSubscription) { - this.destination.complete(); - } - this.unsubscribe(); - }; - ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - ExhaustMapSubscriber.prototype.notifyError = function (err) { - this.destination.error(err); - }; - ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) { - var destination = this.destination; - destination.remove(innerSub); - this.hasSubscription = false; - if (this.hasCompleted) { - this.destination.complete(); - } - }; - return ExhaustMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaustMap.js.map + +//# sourceMappingURL=timeInterval.js.map /***/ }), -/* 302 */ +/* 327 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(195); +/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(328); +/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(180); +/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ -function expand(project, concurrent, scheduler) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } + +function timeout(due, scheduler) { if (scheduler === void 0) { - scheduler = undefined; + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; } - concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; - return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); }; + return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); } -var ExpandOperator = /*@__PURE__*/ (function () { - function ExpandOperator(project, concurrent, scheduler) { - this.project = project; - this.concurrent = concurrent; - this.scheduler = scheduler; - } - ExpandOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); - }; - return ExpandOperator; -}()); - -var ExpandSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExpandSubscriber, _super); - function ExpandSubscriber(destination, project, concurrent, scheduler) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.concurrent = concurrent; - _this.scheduler = scheduler; - _this.index = 0; - _this.active = 0; - _this.hasCompleted = false; - if (concurrent < Number.POSITIVE_INFINITY) { - _this.buffer = []; - } - return _this; - } - ExpandSubscriber.dispatch = function (arg) { - var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; - subscriber.subscribeToProjection(result, value, index); - }; - ExpandSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (destination.closed) { - this._complete(); - return; - } - var index = this.index++; - if (this.active < this.concurrent) { - destination.next(value); - try { - var project = this.project; - var result = project(value, index); - if (!this.scheduler) { - this.subscribeToProjection(result, value, index); - } - else { - var state = { subscriber: this, result: result, value: value, index: index }; - var destination_1 = this.destination; - destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); - } - } - catch (e) { - destination.error(e); - } - } - else { - this.buffer.push(value); - } - }; - ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { - this.active++; - var destination = this.destination; - destination.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, result, value, index)); - }; - ExpandSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - this.unsubscribe(); - }; - ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this._next(innerValue); - }; - ExpandSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - var destination = this.destination; - destination.remove(innerSub); - this.active--; - if (buffer && buffer.length > 0) { - this._next(buffer.shift()); - } - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - }; - return ExpandSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); - -//# sourceMappingURL=expand.js.map +//# sourceMappingURL=timeout.js.map /***/ }), -/* 303 */ +/* 328 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ - - - -function finalize(callback) { - return function (source) { return source.lift(new FinallyOperator(callback)); }; -} -var FinallyOperator = /*@__PURE__*/ (function () { - function FinallyOperator(callback) { - this.callback = callback; - } - FinallyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FinallySubscriber(subscriber, this.callback)); - }; - return FinallyOperator; -}()); -var FinallySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); - function FinallySubscriber(destination, callback) { - var _this = _super.call(this, destination) || this; - _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); - return _this; - } - return FinallySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=finalize.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(260); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 304 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function find(predicate, thisArg) { - if (typeof predicate !== 'function') { - throw new TypeError('predicate is not a function'); +function timeoutWith(due, withObservable, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; } - return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); }; + return function (source) { + var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(due); + var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); + return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler)); + }; } -var FindValueOperator = /*@__PURE__*/ (function () { - function FindValueOperator(predicate, source, yieldIndex, thisArg) { - this.predicate = predicate; - this.source = source; - this.yieldIndex = yieldIndex; - this.thisArg = thisArg; +var TimeoutWithOperator = /*@__PURE__*/ (function () { + function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) { + this.waitFor = waitFor; + this.absoluteTimeout = absoluteTimeout; + this.withObservable = withObservable; + this.scheduler = scheduler; } - FindValueOperator.prototype.call = function (observer, source) { - return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); + TimeoutWithOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler)); }; - return FindValueOperator; + return TimeoutWithOperator; }()); - -var FindValueSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FindValueSubscriber, _super); - function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) { +var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TimeoutWithSubscriber, _super); + function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.source = source; - _this.yieldIndex = yieldIndex; - _this.thisArg = thisArg; - _this.index = 0; + _this.absoluteTimeout = absoluteTimeout; + _this.waitFor = waitFor; + _this.withObservable = withObservable; + _this.scheduler = scheduler; + _this.action = null; + _this.scheduleTimeout(); return _this; } - FindValueSubscriber.prototype.notifyComplete = function (value) { - var destination = this.destination; - destination.next(value); - destination.complete(); - this.unsubscribe(); + TimeoutWithSubscriber.dispatchTimeout = function (subscriber) { + var withObservable = subscriber.withObservable; + subscriber._unsubscribeAndRecycle(); + subscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(subscriber, withObservable)); }; - FindValueSubscriber.prototype._next = function (value) { - var _a = this, predicate = _a.predicate, thisArg = _a.thisArg; - var index = this.index++; - try { - var result = predicate.call(thisArg || this, value, index, this.source); - if (result) { - this.notifyComplete(this.yieldIndex ? index : value); - } + TimeoutWithSubscriber.prototype.scheduleTimeout = function () { + var action = this.action; + if (action) { + this.action = action.schedule(this, this.waitFor); } - catch (err) { - this.destination.error(err); + else { + this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this)); } }; - FindValueSubscriber.prototype._complete = function () { - this.notifyComplete(this.yieldIndex ? -1 : undefined); + TimeoutWithSubscriber.prototype._next = function (value) { + if (!this.absoluteTimeout) { + this.scheduleTimeout(); + } + _super.prototype._next.call(this, value); }; - return FindValueSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=find.js.map + TimeoutWithSubscriber.prototype._unsubscribe = function () { + this.action = null; + this.scheduler = null; + this.withObservable = null; + }; + return TimeoutWithSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=timeoutWith.js.map /***/ }), -/* 305 */ +/* 329 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); -/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(304); -/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(197); +/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ -function findIndex(predicate, thisArg) { - return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; + +function timestamp(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_map__WEBPACK_IMPORTED_MODULE_1__["map"])(function (value) { return new Timestamp(value, scheduler.now()); }); } -//# sourceMappingURL=findIndex.js.map +var Timestamp = /*@__PURE__*/ (function () { + function Timestamp(value, timestamp) { + this.value = value; + this.timestamp = timestamp; + } + return Timestamp; +}()); + +//# sourceMappingURL=timestamp.js.map /***/ }), -/* 306 */ +/* 330 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(223); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(297); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(287); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(296); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ - - - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(285); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ -function first(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +function toArrayReducer(arr, item, index) { + if (index === 0) { + return [item]; + } + arr.push(item); + return arr; } -//# sourceMappingURL=first.js.map +function toArray() { + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); +} +//# sourceMappingURL=toArray.js.map /***/ }), -/* 307 */ +/* 331 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function ignoreElements() { - return function ignoreElementsOperatorFunction(source) { - return source.lift(new IgnoreElementsOperator()); + + +function window(windowBoundaries) { + return function windowOperatorFunction(source) { + return source.lift(new WindowOperator(windowBoundaries)); }; } -var IgnoreElementsOperator = /*@__PURE__*/ (function () { - function IgnoreElementsOperator() { +var WindowOperator = /*@__PURE__*/ (function () { + function WindowOperator(windowBoundaries) { + this.windowBoundaries = windowBoundaries; } - IgnoreElementsOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new IgnoreElementsSubscriber(subscriber)); + WindowOperator.prototype.call = function (subscriber, source) { + var windowSubscriber = new WindowSubscriber(subscriber); + var sourceSubscription = source.subscribe(windowSubscriber); + if (!sourceSubscription.closed) { + windowSubscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); + } + return sourceSubscription; }; - return IgnoreElementsOperator; + return WindowOperator; }()); -var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); - function IgnoreElementsSubscriber() { - return _super !== null && _super.apply(this, arguments) || this; +var WindowSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); + function WindowSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + destination.next(_this.window); + return _this; } - IgnoreElementsSubscriber.prototype._next = function (unused) { + WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openWindow(); }; - return IgnoreElementsSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=ignoreElements.js.map - - -/***/ }), -/* 308 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function isEmpty() { - return function (source) { return source.lift(new IsEmptyOperator()); }; -} -var IsEmptyOperator = /*@__PURE__*/ (function () { - function IsEmptyOperator() { - } - IsEmptyOperator.prototype.call = function (observer, source) { - return source.subscribe(new IsEmptySubscriber(observer)); + WindowSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); }; - return IsEmptyOperator; -}()); -var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IsEmptySubscriber, _super); - function IsEmptySubscriber(destination) { - return _super.call(this, destination) || this; - } - IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) { - var destination = this.destination; - destination.next(isEmpty); - destination.complete(); + WindowSubscriber.prototype.notifyComplete = function (innerSub) { + this._complete(); }; - IsEmptySubscriber.prototype._next = function (value) { - this.notifyComplete(false); + WindowSubscriber.prototype._next = function (value) { + this.window.next(value); }; - IsEmptySubscriber.prototype._complete = function () { - this.notifyComplete(true); + WindowSubscriber.prototype._error = function (err) { + this.window.error(err); + this.destination.error(err); }; - return IsEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=isEmpty.js.map + WindowSubscriber.prototype._complete = function () { + this.window.complete(); + this.destination.complete(); + }; + WindowSubscriber.prototype._unsubscribe = function () { + this.window = null; + }; + WindowSubscriber.prototype.openWindow = function () { + var prevWindow = this.window; + if (prevWindow) { + prevWindow.complete(); + } + var destination = this.destination; + var newWindow = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + destination.next(newWindow); + }; + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=window.js.map /***/ }), -/* 309 */ +/* 332 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(223); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(310); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(296); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(287); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(158); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ -function last(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +function windowCount(windowSize, startWindowEvery) { + if (startWindowEvery === void 0) { + startWindowEvery = 0; + } + return function windowCountOperatorFunction(source) { + return source.lift(new WindowCountOperator(windowSize, startWindowEvery)); + }; } -//# sourceMappingURL=last.js.map - - -/***/ }), -/* 310 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ - - - - -function takeLast(count) { - return function takeLastOperatorFunction(source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); - } - else { - return source.lift(new TakeLastOperator(count)); - } - }; -} -var TakeLastOperator = /*@__PURE__*/ (function () { - function TakeLastOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; - } +var WindowCountOperator = /*@__PURE__*/ (function () { + function WindowCountOperator(windowSize, startWindowEvery) { + this.windowSize = windowSize; + this.startWindowEvery = startWindowEvery; } - TakeLastOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); + WindowCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery)); }; - return TakeLastOperator; + return WindowCountOperator; }()); -var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeLastSubscriber, _super); - function TakeLastSubscriber(destination, total) { +var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowCountSubscriber, _super); + function WindowCountSubscriber(destination, windowSize, startWindowEvery) { var _this = _super.call(this, destination) || this; - _this.total = total; - _this.ring = new Array(); + _this.destination = destination; + _this.windowSize = windowSize; + _this.startWindowEvery = startWindowEvery; + _this.windows = [new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"]()]; _this.count = 0; + destination.next(_this.windows[0]); return _this; } - TakeLastSubscriber.prototype._next = function (value) { - var ring = this.ring; - var total = this.total; - var count = this.count++; - if (ring.length < total) { - ring.push(value); + WindowCountSubscriber.prototype._next = function (value) { + var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize; + var destination = this.destination; + var windowSize = this.windowSize; + var windows = this.windows; + var len = windows.length; + for (var i = 0; i < len && !this.closed; i++) { + windows[i].next(value); } - else { - var index = count % total; - ring[index] = value; + var c = this.count - windowSize + 1; + if (c >= 0 && c % startWindowEvery === 0 && !this.closed) { + windows.shift().complete(); + } + if (++this.count % startWindowEvery === 0 && !this.closed) { + var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); + windows.push(window_1); + destination.next(window_1); } }; - TakeLastSubscriber.prototype._complete = function () { - var destination = this.destination; - var count = this.count; - if (count > 0) { - var total = this.count >= this.total ? this.total : this.count; - var ring = this.ring; - for (var i = 0; i < total; i++) { - var idx = (count++) % total; - destination.next(ring[idx]); + WindowCountSubscriber.prototype._error = function (err) { + var windows = this.windows; + if (windows) { + while (windows.length > 0 && !this.closed) { + windows.shift().error(err); } } - destination.complete(); - }; - return TakeLastSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeLast.js.map - - -/***/ }), -/* 311 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function mapTo(value) { - return function (source) { return source.lift(new MapToOperator(value)); }; -} -var MapToOperator = /*@__PURE__*/ (function () { - function MapToOperator(value) { - this.value = value; - } - MapToOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MapToSubscriber(subscriber, this.value)); - }; - return MapToOperator; -}()); -var MapToSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapToSubscriber, _super); - function MapToSubscriber(destination, value) { - var _this = _super.call(this, destination) || this; - _this.value = value; - return _this; - } - MapToSubscriber.prototype._next = function (x) { - this.destination.next(this.value); - }; - return MapToSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=mapTo.js.map - - -/***/ }), -/* 312 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ - - - -function materialize() { - return function materializeOperatorFunction(source) { - return source.lift(new MaterializeOperator()); - }; -} -var MaterializeOperator = /*@__PURE__*/ (function () { - function MaterializeOperator() { - } - MaterializeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MaterializeSubscriber(subscriber)); - }; - return MaterializeOperator; -}()); -var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); - function MaterializeSubscriber(destination) { - return _super.call(this, destination) || this; - } - MaterializeSubscriber.prototype._next = function (value) { - this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + this.destination.error(err); }; - MaterializeSubscriber.prototype._error = function (err) { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); - destination.complete(); + WindowCountSubscriber.prototype._complete = function () { + var windows = this.windows; + if (windows) { + while (windows.length > 0 && !this.closed) { + windows.shift().complete(); + } + } + this.destination.complete(); }; - MaterializeSubscriber.prototype._complete = function () { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); - destination.complete(); + WindowCountSubscriber.prototype._unsubscribe = function () { + this.count = 0; + this.windows = null; }; - return MaterializeSubscriber; + return WindowCountSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=materialize.js.map +//# sourceMappingURL=windowCount.js.map /***/ }), -/* 313 */ +/* 333 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(314); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ - -function max(comparer) { - var max = (typeof comparer === 'function') - ? function (x, y) { return comparer(x, y) > 0 ? x : y; } - : function (x, y) { return x > y ? x : y; }; - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); -} -//# sourceMappingURL=max.js.map - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(186); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(143); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(228); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(176); +/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -/***/ }), -/* 314 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(315); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(310); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(287); -/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(184); -/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ -function reduce(accumulator, seed) { - if (arguments.length >= 2) { - return function reduceOperatorFunctionWithSeed(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); - }; +function windowTime(windowTimeSpan) { + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + var windowCreationInterval = null; + var maxWindowSize = Number.POSITIVE_INFINITY; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { + scheduler = arguments[3]; } - return function reduceOperatorFunction(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); - }; -} -//# sourceMappingURL=reduce.js.map - - -/***/ }), -/* 315 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -function scan(accumulator, seed) { - var hasSeed = false; - if (arguments.length >= 2) { - hasSeed = true; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { + scheduler = arguments[2]; } - return function scanOperatorFunction(source) { - return source.lift(new ScanOperator(accumulator, seed, hasSeed)); + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { + maxWindowSize = arguments[2]; + } + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { + scheduler = arguments[1]; + } + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[1])) { + windowCreationInterval = arguments[1]; + } + return function windowTimeOperatorFunction(source) { + return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler)); }; } -var ScanOperator = /*@__PURE__*/ (function () { - function ScanOperator(accumulator, seed, hasSeed) { - if (hasSeed === void 0) { - hasSeed = false; - } - this.accumulator = accumulator; - this.seed = seed; - this.hasSeed = hasSeed; +var WindowTimeOperator = /*@__PURE__*/ (function () { + function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { + this.windowTimeSpan = windowTimeSpan; + this.windowCreationInterval = windowCreationInterval; + this.maxWindowSize = maxWindowSize; + this.scheduler = scheduler; } - ScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); + WindowTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler)); }; - return ScanOperator; + return WindowTimeOperator; }()); -var ScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ScanSubscriber, _super); - function ScanSubscriber(destination, accumulator, _seed, hasSeed) { - var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this._seed = _seed; - _this.hasSeed = hasSeed; - _this.index = 0; +var CountedSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountedSubject, _super); + function CountedSubject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._numberOfNextedValues = 0; return _this; } - Object.defineProperty(ScanSubscriber.prototype, "seed", { + CountedSubject.prototype.next = function (value) { + this._numberOfNextedValues++; + _super.prototype.next.call(this, value); + }; + Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", { get: function () { - return this._seed; - }, - set: function (value) { - this.hasSeed = true; - this._seed = value; + return this._numberOfNextedValues; }, enumerable: true, configurable: true }); - ScanSubscriber.prototype._next = function (value) { - if (!this.hasSeed) { - this.seed = value; - this.destination.next(value); + return CountedSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowTimeSubscriber, _super); + function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + _this.windowTimeSpan = windowTimeSpan; + _this.windowCreationInterval = windowCreationInterval; + _this.maxWindowSize = maxWindowSize; + _this.scheduler = scheduler; + _this.windows = []; + var window = _this.openWindow(); + if (windowCreationInterval !== null && windowCreationInterval >= 0) { + var closeState = { subscriber: _this, window: window, context: null }; + var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler }; + _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState)); + _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState)); } else { - return this._tryNext(value); + var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan }; + _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState)); + } + return _this; + } + WindowTimeSubscriber.prototype._next = function (value) { + var windows = this.windows; + var len = windows.length; + for (var i = 0; i < len; i++) { + var window_1 = windows[i]; + if (!window_1.closed) { + window_1.next(value); + if (window_1.numberOfNextedValues >= this.maxWindowSize) { + this.closeWindow(window_1); + } + } } }; - ScanSubscriber.prototype._tryNext = function (value) { - var index = this.index++; - var result; - try { - result = this.accumulator(this.seed, value, index); + WindowTimeSubscriber.prototype._error = function (err) { + var windows = this.windows; + while (windows.length > 0) { + windows.shift().error(err); } - catch (err) { - this.destination.error(err); + this.destination.error(err); + }; + WindowTimeSubscriber.prototype._complete = function () { + var windows = this.windows; + while (windows.length > 0) { + var window_2 = windows.shift(); + if (!window_2.closed) { + window_2.complete(); + } } - this.seed = result; - this.destination.next(result); + this.destination.complete(); }; - return ScanSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=scan.js.map - - -/***/ }), -/* 316 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); -/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(258); -/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ - -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; + WindowTimeSubscriber.prototype.openWindow = function () { + var window = new CountedSubject(); + this.windows.push(window); + var destination = this.destination; + destination.next(window); + return window; + }; + WindowTimeSubscriber.prototype.closeWindow = function (window) { + window.complete(); + var windows = this.windows; + windows.splice(windows.indexOf(window), 1); + }; + return WindowTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +function dispatchWindowTimeSpanOnly(state) { + var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window; + if (window) { + subscriber.closeWindow(window); } - return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; + state.window = subscriber.openWindow(); + this.schedule(state, windowTimeSpan); } -//# sourceMappingURL=merge.js.map - - -/***/ }), -/* 317 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ - -function mergeMapTo(innerObservable, resultSelector, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (typeof resultSelector === 'function') { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); - } - if (typeof resultSelector === 'number') { - concurrent = resultSelector; +function dispatchWindowCreation(state) { + var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval; + var window = subscriber.openWindow(); + var action = this; + var context = { action: action, subscription: null }; + var timeSpanState = { subscriber: subscriber, window: window, context: context }; + context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState); + action.add(context.subscription); + action.schedule(state, windowCreationInterval); +} +function dispatchWindowClose(state) { + var subscriber = state.subscriber, window = state.window, context = state.context; + if (context && context.action && context.subscription) { + context.action.remove(context.subscription); } - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); + subscriber.closeWindow(window); } -//# sourceMappingURL=mergeMapTo.js.map +//# sourceMappingURL=windowTime.js.map /***/ }), -/* 318 */ +/* 334 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(230); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); -/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(148); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function mergeScan(accumulator, seed, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); }; + +function windowToggle(openings, closingSelector) { + return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); }; } -var MergeScanOperator = /*@__PURE__*/ (function () { - function MergeScanOperator(accumulator, seed, concurrent) { - this.accumulator = accumulator; - this.seed = seed; - this.concurrent = concurrent; +var WindowToggleOperator = /*@__PURE__*/ (function () { + function WindowToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; } - MergeScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); + WindowToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector)); }; - return MergeScanOperator; + return WindowToggleOperator; }()); - -var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); - function MergeScanSubscriber(destination, accumulator, acc, concurrent) { +var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowToggleSubscriber, _super); + function WindowToggleSubscriber(destination, openings, closingSelector) { var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this.acc = acc; - _this.concurrent = concurrent; - _this.hasValue = false; - _this.hasCompleted = false; - _this.buffer = []; - _this.active = 0; - _this.index = 0; + _this.openings = openings; + _this.closingSelector = closingSelector; + _this.contexts = []; + _this.add(_this.openSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(_this, openings, openings)); return _this; } - MergeScanSubscriber.prototype._next = function (value) { - if (this.active < this.concurrent) { - var index = this.index++; - var destination = this.destination; - var ish = void 0; - try { - var accumulator = this.accumulator; - ish = accumulator(this.acc, value, index); + WindowToggleSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + if (contexts) { + var len = contexts.length; + for (var i = 0; i < len; i++) { + contexts[i].window.next(value); } - catch (e) { - return destination.error(e); - } - this.active++; - this._innerSub(ish, value, index); - } - else { - this.buffer.push(value); } }; - MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); - }; - MergeScanSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - if (this.hasValue === false) { - this.destination.next(this.acc); + WindowToggleSubscriber.prototype._error = function (err) { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_1 = contexts[index]; + context_1.window.error(err); + context_1.subscription.unsubscribe(); } - this.destination.complete(); } - this.unsubscribe(); - }; - MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var destination = this.destination; - this.acc = innerValue; - this.hasValue = true; - destination.next(innerValue); + _super.prototype._error.call(this, err); }; - MergeScanSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - var destination = this.destination; - destination.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); + WindowToggleSubscriber.prototype._complete = function () { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_2 = contexts[index]; + context_2.window.complete(); + context_2.subscription.unsubscribe(); + } } - else if (this.active === 0 && this.hasCompleted) { - if (this.hasValue === false) { - this.destination.next(this.acc); + _super.prototype._complete.call(this); + }; + WindowToggleSubscriber.prototype._unsubscribe = function () { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_3 = contexts[index]; + context_3.window.unsubscribe(); + context_3.subscription.unsubscribe(); } - this.destination.complete(); } }; - return MergeScanSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); - -//# sourceMappingURL=mergeScan.js.map - - -/***/ }), -/* 319 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(314); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ - -function min(comparer) { - var min = (typeof comparer === 'function') - ? function (x, y) { return comparer(x, y) < 0 ? x : y; } - : function (x, y) { return x < y ? x : y; }; - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); -} -//# sourceMappingURL=min.js.map - - -/***/ }), -/* 320 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); -/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); -/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ - -function multicast(subjectOrSubjectFactory, selector) { - return function multicastOperatorFunction(source) { - var subjectFactory; - if (typeof subjectOrSubjectFactory === 'function') { - subjectFactory = subjectOrSubjectFactory; + WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (outerValue === this.openings) { + var closingNotifier = void 0; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(innerValue); + } + catch (e) { + return this.error(e); + } + var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); + var context_4 = { window: window_1, subscription: subscription }; + this.contexts.push(context_4); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, closingNotifier, context_4); + if (innerSubscription.closed) { + this.closeWindow(this.contexts.length - 1); + } + else { + innerSubscription.context = context_4; + subscription.add(innerSubscription); + } + this.destination.next(window_1); } else { - subjectFactory = function subjectFactory() { - return subjectOrSubjectFactory; - }; + this.closeWindow(this.contexts.indexOf(outerValue)); } - if (typeof selector === 'function') { - return source.lift(new MulticastOperator(subjectFactory, selector)); + }; + WindowToggleSubscriber.prototype.notifyError = function (err) { + this.error(err); + }; + WindowToggleSubscriber.prototype.notifyComplete = function (inner) { + if (inner !== this.openSubscription) { + this.closeWindow(this.contexts.indexOf(inner.context)); } - var connectable = Object.create(source, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); - connectable.source = source; - connectable.subjectFactory = subjectFactory; - return connectable; }; -} -var MulticastOperator = /*@__PURE__*/ (function () { - function MulticastOperator(subjectFactory, selector) { - this.subjectFactory = subjectFactory; - this.selector = selector; - } - MulticastOperator.prototype.call = function (subscriber, source) { - var selector = this.selector; - var subject = this.subjectFactory(); - var subscription = selector(subject).subscribe(subscriber); - subscription.add(source.subscribe(subject)); - return subscription; + WindowToggleSubscriber.prototype.closeWindow = function (index) { + if (index === -1) { + return; + } + var contexts = this.contexts; + var context = contexts[index]; + var window = context.window, subscription = context.subscription; + contexts.splice(index, 1); + window.complete(); + subscription.unsubscribe(); }; - return MulticastOperator; -}()); - -//# sourceMappingURL=multicast.js.map + return WindowToggleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=windowToggle.js.map /***/ }), -/* 321 */ +/* 335 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(158); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function onErrorResumeNext() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; -} -function onErrorResumeNextStatic() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - var source = null; - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - source = nextSources.shift(); - return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(source, null).lift(new OnErrorResumeNextOperator(nextSources)); +function windowWhen(closingSelector) { + return function windowWhenOperatorFunction(source) { + return source.lift(new WindowOperator(closingSelector)); + }; } -var OnErrorResumeNextOperator = /*@__PURE__*/ (function () { - function OnErrorResumeNextOperator(nextSources) { - this.nextSources = nextSources; +var WindowOperator = /*@__PURE__*/ (function () { + function WindowOperator(closingSelector) { + this.closingSelector = closingSelector; } - OnErrorResumeNextOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources)); + WindowOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector)); }; - return OnErrorResumeNextOperator; + return WindowOperator; }()); -var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); - function OnErrorResumeNextSubscriber(destination, nextSources) { +var WindowSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); + function WindowSubscriber(destination, closingSelector) { var _this = _super.call(this, destination) || this; _this.destination = destination; - _this.nextSources = nextSources; + _this.closingSelector = closingSelector; + _this.openWindow(); return _this; } - OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { - this.subscribeToNextSource(); + WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openWindow(innerSub); }; - OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { - this.subscribeToNextSource(); + WindowSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); }; - OnErrorResumeNextSubscriber.prototype._error = function (err) { - this.subscribeToNextSource(); - this.unsubscribe(); + WindowSubscriber.prototype.notifyComplete = function (innerSub) { + this.openWindow(innerSub); }; - OnErrorResumeNextSubscriber.prototype._complete = function () { - this.subscribeToNextSource(); - this.unsubscribe(); + WindowSubscriber.prototype._next = function (value) { + this.window.next(value); }; - OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { - var next = this.nextSources.shift(); - if (!!next) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); + WindowSubscriber.prototype._error = function (err) { + this.window.error(err); + this.destination.error(err); + this.unsubscribeClosingNotification(); + }; + WindowSubscriber.prototype._complete = function () { + this.window.complete(); + this.destination.complete(); + this.unsubscribeClosingNotification(); + }; + WindowSubscriber.prototype.unsubscribeClosingNotification = function () { + if (this.closingNotification) { + this.closingNotification.unsubscribe(); } - else { - this.destination.complete(); + }; + WindowSubscriber.prototype.openWindow = function (innerSub) { + if (innerSub === void 0) { + innerSub = null; + } + if (innerSub) { + this.remove(innerSub); + innerSub.unsubscribe(); + } + var prevWindow = this.window; + if (prevWindow) { + prevWindow.complete(); + } + var window = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + this.destination.next(window); + var closingNotifier; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(); + } + catch (e) { + this.destination.error(e); + this.window.error(e); + return; } + this.add(this.closingNotification = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); }; - return OnErrorResumeNextSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=onErrorResumeNext.js.map + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=windowWhen.js.map /***/ }), -/* 322 */ +/* 336 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(201); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function pairwise() { - return function (source) { return source.lift(new PairwiseOperator()); }; + +function withLatestFrom() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return function (source) { + var project; + if (typeof args[args.length - 1] === 'function') { + project = args.pop(); + } + var observables = args; + return source.lift(new WithLatestFromOperator(observables, project)); + }; } -var PairwiseOperator = /*@__PURE__*/ (function () { - function PairwiseOperator() { +var WithLatestFromOperator = /*@__PURE__*/ (function () { + function WithLatestFromOperator(observables, project) { + this.observables = observables; + this.project = project; } - PairwiseOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new PairwiseSubscriber(subscriber)); + WithLatestFromOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); }; - return PairwiseOperator; + return WithLatestFromOperator; }()); -var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](PairwiseSubscriber, _super); - function PairwiseSubscriber(destination) { +var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WithLatestFromSubscriber, _super); + function WithLatestFromSubscriber(destination, observables, project) { var _this = _super.call(this, destination) || this; - _this.hasPrev = false; + _this.observables = observables; + _this.project = project; + _this.toRespond = []; + var len = observables.length; + _this.values = new Array(len); + for (var i = 0; i < len; i++) { + _this.toRespond.push(i); + } + for (var i = 0; i < len; i++) { + var observable = observables[i]; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, observable, observable, i)); + } return _this; } - PairwiseSubscriber.prototype._next = function (value) { - var pair; - if (this.hasPrev) { - pair = [this.prev, value]; - } - else { - this.hasPrev = true; + WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values[outerIndex] = innerValue; + var toRespond = this.toRespond; + if (toRespond.length > 0) { + var found = toRespond.indexOf(outerIndex); + if (found !== -1) { + toRespond.splice(found, 1); + } } - this.prev = value; - if (pair) { - this.destination.next(pair); + }; + WithLatestFromSubscriber.prototype.notifyComplete = function () { + }; + WithLatestFromSubscriber.prototype._next = function (value) { + if (this.toRespond.length === 0) { + var args = [value].concat(this.values); + if (this.project) { + this._tryProject(args); + } + else { + this.destination.next(args); + } } }; - return PairwiseSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=pairwise.js.map - - -/***/ }), -/* 323 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); -/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(263); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); -/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ - - -function partition(predicate, thisArg) { - return function (source) { - return [ - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) - ]; + WithLatestFromSubscriber.prototype._tryProject = function (args) { + var result; + try { + result = this.project.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); }; -} -//# sourceMappingURL=partition.js.map + return WithLatestFromSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=withLatestFrom.js.map /***/ }), -/* 324 */ +/* 337 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(226); -/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(240); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -function pluck() { - var properties = []; +function zip() { + var observables = []; for (var _i = 0; _i < arguments.length; _i++) { - properties[_i] = arguments[_i]; - } - var length = properties.length; - if (length === 0) { - throw new Error('list of properties cannot be empty.'); + observables[_i] = arguments[_i]; } - return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])(plucker(properties, length))(source); }; -} -function plucker(props, length) { - var mapper = function (x) { - var currentProp = x; - for (var i = 0; i < length; i++) { - var p = currentProp[props[i]]; - if (typeof p !== 'undefined') { - currentProp = p; - } - else { - return undefined; - } - } - return currentProp; + return function zipOperatorFunction(source) { + return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); }; - return mapper; } -//# sourceMappingURL=pluck.js.map +//# sourceMappingURL=zip.js.map /***/ }), -/* 325 */ +/* 338 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(187); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(240); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -function publish(selector) { - return selector ? - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); +function zipAll(project) { + return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; } -//# sourceMappingURL=publish.js.map +//# sourceMappingURL=zipAll.js.map /***/ }), -/* 326 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 339 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); -/* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(192); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ - -function publishBehavior(value) { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; -} -//# sourceMappingURL=publishBehavior.js.map +const callbacks = new Set(); +let called = false; -/***/ }), -/* 327 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +function exit(exit, signal) { + if (called) { + return; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ + called = true; + for (const callback of callbacks) { + callback(); + } -function publishLast() { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; + if (exit === true) { + process.exit(128 + signal); // eslint-disable-line unicorn/no-process-exit + } } -//# sourceMappingURL=publishLast.js.map +module.exports = callback => { + callbacks.add(callback); -/***/ }), -/* 328 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); -/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); -/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ + if (callbacks.size === 1) { + process.once('exit', exit); + process.once('SIGINT', exit.bind(null, true, 2)); + process.once('SIGTERM', exit.bind(null, true, 15)); + // PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because + // explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit + // event cannot support async handlers, since the event loop is never called after it. + process.on('message', message => { + if (message === 'shutdown') { + exit(true, -128); + } + }); + } -function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { - if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { - scheduler = selectorOrScheduler; - } - var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; - var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; -} -//# sourceMappingURL=publishReplay.js.map + return () => { + callbacks.delete(callback); + }; +}; /***/ }), -/* 329 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 340 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ - -function race() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function raceOperatorFunction(source) { - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0]; - } - return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); - }; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const $isCliError = Symbol('isCliError'); +function createCliError(message) { + const error = new Error(message); + error[$isCliError] = true; + return error; } -//# sourceMappingURL=race.js.map +exports.createCliError = createCliError; +function isCliError(error) { + return error && !!error[$isCliError]; +} +exports.isCliError = isCliError; /***/ }), -/* 330 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 341 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); -/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ - - -function repeat(count) { - if (count === void 0) { - count = -1; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const execa_1 = tslib_1.__importDefault(__webpack_require__(342)); +const fs_1 = __webpack_require__(349); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +const chalk_1 = tslib_1.__importDefault(__webpack_require__(386)); +const tree_kill_1 = tslib_1.__importDefault(__webpack_require__(396)); +const util_1 = __webpack_require__(397); +const treeKillAsync = util_1.promisify((...args) => tree_kill_1.default(...args)); +const observe_lines_1 = __webpack_require__(398); +const errors_1 = __webpack_require__(340); +const SECOND = 1000; +const STOP_TIMEOUT = 30 * SECOND; +async function withTimeout(attempt, ms, onTimeout) { + const TIMEOUT = Symbol('timeout'); + try { + await Promise.race([ + attempt(), + new Promise((_, reject) => setTimeout(() => reject(TIMEOUT), ms)), + ]); } - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); - } - else if (count < 0) { - return source.lift(new RepeatOperator(-1, source)); + catch (error) { + if (error === TIMEOUT) { + await onTimeout(); } else { - return source.lift(new RepeatOperator(count - 1, source)); + throw error; } - }; -} -var RepeatOperator = /*@__PURE__*/ (function () { - function RepeatOperator(count, source) { - this.count = count; - this.source = source; } - RepeatOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); - }; - return RepeatOperator; -}()); -var RepeatSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatSubscriber, _super); - function RepeatSubscriber(destination, count, source) { - var _this = _super.call(this, destination) || this; - _this.count = count; - _this.source = source; - return _this; +} +function startProc(name, options, log) { + const { cmd, args, cwd, env, stdin } = options; + log.info('[%s] > %s', name, cmd, args.join(' ')); + // spawn fails with ENOENT when either the + // cmd or cwd don't exist, so we check for the cwd + // ahead of time so that the error is less ambiguous + try { + if (!fs_1.statSync(cwd).isDirectory()) { + throw new Error(`cwd "${cwd}" exists but is not a directory`); + } } - RepeatSubscriber.prototype.complete = function () { - if (!this.isStopped) { - var _a = this, source = _a.source, count = _a.count; - if (count === 0) { - return _super.prototype.complete.call(this); - } - else if (count > -1) { - this.count = count - 1; - } - source.subscribe(this._unsubscribeAndRecycle()); + catch (err) { + if (err.code === 'ENOENT') { + throw new Error(`cwd "${cwd}" does not exist`); } - }; - return RepeatSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=repeat.js.map - - -/***/ }), -/* 331 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - - -function repeatWhen(notifier) { - return function (source) { return source.lift(new RepeatWhenOperator(notifier)); }; -} -var RepeatWhenOperator = /*@__PURE__*/ (function () { - function RepeatWhenOperator(notifier) { - this.notifier = notifier; } - RepeatWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source)); - }; - return RepeatWhenOperator; -}()); -var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatWhenSubscriber, _super); - function RepeatWhenSubscriber(destination, notifier, source) { - var _this = _super.call(this, destination) || this; - _this.notifier = notifier; - _this.source = source; - _this.sourceIsBeingSubscribedTo = true; - return _this; + const childProcess = execa_1.default(cmd, args, { + cwd, + env, + stdio: ['pipe', 'pipe', 'pipe'], + preferLocal: true, + }); + if (stdin) { + childProcess.stdin.end(stdin, 'utf8'); } - RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.sourceIsBeingSubscribedTo = true; - this.source.subscribe(this); - }; - RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) { - if (this.sourceIsBeingSubscribedTo === false) { - return _super.prototype.complete.call(this); - } - }; - RepeatWhenSubscriber.prototype.complete = function () { - this.sourceIsBeingSubscribedTo = false; - if (!this.isStopped) { - if (!this.retries) { - this.subscribeToRetries(); - } - if (!this.retriesSubscription || this.retriesSubscription.closed) { - return _super.prototype.complete.call(this); - } - this._unsubscribeAndRecycle(); - this.notifications.next(); - } - }; - RepeatWhenSubscriber.prototype._unsubscribe = function () { - var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription; - if (notifications) { - notifications.unsubscribe(); - this.notifications = null; - } - if (retriesSubscription) { - retriesSubscription.unsubscribe(); - this.retriesSubscription = null; + else { + childProcess.stdin.end(); + } + let stopCalled = false; + const outcome$ = Rx.race( + // observe first exit event + Rx.fromEvent(childProcess, 'exit').pipe(operators_1.take(1), operators_1.map(([code]) => { + if (stopCalled) { + return null; } - this.retries = null; - }; - RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () { - var _unsubscribe = this._unsubscribe; - this._unsubscribe = null; - _super.prototype._unsubscribeAndRecycle.call(this); - this._unsubscribe = _unsubscribe; - return this; - }; - RepeatWhenSubscriber.prototype.subscribeToRetries = function () { - this.notifications = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - var retries; - try { - var notifier = this.notifier; - retries = notifier(this.notifications); + // JVM exits with 143 on SIGTERM and 130 on SIGINT, dont' treat then as errors + if (code > 0 && !(code === 143 || code === 130)) { + throw errors_1.createCliError(`[${name}] exited with code ${code}`); } - catch (e) { - return _super.prototype.complete.call(this); + return code; + })), + // observe first error event + Rx.fromEvent(childProcess, 'error').pipe(operators_1.take(1), operators_1.mergeMap((err) => Rx.throwError(err)))).pipe(operators_1.share()); + const lines$ = Rx.merge(observe_lines_1.observeLines(childProcess.stdout), observe_lines_1.observeLines(childProcess.stderr)).pipe(operators_1.tap((line) => log.write(` ${chalk_1.default.gray('proc')} [${chalk_1.default.gray(name)}] ${line}`)), operators_1.share()); + const outcomePromise = Rx.merge(lines$.pipe(operators_1.ignoreElements()), outcome$).toPromise(); + async function stop(signal) { + if (stopCalled) { + return; } - this.retries = retries; - this.retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); + stopCalled = true; + await withTimeout(async () => { + log.debug(`Sending "${signal}" to proc "${name}"`); + await treeKillAsync(childProcess.pid, signal); + await outcomePromise; + }, STOP_TIMEOUT, async () => { + log.warning(`Proc "${name}" was sent "${signal}" didn't emit the "exit" or "error" events after ${STOP_TIMEOUT} ms, sending SIGKILL`); + await treeKillAsync(childProcess.pid, 'SIGKILL'); + }); + await withTimeout(async () => { + try { + await outcomePromise; + } + catch (error) { + // ignore + } + }, STOP_TIMEOUT, async () => { + throw new Error(`Proc "${name}" was stopped but never emitted either the "exit" or "error" event after ${STOP_TIMEOUT} ms`); + }); + } + return { + name, + lines$, + outcome$, + outcomePromise, + stop, }; - return RepeatWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=repeatWhen.js.map +} +exports.startProc = startProc; /***/ }), -/* 332 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 342 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +const path = __webpack_require__(4); +const childProcess = __webpack_require__(343); +const crossSpawn = __webpack_require__(344); +const stripFinalNewline = __webpack_require__(358); +const npmRunPath = __webpack_require__(359); +const onetime = __webpack_require__(360); +const makeError = __webpack_require__(362); +const normalizeStdio = __webpack_require__(368); +const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(369); +const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(374); +const {mergePromise, getSpawnedPromise} = __webpack_require__(384); +const {joinCommand, parseCommand} = __webpack_require__(385); -function retry(count) { - if (count === void 0) { - count = -1; - } - return function (source) { return source.lift(new RetryOperator(count, source)); }; -} -var RetryOperator = /*@__PURE__*/ (function () { - function RetryOperator(count, source) { - this.count = count; - this.source = source; - } - RetryOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source)); - }; - return RetryOperator; -}()); -var RetrySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetrySubscriber, _super); - function RetrySubscriber(destination, count, source) { - var _this = _super.call(this, destination) || this; - _this.count = count; - _this.source = source; - return _this; - } - RetrySubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var _a = this, source = _a.source, count = _a.count; - if (count === 0) { - return _super.prototype.error.call(this, err); - } - else if (count > -1) { - this.count = count - 1; - } - source.subscribe(this._unsubscribeAndRecycle()); - } - }; - return RetrySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=retry.js.map +const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; +const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { + const env = extendEnv ? {...process.env, ...envOption} : envOption; -/***/ }), -/* 333 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (preferLocal) { + return npmRunPath.env({env, cwd: localDir, execPath}); + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + return env; +}; +const handleArgs = (file, args, options = {}) => { + const parsed = crossSpawn._parse(file, args, options); + file = parsed.command; + args = parsed.args; + options = parsed.options; + options = { + maxBuffer: DEFAULT_MAX_BUFFER, + buffer: true, + stripFinalNewline: true, + extendEnv: true, + preferLocal: false, + localDir: options.cwd || process.cwd(), + execPath: process.execPath, + encoding: 'utf8', + reject: true, + cleanup: true, + all: false, + windowsHide: true, + ...options + }; + options.env = getEnv(options); -function retryWhen(notifier) { - return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); }; -} -var RetryWhenOperator = /*@__PURE__*/ (function () { - function RetryWhenOperator(notifier, source) { - this.notifier = notifier; - this.source = source; - } - RetryWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source)); - }; - return RetryWhenOperator; -}()); -var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetryWhenSubscriber, _super); - function RetryWhenSubscriber(destination, notifier, source) { - var _this = _super.call(this, destination) || this; - _this.notifier = notifier; - _this.source = source; - return _this; - } - RetryWhenSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var errors = this.errors; - var retries = this.retries; - var retriesSubscription = this.retriesSubscription; - if (!retries) { - errors = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - try { - var notifier = this.notifier; - retries = notifier(errors); - } - catch (e) { - return _super.prototype.error.call(this, e); - } - retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); - } - else { - this.errors = null; - this.retriesSubscription = null; - } - this._unsubscribeAndRecycle(); - this.errors = errors; - this.retries = retries; - this.retriesSubscription = retriesSubscription; - errors.next(err); - } - }; - RetryWhenSubscriber.prototype._unsubscribe = function () { - var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription; - if (errors) { - errors.unsubscribe(); - this.errors = null; - } - if (retriesSubscription) { - retriesSubscription.unsubscribe(); - this.retriesSubscription = null; - } - this.retries = null; - }; - RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var _unsubscribe = this._unsubscribe; - this._unsubscribe = null; - this._unsubscribeAndRecycle(); - this._unsubscribe = _unsubscribe; - this.source.subscribe(this); - }; - return RetryWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=retryWhen.js.map + options.stdio = normalizeStdio(options); + if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { + // #116 + args.unshift('/q'); + } -/***/ }), -/* 334 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + return {file, args, options, parsed}; +}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +const handleOutput = (options, value, error) => { + if (typeof value !== 'string' && !Buffer.isBuffer(value)) { + // When `execa.sync()` errors, we normalize it to '' to mimic `execa()` + return error === undefined ? undefined : ''; + } + if (options.stripFinalNewline) { + return stripFinalNewline(value); + } + return value; +}; -function sample(notifier) { - return function (source) { return source.lift(new SampleOperator(notifier)); }; -} -var SampleOperator = /*@__PURE__*/ (function () { - function SampleOperator(notifier) { - this.notifier = notifier; - } - SampleOperator.prototype.call = function (subscriber, source) { - var sampleSubscriber = new SampleSubscriber(subscriber); - var subscription = source.subscribe(sampleSubscriber); - subscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); - return subscription; - }; - return SampleOperator; -}()); -var SampleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleSubscriber, _super); - function SampleSubscriber() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.hasValue = false; - return _this; - } - SampleSubscriber.prototype._next = function (value) { - this.value = value; - this.hasValue = true; - }; - SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.emitValue(); - }; - SampleSubscriber.prototype.notifyComplete = function () { - this.emitValue(); - }; - SampleSubscriber.prototype.emitValue = function () { - if (this.hasValue) { - this.hasValue = false; - this.destination.next(this.value); - } - }; - return SampleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=sample.js.map +const execa = (file, args, options) => { + const parsed = handleArgs(file, args, options); + const command = joinCommand(file, args); + let spawned; + try { + spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); + } catch (error) { + // Ensure the returned error is always both a promise and a child process + const dummySpawned = new childProcess.ChildProcess(); + const errorPromise = Promise.reject(makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + parsed, + timedOut: false, + isCanceled: false, + killed: false + })); + return mergePromise(dummySpawned, errorPromise); + } -/***/ }), -/* 335 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const spawnedPromise = getSpawnedPromise(spawned); + const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); + const processDone = setExitHandler(spawned, parsed.options, timedPromise); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ + const context = {isCanceled: false}; + spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); + spawned.cancel = spawnedCancel.bind(null, spawned, context); + const handlePromise = async () => { + const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); + const stdout = handleOutput(parsed.options, stdoutResult); + const stderr = handleOutput(parsed.options, stderrResult); + const all = handleOutput(parsed.options, allResult); -function sampleTime(period, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); }; -} -var SampleTimeOperator = /*@__PURE__*/ (function () { - function SampleTimeOperator(period, scheduler) { - this.period = period; - this.scheduler = scheduler; - } - SampleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler)); - }; - return SampleTimeOperator; -}()); -var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleTimeSubscriber, _super); - function SampleTimeSubscriber(destination, period, scheduler) { - var _this = _super.call(this, destination) || this; - _this.period = period; - _this.scheduler = scheduler; - _this.hasValue = false; - _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period })); - return _this; - } - SampleTimeSubscriber.prototype._next = function (value) { - this.lastValue = value; - this.hasValue = true; - }; - SampleTimeSubscriber.prototype.notifyNext = function () { - if (this.hasValue) { - this.hasValue = false; - this.destination.next(this.lastValue); - } - }; - return SampleTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNotification(state) { - var subscriber = state.subscriber, period = state.period; - subscriber.notifyNext(); - this.schedule(state, period); -} -//# sourceMappingURL=sampleTime.js.map + if (error || exitCode !== 0 || signal !== null) { + const returnedError = makeError({ + error, + exitCode, + signal, + stdout, + stderr, + all, + command, + parsed, + timedOut, + isCanceled: context.isCanceled, + killed: spawned.killed + }); + if (!parsed.options.reject) { + return returnedError; + } -/***/ }), -/* 336 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + throw returnedError; + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + return { + command, + exitCode: 0, + stdout, + stderr, + all, + failed: false, + timedOut: false, + isCanceled: false, + killed: false + }; + }; + const handlePromiseOnce = onetime(handlePromise); -function sequenceEqual(compareTo, comparator) { - return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); }; -} -var SequenceEqualOperator = /*@__PURE__*/ (function () { - function SequenceEqualOperator(compareTo, comparator) { - this.compareTo = compareTo; - this.comparator = comparator; - } - SequenceEqualOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator)); - }; - return SequenceEqualOperator; -}()); + crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); -var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualSubscriber, _super); - function SequenceEqualSubscriber(destination, compareTo, comparator) { - var _this = _super.call(this, destination) || this; - _this.compareTo = compareTo; - _this.comparator = comparator; - _this._a = []; - _this._b = []; - _this._oneComplete = false; - _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this))); - return _this; - } - SequenceEqualSubscriber.prototype._next = function (value) { - if (this._oneComplete && this._b.length === 0) { - this.emit(false); - } - else { - this._a.push(value); - this.checkValues(); - } - }; - SequenceEqualSubscriber.prototype._complete = function () { - if (this._oneComplete) { - this.emit(this._a.length === 0 && this._b.length === 0); - } - else { - this._oneComplete = true; - } - this.unsubscribe(); - }; - SequenceEqualSubscriber.prototype.checkValues = function () { - var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator; - while (_a.length > 0 && _b.length > 0) { - var a = _a.shift(); - var b = _b.shift(); - var areEqual = false; - try { - areEqual = comparator ? comparator(a, b) : a === b; - } - catch (e) { - this.destination.error(e); - } - if (!areEqual) { - this.emit(false); - } - } - }; - SequenceEqualSubscriber.prototype.emit = function (value) { - var destination = this.destination; - destination.next(value); - destination.complete(); - }; - SequenceEqualSubscriber.prototype.nextB = function (value) { - if (this._oneComplete && this._a.length === 0) { - this.emit(false); - } - else { - this._b.push(value); - this.checkValues(); - } - }; - SequenceEqualSubscriber.prototype.completeB = function () { - if (this._oneComplete) { - this.emit(this._a.length === 0 && this._b.length === 0); - } - else { - this._oneComplete = true; - } - }; - return SequenceEqualSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); + handleInput(spawned, parsed.options.input); -var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualCompareToSubscriber, _super); - function SequenceEqualCompareToSubscriber(destination, parent) { - var _this = _super.call(this, destination) || this; - _this.parent = parent; - return _this; - } - SequenceEqualCompareToSubscriber.prototype._next = function (value) { - this.parent.nextB(value); - }; - SequenceEqualCompareToSubscriber.prototype._error = function (err) { - this.parent.error(err); - this.unsubscribe(); - }; - SequenceEqualCompareToSubscriber.prototype._complete = function () { - this.parent.completeB(); - this.unsubscribe(); - }; - return SequenceEqualCompareToSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=sequenceEqual.js.map + spawned.all = makeAllStream(spawned, parsed.options); + return mergePromise(spawned, handlePromiseOnce); +}; -/***/ }), -/* 337 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +module.exports = execa; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(320); -/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(190); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(187); -/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ +module.exports.sync = (file, args, options) => { + const parsed = handleArgs(file, args, options); + const command = joinCommand(file, args); + + validateInputSync(parsed.options); + + let result; + try { + result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); + } catch (error) { + throw makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + parsed, + timedOut: false, + isCanceled: false, + killed: false + }); + } + + const stdout = handleOutput(parsed.options, result.stdout, result.error); + const stderr = handleOutput(parsed.options, result.stderr, result.error); + if (result.error || result.status !== 0 || result.signal !== null) { + const error = makeError({ + stdout, + stderr, + error: result.error, + signal: result.signal, + exitCode: result.status, + command, + parsed, + timedOut: result.error && result.error.code === 'ETIMEDOUT', + isCanceled: false, + killed: result.signal !== null + }); + if (!parsed.options.reject) { + return error; + } -function shareSubjectFactory() { - return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); -} -function share() { - return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; -} -//# sourceMappingURL=share.js.map + throw error; + } + + return { + command, + exitCode: 0, + stdout, + stderr, + failed: false, + timedOut: false, + isCanceled: false, + killed: false + }; +}; + +module.exports.command = (command, options) => { + const [file, ...args] = parseCommand(command); + return execa(file, args, options); +}; + +module.exports.commandSync = (command, options) => { + const [file, ...args] = parseCommand(command); + return execa.sync(file, args, options); +}; + +module.exports.node = (scriptPath, args, options = {}) => { + if (args && !Array.isArray(args) && typeof args === 'object') { + options = args; + args = []; + } + + const stdio = normalizeStdio.node(options); + + const {nodePath = process.execPath, nodeOptions = process.execArgv} = options; + + return execa( + nodePath, + [ + ...nodeOptions, + scriptPath, + ...(Array.isArray(args) ? args : []) + ], + { + ...options, + stdin: undefined, + stdout: undefined, + stderr: undefined, + stdio, + shell: false + } + ); +}; /***/ }), -/* 338 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 343 */ +/***/ (function(module, exports) { + +module.exports = require("child_process"); + +/***/ }), +/* 344 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); -/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ -function shareReplay(configOrBufferSize, windowTime, scheduler) { - var config; - if (configOrBufferSize && typeof configOrBufferSize === 'object') { - config = configOrBufferSize; - } - else { - config = { - bufferSize: configOrBufferSize, - windowTime: windowTime, - refCount: false, - scheduler: scheduler - }; - } - return function (source) { return source.lift(shareReplayOperator(config)); }; + +const cp = __webpack_require__(343); +const parse = __webpack_require__(345); +const enoent = __webpack_require__(357); + +function spawn(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); + + // Spawn the child process + const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); + + // Hook into child process "exit" event to emit an error if the command + // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + enoent.hookChildProcess(spawned, parsed); + + return spawned; } -function shareReplayOperator(_a) { - var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler; - var subject; - var refCount = 0; - var subscription; - var hasError = false; - var isComplete = false; - return function shareReplayOperation(source) { - refCount++; - if (!subject || hasError) { - hasError = false; - subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); - subscription = source.subscribe({ - next: function (value) { subject.next(value); }, - error: function (err) { - hasError = true; - subject.error(err); - }, - complete: function () { - isComplete = true; - subject.complete(); - }, - }); - } - var innerSub = subject.subscribe(this); - this.add(function () { - refCount--; - innerSub.unsubscribe(); - if (subscription && !isComplete && useRefCount && refCount === 0) { - subscription.unsubscribe(); - subscription = undefined; - subject = undefined; - } - }); - }; + +function spawnSync(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); + + // Spawn the child process + const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); + + // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); + + return result; } -//# sourceMappingURL=shareReplay.js.map + +module.exports = spawn; +module.exports.spawn = spawn; +module.exports.sync = spawnSync; + +module.exports._parse = parse; +module.exports._enoent = enoent; /***/ }), -/* 339 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 345 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(223); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ +const path = __webpack_require__(4); +const resolveCommand = __webpack_require__(346); +const escape = __webpack_require__(353); +const readShebang = __webpack_require__(354); -function single(predicate) { - return function (source) { return source.lift(new SingleOperator(predicate, source)); }; +const isWin = process.platform === 'win32'; +const isExecutableRegExp = /\.(?:com|exe)$/i; +const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + +function detectShebang(parsed) { + parsed.file = resolveCommand(parsed); + + const shebang = parsed.file && readShebang(parsed.file); + + if (shebang) { + parsed.args.unshift(parsed.file); + parsed.command = shebang; + + return resolveCommand(parsed); + } + + return parsed.file; } -var SingleOperator = /*@__PURE__*/ (function () { - function SingleOperator(predicate, source) { - this.predicate = predicate; - this.source = source; + +function parseNonShell(parsed) { + if (!isWin) { + return parsed; } - SingleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source)); - }; - return SingleOperator; -}()); -var SingleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SingleSubscriber, _super); - function SingleSubscriber(destination, predicate, source) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.source = source; - _this.seenValue = false; - _this.index = 0; - return _this; - } - SingleSubscriber.prototype.applySingleValue = function (value) { - if (this.seenValue) { - this.destination.error('Sequence contains more than one element'); - } - else { - this.seenValue = true; - this.singleValue = value; - } - }; - SingleSubscriber.prototype._next = function (value) { - var index = this.index++; - if (this.predicate) { - this.tryNext(value, index); - } - else { - this.applySingleValue(value); - } - }; - SingleSubscriber.prototype.tryNext = function (value, index) { - try { - if (this.predicate(value, index, this.source)) { - this.applySingleValue(value); - } - } - catch (err) { - this.destination.error(err); - } - }; - SingleSubscriber.prototype._complete = function () { - var destination = this.destination; - if (this.index > 0) { - destination.next(this.seenValue ? this.singleValue : undefined); - destination.complete(); - } - else { - destination.error(new _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); - } - }; - return SingleSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=single.js.map + // Detect & add support for shebangs + const commandFile = detectShebang(parsed); -/***/ }), -/* 340 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // We don't need a shell if the command filename is an executable + const needsShell = !isExecutableRegExp.test(commandFile); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + // If a shell is required, use cmd.exe and take care of escaping everything correctly + // Note that `forceShell` is an hidden option used only in tests + if (parsed.options.forceShell || needsShell) { + // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` + // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument + // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, + // we need to double escape them + const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); + // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) + // This is necessary otherwise it will always fail with ENOENT in those cases + parsed.command = path.normalize(parsed.command); -function skip(count) { - return function (source) { return source.lift(new SkipOperator(count)); }; -} -var SkipOperator = /*@__PURE__*/ (function () { - function SkipOperator(total) { - this.total = total; + // Escape command & arguments + parsed.command = escape.command(parsed.command); + parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); + + const shellCommand = [parsed.command].concat(parsed.args).join(' '); + + parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; + parsed.command = process.env.comspec || 'cmd.exe'; + parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped } - SkipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipSubscriber(subscriber, this.total)); - }; - return SkipOperator; -}()); -var SkipSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipSubscriber, _super); - function SkipSubscriber(destination, total) { - var _this = _super.call(this, destination) || this; - _this.total = total; - _this.count = 0; - return _this; + + return parsed; +} + +function parse(command, args, options) { + // Normalize arguments, similar to nodejs + if (args && !Array.isArray(args)) { + options = args; + args = null; } - SkipSubscriber.prototype._next = function (x) { - if (++this.count > this.total) { - this.destination.next(x); - } + + args = args ? args.slice(0) : []; // Clone array to avoid changing the original + options = Object.assign({}, options); // Clone object to avoid changing the original + + // Build our parsed object + const parsed = { + command, + args, + options, + file: undefined, + original: { + command, + args, + }, }; - return SkipSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skip.js.map + + // Delegate further parsing to shell or non-shell + return options.shell ? parsed : parseNonShell(parsed); +} + +module.exports = parse; /***/ }), -/* 341 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 346 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ +const path = __webpack_require__(4); +const which = __webpack_require__(347); +const pathKey = __webpack_require__(352)(); -function skipLast(count) { - return function (source) { return source.lift(new SkipLastOperator(count)); }; -} -var SkipLastOperator = /*@__PURE__*/ (function () { - function SkipLastOperator(_skipCount) { - this._skipCount = _skipCount; - if (this._skipCount < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; +function resolveCommandAttempt(parsed, withoutPathExt) { + const cwd = process.cwd(); + const hasCustomCwd = parsed.options.cwd != null; + // Worker threads do not have process.chdir() + const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined; + + // If a custom `cwd` was specified, we need to change the process cwd + // because `which` will do stat calls but does not support a custom cwd + if (shouldSwitchCwd) { + try { + process.chdir(parsed.options.cwd); + } catch (err) { + /* Empty */ } } - SkipLastOperator.prototype.call = function (subscriber, source) { - if (this._skipCount === 0) { - return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); - } - else { - return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); + + let resolved; + + try { + resolved = which.sync(parsed.command, { + path: (parsed.options.env || process.env)[pathKey], + pathExt: withoutPathExt ? path.delimiter : undefined, + }); + } catch (e) { + /* Empty */ + } finally { + if (shouldSwitchCwd) { + process.chdir(cwd); } - }; - return SkipLastOperator; -}()); -var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipLastSubscriber, _super); - function SkipLastSubscriber(destination, _skipCount) { - var _this = _super.call(this, destination) || this; - _this._skipCount = _skipCount; - _this._count = 0; - _this._ring = new Array(_skipCount); - return _this; } - SkipLastSubscriber.prototype._next = function (value) { - var skipCount = this._skipCount; - var count = this._count++; - if (count < skipCount) { - this._ring[count] = value; - } - else { - var currentIndex = count % skipCount; - var ring = this._ring; - var oldValue = ring[currentIndex]; - ring[currentIndex] = value; - this.destination.next(oldValue); - } - }; - return SkipLastSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipLast.js.map + // If we successfully resolved, ensure that an absolute path is returned + // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it + if (resolved) { + resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); + } -/***/ }), -/* 342 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + return resolved; +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +function resolveCommand(parsed) { + return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +} +module.exports = resolveCommand; +/***/ }), +/* 347 */ +/***/ (function(module, exports, __webpack_require__) { -function skipUntil(notifier) { - return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; -} -var SkipUntilOperator = /*@__PURE__*/ (function () { - function SkipUntilOperator(notifier) { - this.notifier = notifier; - } - SkipUntilOperator.prototype.call = function (destination, source) { - return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); - }; - return SkipUntilOperator; -}()); -var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); - function SkipUntilSubscriber(destination, notifier) { - var _this = _super.call(this, destination) || this; - _this.hasValue = false; - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); - _this.add(innerSubscriber); - _this.innerSubscription = innerSubscriber; - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(_this, notifier, undefined, undefined, innerSubscriber); - return _this; - } - SkipUntilSubscriber.prototype._next = function (value) { - if (this.hasValue) { - _super.prototype._next.call(this, value); - } - }; - SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.hasValue = true; - if (this.innerSubscription) { - this.innerSubscription.unsubscribe(); - } - }; - SkipUntilSubscriber.prototype.notifyComplete = function () { - }; - return SkipUntilSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=skipUntil.js.map +const isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys' +const path = __webpack_require__(4) +const COLON = isWindows ? ';' : ':' +const isexe = __webpack_require__(348) -/***/ }), -/* 343 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +const getNotFoundError = (cmd) => + Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +const getPathInfo = (cmd, opt) => { + const colon = opt.colon || COLON + + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] + : ( + [ + // windows always checks the cwd first + ...(isWindows ? [process.cwd()] : []), + ...(opt.path || process.env.PATH || + /* istanbul ignore next: very unusual */ '').split(colon), + ] + ) + const pathExtExe = isWindows + ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' + : '' + const pathExt = isWindows ? pathExtExe.split(colon) : [''] + if (isWindows) { + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift('') + } -function skipWhile(predicate) { - return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; + return { + pathEnv, + pathExt, + pathExtExe, + } } -var SkipWhileOperator = /*@__PURE__*/ (function () { - function SkipWhileOperator(predicate) { - this.predicate = predicate; - } - SkipWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); - }; - return SkipWhileOperator; -}()); -var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipWhileSubscriber, _super); - function SkipWhileSubscriber(destination, predicate) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.skipping = true; - _this.index = 0; - return _this; - } - SkipWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (this.skipping) { - this.tryCallPredicate(value); - } - if (!this.skipping) { - destination.next(value); - } - }; - SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { - try { - var result = this.predicate(value, this.index++); - this.skipping = Boolean(result); - } - catch (err) { - this.destination.error(err); - } - }; - return SkipWhileSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipWhile.js.map +const which = (cmd, opt, cb) => { + if (typeof opt === 'function') { + cb = opt + opt = {} + } + if (!opt) + opt = {} -/***/ }), -/* 344 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); -/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ + const step = i => new Promise((resolve, reject) => { + if (i === pathEnv.length) + return opt.all && found.length ? resolve(found) + : reject(getNotFoundError(cmd)) + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw -function startWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; - } - var scheduler = array[array.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { - array.pop(); - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; - } - else { - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; - } + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd + + resolve(subStep(p, i, 0)) + }) + + const subStep = (p, i, ii) => new Promise((resolve, reject) => { + if (ii === pathExt.length) + return resolve(step(i + 1)) + const ext = pathExt[ii] + isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { + if (!er && is) { + if (opt.all) + found.push(p + ext) + else + return resolve(p + ext) + } + return resolve(subStep(p, i, ii + 1)) + }) + }) + + return cb ? step(0).then(res => cb(null, res), cb) : step(0) } -//# sourceMappingURL=startWith.js.map +const whichSync = (cmd, opt) => { + opt = opt || {} -/***/ }), -/* 345 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); -/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(346); -/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ + for (let i = 0; i < pathEnv.length; i ++) { + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw -function subscribeOn(scheduler, delay) { - if (delay === void 0) { - delay = 0; + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd + + for (let j = 0; j < pathExt.length; j ++) { + const cur = p + pathExt[j] + try { + const is = isexe.sync(cur, { pathExt: pathExtExe }) + if (is) { + if (opt.all) + found.push(cur) + else + return cur + } + } catch (ex) {} } - return function subscribeOnOperatorFunction(source) { - return source.lift(new SubscribeOnOperator(scheduler, delay)); - }; + } + + if (opt.all && found.length) + return found + + if (opt.nothrow) + return null + + throw getNotFoundError(cmd) } -var SubscribeOnOperator = /*@__PURE__*/ (function () { - function SubscribeOnOperator(scheduler, delay) { - this.scheduler = scheduler; - this.delay = delay; - } - SubscribeOnOperator.prototype.call = function (subscriber, source) { - return new _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); - }; - return SubscribeOnOperator; -}()); -//# sourceMappingURL=subscribeOn.js.map + +module.exports = which +which.sync = whichSync /***/ }), -/* 346 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 348 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); -/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(211); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(257); -/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ +var fs = __webpack_require__(349) +var core +if (process.platform === 'win32' || global.TESTING_WINDOWS) { + core = __webpack_require__(350) +} else { + core = __webpack_require__(351) +} +module.exports = isexe +isexe.sync = sync +function isexe (path, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + if (!cb) { + if (typeof Promise !== 'function') { + throw new TypeError('callback not provided') + } -var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); - function SubscribeOnObservable(source, delayTime, scheduler) { - if (delayTime === void 0) { - delayTime = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; - } - var _this = _super.call(this) || this; - _this.source = source; - _this.delayTime = delayTime; - _this.scheduler = scheduler; - if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { - _this.delayTime = 0; - } - if (!scheduler || typeof scheduler.schedule !== 'function') { - _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + return new Promise(function (resolve, reject) { + isexe(path, options || {}, function (er, is) { + if (er) { + reject(er) + } else { + resolve(is) } - return _this; - } - SubscribeOnObservable.create = function (source, delay, scheduler) { - if (delay === void 0) { - delay = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; - } - return new SubscribeOnObservable(source, delay, scheduler); - }; - SubscribeOnObservable.dispatch = function (arg) { - var source = arg.source, subscriber = arg.subscriber; - return this.add(source.subscribe(subscriber)); - }; - SubscribeOnObservable.prototype._subscribe = function (subscriber) { - var delay = this.delayTime; - var source = this.source; - var scheduler = this.scheduler; - return scheduler.schedule(SubscribeOnObservable.dispatch, delay, { - source: source, subscriber: subscriber - }); - }; - return SubscribeOnObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); + }) + }) + } -//# sourceMappingURL=SubscribeOnObservable.js.map + core(path, options || {}, function (er, is) { + // ignore EACCES because that just means we aren't allowed to run it + if (er) { + if (er.code === 'EACCES' || options && options.ignoreErrors) { + er = null + is = false + } + } + cb(er, is) + }) +} + +function sync (path, options) { + // my kingdom for a filtered catch + try { + return core.sync(path, options || {}) + } catch (er) { + if (options && options.ignoreErrors || er.code === 'EACCES') { + return false + } else { + throw er + } + } +} /***/ }), -/* 347 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 349 */ +/***/ (function(module, exports) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(348); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); -/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ +module.exports = require("fs"); +/***/ }), +/* 350 */ +/***/ (function(module, exports, __webpack_require__) { -function switchAll() { - return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); +module.exports = isexe +isexe.sync = sync + +var fs = __webpack_require__(349) + +function checkPathExt (path, options) { + var pathext = options.pathExt !== undefined ? + options.pathExt : process.env.PATHEXT + + if (!pathext) { + return true + } + + pathext = pathext.split(';') + if (pathext.indexOf('') !== -1) { + return true + } + for (var i = 0; i < pathext.length; i++) { + var p = pathext[i].toLowerCase() + if (p && path.substr(-p.length).toLowerCase() === p) { + return true + } + } + return false +} + +function checkStat (stat, path, options) { + if (!stat.isSymbolicLink() && !stat.isFile()) { + return false + } + return checkPathExt(path, options) +} + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, path, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), path, options) } -//# sourceMappingURL=switchAll.js.map /***/ }), -/* 348 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 351 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ +module.exports = isexe +isexe.sync = sync + +var fs = __webpack_require__(349) + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), options) +} +function checkStat (stat, options) { + return stat.isFile() && checkMode(stat, options) +} +function checkMode (stat, options) { + var mod = stat.mode + var uid = stat.uid + var gid = stat.gid + var myUid = options.uid !== undefined ? + options.uid : process.getuid && process.getuid() + var myGid = options.gid !== undefined ? + options.gid : process.getgid && process.getgid() + var u = parseInt('100', 8) + var g = parseInt('010', 8) + var o = parseInt('001', 8) + var ug = u | g + var ret = (mod & o) || + (mod & g) && gid === myGid || + (mod & u) && uid === myUid || + (mod & ug) && myUid === 0 -function switchMap(project, resultSelector) { - if (typeof resultSelector === 'function') { - return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; - } - return function (source) { return source.lift(new SwitchMapOperator(project)); }; + return ret } -var SwitchMapOperator = /*@__PURE__*/ (function () { - function SwitchMapOperator(project) { - this.project = project; - } - SwitchMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); - }; - return SwitchMapOperator; -}()); -var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchMapSubscriber, _super); - function SwitchMapSubscriber(destination, project) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.index = 0; - return _this; - } - SwitchMapSubscriber.prototype._next = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (error) { - this.destination.error(error); - return; - } - this._innerSub(result, value, index); - }; - SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscription = this.innerSubscription; - if (innerSubscription) { - innerSubscription.unsubscribe(); - } - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); - }; - SwitchMapSubscriber.prototype._complete = function () { - var innerSubscription = this.innerSubscription; - if (!innerSubscription || innerSubscription.closed) { - _super.prototype._complete.call(this); - } - this.unsubscribe(); - }; - SwitchMapSubscriber.prototype._unsubscribe = function () { - this.innerSubscription = null; - }; - SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { - var destination = this.destination; - destination.remove(innerSub); - this.innerSubscription = null; - if (this.isStopped) { - _super.prototype._complete.call(this); - } - }; - SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - return SwitchMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=switchMap.js.map /***/ }), -/* 349 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 352 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(348); -/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ -function switchMapTo(innerObservable, resultSelector) { - return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); -} -//# sourceMappingURL=switchMapTo.js.map + +const pathKey = (options = {}) => { + const environment = options.env || process.env; + const platform = options.platform || process.platform; + + if (platform !== 'win32') { + return 'PATH'; + } + + return Object.keys(environment).find(key => key.toUpperCase() === 'PATH') || 'Path'; +}; + +module.exports = pathKey; +// TODO: Remove this for the next major release +module.exports.default = pathKey; /***/ }), -/* 350 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 353 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +// See http://www.robvanderwoude.com/escapechars.php +const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; -function takeUntil(notifier) { - return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; +function escapeCommand(arg) { + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + return arg; } -var TakeUntilOperator = /*@__PURE__*/ (function () { - function TakeUntilOperator(notifier) { - this.notifier = notifier; - } - TakeUntilOperator.prototype.call = function (subscriber, source) { - var takeUntilSubscriber = new TakeUntilSubscriber(subscriber); - var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(takeUntilSubscriber, this.notifier); - if (notifierSubscription && !takeUntilSubscriber.seenValue) { - takeUntilSubscriber.add(notifierSubscription); - return source.subscribe(takeUntilSubscriber); - } - return takeUntilSubscriber; - }; - return TakeUntilOperator; -}()); -var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeUntilSubscriber, _super); - function TakeUntilSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.seenValue = false; - return _this; - } - TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.seenValue = true; - this.complete(); - }; - TakeUntilSubscriber.prototype.notifyComplete = function () { - }; - return TakeUntilSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=takeUntil.js.map +function escapeArgument(arg, doubleEscapeMetaChars) { + // Convert to string + arg = `${arg}`; -/***/ }), -/* 351 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // Algorithm below is based on https://qntm.org/cmd -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + // Sequence of backslashes followed by a double quote: + // double up all the backslashes and escape the double quote + arg = arg.replace(/(\\*)"/g, '$1$1\\"'); + + // Sequence of backslashes followed by the end of the string + // (which will become a double quote later): + // double up all the backslashes + arg = arg.replace(/(\\*)$/, '$1$1'); + // All other backslashes occur literally -function takeWhile(predicate, inclusive) { - if (inclusive === void 0) { - inclusive = false; + // Quote the whole thing: + arg = `"${arg}"`; + + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + // Double escape meta chars if necessary + if (doubleEscapeMetaChars) { + arg = arg.replace(metaCharsRegExp, '^$1'); } - return function (source) { - return source.lift(new TakeWhileOperator(predicate, inclusive)); - }; + + return arg; } -var TakeWhileOperator = /*@__PURE__*/ (function () { - function TakeWhileOperator(predicate, inclusive) { - this.predicate = predicate; - this.inclusive = inclusive; - } - TakeWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive)); - }; - return TakeWhileOperator; -}()); -var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeWhileSubscriber, _super); - function TakeWhileSubscriber(destination, predicate, inclusive) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.inclusive = inclusive; - _this.index = 0; - return _this; - } - TakeWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - var result; - try { - result = this.predicate(value, this.index++); - } - catch (err) { - destination.error(err); - return; - } - this.nextOrComplete(value, result); - }; - TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { - var destination = this.destination; - if (Boolean(predicateResult)) { - destination.next(value); - } - else { - if (this.inclusive) { - destination.next(value); - } - destination.complete(); - } - }; - return TakeWhileSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeWhile.js.map + +module.exports.command = escapeCommand; +module.exports.argument = escapeArgument; /***/ }), -/* 352 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 354 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(185); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(173); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ +const fs = __webpack_require__(349); +const shebangCommand = __webpack_require__(355); + +function readShebang(command) { + // Read the first 150 bytes from the file + const size = 150; + const buffer = Buffer.alloc(size); + + let fd; + try { + fd = fs.openSync(command, 'r'); + fs.readSync(fd, buffer, 0, size, 0); + fs.closeSync(fd); + } catch (e) { /* Empty */ } -function tap(nextOrObserver, error, complete) { - return function tapOperatorFunction(source) { - return source.lift(new DoOperator(nextOrObserver, error, complete)); - }; + // Attempt to extract shebang (null is returned if not a shebang) + return shebangCommand(buffer.toString()); } -var DoOperator = /*@__PURE__*/ (function () { - function DoOperator(nextOrObserver, error, complete) { - this.nextOrObserver = nextOrObserver; - this.error = error; - this.complete = complete; - } - DoOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); - }; - return DoOperator; -}()); -var TapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); - function TapSubscriber(destination, observerOrNext, error, complete) { - var _this = _super.call(this, destination) || this; - _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { - _this._context = _this; - _this._tapNext = observerOrNext; - } - else if (observerOrNext) { - _this._context = observerOrNext; - _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - } - return _this; - } - TapSubscriber.prototype._next = function (value) { - try { - this._tapNext.call(this._context, value); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(value); - }; - TapSubscriber.prototype._error = function (err) { - try { - this._tapError.call(this._context, err); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.error(err); - }; - TapSubscriber.prototype._complete = function () { - try { - this._tapComplete.call(this._context); - } - catch (err) { - this.destination.error(err); - return; - } - return this.destination.complete(); - }; - return TapSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=tap.js.map + +module.exports = readShebang; /***/ }), -/* 353 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 355 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +const shebangRegex = __webpack_require__(356); +module.exports = (string = '') => { + const match = string.match(shebangRegex); -var defaultThrottleConfig = { - leading: true, - trailing: false + if (!match) { + return null; + } + + const [path, argument] = match[0].replace(/#! ?/, '').split(' '); + const binary = path.split('/').pop(); + + if (binary === 'env') { + return argument; + } + + return argument ? `${binary} ${argument}` : binary; }; -function throttle(durationSelector, config) { - if (config === void 0) { - config = defaultThrottleConfig; - } - return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); }; -} -var ThrottleOperator = /*@__PURE__*/ (function () { - function ThrottleOperator(durationSelector, leading, trailing) { - this.durationSelector = durationSelector; - this.leading = leading; - this.trailing = trailing; - } - ThrottleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); - }; - return ThrottleOperator; -}()); -var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleSubscriber, _super); - function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.durationSelector = durationSelector; - _this._leading = _leading; - _this._trailing = _trailing; - _this._hasValue = false; - return _this; - } - ThrottleSubscriber.prototype._next = function (value) { - this._hasValue = true; - this._sendValue = value; - if (!this._throttled) { - if (this._leading) { - this.send(); - } - else { - this.throttle(value); - } - } - }; - ThrottleSubscriber.prototype.send = function () { - var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; - if (_hasValue) { - this.destination.next(_sendValue); - this.throttle(_sendValue); - } - this._hasValue = false; - this._sendValue = null; - }; - ThrottleSubscriber.prototype.throttle = function (value) { - var duration = this.tryDurationSelector(value); - if (!!duration) { - this.add(this._throttled = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration)); - } - }; - ThrottleSubscriber.prototype.tryDurationSelector = function (value) { - try { - return this.durationSelector(value); - } - catch (err) { - this.destination.error(err); - return null; - } - }; - ThrottleSubscriber.prototype.throttlingDone = function () { - var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; - if (_throttled) { - _throttled.unsubscribe(); - } - this._throttled = null; - if (_trailing) { - this.send(); - } - }; - ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.throttlingDone(); - }; - ThrottleSubscriber.prototype.notifyComplete = function () { - this.throttlingDone(); - }; - return ThrottleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=throttle.js.map /***/ }), -/* 354 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 356 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(353); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ +module.exports = /^#!(.*)/; +/***/ }), +/* 357 */ +/***/ (function(module, exports, __webpack_require__) { -function throttleTime(duration, scheduler, config) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - if (config === void 0) { - config = _throttle__WEBPACK_IMPORTED_MODULE_3__["defaultThrottleConfig"]; - } - return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); }; +"use strict"; + + +const isWin = process.platform === 'win32'; + +function notFoundError(original, syscall) { + return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { + code: 'ENOENT', + errno: 'ENOENT', + syscall: `${syscall} ${original.command}`, + path: original.command, + spawnargs: original.args, + }); } -var ThrottleTimeOperator = /*@__PURE__*/ (function () { - function ThrottleTimeOperator(duration, scheduler, leading, trailing) { - this.duration = duration; - this.scheduler = scheduler; - this.leading = leading; - this.trailing = trailing; - } - ThrottleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); - }; - return ThrottleTimeOperator; -}()); -var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleTimeSubscriber, _super); - function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { - var _this = _super.call(this, destination) || this; - _this.duration = duration; - _this.scheduler = scheduler; - _this.leading = leading; - _this.trailing = trailing; - _this._hasTrailingValue = false; - _this._trailingValue = null; - return _this; + +function hookChildProcess(cp, parsed) { + if (!isWin) { + return; } - ThrottleTimeSubscriber.prototype._next = function (value) { - if (this.throttled) { - if (this.trailing) { - this._trailingValue = value; - this._hasTrailingValue = true; - } - } - else { - this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); - if (this.leading) { - this.destination.next(value); - } - else if (this.trailing) { - this._trailingValue = value; - this._hasTrailingValue = true; - } - } - }; - ThrottleTimeSubscriber.prototype._complete = function () { - if (this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this.destination.complete(); - } - else { - this.destination.complete(); - } - }; - ThrottleTimeSubscriber.prototype.clearThrottle = function () { - var throttled = this.throttled; - if (throttled) { - if (this.trailing && this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this._trailingValue = null; - this._hasTrailingValue = false; + + const originalEmit = cp.emit; + + cp.emit = function (name, arg1) { + // If emitting "exit" event and exit code is 1, we need to check if + // the command exists and emit an "error" instead + // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 + if (name === 'exit') { + const err = verifyENOENT(arg1, parsed, 'spawn'); + + if (err) { + return originalEmit.call(cp, 'error', err); } - throttled.unsubscribe(); - this.remove(throttled); - this.throttled = null; } + + return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params }; - return ThrottleTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(arg) { - var subscriber = arg.subscriber; - subscriber.clearThrottle(); } -//# sourceMappingURL=throttleTime.js.map + +function verifyENOENT(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawn'); + } + + return null; +} + +function verifyENOENTSync(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawnSync'); + } + + return null; +} + +module.exports = { + hookChildProcess, + verifyENOENT, + verifyENOENTSync, + notFoundError, +}; /***/ }), -/* 355 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 358 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(315); -/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(250); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); -/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ +module.exports = input => { + const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); + const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); + if (input[input.length - 1] === LF) { + input = input.slice(0, input.length - 1); + } -function timeInterval(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return function (source) { - return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { - return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { - var current = _a.current; - return ({ value: value, current: scheduler.now(), last: current }); - }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (_a) { - var current = _a.current, last = _a.last, value = _a.value; - return new TimeInterval(value, current - last); - })); - }); - }; -} -var TimeInterval = /*@__PURE__*/ (function () { - function TimeInterval(value, interval) { - this.value = value; - this.interval = interval; - } - return TimeInterval; -}()); + if (input[input.length - 1] === CR) { + input = input.slice(0, input.length - 1); + } -//# sourceMappingURL=timeInterval.js.map + return input; +}; /***/ }), -/* 356 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 359 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(224); -/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(357); -/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(209); -/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ - +const path = __webpack_require__(4); +const pathKey = __webpack_require__(352); +const npmRunPath = options => { + options = { + cwd: process.cwd(), + path: process.env[pathKey()], + execPath: process.execPath, + ...options + }; -function timeout(due, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); -} -//# sourceMappingURL=timeout.js.map + let previous; + let cwdPath = path.resolve(options.cwd); + const result = []; + while (previous !== cwdPath) { + result.push(path.join(cwdPath, 'node_modules/.bin')); + previous = cwdPath; + cwdPath = path.resolve(cwdPath, '..'); + } -/***/ }), -/* 357 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + // Ensure the running `node` binary is used + const execPathDir = path.resolve(options.cwd, options.execPath, '..'); + result.push(execPathDir); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(289); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + return result.concat(options.path).join(path.delimiter); +}; +module.exports = npmRunPath; +// TODO: Remove this for the next major release +module.exports.default = npmRunPath; +module.exports.env = options => { + options = { + env: process.env, + ...options + }; + const env = {...options.env}; + const path = pathKey({env}); + options.path = env[path]; + env[path] = module.exports(options); -function timeoutWith(due, withObservable, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return function (source) { - var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(due); - var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); - return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler)); - }; -} -var TimeoutWithOperator = /*@__PURE__*/ (function () { - function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) { - this.waitFor = waitFor; - this.absoluteTimeout = absoluteTimeout; - this.withObservable = withObservable; - this.scheduler = scheduler; - } - TimeoutWithOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler)); - }; - return TimeoutWithOperator; -}()); -var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TimeoutWithSubscriber, _super); - function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) { - var _this = _super.call(this, destination) || this; - _this.absoluteTimeout = absoluteTimeout; - _this.waitFor = waitFor; - _this.withObservable = withObservable; - _this.scheduler = scheduler; - _this.action = null; - _this.scheduleTimeout(); - return _this; - } - TimeoutWithSubscriber.dispatchTimeout = function (subscriber) { - var withObservable = subscriber.withObservable; - subscriber._unsubscribeAndRecycle(); - subscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(subscriber, withObservable)); - }; - TimeoutWithSubscriber.prototype.scheduleTimeout = function () { - var action = this.action; - if (action) { - this.action = action.schedule(this, this.waitFor); - } - else { - this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this)); - } - }; - TimeoutWithSubscriber.prototype._next = function (value) { - if (!this.absoluteTimeout) { - this.scheduleTimeout(); - } - _super.prototype._next.call(this, value); - }; - TimeoutWithSubscriber.prototype._unsubscribe = function () { - this.action = null; - this.scheduler = null; - this.withObservable = null; - }; - return TimeoutWithSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=timeoutWith.js.map + return env; +}; /***/ }), -/* 358 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 360 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(226); -/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ +const mimicFn = __webpack_require__(361); -function timestamp(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_map__WEBPACK_IMPORTED_MODULE_1__["map"])(function (value) { return new Timestamp(value, scheduler.now()); }); -} -var Timestamp = /*@__PURE__*/ (function () { - function Timestamp(value, timestamp) { - this.value = value; - this.timestamp = timestamp; - } - return Timestamp; -}()); +const calledFunctions = new WeakMap(); -//# sourceMappingURL=timestamp.js.map +const oneTime = (fn, options = {}) => { + if (typeof fn !== 'function') { + throw new TypeError('Expected a function'); + } + let ret; + let isCalled = false; + let callCount = 0; + const functionName = fn.displayName || fn.name || ''; -/***/ }), -/* 359 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const onetime = function (...args) { + calledFunctions.set(onetime, ++callCount); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(314); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + if (isCalled) { + if (options.throw === true) { + throw new Error(`Function \`${functionName}\` can only be called once`); + } -function toArrayReducer(arr, item, index) { - if (index === 0) { - return [item]; - } - arr.push(item); - return arr; -} -function toArray() { - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); -} -//# sourceMappingURL=toArray.js.map + return ret; + } + isCalled = true; + ret = fn.apply(this, args); + fn = null; -/***/ }), -/* 360 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + return ret; + }; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + mimicFn(onetime, fn); + calledFunctions.set(onetime, callCount); + return onetime; +}; +module.exports = oneTime; +// TODO: Remove this for the next major release +module.exports.default = oneTime; +module.exports.callCount = fn => { + if (!calledFunctions.has(fn)) { + throw new Error(`The given function \`${fn.name}\` is not wrapped by the \`onetime\` package`); + } -function window(windowBoundaries) { - return function windowOperatorFunction(source) { - return source.lift(new WindowOperator(windowBoundaries)); - }; -} -var WindowOperator = /*@__PURE__*/ (function () { - function WindowOperator(windowBoundaries) { - this.windowBoundaries = windowBoundaries; - } - WindowOperator.prototype.call = function (subscriber, source) { - var windowSubscriber = new WindowSubscriber(subscriber); - var sourceSubscription = source.subscribe(windowSubscriber); - if (!sourceSubscription.closed) { - windowSubscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); - } - return sourceSubscription; - }; - return WindowOperator; -}()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); - function WindowSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(_this.window); - return _this; - } - WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openWindow(); - }; - WindowSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - WindowSubscriber.prototype.notifyComplete = function (innerSub) { - this._complete(); - }; - WindowSubscriber.prototype._next = function (value) { - this.window.next(value); - }; - WindowSubscriber.prototype._error = function (err) { - this.window.error(err); - this.destination.error(err); - }; - WindowSubscriber.prototype._complete = function () { - this.window.complete(); - this.destination.complete(); - }; - WindowSubscriber.prototype._unsubscribe = function () { - this.window = null; - }; - WindowSubscriber.prototype.openWindow = function () { - var prevWindow = this.window; - if (prevWindow) { - prevWindow.complete(); - } - var destination = this.destination; - var newWindow = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(newWindow); - }; - return WindowSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=window.js.map + return calledFunctions.get(fn); +}; /***/ }), /* 361 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(187); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ - -function windowCount(windowSize, startWindowEvery) { - if (startWindowEvery === void 0) { - startWindowEvery = 0; - } - return function windowCountOperatorFunction(source) { - return source.lift(new WindowCountOperator(windowSize, startWindowEvery)); - }; -} -var WindowCountOperator = /*@__PURE__*/ (function () { - function WindowCountOperator(windowSize, startWindowEvery) { - this.windowSize = windowSize; - this.startWindowEvery = startWindowEvery; - } - WindowCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery)); - }; - return WindowCountOperator; -}()); -var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowCountSubscriber, _super); - function WindowCountSubscriber(destination, windowSize, startWindowEvery) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.windowSize = windowSize; - _this.startWindowEvery = startWindowEvery; - _this.windows = [new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"]()]; - _this.count = 0; - destination.next(_this.windows[0]); - return _this; - } - WindowCountSubscriber.prototype._next = function (value) { - var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize; - var destination = this.destination; - var windowSize = this.windowSize; - var windows = this.windows; - var len = windows.length; - for (var i = 0; i < len && !this.closed; i++) { - windows[i].next(value); - } - var c = this.count - windowSize + 1; - if (c >= 0 && c % startWindowEvery === 0 && !this.closed) { - windows.shift().complete(); - } - if (++this.count % startWindowEvery === 0 && !this.closed) { - var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); - windows.push(window_1); - destination.next(window_1); - } - }; - WindowCountSubscriber.prototype._error = function (err) { - var windows = this.windows; - if (windows) { - while (windows.length > 0 && !this.closed) { - windows.shift().error(err); - } - } - this.destination.error(err); - }; - WindowCountSubscriber.prototype._complete = function () { - var windows = this.windows; - if (windows) { - while (windows.length > 0 && !this.closed) { - windows.shift().complete(); - } - } - this.destination.complete(); - }; - WindowCountSubscriber.prototype._unsubscribe = function () { - this.count = 0; - this.windows = null; - }; - return WindowCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=windowCount.js.map +const mimicFn = (to, from) => { + for (const prop of Reflect.ownKeys(from)) { + Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); + } + + return to; +}; + +module.exports = mimicFn; +// TODO: Remove this for the next major release +module.exports.default = mimicFn; /***/ }), /* 362 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(257); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(205); -/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ +const {signalsByName} = __webpack_require__(363); +const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { + if (timedOut) { + return `timed out after ${timeout} milliseconds`; + } + if (isCanceled) { + return 'was canceled'; + } + if (errorCode !== undefined) { + return `failed with ${errorCode}`; + } + if (signal !== undefined) { + return `was killed with ${signal} (${signalDescription})`; + } -function windowTime(windowTimeSpan) { - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - var windowCreationInterval = null; - var maxWindowSize = Number.POSITIVE_INFINITY; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { - scheduler = arguments[3]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { - scheduler = arguments[2]; - } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { - maxWindowSize = arguments[2]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { - scheduler = arguments[1]; - } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[1])) { - windowCreationInterval = arguments[1]; - } - return function windowTimeOperatorFunction(source) { - return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler)); - }; -} -var WindowTimeOperator = /*@__PURE__*/ (function () { - function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { - this.windowTimeSpan = windowTimeSpan; - this.windowCreationInterval = windowCreationInterval; - this.maxWindowSize = maxWindowSize; - this.scheduler = scheduler; - } - WindowTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler)); - }; - return WindowTimeOperator; -}()); -var CountedSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountedSubject, _super); - function CountedSubject() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this._numberOfNextedValues = 0; - return _this; - } - CountedSubject.prototype.next = function (value) { - this._numberOfNextedValues++; - _super.prototype.next.call(this, value); - }; - Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", { - get: function () { - return this._numberOfNextedValues; - }, - enumerable: true, - configurable: true - }); - return CountedSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowTimeSubscriber, _super); - function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.windowTimeSpan = windowTimeSpan; - _this.windowCreationInterval = windowCreationInterval; - _this.maxWindowSize = maxWindowSize; - _this.scheduler = scheduler; - _this.windows = []; - var window = _this.openWindow(); - if (windowCreationInterval !== null && windowCreationInterval >= 0) { - var closeState = { subscriber: _this, window: window, context: null }; - var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler }; - _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState)); - _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState)); - } - else { - var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan }; - _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState)); - } - return _this; - } - WindowTimeSubscriber.prototype._next = function (value) { - var windows = this.windows; - var len = windows.length; - for (var i = 0; i < len; i++) { - var window_1 = windows[i]; - if (!window_1.closed) { - window_1.next(value); - if (window_1.numberOfNextedValues >= this.maxWindowSize) { - this.closeWindow(window_1); - } - } - } - }; - WindowTimeSubscriber.prototype._error = function (err) { - var windows = this.windows; - while (windows.length > 0) { - windows.shift().error(err); - } - this.destination.error(err); - }; - WindowTimeSubscriber.prototype._complete = function () { - var windows = this.windows; - while (windows.length > 0) { - var window_2 = windows.shift(); - if (!window_2.closed) { - window_2.complete(); - } - } - this.destination.complete(); - }; - WindowTimeSubscriber.prototype.openWindow = function () { - var window = new CountedSubject(); - this.windows.push(window); - var destination = this.destination; - destination.next(window); - return window; - }; - WindowTimeSubscriber.prototype.closeWindow = function (window) { - window.complete(); - var windows = this.windows; - windows.splice(windows.indexOf(window), 1); - }; - return WindowTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -function dispatchWindowTimeSpanOnly(state) { - var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window; - if (window) { - subscriber.closeWindow(window); - } - state.window = subscriber.openWindow(); - this.schedule(state, windowTimeSpan); -} -function dispatchWindowCreation(state) { - var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval; - var window = subscriber.openWindow(); - var action = this; - var context = { action: action, subscription: null }; - var timeSpanState = { subscriber: subscriber, window: window, context: context }; - context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState); - action.add(context.subscription); - action.schedule(state, windowCreationInterval); -} -function dispatchWindowClose(state) { - var subscriber = state.subscriber, window = state.window, context = state.context; - if (context && context.action && context.subscription) { - context.action.remove(context.subscription); - } - subscriber.closeWindow(window); -} -//# sourceMappingURL=windowTime.js.map + if (exitCode !== undefined) { + return `failed with exit code ${exitCode}`; + } + + return 'failed'; +}; + +const makeError = ({ + stdout, + stderr, + all, + error, + signal, + exitCode, + command, + timedOut, + isCanceled, + killed, + parsed: {options: {timeout}} +}) => { + // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. + // We normalize them to `undefined` + exitCode = exitCode === null ? undefined : exitCode; + signal = signal === null ? undefined : signal; + const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; + + const errorCode = error && error.code; + + const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); + const execaMessage = `Command ${prefix}: ${command}`; + const isError = Object.prototype.toString.call(error) === '[object Error]'; + const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage; + const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); + + if (isError) { + error.originalMessage = error.message; + error.message = message; + } else { + error = new Error(message); + } + + error.shortMessage = shortMessage; + error.command = command; + error.exitCode = exitCode; + error.signal = signal; + error.signalDescription = signalDescription; + error.stdout = stdout; + error.stderr = stderr; + + if (all !== undefined) { + error.all = all; + } + + if ('bufferedData' in error) { + delete error.bufferedData; + } + + error.failed = true; + error.timedOut = Boolean(timedOut); + error.isCanceled = isCanceled; + error.killed = killed && !timedOut; + + return error; +}; + +module.exports = makeError; /***/ }), /* 363 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(364); +var _signals=__webpack_require__(365); +var _realtime=__webpack_require__(367); +const getSignalsByName=function(){ +const signals=(0,_signals.getSignals)(); +return signals.reduce(getSignalByName,{}); +}; -function windowToggle(openings, closingSelector) { - return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); }; +const getSignalByName=function( +signalByNameMemo, +{name,number,description,supported,action,forced,standard}) +{ +return{ +...signalByNameMemo, +[name]:{name,number,description,supported,action,forced,standard}}; + +}; + +const signalsByName=getSignalsByName();exports.signalsByName=signalsByName; + + + + +const getSignalsByNumber=function(){ +const signals=(0,_signals.getSignals)(); +const length=_realtime.SIGRTMAX+1; +const signalsA=Array.from({length},(value,number)=> +getSignalByNumber(number,signals)); + +return Object.assign({},...signalsA); +}; + +const getSignalByNumber=function(number,signals){ +const signal=findSignalByNumber(number,signals); + +if(signal===undefined){ +return{}; } -var WindowToggleOperator = /*@__PURE__*/ (function () { - function WindowToggleOperator(openings, closingSelector) { - this.openings = openings; - this.closingSelector = closingSelector; - } - WindowToggleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector)); - }; - return WindowToggleOperator; -}()); -var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowToggleSubscriber, _super); - function WindowToggleSubscriber(destination, openings, closingSelector) { - var _this = _super.call(this, destination) || this; - _this.openings = openings; - _this.closingSelector = closingSelector; - _this.contexts = []; - _this.add(_this.openSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(_this, openings, openings)); - return _this; - } - WindowToggleSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - if (contexts) { - var len = contexts.length; - for (var i = 0; i < len; i++) { - contexts[i].window.next(value); - } - } - }; - WindowToggleSubscriber.prototype._error = function (err) { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_1 = contexts[index]; - context_1.window.error(err); - context_1.subscription.unsubscribe(); - } - } - _super.prototype._error.call(this, err); - }; - WindowToggleSubscriber.prototype._complete = function () { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_2 = contexts[index]; - context_2.window.complete(); - context_2.subscription.unsubscribe(); - } - } - _super.prototype._complete.call(this); - }; - WindowToggleSubscriber.prototype._unsubscribe = function () { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_3 = contexts[index]; - context_3.window.unsubscribe(); - context_3.subscription.unsubscribe(); - } - } - }; - WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (outerValue === this.openings) { - var closingNotifier = void 0; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(innerValue); - } - catch (e) { - return this.error(e); - } - var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); - var context_4 = { window: window_1, subscription: subscription }; - this.contexts.push(context_4); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, closingNotifier, context_4); - if (innerSubscription.closed) { - this.closeWindow(this.contexts.length - 1); - } - else { - innerSubscription.context = context_4; - subscription.add(innerSubscription); - } - this.destination.next(window_1); - } - else { - this.closeWindow(this.contexts.indexOf(outerValue)); - } - }; - WindowToggleSubscriber.prototype.notifyError = function (err) { - this.error(err); - }; - WindowToggleSubscriber.prototype.notifyComplete = function (inner) { - if (inner !== this.openSubscription) { - this.closeWindow(this.contexts.indexOf(inner.context)); - } - }; - WindowToggleSubscriber.prototype.closeWindow = function (index) { - if (index === -1) { - return; - } - var contexts = this.contexts; - var context = contexts[index]; - var window = context.window, subscription = context.subscription; - contexts.splice(index, 1); - window.complete(); - subscription.unsubscribe(); - }; - return WindowToggleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=windowToggle.js.map +const{name,description,supported,action,forced,standard}=signal; +return{ +[number]:{ +name, +number, +description, +supported, +action, +forced, +standard}}; -/***/ }), -/* 364 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +}; +const findSignalByNumber=function(number,signals){ +const signal=signals.find(({name})=>_os.constants.signals[name]===number); -function windowWhen(closingSelector) { - return function windowWhenOperatorFunction(source) { - return source.lift(new WindowOperator(closingSelector)); - }; +if(signal!==undefined){ +return signal; } -var WindowOperator = /*@__PURE__*/ (function () { - function WindowOperator(closingSelector) { - this.closingSelector = closingSelector; - } - WindowOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector)); - }; - return WindowOperator; -}()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); - function WindowSubscriber(destination, closingSelector) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.closingSelector = closingSelector; - _this.openWindow(); - return _this; - } - WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openWindow(innerSub); - }; - WindowSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - WindowSubscriber.prototype.notifyComplete = function (innerSub) { - this.openWindow(innerSub); - }; - WindowSubscriber.prototype._next = function (value) { - this.window.next(value); - }; - WindowSubscriber.prototype._error = function (err) { - this.window.error(err); - this.destination.error(err); - this.unsubscribeClosingNotification(); - }; - WindowSubscriber.prototype._complete = function () { - this.window.complete(); - this.destination.complete(); - this.unsubscribeClosingNotification(); - }; - WindowSubscriber.prototype.unsubscribeClosingNotification = function () { - if (this.closingNotification) { - this.closingNotification.unsubscribe(); - } - }; - WindowSubscriber.prototype.openWindow = function (innerSub) { - if (innerSub === void 0) { - innerSub = null; - } - if (innerSub) { - this.remove(innerSub); - innerSub.unsubscribe(); - } - var prevWindow = this.window; - if (prevWindow) { - prevWindow.complete(); - } - var window = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - this.destination.next(window); - var closingNotifier; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(); - } - catch (e) { - this.destination.error(e); - this.window.error(e); - return; - } - this.add(this.closingNotification = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); - }; - return WindowSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=windowWhen.js.map - - -/***/ }), -/* 365 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - - -function withLatestFrom() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return function (source) { - var project; - if (typeof args[args.length - 1] === 'function') { - project = args.pop(); - } - var observables = args; - return source.lift(new WithLatestFromOperator(observables, project)); - }; -} -var WithLatestFromOperator = /*@__PURE__*/ (function () { - function WithLatestFromOperator(observables, project) { - this.observables = observables; - this.project = project; - } - WithLatestFromOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); - }; - return WithLatestFromOperator; -}()); -var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WithLatestFromSubscriber, _super); - function WithLatestFromSubscriber(destination, observables, project) { - var _this = _super.call(this, destination) || this; - _this.observables = observables; - _this.project = project; - _this.toRespond = []; - var len = observables.length; - _this.values = new Array(len); - for (var i = 0; i < len; i++) { - _this.toRespond.push(i); - } - for (var i = 0; i < len; i++) { - var observable = observables[i]; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, observable, observable, i)); - } - return _this; - } - WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values[outerIndex] = innerValue; - var toRespond = this.toRespond; - if (toRespond.length > 0) { - var found = toRespond.indexOf(outerIndex); - if (found !== -1) { - toRespond.splice(found, 1); - } - } - }; - WithLatestFromSubscriber.prototype.notifyComplete = function () { - }; - WithLatestFromSubscriber.prototype._next = function (value) { - if (this.toRespond.length === 0) { - var args = [value].concat(this.values); - if (this.project) { - this._tryProject(args); - } - else { - this.destination.next(args); - } - } - }; - WithLatestFromSubscriber.prototype._tryProject = function (args) { - var result; - try { - result = this.project.apply(this, args); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(result); - }; - return WithLatestFromSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=withLatestFrom.js.map - - -/***/ }), -/* 366 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(269); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function zipOperatorFunction(source) { - return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); - }; -} -//# sourceMappingURL=zip.js.map +return signals.find(signalA=>signalA.number===number); +}; +const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumber; +//# sourceMappingURL=main.js.map /***/ }), -/* 367 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(269); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ - -function zipAll(project) { - return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; -} -//# sourceMappingURL=zipAll.js.map +/* 364 */ +/***/ (function(module, exports) { +module.exports = require("os"); /***/ }), -/* 368 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(364); +var _core=__webpack_require__(366); +var _realtime=__webpack_require__(367); -const callbacks = new Set(); -let called = false; -function exit(exit, signal) { - if (called) { - return; - } - called = true; +const getSignals=function(){ +const realtimeSignals=(0,_realtime.getRealtimeSignals)(); +const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal); +return signals; +};exports.getSignals=getSignals; - for (const callback of callbacks) { - callback(); - } - if (exit === true) { - process.exit(128 + signal); // eslint-disable-line unicorn/no-process-exit - } -} -module.exports = callback => { - callbacks.add(callback); - if (callbacks.size === 1) { - process.once('exit', exit); - process.once('SIGINT', exit.bind(null, true, 2)); - process.once('SIGTERM', exit.bind(null, true, 15)); - // PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because - // explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit - // event cannot support async handlers, since the event loop is never called after it. - process.on('message', message => { - if (message === 'shutdown') { - exit(true, -128); - } - }); - } - return () => { - callbacks.delete(callback); - }; -}; +const normalizeSignal=function({ +name, +number:defaultNumber, +description, +action, +forced=false, +standard}) +{ +const{ +signals:{[name]:constantSignal}}= +_os.constants; +const supported=constantSignal!==undefined; +const number=supported?constantSignal:defaultNumber; +return{name,number,description,supported,action,forced,standard}; +}; +//# sourceMappingURL=signals.js.map /***/ }), -/* 369 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.SIGNALS=void 0; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const $isCliError = Symbol('isCliError'); -function createCliError(message) { - const error = new Error(message); - error[$isCliError] = true; - return error; -} -exports.createCliError = createCliError; -function isCliError(error) { - return error && !!error[$isCliError]; -} -exports.isCliError = isCliError; +const SIGNALS=[ +{ +name:"SIGHUP", +number:1, +action:"terminate", +description:"Terminal closed", +standard:"posix"}, +{ +name:"SIGINT", +number:2, +action:"terminate", +description:"User interruption with CTRL-C", +standard:"ansi"}, -/***/ }), -/* 370 */ -/***/ (function(module, exports, __webpack_require__) { +{ +name:"SIGQUIT", +number:3, +action:"core", +description:"User interruption with CTRL-\\", +standard:"posix"}, -"use strict"; +{ +name:"SIGILL", +number:4, +action:"core", +description:"Invalid machine instruction", +standard:"ansi"}, -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const execa_1 = tslib_1.__importDefault(__webpack_require__(371)); -const fs_1 = __webpack_require__(23); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -const chalk_1 = tslib_1.__importDefault(__webpack_require__(2)); -const tree_kill_1 = tslib_1.__importDefault(__webpack_require__(411)); -const util_1 = __webpack_require__(29); -const treeKillAsync = util_1.promisify((...args) => tree_kill_1.default(...args)); -const observe_lines_1 = __webpack_require__(412); -const errors_1 = __webpack_require__(369); -const SECOND = 1000; -const STOP_TIMEOUT = 30 * SECOND; -async function withTimeout(attempt, ms, onTimeout) { - const TIMEOUT = Symbol('timeout'); - try { - await Promise.race([ - attempt(), - new Promise((_, reject) => setTimeout(() => reject(TIMEOUT), ms)), - ]); - } - catch (error) { - if (error === TIMEOUT) { - await onTimeout(); - } - else { - throw error; - } - } -} -function startProc(name, options, log) { - const { cmd, args, cwd, env, stdin } = options; - log.info('[%s] > %s', name, cmd, args.join(' ')); - // spawn fails with ENOENT when either the - // cmd or cwd don't exist, so we check for the cwd - // ahead of time so that the error is less ambiguous - try { - if (!fs_1.statSync(cwd).isDirectory()) { - throw new Error(`cwd "${cwd}" exists but is not a directory`); - } - } - catch (err) { - if (err.code === 'ENOENT') { - throw new Error(`cwd "${cwd}" does not exist`); - } - } - const childProcess = execa_1.default(cmd, args, { - cwd, - env, - stdio: ['pipe', 'pipe', 'pipe'], - preferLocal: true, - }); - if (stdin) { - childProcess.stdin.end(stdin, 'utf8'); - } - else { - childProcess.stdin.end(); - } - let stopCalled = false; - const outcome$ = Rx.race( - // observe first exit event - Rx.fromEvent(childProcess, 'exit').pipe(operators_1.take(1), operators_1.map(([code]) => { - if (stopCalled) { - return null; - } - // JVM exits with 143 on SIGTERM and 130 on SIGINT, dont' treat then as errors - if (code > 0 && !(code === 143 || code === 130)) { - throw errors_1.createCliError(`[${name}] exited with code ${code}`); - } - return code; - })), - // observe first error event - Rx.fromEvent(childProcess, 'error').pipe(operators_1.take(1), operators_1.mergeMap((err) => Rx.throwError(err)))).pipe(operators_1.share()); - const lines$ = Rx.merge(observe_lines_1.observeLines(childProcess.stdout), observe_lines_1.observeLines(childProcess.stderr)).pipe(operators_1.tap((line) => log.write(` ${chalk_1.default.gray('proc')} [${chalk_1.default.gray(name)}] ${line}`)), operators_1.share()); - const outcomePromise = Rx.merge(lines$.pipe(operators_1.ignoreElements()), outcome$).toPromise(); - async function stop(signal) { - if (stopCalled) { - return; - } - stopCalled = true; - await withTimeout(async () => { - log.debug(`Sending "${signal}" to proc "${name}"`); - await treeKillAsync(childProcess.pid, signal); - await outcomePromise; - }, STOP_TIMEOUT, async () => { - log.warning(`Proc "${name}" was sent "${signal}" didn't emit the "exit" or "error" events after ${STOP_TIMEOUT} ms, sending SIGKILL`); - await treeKillAsync(childProcess.pid, 'SIGKILL'); - }); - await withTimeout(async () => { - try { - await outcomePromise; - } - catch (error) { - // ignore - } - }, STOP_TIMEOUT, async () => { - throw new Error(`Proc "${name}" was stopped but never emitted either the "exit" or "error" event after ${STOP_TIMEOUT} ms`); - }); - } - return { - name, - lines$, - outcome$, - outcomePromise, - stop, - }; -} -exports.startProc = startProc; +{ +name:"SIGTRAP", +number:5, +action:"core", +description:"Debugger breakpoint", +standard:"posix"}, +{ +name:"SIGABRT", +number:6, +action:"core", +description:"Aborted", +standard:"ansi"}, -/***/ }), -/* 371 */ -/***/ (function(module, exports, __webpack_require__) { +{ +name:"SIGIOT", +number:6, +action:"core", +description:"Aborted", +standard:"bsd"}, -"use strict"; +{ +name:"SIGBUS", +number:7, +action:"core", +description: +"Bus error due to misaligned, non-existing address or paging error", +standard:"bsd"}, -const path = __webpack_require__(16); -const childProcess = __webpack_require__(372); -const crossSpawn = __webpack_require__(373); -const stripFinalNewline = __webpack_require__(386); -const npmRunPath = __webpack_require__(387); -const onetime = __webpack_require__(388); -const makeError = __webpack_require__(390); -const normalizeStdio = __webpack_require__(395); -const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(396); -const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(400); -const {mergePromise, getSpawnedPromise} = __webpack_require__(409); -const {joinCommand, parseCommand} = __webpack_require__(410); +{ +name:"SIGEMT", +number:7, +action:"terminate", +description:"Command should be emulated but is not implemented", +standard:"other"}, -const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; +{ +name:"SIGFPE", +number:8, +action:"core", +description:"Floating point arithmetic error", +standard:"ansi"}, -const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { - const env = extendEnv ? {...process.env, ...envOption} : envOption; +{ +name:"SIGKILL", +number:9, +action:"terminate", +description:"Forced termination", +standard:"posix", +forced:true}, - if (preferLocal) { - return npmRunPath.env({env, cwd: localDir, execPath}); - } +{ +name:"SIGUSR1", +number:10, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, - return env; -}; +{ +name:"SIGSEGV", +number:11, +action:"core", +description:"Segmentation fault", +standard:"ansi"}, -const handleArgs = (file, args, options = {}) => { - const parsed = crossSpawn._parse(file, args, options); - file = parsed.command; - args = parsed.args; - options = parsed.options; +{ +name:"SIGUSR2", +number:12, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, - options = { - maxBuffer: DEFAULT_MAX_BUFFER, - buffer: true, - stripFinalNewline: true, - extendEnv: true, - preferLocal: false, - localDir: options.cwd || process.cwd(), - execPath: process.execPath, - encoding: 'utf8', - reject: true, - cleanup: true, - all: false, - windowsHide: true, - ...options - }; +{ +name:"SIGPIPE", +number:13, +action:"terminate", +description:"Broken pipe or socket", +standard:"posix"}, - options.env = getEnv(options); +{ +name:"SIGALRM", +number:14, +action:"terminate", +description:"Timeout or timer", +standard:"posix"}, - options.stdio = normalizeStdio(options); +{ +name:"SIGTERM", +number:15, +action:"terminate", +description:"Termination", +standard:"ansi"}, - if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { - // #116 - args.unshift('/q'); - } +{ +name:"SIGSTKFLT", +number:16, +action:"terminate", +description:"Stack is empty or overflowed", +standard:"other"}, - return {file, args, options, parsed}; -}; +{ +name:"SIGCHLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"posix"}, -const handleOutput = (options, value, error) => { - if (typeof value !== 'string' && !Buffer.isBuffer(value)) { - // When `execa.sync()` errors, we normalize it to '' to mimic `execa()` - return error === undefined ? undefined : ''; - } +{ +name:"SIGCLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"other"}, - if (options.stripFinalNewline) { - return stripFinalNewline(value); - } +{ +name:"SIGCONT", +number:18, +action:"unpause", +description:"Unpaused", +standard:"posix", +forced:true}, - return value; -}; +{ +name:"SIGSTOP", +number:19, +action:"pause", +description:"Paused", +standard:"posix", +forced:true}, -const execa = (file, args, options) => { - const parsed = handleArgs(file, args, options); - const command = joinCommand(file, args); +{ +name:"SIGTSTP", +number:20, +action:"pause", +description:"Paused using CTRL-Z or \"suspend\"", +standard:"posix"}, - let spawned; - try { - spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); - } catch (error) { - // Ensure the returned error is always both a promise and a child process - const dummySpawned = new childProcess.ChildProcess(); - const errorPromise = Promise.reject(makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - parsed, - timedOut: false, - isCanceled: false, - killed: false - })); - return mergePromise(dummySpawned, errorPromise); - } +{ +name:"SIGTTIN", +number:21, +action:"pause", +description:"Background process cannot read terminal input", +standard:"posix"}, - const spawnedPromise = getSpawnedPromise(spawned); - const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); - const processDone = setExitHandler(spawned, parsed.options, timedPromise); +{ +name:"SIGBREAK", +number:21, +action:"terminate", +description:"User interruption with CTRL-BREAK", +standard:"other"}, - const context = {isCanceled: false}; +{ +name:"SIGTTOU", +number:22, +action:"pause", +description:"Background process cannot write to terminal output", +standard:"posix"}, - spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); - spawned.cancel = spawnedCancel.bind(null, spawned, context); +{ +name:"SIGURG", +number:23, +action:"ignore", +description:"Socket received out-of-band data", +standard:"bsd"}, - const handlePromise = async () => { - const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); - const stdout = handleOutput(parsed.options, stdoutResult); - const stderr = handleOutput(parsed.options, stderrResult); - const all = handleOutput(parsed.options, allResult); +{ +name:"SIGXCPU", +number:24, +action:"core", +description:"Process timed out", +standard:"bsd"}, - if (error || exitCode !== 0 || signal !== null) { - const returnedError = makeError({ - error, - exitCode, - signal, - stdout, - stderr, - all, - command, - parsed, - timedOut, - isCanceled: context.isCanceled, - killed: spawned.killed - }); +{ +name:"SIGXFSZ", +number:25, +action:"core", +description:"File too big", +standard:"bsd"}, - if (!parsed.options.reject) { - return returnedError; - } +{ +name:"SIGVTALRM", +number:26, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, - throw returnedError; - } +{ +name:"SIGPROF", +number:27, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, - return { - command, - exitCode: 0, - stdout, - stderr, - all, - failed: false, - timedOut: false, - isCanceled: false, - killed: false - }; - }; +{ +name:"SIGWINCH", +number:28, +action:"ignore", +description:"Terminal window size changed", +standard:"bsd"}, - const handlePromiseOnce = onetime(handlePromise); +{ +name:"SIGIO", +number:29, +action:"terminate", +description:"I/O is available", +standard:"other"}, - crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); +{ +name:"SIGPOLL", +number:29, +action:"terminate", +description:"Watched event", +standard:"other"}, - handleInput(spawned, parsed.options.input); +{ +name:"SIGINFO", +number:29, +action:"ignore", +description:"Request for process information", +standard:"other"}, - spawned.all = makeAllStream(spawned, parsed.options); +{ +name:"SIGPWR", +number:30, +action:"terminate", +description:"Device running out of power", +standard:"systemv"}, + +{ +name:"SIGSYS", +number:31, +action:"core", +description:"Invalid system call", +standard:"other"}, + +{ +name:"SIGUNUSED", +number:31, +action:"terminate", +description:"Invalid system call", +standard:"other"}];exports.SIGNALS=SIGNALS; +//# sourceMappingURL=core.js.map + +/***/ }), +/* 367 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.SIGRTMAX=exports.getRealtimeSignals=void 0; +const getRealtimeSignals=function(){ +const length=SIGRTMAX-SIGRTMIN+1; +return Array.from({length},getRealtimeSignal); +};exports.getRealtimeSignals=getRealtimeSignals; + +const getRealtimeSignal=function(value,index){ +return{ +name:`SIGRT${index+1}`, +number:SIGRTMIN+index, +action:"terminate", +description:"Application-specific signal (realtime)", +standard:"posix"}; - return mergePromise(spawned, handlePromiseOnce); }; -module.exports = execa; +const SIGRTMIN=34; +const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; +//# sourceMappingURL=realtime.js.map -module.exports.sync = (file, args, options) => { - const parsed = handleArgs(file, args, options); - const command = joinCommand(file, args); +/***/ }), +/* 368 */ +/***/ (function(module, exports, __webpack_require__) { - validateInputSync(parsed.options); +"use strict"; - let result; - try { - result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); - } catch (error) { - throw makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - parsed, - timedOut: false, - isCanceled: false, - killed: false - }); +const aliases = ['stdin', 'stdout', 'stderr']; + +const hasAlias = opts => aliases.some(alias => opts[alias] !== undefined); + +const normalizeStdio = opts => { + if (!opts) { + return; } - const stdout = handleOutput(parsed.options, result.stdout, result.error); - const stderr = handleOutput(parsed.options, result.stderr, result.error); + const {stdio} = opts; - if (result.error || result.status !== 0 || result.signal !== null) { - const error = makeError({ - stdout, - stderr, - error: result.error, - signal: result.signal, - exitCode: result.status, - command, - parsed, - timedOut: result.error && result.error.code === 'ETIMEDOUT', - isCanceled: false, - killed: result.signal !== null - }); + if (stdio === undefined) { + return aliases.map(alias => opts[alias]); + } - if (!parsed.options.reject) { - return error; - } + if (hasAlias(opts)) { + throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); + } - throw error; + if (typeof stdio === 'string') { + return stdio; } - return { - command, - exitCode: 0, - stdout, - stderr, - failed: false, - timedOut: false, - isCanceled: false, - killed: false - }; -}; + if (!Array.isArray(stdio)) { + throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); + } -module.exports.command = (command, options) => { - const [file, ...args] = parseCommand(command); - return execa(file, args, options); + const length = Math.max(stdio.length, aliases.length); + return Array.from({length}, (value, index) => stdio[index]); }; -module.exports.commandSync = (command, options) => { - const [file, ...args] = parseCommand(command); - return execa.sync(file, args, options); -}; +module.exports = normalizeStdio; -module.exports.node = (scriptPath, args, options = {}) => { - if (args && !Array.isArray(args) && typeof args === 'object') { - options = args; - args = []; +// `ipc` is pushed unless it is already present +module.exports.node = opts => { + const stdio = normalizeStdio(opts); + + if (stdio === 'ipc') { + return 'ipc'; } - const stdio = normalizeStdio.node(options); + if (stdio === undefined || typeof stdio === 'string') { + return [stdio, stdio, stdio, 'ipc']; + } - const {nodePath = process.execPath, nodeOptions = process.execArgv} = options; + if (stdio.includes('ipc')) { + return stdio; + } - return execa( - nodePath, - [ - ...nodeOptions, - scriptPath, - ...(Array.isArray(args) ? args : []) - ], - { - ...options, - stdin: undefined, - stdout: undefined, - stderr: undefined, - stdio, - shell: false - } - ); + return [...stdio, 'ipc']; }; /***/ }), -/* 372 */ -/***/ (function(module, exports) { - -module.exports = require("child_process"); - -/***/ }), -/* 373 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const os = __webpack_require__(364); +const onExit = __webpack_require__(370); -const cp = __webpack_require__(372); -const parse = __webpack_require__(374); -const enoent = __webpack_require__(385); +const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; -function spawn(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); +// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior +const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { + const killResult = kill(signal); + setKillTimeout(kill, signal, options, killResult); + return killResult; +}; - // Spawn the child process - const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); +const setKillTimeout = (kill, signal, options, killResult) => { + if (!shouldForceKill(signal, options, killResult)) { + return; + } - // Hook into child process "exit" event to emit an error if the command - // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - enoent.hookChildProcess(spawned, parsed); + const timeout = getForceKillAfterTimeout(options); + const t = setTimeout(() => { + kill('SIGKILL'); + }, timeout); - return spawned; -} + // Guarded because there's no `.unref()` when `execa` is used in the renderer + // process in Electron. This cannot be tested since we don't run tests in + // Electron. + // istanbul ignore else + if (t.unref) { + t.unref(); + } +}; -function spawnSync(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); +const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => { + return isSigterm(signal) && forceKillAfterTimeout !== false && killResult; +}; - // Spawn the child process - const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); +const isSigterm = signal => { + return signal === os.constants.signals.SIGTERM || + (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); +}; - // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); +const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { + if (forceKillAfterTimeout === true) { + return DEFAULT_FORCE_KILL_TIMEOUT; + } - return result; -} + if (!Number.isInteger(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { + throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); + } -module.exports = spawn; -module.exports.spawn = spawn; -module.exports.sync = spawnSync; + return forceKillAfterTimeout; +}; -module.exports._parse = parse; -module.exports._enoent = enoent; +// `childProcess.cancel()` +const spawnedCancel = (spawned, context) => { + const killResult = spawned.kill(); + if (killResult) { + context.isCanceled = true; + } +}; -/***/ }), -/* 374 */ -/***/ (function(module, exports, __webpack_require__) { +const timeoutKill = (spawned, signal, reject) => { + spawned.kill(signal); + reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); +}; -"use strict"; +// `timeout` option handling +const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { + if (timeout === 0 || timeout === undefined) { + return spawnedPromise; + } + if (!Number.isInteger(timeout) || timeout < 0) { + throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); + } -const path = __webpack_require__(16); -const resolveCommand = __webpack_require__(375); -const escape = __webpack_require__(381); -const readShebang = __webpack_require__(382); + let timeoutId; + const timeoutPromise = new Promise((resolve, reject) => { + timeoutId = setTimeout(() => { + timeoutKill(spawned, killSignal, reject); + }, timeout); + }); -const isWin = process.platform === 'win32'; -const isExecutableRegExp = /\.(?:com|exe)$/i; -const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + const safeSpawnedPromise = spawnedPromise.finally(() => { + clearTimeout(timeoutId); + }); -function detectShebang(parsed) { - parsed.file = resolveCommand(parsed); + return Promise.race([timeoutPromise, safeSpawnedPromise]); +}; - const shebang = parsed.file && readShebang(parsed.file); +// `cleanup` option handling +const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { + if (!cleanup || detached) { + return timedPromise; + } - if (shebang) { - parsed.args.unshift(parsed.file); - parsed.command = shebang; + const removeExitHandler = onExit(() => { + spawned.kill(); + }); - return resolveCommand(parsed); - } + return timedPromise.finally(() => { + removeExitHandler(); + }); +}; - return parsed.file; -} +module.exports = { + spawnedKill, + spawnedCancel, + setupTimeout, + setExitHandler +}; -function parseNonShell(parsed) { - if (!isWin) { - return parsed; - } - // Detect & add support for shebangs - const commandFile = detectShebang(parsed); +/***/ }), +/* 370 */ +/***/ (function(module, exports, __webpack_require__) { - // We don't need a shell if the command filename is an executable - const needsShell = !isExecutableRegExp.test(commandFile); +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +var assert = __webpack_require__(371) +var signals = __webpack_require__(372) - // If a shell is required, use cmd.exe and take care of escaping everything correctly - // Note that `forceShell` is an hidden option used only in tests - if (parsed.options.forceShell || needsShell) { - // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` - // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument - // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, - // we need to double escape them - const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); +var EE = __webpack_require__(373) +/* istanbul ignore if */ +if (typeof EE !== 'function') { + EE = EE.EventEmitter +} - // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) - // This is necessary otherwise it will always fail with ENOENT in those cases - parsed.command = path.normalize(parsed.command); +var emitter +if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ +} else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} +} - // Escape command & arguments - parsed.command = escape.command(parsed.command); - parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); +// Because this emitter is a global, we have to check to see if a +// previous version of this library failed to enable infinite listeners. +// I know what you're about to say. But literally everything about +// signal-exit is a compromise with evil. Get used to it. +if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true +} - const shellCommand = [parsed.command].concat(parsed.args).join(' '); +module.exports = function (cb, opts) { + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') - parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; - parsed.command = process.env.comspec || 'cmd.exe'; - parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped - } + if (loaded === false) { + load() + } - return parsed; -} + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' + } -function parse(command, args, options) { - // Normalize arguments, similar to nodejs - if (args && !Array.isArray(args)) { - options = args; - args = null; + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() } + } + emitter.on(ev, cb) - args = args ? args.slice(0) : []; // Clone array to avoid changing the original - options = Object.assign({}, options); // Clone object to avoid changing the original - - // Build our parsed object - const parsed = { - command, - args, - options, - file: undefined, - original: { - command, - args, - }, - }; - - // Delegate further parsing to shell or non-shell - return options.shell ? parsed : parseNonShell(parsed); + return remove } -module.exports = parse; +module.exports.unload = unload +function unload () { + if (!loaded) { + return + } + loaded = false + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 +} -/***/ }), -/* 375 */ -/***/ (function(module, exports, __webpack_require__) { +function emit (event, code, signal) { + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) +} -"use strict"; +// { : , ... } +var sigListeners = {} +signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + process.kill(process.pid, sig) + } + } +}) +module.exports.signals = function () { + return signals +} -const path = __webpack_require__(16); -const which = __webpack_require__(376); -const pathKey = __webpack_require__(380)(); +module.exports.load = load -function resolveCommandAttempt(parsed, withoutPathExt) { - const cwd = process.cwd(); - const hasCustomCwd = parsed.options.cwd != null; - // Worker threads do not have process.chdir() - const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined; +var loaded = false - // If a custom `cwd` was specified, we need to change the process cwd - // because `which` will do stat calls but does not support a custom cwd - if (shouldSwitchCwd) { - try { - process.chdir(parsed.options.cwd); - } catch (err) { - /* Empty */ - } - } +function load () { + if (loaded) { + return + } + loaded = true - let resolved; + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 + signals = signals.filter(function (sig) { try { - resolved = which.sync(parsed.command, { - path: (parsed.options.env || process.env)[pathKey], - pathExt: withoutPathExt ? path.delimiter : undefined, - }); - } catch (e) { - /* Empty */ - } finally { - if (shouldSwitchCwd) { - process.chdir(cwd); - } + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false } + }) - // If we successfully resolved, ensure that an absolute path is returned - // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it - if (resolved) { - resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); - } + process.emit = processEmit + process.reallyExit = processReallyExit +} - return resolved; +var originalProcessReallyExit = process.reallyExit +function processReallyExit (code) { + process.exitCode = code || 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) } -function resolveCommand(parsed) { - return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +var originalProcessEmit = process.emit +function processEmit (ev, arg) { + if (ev === 'exit') { + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } } -module.exports = resolveCommand; +/***/ }), +/* 371 */ +/***/ (function(module, exports) { + +module.exports = require("assert"); /***/ }), -/* 376 */ -/***/ (function(module, exports, __webpack_require__) { +/* 372 */ +/***/ (function(module, exports) { -const isWindows = process.platform === 'win32' || - process.env.OSTYPE === 'cygwin' || - process.env.OSTYPE === 'msys' +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] -const path = __webpack_require__(16) -const COLON = isWindows ? ';' : ':' -const isexe = __webpack_require__(377) +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} -const getNotFoundError = (cmd) => - Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} -const getPathInfo = (cmd, opt) => { - const colon = opt.colon || COLON - // If it has a slash, then we don't bother searching the pathenv. - // just check the file itself, and that's it. - const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] - : ( - [ - // windows always checks the cwd first - ...(isWindows ? [process.cwd()] : []), - ...(opt.path || process.env.PATH || - /* istanbul ignore next: very unusual */ '').split(colon), - ] - ) - const pathExtExe = isWindows - ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' - : '' - const pathExt = isWindows ? pathExtExe.split(colon) : [''] +/***/ }), +/* 373 */ +/***/ (function(module, exports) { - if (isWindows) { - if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') - pathExt.unshift('') - } +module.exports = require("events"); - return { - pathEnv, - pathExt, - pathExtExe, - } -} +/***/ }), +/* 374 */ +/***/ (function(module, exports, __webpack_require__) { -const which = (cmd, opt, cb) => { - if (typeof opt === 'function') { - cb = opt - opt = {} - } - if (!opt) - opt = {} +"use strict"; - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] +const isStream = __webpack_require__(375); +const getStream = __webpack_require__(376); +const mergeStream = __webpack_require__(383); - const step = i => new Promise((resolve, reject) => { - if (i === pathEnv.length) - return opt.all && found.length ? resolve(found) - : reject(getNotFoundError(cmd)) +// `input` option +const handleInput = (spawned, input) => { + // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 + // TODO: Remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 + if (input === undefined || spawned.stdin === undefined) { + return; + } - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw + if (isStream(input)) { + input.pipe(spawned.stdin); + } else { + spawned.stdin.end(input); + } +}; - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd +// `all` interleaves `stdout` and `stderr` +const makeAllStream = (spawned, {all}) => { + if (!all || (!spawned.stdout && !spawned.stderr)) { + return; + } - resolve(subStep(p, i, 0)) - }) + const mixed = mergeStream(); - const subStep = (p, i, ii) => new Promise((resolve, reject) => { - if (ii === pathExt.length) - return resolve(step(i + 1)) - const ext = pathExt[ii] - isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { - if (!er && is) { - if (opt.all) - found.push(p + ext) - else - return resolve(p + ext) - } - return resolve(subStep(p, i, ii + 1)) - }) - }) + if (spawned.stdout) { + mixed.add(spawned.stdout); + } - return cb ? step(0).then(res => cb(null, res), cb) : step(0) -} + if (spawned.stderr) { + mixed.add(spawned.stderr); + } -const whichSync = (cmd, opt) => { - opt = opt || {} + return mixed; +}; - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] +// On failure, `result.stdout|stderr|all` should contain the currently buffered stream +const getBufferedData = async (stream, streamPromise) => { + if (!stream) { + return; + } - for (let i = 0; i < pathEnv.length; i ++) { - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw + stream.destroy(); - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd + try { + return await streamPromise; + } catch (error) { + return error.bufferedData; + } +}; - for (let j = 0; j < pathExt.length; j ++) { - const cur = p + pathExt[j] - try { - const is = isexe.sync(cur, { pathExt: pathExtExe }) - if (is) { - if (opt.all) - found.push(cur) - else - return cur - } - } catch (ex) {} - } - } +const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { + if (!stream || !buffer) { + return; + } - if (opt.all && found.length) - return found + if (encoding) { + return getStream(stream, {encoding, maxBuffer}); + } - if (opt.nothrow) - return null + return getStream.buffer(stream, {maxBuffer}); +}; - throw getNotFoundError(cmd) -} +// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) +const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { + const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); + const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); + const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); + + try { + return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); + } catch (error) { + return Promise.all([ + {error, signal: error.signal, timedOut: error.timedOut}, + getBufferedData(stdout, stdoutPromise), + getBufferedData(stderr, stderrPromise), + getBufferedData(all, allPromise) + ]); + } +}; + +const validateInputSync = ({input}) => { + if (isStream(input)) { + throw new TypeError('The `input` option cannot be a stream in sync mode'); + } +}; + +module.exports = { + handleInput, + makeAllStream, + getSpawnedResult, + validateInputSync +}; -module.exports = which -which.sync = whichSync /***/ }), -/* 377 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(23) -var core -if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = __webpack_require__(378) -} else { - core = __webpack_require__(379) -} +"use strict"; -module.exports = isexe -isexe.sync = sync -function isexe (path, options, cb) { - if (typeof options === 'function') { - cb = options - options = {} - } +const isStream = stream => + stream !== null && + typeof stream === 'object' && + typeof stream.pipe === 'function'; - if (!cb) { - if (typeof Promise !== 'function') { - throw new TypeError('callback not provided') - } +isStream.writable = stream => + isStream(stream) && + stream.writable !== false && + typeof stream._write === 'function' && + typeof stream._writableState === 'object'; - return new Promise(function (resolve, reject) { - isexe(path, options || {}, function (er, is) { - if (er) { - reject(er) - } else { - resolve(is) - } - }) - }) - } +isStream.readable = stream => + isStream(stream) && + stream.readable !== false && + typeof stream._read === 'function' && + typeof stream._readableState === 'object'; - core(path, options || {}, function (er, is) { - // ignore EACCES because that just means we aren't allowed to run it - if (er) { - if (er.code === 'EACCES' || options && options.ignoreErrors) { - er = null - is = false - } - } - cb(er, is) - }) -} +isStream.duplex = stream => + isStream.writable(stream) && + isStream.readable(stream); -function sync (path, options) { - // my kingdom for a filtered catch - try { - return core.sync(path, options || {}) - } catch (er) { - if (options && options.ignoreErrors || er.code === 'EACCES') { - return false - } else { - throw er - } - } -} +isStream.transform = stream => + isStream.duplex(stream) && + typeof stream._transform === 'function' && + typeof stream._transformState === 'object'; + +module.exports = isStream; /***/ }), -/* 378 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = isexe -isexe.sync = sync +"use strict"; -var fs = __webpack_require__(23) +const pump = __webpack_require__(377); +const bufferStream = __webpack_require__(381); -function checkPathExt (path, options) { - var pathext = options.pathExt !== undefined ? - options.pathExt : process.env.PATHEXT +class MaxBufferError extends Error { + constructor() { + super('maxBuffer exceeded'); + this.name = 'MaxBufferError'; + } +} - if (!pathext) { - return true - } +async function getStream(inputStream, options) { + if (!inputStream) { + return Promise.reject(new Error('Expected a stream')); + } - pathext = pathext.split(';') - if (pathext.indexOf('') !== -1) { - return true - } - for (var i = 0; i < pathext.length; i++) { - var p = pathext[i].toLowerCase() - if (p && path.substr(-p.length).toLowerCase() === p) { - return true - } - } - return false -} + options = { + maxBuffer: Infinity, + ...options + }; -function checkStat (stat, path, options) { - if (!stat.isSymbolicLink() && !stat.isFile()) { - return false - } - return checkPathExt(path, options) -} + const {maxBuffer} = options; -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, path, options)) - }) -} + let stream; + await new Promise((resolve, reject) => { + const rejectPromise = error => { + if (error) { // A null check + error.bufferedData = stream.getBufferedValue(); + } -function sync (path, options) { - return checkStat(fs.statSync(path), path, options) + reject(error); + }; + + stream = pump(inputStream, bufferStream(options), error => { + if (error) { + rejectPromise(error); + return; + } + + resolve(); + }); + + stream.on('data', () => { + if (stream.getBufferedLength() > maxBuffer) { + rejectPromise(new MaxBufferError()); + } + }); + }); + + return stream.getBufferedValue(); } +module.exports = getStream; +// TODO: Remove this for the next major release +module.exports.default = getStream; +module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); +module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); +module.exports.MaxBufferError = MaxBufferError; + /***/ }), -/* 379 */ +/* 377 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = isexe -isexe.sync = sync +var once = __webpack_require__(378) +var eos = __webpack_require__(380) +var fs = __webpack_require__(349) // we only need fs to get the ReadStream and WriteStream prototypes -var fs = __webpack_require__(23) +var noop = function () {} +var ancient = /^v?\.0/.test(process.version) -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, options)) - }) +var isFn = function (fn) { + return typeof fn === 'function' } -function sync (path, options) { - return checkStat(fs.statSync(path), options) +var isFS = function (stream) { + if (!ancient) return false // newer node version do not need to care about fs is a special way + if (!fs) return false // browser + return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) } -function checkStat (stat, options) { - return stat.isFile() && checkMode(stat, options) +var isRequest = function (stream) { + return stream.setHeader && isFn(stream.abort) } -function checkMode (stat, options) { - var mod = stat.mode - var uid = stat.uid - var gid = stat.gid +var destroyer = function (stream, reading, writing, callback) { + callback = once(callback) - var myUid = options.uid !== undefined ? - options.uid : process.getuid && process.getuid() - var myGid = options.gid !== undefined ? - options.gid : process.getgid && process.getgid() + var closed = false + stream.on('close', function () { + closed = true + }) - var u = parseInt('100', 8) - var g = parseInt('010', 8) - var o = parseInt('001', 8) - var ug = u | g + eos(stream, {readable: reading, writable: writing}, function (err) { + if (err) return callback(err) + closed = true + callback() + }) - var ret = (mod & o) || - (mod & g) && gid === myGid || - (mod & u) && uid === myUid || - (mod & ug) && myUid === 0 + var destroyed = false + return function (err) { + if (closed) return + if (destroyed) return + destroyed = true - return ret -} + if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks + if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + if (isFn(stream.destroy)) return stream.destroy() -/***/ }), -/* 380 */ -/***/ (function(module, exports, __webpack_require__) { + callback(err || new Error('stream was destroyed')) + } +} -"use strict"; +var call = function (fn) { + fn() +} +var pipe = function (from, to) { + return from.pipe(to) +} -const pathKey = (options = {}) => { - const environment = options.env || process.env; - const platform = options.platform || process.platform; +var pump = function () { + var streams = Array.prototype.slice.call(arguments) + var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop - if (platform !== 'win32') { - return 'PATH'; - } + if (Array.isArray(streams[0])) streams = streams[0] + if (streams.length < 2) throw new Error('pump requires two streams per minimum') - return Object.keys(environment).find(key => key.toUpperCase() === 'PATH') || 'Path'; -}; + var error + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1 + var writing = i > 0 + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err + if (err) destroys.forEach(call) + if (reading) return + destroys.forEach(call) + callback(error) + }) + }) -module.exports = pathKey; -// TODO: Remove this for the next major release -module.exports.default = pathKey; + return streams.reduce(pipe) +} + +module.exports = pump /***/ }), -/* 381 */ +/* 378 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - +var wrappy = __webpack_require__(379) +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) -// See http://www.robvanderwoude.com/escapechars.php -const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) -function escapeCommand(arg) { - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) - return arg; +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f } -function escapeArgument(arg, doubleEscapeMetaChars) { - // Convert to string - arg = `${arg}`; +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} - // Algorithm below is based on https://qntm.org/cmd - // Sequence of backslashes followed by a double quote: - // double up all the backslashes and escape the double quote - arg = arg.replace(/(\\*)"/g, '$1$1\\"'); +/***/ }), +/* 379 */ +/***/ (function(module, exports) { - // Sequence of backslashes followed by the end of the string - // (which will become a double quote later): - // double up all the backslashes - arg = arg.replace(/(\\*)$/, '$1$1'); +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) - // All other backslashes occur literally + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') - // Quote the whole thing: - arg = `"${arg}"`; + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); + return wrapper - // Double escape meta chars if necessary - if (doubleEscapeMetaChars) { - arg = arg.replace(metaCharsRegExp, '^$1'); + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] } - - return arg; + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } } -module.exports.command = escapeCommand; -module.exports.argument = escapeArgument; - /***/ }), -/* 382 */ +/* 380 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var once = __webpack_require__(378); +var noop = function() {}; -const fs = __webpack_require__(23); -const shebangCommand = __webpack_require__(383); +var isRequest = function(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +}; -function readShebang(command) { - // Read the first 150 bytes from the file - const size = 150; - const buffer = Buffer.alloc(size); +var isChildProcess = function(stream) { + return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 +}; - let fd; +var eos = function(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; - try { - fd = fs.openSync(command, 'r'); - fs.readSync(fd, buffer, 0, size, 0); - fs.closeSync(fd); - } catch (e) { /* Empty */ } + callback = once(callback || noop); - // Attempt to extract shebang (null is returned if not a shebang) - return shebangCommand(buffer.toString()); -} + var ws = stream._writableState; + var rs = stream._readableState; + var readable = opts.readable || (opts.readable !== false && stream.readable); + var writable = opts.writable || (opts.writable !== false && stream.writable); -module.exports = readShebang; + var onlegacyfinish = function() { + if (!stream.writable) onfinish(); + }; + var onfinish = function() { + writable = false; + if (!readable) callback.call(stream); + }; -/***/ }), -/* 383 */ -/***/ (function(module, exports, __webpack_require__) { + var onend = function() { + readable = false; + if (!writable) callback.call(stream); + }; -"use strict"; + var onexit = function(exitCode) { + callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); + }; -const shebangRegex = __webpack_require__(384); + var onerror = function(err) { + callback.call(stream, err); + }; -module.exports = (string = '') => { - const match = string.match(shebangRegex); + var onclose = function() { + if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close')); + if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close')); + }; - if (!match) { - return null; + var onrequest = function() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest(); + else stream.on('request', onrequest); + } else if (writable && !ws) { // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); } - const [path, argument] = match[0].replace(/#! ?/, '').split(' '); - const binary = path.split('/').pop(); + if (isChildProcess(stream)) stream.on('exit', onexit); - if (binary === 'env') { - return argument; - } + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); - return argument ? `${binary} ${argument}` : binary; + return function() { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('exit', onexit); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; }; +module.exports = eos; + /***/ }), -/* 384 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = /^#!(.*)/; +const {PassThrough: PassThroughStream} = __webpack_require__(382); +module.exports = options => { + options = {...options}; -/***/ }), -/* 385 */ -/***/ (function(module, exports, __webpack_require__) { + const {array} = options; + let {encoding} = options; + const isBuffer = encoding === 'buffer'; + let objectMode = false; -"use strict"; + if (array) { + objectMode = !(encoding || isBuffer); + } else { + encoding = encoding || 'utf8'; + } + if (isBuffer) { + encoding = null; + } -const isWin = process.platform === 'win32'; + const stream = new PassThroughStream({objectMode}); -function notFoundError(original, syscall) { - return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { - code: 'ENOENT', - errno: 'ENOENT', - syscall: `${syscall} ${original.command}`, - path: original.command, - spawnargs: original.args, - }); -} + if (encoding) { + stream.setEncoding(encoding); + } -function hookChildProcess(cp, parsed) { - if (!isWin) { - return; - } + let length = 0; + const chunks = []; - const originalEmit = cp.emit; + stream.on('data', chunk => { + chunks.push(chunk); - cp.emit = function (name, arg1) { - // If emitting "exit" event and exit code is 1, we need to check if - // the command exists and emit an "error" instead - // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 - if (name === 'exit') { - const err = verifyENOENT(arg1, parsed, 'spawn'); + if (objectMode) { + length = chunks.length; + } else { + length += chunk.length; + } + }); - if (err) { - return originalEmit.call(cp, 'error', err); - } - } + stream.getBufferedValue = () => { + if (array) { + return chunks; + } - return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params - }; -} + return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); + }; -function verifyENOENT(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawn'); - } + stream.getBufferedLength = () => length; - return null; -} + return stream; +}; -function verifyENOENTSync(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawnSync'); - } - return null; -} - -module.exports = { - hookChildProcess, - verifyENOENT, - verifyENOENTSync, - notFoundError, -}; +/***/ }), +/* 382 */ +/***/ (function(module, exports) { +module.exports = require("stream"); /***/ }), -/* 386 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = input => { - const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); - const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); +const { PassThrough } = __webpack_require__(382); - if (input[input.length - 1] === LF) { - input = input.slice(0, input.length - 1); - } +module.exports = function (/*streams...*/) { + var sources = [] + var output = new PassThrough({objectMode: true}) - if (input[input.length - 1] === CR) { - input = input.slice(0, input.length - 1); - } + output.setMaxListeners(0) - return input; -}; + output.add = add + output.isEmpty = isEmpty + + output.on('unpipe', remove) + + Array.prototype.slice.call(arguments).forEach(add) + + return output + + function add (source) { + if (Array.isArray(source)) { + source.forEach(add) + return this + } + + sources.push(source); + source.once('end', remove.bind(null, source)) + source.once('error', output.emit.bind(output, 'error')) + source.pipe(output, {end: false}) + return this + } + + function isEmpty () { + return sources.length == 0; + } + + function remove (source) { + sources = sources.filter(function (it) { return it !== source }) + if (!sources.length && output.readable) { output.end() } + } +} /***/ }), -/* 387 */ +/* 384 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const pathKey = __webpack_require__(380); -const npmRunPath = options => { - options = { - cwd: process.cwd(), - path: process.env[pathKey()], - execPath: process.execPath, - ...options - }; +const nativePromisePrototype = (async () => {})().constructor.prototype; +const descriptors = ['then', 'catch', 'finally'].map(property => [ + property, + Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property) +]); - let previous; - let cwdPath = path.resolve(options.cwd); - const result = []; +// The return value is a mixin of `childProcess` and `Promise` +const mergePromise = (spawned, promise) => { + for (const [property, descriptor] of descriptors) { + // Starting the main `promise` is deferred to avoid consuming streams + const value = typeof promise === 'function' ? + (...args) => Reflect.apply(descriptor.value, promise(), args) : + descriptor.value.bind(promise); - while (previous !== cwdPath) { - result.push(path.join(cwdPath, 'node_modules/.bin')); - previous = cwdPath; - cwdPath = path.resolve(cwdPath, '..'); + Reflect.defineProperty(spawned, property, {...descriptor, value}); } - // Ensure the running `node` binary is used - const execPathDir = path.resolve(options.cwd, options.execPath, '..'); - result.push(execPathDir); - - return result.concat(options.path).join(path.delimiter); + return spawned; }; -module.exports = npmRunPath; -// TODO: Remove this for the next major release -module.exports.default = npmRunPath; - -module.exports.env = options => { - options = { - env: process.env, - ...options - }; +// Use promises instead of `child_process` events +const getSpawnedPromise = spawned => { + return new Promise((resolve, reject) => { + spawned.on('exit', (exitCode, signal) => { + resolve({exitCode, signal}); + }); - const env = {...options.env}; - const path = pathKey({env}); + spawned.on('error', error => { + reject(error); + }); - options.path = env[path]; - env[path] = module.exports(options); + if (spawned.stdin) { + spawned.stdin.on('error', error => { + reject(error); + }); + } + }); +}; - return env; +module.exports = { + mergePromise, + getSpawnedPromise }; + /***/ }), -/* 388 */ +/* 385 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(389); - -const calledFunctions = new WeakMap(); +const SPACES_REGEXP = / +/g; -const oneTime = (fn, options = {}) => { - if (typeof fn !== 'function') { - throw new TypeError('Expected a function'); +const joinCommand = (file, args = []) => { + if (!Array.isArray(args)) { + return file; } - let ret; - let isCalled = false; - let callCount = 0; - const functionName = fn.displayName || fn.name || ''; - - const onetime = function (...args) { - calledFunctions.set(onetime, ++callCount); - - if (isCalled) { - if (options.throw === true) { - throw new Error(`Function \`${functionName}\` can only be called once`); - } - - return ret; - } + return [file, ...args].join(' '); +}; - isCalled = true; - ret = fn.apply(this, args); - fn = null; +// Allow spaces to be escaped by a backslash if not meant as a delimiter +const handleEscaping = (tokens, token, index) => { + if (index === 0) { + return [token]; + } - return ret; - }; + const previousToken = tokens[tokens.length - 1]; - mimicFn(onetime, fn); - calledFunctions.set(onetime, callCount); + if (previousToken.endsWith('\\')) { + return [...tokens.slice(0, -1), `${previousToken.slice(0, -1)} ${token}`]; + } - return onetime; + return [...tokens, token]; }; -module.exports = oneTime; -// TODO: Remove this for the next major release -module.exports.default = oneTime; - -module.exports.callCount = fn => { - if (!calledFunctions.has(fn)) { - throw new Error(`The given function \`${fn.name}\` is not wrapped by the \`onetime\` package`); - } +// Handle `execa.command()` +const parseCommand = command => { + return command + .trim() + .split(SPACES_REGEXP) + .reduce(handleEscaping, []); +}; - return calledFunctions.get(fn); +module.exports = { + joinCommand, + parseCommand }; /***/ }), -/* 389 */ +/* 386 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(388); +const stdoutColor = __webpack_require__(393).stdout; -const mimicFn = (to, from) => { - for (const prop of Reflect.ownKeys(from)) { - Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); - } +const template = __webpack_require__(395); - return to; -}; +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); -module.exports = mimicFn; -// TODO: Remove this for the next major release -module.exports.default = mimicFn; +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); -/***/ }), -/* 390 */ -/***/ (function(module, exports, __webpack_require__) { +const styles = Object.create(null); -"use strict"; +function applyOptions(obj, options) { + options = options || {}; -const {signalsByName} = __webpack_require__(391); + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} -const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { - if (timedOut) { - return `timed out after ${timeout} milliseconds`; - } +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); - if (isCanceled) { - return 'was canceled'; - } + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; - if (errorCode !== undefined) { - return `failed with ${errorCode}`; - } + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); - if (signal !== undefined) { - return `was killed with ${signal} (${signalDescription})`; - } + chalk.template.constructor = Chalk; - if (exitCode !== undefined) { - return `failed with exit code ${exitCode}`; + return chalk.template; } - return 'failed'; -}; + applyOptions(this, options); +} -const makeError = ({ - stdout, - stderr, - all, - error, - signal, - exitCode, - command, - timedOut, - isCanceled, - killed, - parsed: {options: {timeout}} -}) => { - // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. - // We normalize them to `undefined` - exitCode = exitCode === null ? undefined : exitCode; - signal = signal === null ? undefined : signal; - const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} - const errorCode = error && error.code; +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); - const execaMessage = `Command ${prefix}: ${command}`; - const isError = Object.prototype.toString.call(error) === '[object Error]'; - const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage; - const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} - if (isError) { - error.originalMessage = error.message; - error.message = message; - } else { - error = new Error(message); +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); } +}; - error.shortMessage = shortMessage; - error.command = command; - error.exitCode = exitCode; - error.signal = signal; - error.signalDescription = signalDescription; - error.stdout = stdout; - error.stderr = stderr; - - if (all !== undefined) { - error.all = all; +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; } - if ('bufferedData' in error) { - delete error.bufferedData; - } + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} - error.failed = true; - error.timedOut = Boolean(timedOut); - error.isCanceled = isCanceled; - error.killed = killed && !timedOut; +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } - return error; -}; + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} -module.exports = makeError; +const proto = Object.defineProperties(() => {}, styles); +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -/***/ }), -/* 391 */ -/***/ (function(module, exports, __webpack_require__) { + builder._styles = _styles; + builder._empty = _empty; -"use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(11); + const self = this; -var _signals=__webpack_require__(392); -var _realtime=__webpack_require__(394); + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; -const getSignalsByName=function(){ -const signals=(0,_signals.getSignals)(); -return signals.reduce(getSignalByName,{}); -}; + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto -const getSignalByName=function( -signalByNameMemo, -{name,number,description,supported,action,forced,standard}) -{ -return{ -...signalByNameMemo, -[name]:{name,number,description,supported,action,forced,standard}}; + return builder; +} -}; +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); -const signalsByName=getSignalsByName();exports.signalsByName=signalsByName; + if (argsLen === 0) { + return ''; + } + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } -const getSignalsByNumber=function(){ -const signals=(0,_signals.getSignals)(); -const length=_realtime.SIGRTMAX+1; -const signalsA=Array.from({length},(value,number)=> -getSignalByNumber(number,signals)); + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; -return Object.assign({},...signalsA); -}; + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } -const getSignalByNumber=function(number,signals){ -const signal=findSignalByNumber(number,signals); + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -if(signal===undefined){ -return{}; + return str; } -const{name,description,supported,action,forced,standard}=signal; -return{ -[number]:{ -name, -number, -description, -supported, -action, -forced, -standard}}; - - -}; - +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; -const findSignalByNumber=function(number,signals){ -const signal=signals.find(({name})=>_os.constants.signals[name]===number); + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } -if(signal!==undefined){ -return signal; + return template(chalk, parts.join('')); } -return signals.find(signalA=>signalA.number===number); -}; +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript -const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumber; -//# sourceMappingURL=main.js.map /***/ }), -/* 392 */ +/* 387 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(11); -var _core=__webpack_require__(393); -var _realtime=__webpack_require__(394); +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } -const getSignals=function(){ -const realtimeSignals=(0,_realtime.getRealtimeSignals)(); -const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal); -return signals; -};exports.getSignals=getSignals; + return str.replace(matchOperatorsRe, '\\$&'); +}; - - - - - -const normalizeSignal=function({ -name, -number:defaultNumber, -description, -action, -forced=false, -standard}) -{ -const{ -signals:{[name]:constantSignal}}= -_os.constants; -const supported=constantSignal!==undefined; -const number=supported?constantSignal:defaultNumber; -return{name,number,description,supported,action,forced,standard}; -}; -//# sourceMappingURL=signals.js.map - /***/ }), -/* 393 */ +/* 388 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.SIGNALS=void 0; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(389); -const SIGNALS=[ -{ -name:"SIGHUP", -number:1, -action:"terminate", -description:"Terminal closed", -standard:"posix"}, +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; -{ -name:"SIGINT", -number:2, -action:"terminate", -description:"User interruption with CTRL-C", -standard:"ansi"}, +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; -{ -name:"SIGQUIT", -number:3, -action:"core", -description:"User interruption with CTRL-\\", -standard:"posix"}, +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -{ -name:"SIGILL", -number:4, -action:"core", -description:"Invalid machine instruction", -standard:"ansi"}, +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], -{ -name:"SIGTRAP", -number:5, -action:"core", -description:"Debugger breakpoint", -standard:"posix"}, + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -{ -name:"SIGABRT", -number:6, -action:"core", -description:"Aborted", -standard:"ansi"}, + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -{ -name:"SIGIOT", -number:6, -action:"core", -description:"Aborted", -standard:"bsd"}, + // Fix humans + styles.color.grey = styles.color.gray; -{ -name:"SIGBUS", -number:7, -action:"core", -description: -"Bus error due to misaligned, non-existing address or paging error", -standard:"bsd"}, + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -{ -name:"SIGEMT", -number:7, -action:"terminate", -description:"Command should be emulated but is not implemented", -standard:"other"}, + for (const styleName of Object.keys(group)) { + const style = group[styleName]; -{ -name:"SIGFPE", -number:8, -action:"core", -description:"Floating point arithmetic error", -standard:"ansi"}, + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; -{ -name:"SIGKILL", -number:9, -action:"terminate", -description:"Forced termination", -standard:"posix", -forced:true}, + group[styleName] = styles[styleName]; -{ -name:"SIGUSR1", -number:10, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, + codes.set(style[0], style[1]); + } -{ -name:"SIGSEGV", -number:11, -action:"core", -description:"Segmentation fault", -standard:"ansi"}, + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); -{ -name:"SIGUSR2", -number:12, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } -{ -name:"SIGPIPE", -number:13, -action:"terminate", -description:"Broken pipe or socket", -standard:"posix"}, + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; -{ -name:"SIGALRM", -number:14, -action:"terminate", -description:"Timeout or timer", -standard:"posix"}, + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; -{ -name:"SIGTERM", -number:15, -action:"terminate", -description:"Termination", -standard:"ansi"}, + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; -{ -name:"SIGSTKFLT", -number:16, -action:"terminate", -description:"Stack is empty or overflowed", -standard:"other"}, + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; -{ -name:"SIGCHLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"posix"}, + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } -{ -name:"SIGCLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"other"}, + const suite = colorConvert[key]; -{ -name:"SIGCONT", -number:18, -action:"unpause", -description:"Unpaused", -standard:"posix", -forced:true}, + if (key === 'ansi16') { + key = 'ansi'; + } -{ -name:"SIGSTOP", -number:19, -action:"pause", -description:"Paused", -standard:"posix", -forced:true}, + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } -{ -name:"SIGTSTP", -number:20, -action:"pause", -description:"Paused using CTRL-Z or \"suspend\"", -standard:"posix"}, + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } -{ -name:"SIGTTIN", -number:21, -action:"pause", -description:"Background process cannot read terminal input", -standard:"posix"}, + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } -{ -name:"SIGBREAK", -number:21, -action:"terminate", -description:"User interruption with CTRL-BREAK", -standard:"other"}, + return styles; +} -{ -name:"SIGTTOU", -number:22, -action:"pause", -description:"Background process cannot write to terminal output", -standard:"posix"}, +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); -{ -name:"SIGURG", -number:23, -action:"ignore", -description:"Socket received out-of-band data", -standard:"bsd"}, +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) -{ -name:"SIGXCPU", -number:24, -action:"core", -description:"Process timed out", -standard:"bsd"}, +/***/ }), +/* 389 */ +/***/ (function(module, exports, __webpack_require__) { -{ -name:"SIGXFSZ", -number:25, -action:"core", -description:"File too big", -standard:"bsd"}, +var conversions = __webpack_require__(390); +var route = __webpack_require__(392); -{ -name:"SIGVTALRM", -number:26, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, +var convert = {}; -{ -name:"SIGPROF", -number:27, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, +var models = Object.keys(conversions); -{ -name:"SIGWINCH", -number:28, -action:"ignore", -description:"Terminal window size changed", -standard:"bsd"}, +function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } -{ -name:"SIGIO", -number:29, -action:"terminate", -description:"I/O is available", -standard:"other"}, + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } -{ -name:"SIGPOLL", -number:29, -action:"terminate", -description:"Watched event", -standard:"other"}, + return fn(args); + }; -{ -name:"SIGINFO", -number:29, -action:"ignore", -description:"Request for process information", -standard:"other"}, + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } -{ -name:"SIGPWR", -number:30, -action:"terminate", -description:"Device running out of power", -standard:"systemv"}, + return wrappedFn; +} -{ -name:"SIGSYS", -number:31, -action:"core", -description:"Invalid system call", -standard:"other"}, +function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } -{ -name:"SIGUNUSED", -number:31, -action:"terminate", -description:"Invalid system call", -standard:"other"}];exports.SIGNALS=SIGNALS; -//# sourceMappingURL=core.js.map + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } -/***/ }), -/* 394 */ -/***/ (function(module, exports, __webpack_require__) { + var result = fn(args); -"use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.SIGRTMAX=exports.getRealtimeSignals=void 0; -const getRealtimeSignals=function(){ -const length=SIGRTMAX-SIGRTMIN+1; -return Array.from({length},getRealtimeSignal); -};exports.getRealtimeSignals=getRealtimeSignals; + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } -const getRealtimeSignal=function(value,index){ -return{ -name:`SIGRT${index+1}`, -number:SIGRTMIN+index, -action:"terminate", -description:"Application-specific signal (realtime)", -standard:"posix"}; + return result; + }; -}; + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } -const SIGRTMIN=34; -const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; -//# sourceMappingURL=realtime.js.map + return wrappedFn; +} -/***/ }), -/* 395 */ -/***/ (function(module, exports, __webpack_require__) { +models.forEach(function (fromModel) { + convert[fromModel] = {}; -"use strict"; + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); -const aliases = ['stdin', 'stdout', 'stderr']; + var routes = route(fromModel); + var routeModels = Object.keys(routes); -const hasAlias = opts => aliases.some(alias => opts[alias] !== undefined); + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; -const normalizeStdio = opts => { - if (!opts) { - return; - } + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); - const {stdio} = opts; +module.exports = convert; - if (stdio === undefined) { - return aliases.map(alias => opts[alias]); - } - if (hasAlias(opts)) { - throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); - } +/***/ }), +/* 390 */ +/***/ (function(module, exports, __webpack_require__) { - if (typeof stdio === 'string') { - return stdio; - } +/* MIT license */ +var cssKeywords = __webpack_require__(391); - if (!Array.isArray(stdio)) { - throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) + +var reverseKeywords = {}; +for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; } +} - const length = Math.max(stdio.length, aliases.length); - return Array.from({length}, (value, index) => stdio[index]); +var convert = module.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} }; -module.exports = normalizeStdio; +// hide .channels and .labels properties +for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } -// `ipc` is pushed unless it is already present -module.exports.node = opts => { - const stdio = normalizeStdio(opts); + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - if (stdio === 'ipc') { - return 'ipc'; - } + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } - if (stdio === undefined || typeof stdio === 'string') { - return [stdio, stdio, stdio, 'ipc']; + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); } +} - if (stdio.includes('ipc')) { - return stdio; +convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; + + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; } - return [...stdio, 'ipc']; -}; + h = Math.min(h * 60, 360); + if (h < 0) { + h += 360; + } -/***/ }), -/* 396 */ -/***/ (function(module, exports, __webpack_require__) { + l = (min + max) / 2; -"use strict"; + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } -const os = __webpack_require__(11); -const onExit = __webpack_require__(397); + return [h, s * 100, l * 100]; +}; -const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; +convert.rgb.hsv = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var v; -// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior -const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { - const killResult = kill(signal); - setKillTimeout(kill, signal, options, killResult); - return killResult; -}; + if (max === 0) { + s = 0; + } else { + s = (delta / max * 1000) / 10; + } -const setKillTimeout = (kill, signal, options, killResult) => { - if (!shouldForceKill(signal, options, killResult)) { - return; + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; } - const timeout = getForceKillAfterTimeout(options); - const t = setTimeout(() => { - kill('SIGKILL'); - }, timeout); + h = Math.min(h * 60, 360); - // Guarded because there's no `.unref()` when `execa` is used in the renderer - // process in Electron. This cannot be tested since we don't run tests in - // Electron. - // istanbul ignore else - if (t.unref) { - t.unref(); + if (h < 0) { + h += 360; } -}; -const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => { - return isSigterm(signal) && forceKillAfterTimeout !== false && killResult; -}; + v = ((max / 255) * 1000) / 10; -const isSigterm = signal => { - return signal === os.constants.signals.SIGTERM || - (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); + return [h, s, v]; }; -const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { - if (forceKillAfterTimeout === true) { - return DEFAULT_FORCE_KILL_TIMEOUT; - } +convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); - if (!Number.isInteger(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { - throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); - } + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); - return forceKillAfterTimeout; + return [h, w * 100, b * 100]; }; -// `childProcess.cancel()` -const spawnedCancel = (spawned, context) => { - const killResult = spawned.kill(); +convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; - if (killResult) { - context.isCanceled = true; - } -}; + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; -const timeoutKill = (spawned, signal, reject) => { - spawned.kill(signal); - reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); + return [c * 100, m * 100, y * 100, k * 100]; }; -// `timeout` option handling -const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { - if (timeout === 0 || timeout === undefined) { - return spawnedPromise; - } +/** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ +function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); +} - if (!Number.isInteger(timeout) || timeout < 0) { - throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); +convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; } - let timeoutId; - const timeoutPromise = new Promise((resolve, reject) => { - timeoutId = setTimeout(() => { - timeoutKill(spawned, killSignal, reject); - }, timeout); - }); + var currentClosestDistance = Infinity; + var currentClosestKeyword; - const safeSpawnedPromise = spawnedPromise.finally(() => { - clearTimeout(timeoutId); - }); + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; - return Promise.race([timeoutPromise, safeSpawnedPromise]); -}; + // Compute comparative distance + var distance = comparativeDistance(rgb, value); -// `cleanup` option handling -const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { - if (!cleanup || detached) { - return timedPromise; + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } } - const removeExitHandler = onExit(() => { - spawned.kill(); - }); - - return timedPromise.finally(() => { - removeExitHandler(); - }); + return currentClosestKeyword; }; -module.exports = { - spawnedKill, - spawnedCancel, - setupTimeout, - setExitHandler +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; }; +convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; -/***/ }), -/* 397 */ -/***/ (function(module, exports, __webpack_require__) { + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -var assert = __webpack_require__(30) -var signals = __webpack_require__(398) + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); -var EE = __webpack_require__(399) -/* istanbul ignore if */ -if (typeof EE !== 'function') { - EE = EE.EventEmitter -} + return [x * 100, y * 100, z * 100]; +}; -var emitter -if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ -} else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} -} +convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; -// Because this emitter is a global, we have to check to see if a -// previous version of this library failed to enable infinite listeners. -// I know what you're about to say. But literally everything about -// signal-exit is a compromise with evil. Get used to it. -if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true -} + x /= 95.047; + y /= 100; + z /= 108.883; -module.exports = function (cb, opts) { - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); - if (loaded === false) { - load() - } + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } + return [l, a, b]; +}; - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) +convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; - return remove -} + if (s === 0) { + val = l * 255; + return [val, val, val]; + } -module.exports.unload = unload -function unload () { - if (!loaded) { - return - } - loaded = false + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 -} + t1 = 2 * l - t2; -function emit (event, code, signal) { - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) -} + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } -// { : , ... } -var sigListeners = {} -signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } -}) + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } -module.exports.signals = function () { - return signals -} + rgb[i] = val * 255; + } -module.exports.load = load + return rgb; +}; -var loaded = false +convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; -function load () { - if (loaded) { - return - } - loaded = true + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 + return [h, sv * 100, v * 100]; +}; - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) +convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; - process.emit = processEmit - process.reallyExit = processReallyExit -} + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; -var originalProcessReallyExit = process.reallyExit -function processReallyExit (code) { - process.exitCode = code || 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) -} + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; -var originalProcessEmit = process.emit -function processEmit (ev, arg) { - if (ev === 'exit') { - if (arg !== undefined) { - process.exitCode = arg - } - var ret = originalProcessEmit.apply(this, arguments) - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } -} +convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; -/***/ }), -/* 398 */ -/***/ (function(module, exports) { + return [h, sl * 100, l * 100]; +}; -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] - -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) -} - -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) -} - - -/***/ }), -/* 399 */ -/***/ (function(module, exports) { - -module.exports = require("events"); - -/***/ }), -/* 400 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const isStream = __webpack_require__(401); -const getStream = __webpack_require__(402); -const mergeStream = __webpack_require__(408); +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; -// `input` option -const handleInput = (spawned, input) => { - // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 - // TODO: Remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 - if (input === undefined || spawned.stdin === undefined) { - return; + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; } - if (isStream(input)) { - input.pipe(spawned.stdin); - } else { - spawned.stdin.end(input); - } -}; + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; -// `all` interleaves `stdout` and `stderr` -const makeAllStream = (spawned, {all}) => { - if (!all || (!spawned.stdout && !spawned.stderr)) { - return; + if ((i & 0x01) !== 0) { + f = 1 - f; } - const mixed = mergeStream(); - - if (spawned.stdout) { - mixed.add(spawned.stdout); - } + n = wh + f * (v - wh); // linear interpolation - if (spawned.stderr) { - mixed.add(spawned.stderr); + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; } - return mixed; + return [r * 255, g * 255, b * 255]; }; -// On failure, `result.stdout|stderr|all` should contain the currently buffered stream -const getBufferedData = async (stream, streamPromise) => { - if (!stream) { - return; - } +convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; - stream.destroy(); + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); - try { - return await streamPromise; - } catch (error) { - return error.bufferedData; - } + return [r * 255, g * 255, b * 255]; }; -const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { - if (!stream || !buffer) { - return; - } +convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; - if (encoding) { - return getStream(stream, {encoding, maxBuffer}); - } + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - return getStream.buffer(stream, {maxBuffer}); -}; + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; -// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) -const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { - const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); - const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); - const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; - try { - return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); - } catch (error) { - return Promise.all([ - {error, signal: error.signal, timedOut: error.timedOut}, - getBufferedData(stdout, stdoutPromise), - getBufferedData(stderr, stderrPromise), - getBufferedData(all, allPromise) - ]); - } -}; + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; -const validateInputSync = ({input}) => { - if (isStream(input)) { - throw new TypeError('The `input` option cannot be a stream in sync mode'); - } -}; + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); -module.exports = { - handleInput, - makeAllStream, - getSpawnedResult, - validateInputSync + return [r * 255, g * 255, b * 255]; }; +convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + x /= 95.047; + y /= 100; + z /= 108.883; -/***/ }), -/* 401 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const isStream = stream => - stream !== null && - typeof stream === 'object' && - typeof stream.pipe === 'function'; + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); -isStream.writable = stream => - isStream(stream) && - stream.writable !== false && - typeof stream._write === 'function' && - typeof stream._writableState === 'object'; + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -isStream.readable = stream => - isStream(stream) && - stream.readable !== false && - typeof stream._read === 'function' && - typeof stream._readableState === 'object'; + return [l, a, b]; +}; -isStream.duplex = stream => - isStream.writable(stream) && - isStream.readable(stream); +convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; -isStream.transform = stream => - isStream.duplex(stream) && - typeof stream._transform === 'function' && - typeof stream._transformState === 'object'; + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; -module.exports = isStream; + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + x *= 95.047; + y *= 100; + z *= 108.883; -/***/ }), -/* 402 */ -/***/ (function(module, exports, __webpack_require__) { + return [x, y, z]; +}; -"use strict"; +convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; -const pump = __webpack_require__(403); -const bufferStream = __webpack_require__(407); + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; -class MaxBufferError extends Error { - constructor() { - super('maxBuffer exceeded'); - this.name = 'MaxBufferError'; + if (h < 0) { + h += 360; } -} -async function getStream(inputStream, options) { - if (!inputStream) { - return Promise.reject(new Error('Expected a stream')); - } + c = Math.sqrt(a * a + b * b); - options = { - maxBuffer: Infinity, - ...options - }; + return [l, c, h]; +}; - const {maxBuffer} = options; +convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; - let stream; - await new Promise((resolve, reject) => { - const rejectPromise = error => { - if (error) { // A null check - error.bufferedData = stream.getBufferedValue(); - } + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); - reject(error); - }; + return [l, a, b]; +}; - stream = pump(inputStream, bufferStream(options), error => { - if (error) { - rejectPromise(error); - return; - } +convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization - resolve(); - }); + value = Math.round(value / 50); - stream.on('data', () => { - if (stream.getBufferedLength() > maxBuffer) { - rejectPromise(new MaxBufferError()); - } - }); - }); + if (value === 0) { + return 30; + } - return stream.getBufferedValue(); -} + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); -module.exports = getStream; -// TODO: Remove this for the next major release -module.exports.default = getStream; -module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); -module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); -module.exports.MaxBufferError = MaxBufferError; + if (value === 2) { + ansi += 60; + } + return ansi; +}; -/***/ }), -/* 403 */ -/***/ (function(module, exports, __webpack_require__) { +convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; -var once = __webpack_require__(404) -var eos = __webpack_require__(406) -var fs = __webpack_require__(23) // we only need fs to get the ReadStream and WriteStream prototypes +convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; -var noop = function () {} -var ancient = /^v?\.0/.test(process.version) + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } -var isFn = function (fn) { - return typeof fn === 'function' -} + if (r > 248) { + return 231; + } -var isFS = function (stream) { - if (!ancient) return false // newer node version do not need to care about fs is a special way - if (!fs) return false // browser - return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) -} + return Math.round(((r - 8) / 247) * 24) + 232; + } -var isRequest = function (stream) { - return stream.setHeader && isFn(stream.abort) -} + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); -var destroyer = function (stream, reading, writing, callback) { - callback = once(callback) + return ansi; +}; - var closed = false - stream.on('close', function () { - closed = true - }) +convert.ansi16.rgb = function (args) { + var color = args % 10; - eos(stream, {readable: reading, writable: writing}, function (err) { - if (err) return callback(err) - closed = true - callback() - }) + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } - var destroyed = false - return function (err) { - if (closed) return - if (destroyed) return - destroyed = true + color = color / 10.5 * 255; - if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks - if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + return [color, color, color]; + } - if (isFn(stream.destroy)) return stream.destroy() + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; - callback(err || new Error('stream was destroyed')) - } -} + return [r, g, b]; +}; -var call = function (fn) { - fn() -} +convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } -var pipe = function (from, to) { - return from.pipe(to) -} + args -= 16; -var pump = function () { - var streams = Array.prototype.slice.call(arguments) - var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; - if (Array.isArray(streams[0])) streams = streams[0] - if (streams.length < 2) throw new Error('pump requires two streams per minimum') + return [r, g, b]; +}; - var error - var destroys = streams.map(function (stream, i) { - var reading = i < streams.length - 1 - var writing = i > 0 - return destroyer(stream, reading, writing, function (err) { - if (!error) error = err - if (err) destroys.forEach(call) - if (reading) return - destroys.forEach(call) - callback(error) - }) - }) +convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); - return streams.reduce(pipe) -} + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; -module.exports = pump +convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + var colorString = match[0]; -/***/ }), -/* 404 */ -/***/ (function(module, exports, __webpack_require__) { + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } -var wrappy = __webpack_require__(405) -module.exports = wrappy(once) -module.exports.strict = wrappy(onceStrict) + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true - return f.value = fn.apply(this, arguments) - } - var name = fn.name || 'Function wrapped with `once`' - f.onceError = name + " shouldn't be called more than once" - f.called = false - return f -} - - -/***/ }), -/* 405 */ -/***/ (function(module, exports) { - -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} - - -/***/ }), -/* 406 */ -/***/ (function(module, exports, __webpack_require__) { - -var once = __webpack_require__(404); - -var noop = function() {}; - -var isRequest = function(stream) { - return stream.setHeader && typeof stream.abort === 'function'; -}; - -var isChildProcess = function(stream) { - return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 + return [r, g, b]; }; -var eos = function(stream, opts, callback) { - if (typeof opts === 'function') return eos(stream, null, opts); - if (!opts) opts = {}; - - callback = once(callback || noop); - - var ws = stream._writableState; - var rs = stream._readableState; - var readable = opts.readable || (opts.readable !== false && stream.readable); - var writable = opts.writable || (opts.writable !== false && stream.writable); - - var onlegacyfinish = function() { - if (!stream.writable) onfinish(); - }; - - var onfinish = function() { - writable = false; - if (!readable) callback.call(stream); - }; - - var onend = function() { - readable = false; - if (!writable) callback.call(stream); - }; - - var onexit = function(exitCode) { - callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); - }; - - var onerror = function(err) { - callback.call(stream, err); - }; - - var onclose = function() { - if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close')); - if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close')); - }; - - var onrequest = function() { - stream.req.on('finish', onfinish); - }; +convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; - if (isRequest(stream)) { - stream.on('complete', onfinish); - stream.on('abort', onclose); - if (stream.req) onrequest(); - else stream.on('request', onrequest); - } else if (writable && !ws) { // legacy streams - stream.on('end', onlegacyfinish); - stream.on('close', onlegacyfinish); + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; } - if (isChildProcess(stream)) stream.on('exit', onexit); + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } - stream.on('end', onend); - stream.on('finish', onfinish); - if (opts.error !== false) stream.on('error', onerror); - stream.on('close', onclose); + hue /= 6; + hue %= 1; - return function() { - stream.removeListener('complete', onfinish); - stream.removeListener('abort', onclose); - stream.removeListener('request', onrequest); - if (stream.req) stream.req.removeListener('finish', onfinish); - stream.removeListener('end', onlegacyfinish); - stream.removeListener('close', onlegacyfinish); - stream.removeListener('finish', onfinish); - stream.removeListener('exit', onexit); - stream.removeListener('end', onend); - stream.removeListener('error', onerror); - stream.removeListener('close', onclose); - }; + return [hue * 360, chroma * 100, grayscale * 100]; }; -module.exports = eos; - - -/***/ }), -/* 407 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const {PassThrough: PassThroughStream} = __webpack_require__(27); - -module.exports = options => { - options = {...options}; - - const {array} = options; - let {encoding} = options; - const isBuffer = encoding === 'buffer'; - let objectMode = false; +convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; - if (array) { - objectMode = !(encoding || isBuffer); + if (l < 0.5) { + c = 2.0 * s * l; } else { - encoding = encoding || 'utf8'; - } - - if (isBuffer) { - encoding = null; + c = 2.0 * s * (1.0 - l); } - const stream = new PassThroughStream({objectMode}); - - if (encoding) { - stream.setEncoding(encoding); + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); } - let length = 0; - const chunks = []; - - stream.on('data', chunk => { - chunks.push(chunk); - - if (objectMode) { - length = chunks.length; - } else { - length += chunk.length; - } - }); - - stream.getBufferedValue = () => { - if (array) { - return chunks; - } - - return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); - }; - - stream.getBufferedLength = () => length; - - return stream; + return [hsl[0], c * 100, f * 100]; }; +convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; -/***/ }), -/* 408 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + var c = s * v; + var f = 0; + if (c < 1.0) { + f = (v - c) / (1 - c); + } -const { PassThrough } = __webpack_require__(27); + return [hsv[0], c * 100, f * 100]; +}; -module.exports = function (/*streams...*/) { - var sources = [] - var output = new PassThrough({objectMode: true}) +convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; - output.setMaxListeners(0) + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } - output.add = add - output.isEmpty = isEmpty + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; - output.on('unpipe', remove) + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } - Array.prototype.slice.call(arguments).forEach(add) + mg = (1.0 - c) * g; - return output + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; - function add (source) { - if (Array.isArray(source)) { - source.forEach(add) - return this - } +convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; - sources.push(source); - source.once('end', remove.bind(null, source)) - source.once('error', output.emit.bind(output, 'error')) - source.pipe(output, {end: false}) - return this - } + var v = c + g * (1.0 - c); + var f = 0; - function isEmpty () { - return sources.length == 0; - } + if (v > 0.0) { + f = c / v; + } - function remove (source) { - sources = sources.filter(function (it) { return it !== source }) - if (!sources.length && output.readable) { output.end() } - } -} + return [hcg[0], f * 100, v * 100]; +}; +convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; -/***/ }), -/* 409 */ -/***/ (function(module, exports, __webpack_require__) { + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; -"use strict"; + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + return [hcg[0], s * 100, l * 100]; +}; -const nativePromisePrototype = (async () => {})().constructor.prototype; -const descriptors = ['then', 'catch', 'finally'].map(property => [ - property, - Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property) -]); +convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; -// The return value is a mixin of `childProcess` and `Promise` -const mergePromise = (spawned, promise) => { - for (const [property, descriptor] of descriptors) { - // Starting the main `promise` is deferred to avoid consuming streams - const value = typeof promise === 'function' ? - (...args) => Reflect.apply(descriptor.value, promise(), args) : - descriptor.value.bind(promise); +convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; - Reflect.defineProperty(spawned, property, {...descriptor, value}); + if (c < 1) { + g = (v - c) / (1 - c); } - return spawned; + return [hwb[0], c * 100, g * 100]; }; -// Use promises instead of `child_process` events -const getSpawnedPromise = spawned => { - return new Promise((resolve, reject) => { - spawned.on('exit', (exitCode, signal) => { - resolve({exitCode, signal}); - }); - - spawned.on('error', error => { - reject(error); - }); - - if (spawned.stdin) { - spawned.stdin.on('error', error => { - reject(error); - }); - } - }); +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; }; -module.exports = { - mergePromise, - getSpawnedPromise +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; }; - - -/***/ }), -/* 410 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const SPACES_REGEXP = / +/g; - -const joinCommand = (file, args = []) => { - if (!Array.isArray(args)) { - return file; - } - - return [file, ...args].join(' '); +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; }; -// Allow spaces to be escaped by a backslash if not meant as a delimiter -const handleEscaping = (tokens, token, index) => { - if (index === 0) { - return [token]; - } +convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; +}; - const previousToken = tokens[tokens.length - 1]; +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; - if (previousToken.endsWith('\\')) { - return [...tokens.slice(0, -1), `${previousToken.slice(0, -1)} ${token}`]; - } +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; - return [...tokens, token]; +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; }; -// Handle `execa.command()` -const parseCommand = command => { - return command - .trim() - .split(SPACES_REGEXP) - .reduce(handleEscaping, []); +convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; + + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; }; -module.exports = { - joinCommand, - parseCommand +convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; }; /***/ }), -/* 411 */ +/* 391 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; + + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; -var childProcess = __webpack_require__(372); -var spawn = childProcess.spawn; -var exec = childProcess.exec; - -module.exports = function (pid, signal, callback) { - if (typeof signal === 'function' && callback === undefined) { - callback = signal; - signal = undefined; - } - - pid = parseInt(pid); - if (Number.isNaN(pid)) { - if (callback) { - return callback(new Error("pid must be a number")); - } else { - throw new Error("pid must be a number"); - } - } - - var tree = {}; - var pidsToProcess = {}; - tree[pid] = []; - pidsToProcess[pid] = 1; - - switch (process.platform) { - case 'win32': - exec('taskkill /pid ' + pid + ' /T /F', callback); - break; - case 'darwin': - buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { - return spawn('pgrep', ['-P', parentPid]); - }, function () { - killAll(tree, signal, callback); - }); - break; - // case 'sunos': - // buildProcessTreeSunOS(pid, tree, pidsToProcess, function () { - // killAll(tree, signal, callback); - // }); - // break; - default: // Linux - buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { - return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]); - }, function () { - killAll(tree, signal, callback); - }); - break; - } -}; - -function killAll (tree, signal, callback) { - var killed = {}; - try { - Object.keys(tree).forEach(function (pid) { - tree[pid].forEach(function (pidpid) { - if (!killed[pidpid]) { - killPid(pidpid, signal); - killed[pidpid] = 1; - } - }); - if (!killed[pid]) { - killPid(pid, signal); - killed[pid] = 1; - } - }); - } catch (err) { - if (callback) { - return callback(err); - } else { - throw err; - } - } - if (callback) { - return callback(); - } -} - -function killPid(pid, signal) { - try { - process.kill(parseInt(pid, 10), signal); - } - catch (err) { - if (err.code !== 'ESRCH') throw err; - } -} +/***/ }), +/* 392 */ +/***/ (function(module, exports, __webpack_require__) { -function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) { - var ps = spawnChildProcessesList(parentPid); - var allData = ''; - ps.stdout.on('data', function (data) { - var data = data.toString('ascii'); - allData += data; - }); +var conversions = __webpack_require__(390); - var onClose = function (code) { - delete pidsToProcess[parentPid]; +/* + this function routes a model to all other models. - if (code != 0) { - // no more parent processes - if (Object.keys(pidsToProcess).length == 0) { - cb(); - } - return; - } + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). - allData.match(/\d+/g).forEach(function (pid) { - pid = parseInt(pid, 10); - tree[parentPid].push(pid); - tree[pid] = []; - pidsToProcess[pid] = 1; - buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); - }); - }; + conversions that are not possible simply are not included. +*/ - ps.on('close', onClose); +function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); + + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; } +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop -/***/ }), -/* 412 */ -/***/ (function(module, exports, __webpack_require__) { + graph[fromModel].distance = 0; -"use strict"; + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -const SEP = /\r?\n/; -const observe_readable_1 = __webpack_require__(413); -/** - * Creates an Observable from a Readable Stream that: - * - splits data from `readable` into lines - * - completes when `readable` emits "end" - * - fails if `readable` emits "errors" - * - * @param {ReadableStream} readable - * @return {Rx.Observable} - */ -function observeLines(readable) { - const done$ = observe_readable_1.observeReadable(readable).pipe(operators_1.share()); - const scan$ = Rx.fromEvent(readable, 'data').pipe(operators_1.scan(({ buffer }, chunk) => { - buffer += chunk; - const lines = []; - while (true) { - const match = buffer.match(SEP); - if (!match || match.index === undefined) { - break; - } - lines.push(buffer.slice(0, match.index)); - buffer = buffer.slice(match.index + match[0].length); - } - return { buffer, lines }; - }, { buffer: '' }), - // stop if done completes or errors - operators_1.takeUntil(done$.pipe(operators_1.materialize())), operators_1.share()); - return Rx.merge( - // use done$ to provide completion/errors - done$, - // merge in the "lines" from each step - scan$.pipe(operators_1.mergeMap(({ lines }) => lines || [])), - // inject the "unsplit" data at the end - scan$.pipe(operators_1.last(), operators_1.mergeMap(({ buffer }) => (buffer ? [buffer] : [])), - // if there were no lines, last() will error, so catch and complete - operators_1.catchError(() => Rx.empty()))); + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; + + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + + return graph; } -exports.observeLines = observeLines; +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} -/***/ }), -/* 413 */ -/***/ (function(module, exports, __webpack_require__) { +function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; -"use strict"; + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const operators_1 = __webpack_require__(270); -/** - * Produces an Observable from a ReadableSteam that: - * - completes on the first "end" event - * - fails on the first "error" event - */ -function observeReadable(readable) { - return Rx.race(Rx.fromEvent(readable, 'end').pipe(operators_1.first(), operators_1.ignoreElements()), Rx.fromEvent(readable, 'error').pipe(operators_1.first(), operators_1.mergeMap((err) => Rx.throwError(err)))); + fn.conversion = path; + return fn; } -exports.observeReadable = observeReadable; +module.exports = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; -/***/ }), -/* 414 */ -/***/ (function(module, exports, __webpack_require__) { + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; -"use strict"; + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; +}; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var tooling_log_1 = __webpack_require__(415); -exports.ToolingLog = tooling_log_1.ToolingLog; -var tooling_log_text_writer_1 = __webpack_require__(416); -exports.ToolingLogTextWriter = tooling_log_text_writer_1.ToolingLogTextWriter; -var log_levels_1 = __webpack_require__(417); -exports.pickLevelFromFlags = log_levels_1.pickLevelFromFlags; -exports.parseLogLevel = log_levels_1.parseLogLevel; -var tooling_log_collecting_writer_1 = __webpack_require__(418); -exports.ToolingLogCollectingWriter = tooling_log_collecting_writer_1.ToolingLogCollectingWriter; /***/ }), -/* 415 */ +/* 393 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(169)); -const tooling_log_text_writer_1 = __webpack_require__(416); -class ToolingLog { - constructor(writerConfig) { - this.identWidth = 0; - this.writers = writerConfig ? [new tooling_log_text_writer_1.ToolingLogTextWriter(writerConfig)] : []; - this.written$ = new Rx.Subject(); - } - indent(delta = 0) { - this.identWidth = Math.max(this.identWidth + delta, 0); - return this.identWidth; - } - verbose(...args) { - this.sendToWriters('verbose', args); - } - debug(...args) { - this.sendToWriters('debug', args); - } - info(...args) { - this.sendToWriters('info', args); - } - success(...args) { - this.sendToWriters('success', args); - } - warning(...args) { - this.sendToWriters('warning', args); - } - error(error) { - this.sendToWriters('error', [error]); - } - write(...args) { - this.sendToWriters('write', args); - } - getWriters() { - return this.writers.slice(0); - } - setWriters(writers) { - this.writers = [...writers]; - } - getWritten$() { - return this.written$.asObservable(); - } - sendToWriters(type, args) { - const msg = { - type, - indent: this.identWidth, - args, - }; - let written = false; - for (const writer of this.writers) { - if (writer.write(msg)) { - written = true; - } - } - if (written) { - this.written$.next(msg); - } - } -} -exports.ToolingLog = ToolingLog; - +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); -/***/ }), -/* 416 */ -/***/ (function(module, exports, __webpack_require__) { +const env = process.env; -"use strict"; +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const util_1 = __webpack_require__(29); -const chalk_1 = tslib_1.__importDefault(__webpack_require__(2)); -const log_levels_1 = __webpack_require__(417); -const { magentaBright, yellow, red, blue, green, dim } = chalk_1.default; -const PREFIX_INDENT = ' '.repeat(6); -const MSG_PREFIXES = { - verbose: ` ${magentaBright('sill')} `, - debug: ` ${dim('debg')} `, - info: ` ${blue('info')} `, - success: ` ${green('succ')} `, - warning: ` ${yellow('warn')} `, - error: `${red('ERROR')} `, -}; -const has = (obj, key) => obj.hasOwnProperty(key); -function shouldWriteType(level, type) { - if (type === 'write') { - return true; - } - return Boolean(level.flags[type === 'success' ? 'info' : type]); -} -function stringifyError(error) { - if (typeof error !== 'string' && !(error instanceof Error)) { - error = new Error(`"${error}" thrown`); - } - if (typeof error === 'string') { - return error; - } - return error.stack || error.message || error; -} -class ToolingLogTextWriter { - constructor(config) { - this.level = log_levels_1.parseLogLevel(config.level); - this.writeTo = config.writeTo; - if (!this.writeTo || typeof this.writeTo.write !== 'function') { - throw new Error('ToolingLogTextWriter requires the `writeTo` option be set to a stream (like process.stdout)'); - } - } - write(msg) { - if (!shouldWriteType(this.level, msg.type)) { - return false; - } - const prefix = has(MSG_PREFIXES, msg.type) ? MSG_PREFIXES[msg.type] : ''; - ToolingLogTextWriter.write(this.writeTo, prefix, msg); - return true; - } - static write(writeTo, prefix, msg) { - const txt = msg.type === 'error' - ? stringifyError(msg.args[0]) - : util_1.format(msg.args[0], ...msg.args.slice(1)); - (prefix + txt).split('\n').forEach((line, i) => { - let lineIndent = ''; - if (msg.indent > 0) { - // if we are indenting write some spaces followed by a symbol - lineIndent += ' '.repeat(msg.indent - 1); - lineIndent += line.startsWith('-') ? '└' : '│'; - } - if (line && prefix && i > 0) { - // apply additional indentation to lines after - // the first if this message gets a prefix - lineIndent += PREFIX_INDENT; - } - writeTo.write(`${lineIndent}${line}\n`); - }); - } +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; } -exports.ToolingLogTextWriter = ToolingLogTextWriter; +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } -/***/ }), -/* 417 */ -/***/ (function(module, exports, __webpack_require__) { + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } -"use strict"; + if (hasFlag('color=256')) { + return 2; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const LEVELS = ['silent', 'error', 'warning', 'info', 'debug', 'verbose']; -function pickLevelFromFlags(flags, options = {}) { - if (flags.verbose) - return 'verbose'; - if (flags.debug) - return 'debug'; - if (flags.quiet) - return 'error'; - if (flags.silent) - return 'silent'; - return options.default || 'info'; -} -exports.pickLevelFromFlags = pickLevelFromFlags; -function parseLogLevel(name) { - const i = LEVELS.indexOf(name); - if (i === -1) { - const msg = `Invalid log level "${name}" ` + `(expected one of ${LEVELS.join(',')})`; - throw new Error(msg); - } - const flags = {}; - LEVELS.forEach((level, levelI) => { - flags[level] = levelI <= i; - }); - return { - name, - flags: flags, - }; -} -exports.parseLogLevel = parseLogLevel; + if (stream && !stream.isTTY && forceColor !== true) { + // VS code debugger doesn't have isTTY set + if (env.VSCODE_PID) { + return 1; + } + return 0; + } + const min = forceColor ? 1 : 0; -/***/ }), -/* 418 */ -/***/ (function(module, exports, __webpack_require__) { + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -"use strict"; + return 1; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tooling_log_text_writer_1 = __webpack_require__(416); -class ToolingLogCollectingWriter extends tooling_log_text_writer_1.ToolingLogTextWriter { - constructor() { - super({ - level: 'verbose', - writeTo: { - write: (msg) => { - // trim trailing new line - this.messages.push(msg.slice(0, -1)); - }, - }, - }); - this.messages = []; - } -} -exports.ToolingLogCollectingWriter = ToolingLogCollectingWriter; + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + return min; + } -/***/ }), -/* 419 */ -/***/ (function(module, exports, __webpack_require__) { + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } -"use strict"; + if (env.COLORTERM === 'truecolor') { + return 3; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var absolute_path_serializer_1 = __webpack_require__(420); -exports.createAbsolutePathSerializer = absolute_path_serializer_1.createAbsolutePathSerializer; + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } -/***/ }), -/* 420 */ -/***/ (function(module, exports, __webpack_require__) { + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } -"use strict"; + if ('COLORTERM' in env) { + return 1; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const repo_root_1 = __webpack_require__(421); -function createAbsolutePathSerializer(rootPath = repo_root_1.REPO_ROOT) { - return { - print: (value) => value.replace(rootPath, '').replace(/\\/g, '/'), - test: (value) => typeof value === 'string' && value.startsWith(rootPath), - }; + if (env.TERM === 'dumb') { + return min; + } + + return min; } -exports.createAbsolutePathSerializer = createAbsolutePathSerializer; + +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; /***/ }), -/* 421 */ +/* 394 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const path_1 = tslib_1.__importDefault(__webpack_require__(16)); -const fs_1 = tslib_1.__importDefault(__webpack_require__(23)); -const load_json_file_1 = tslib_1.__importDefault(__webpack_require__(422)); -const isKibanaDir = (dir) => { - try { - const path = path_1.default.resolve(dir, 'package.json'); - const json = load_json_file_1.default.sync(path); - if (json && typeof json === 'object' && 'name' in json && json.name === 'kibana') { - return true; - } - } - catch (error) { - if (error && error.code === 'ENOENT') { - return false; - } - throw error; - } +module.exports = (flag, argv) => { + argv = argv || process.argv; + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const pos = argv.indexOf(prefix + flag); + const terminatorPos = argv.indexOf('--'); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); }; -// search for the kibana directory, since this file is moved around it might -// not be where we think but should always be a relatively close parent -// of this directory -const startDir = fs_1.default.realpathSync(__dirname); -const { root: rootDir } = path_1.default.parse(startDir); -let cursor = startDir; -while (true) { - if (isKibanaDir(cursor)) { - break; - } - const parent = path_1.default.dirname(cursor); - if (parent === rootDir) { - throw new Error(`unable to find kibana directory from ${startDir}`); - } - cursor = parent; -} -exports.REPO_ROOT = cursor; /***/ }), -/* 422 */ +/* 395 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(423); -const stripBom = __webpack_require__(427); -const parseJson = __webpack_require__(428); +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -const parse = (data, filePath, options = {}) => { - data = stripBom(data); +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); - if (typeof options.beforeParse === 'function') { - data = options.beforeParse(data); +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); } - return parseJson(data, options.reviver, path.relative(process.cwd(), filePath)); -}; - -module.exports = async (filePath, options) => parse(await promisify(fs.readFile)(filePath, 'utf8'), filePath, options); -module.exports.sync = (filePath, options) => parse(fs.readFileSync(filePath, 'utf8'), filePath, options); + return ESCAPES.get(c) || c; +} +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; -/***/ }), -/* 423 */ -/***/ (function(module, exports, __webpack_require__) { + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(424) -var legacy = __webpack_require__(425) -var clone = __webpack_require__(426) + return results; +} -var queue = [] +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; -var util = __webpack_require__(29) + const results = []; + let matches; -function noop () {} + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(30).equal(queue.length, 0) - }) + return results; } -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} +function buildStyle(chalk, styles) { + const enabled = {}; -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } -module.exports.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } -// Only patch fs once, otherwise we'll run into a memory leak if -// graceful-fs is loaded multiple times, such as in test environments that -// reset the loaded modules between tests. -// We look for the string `graceful-fs` from the comment above. This -// way we are not adding any extra properties and it will detect if older -// versions of graceful-fs are installed. -if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { - fs.closeSync = module.exports.closeSync; - fs.close = module.exports.close; + return current; } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null - - return go$readFile(path, options, cb) +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); - return go$writeFile(path, data, options, cb) + chunks.push(chunk.join('')); - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + return chunks.join(''); +}; - return go$appendFile(path, data, options, cb) - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +/***/ }), +/* 396 */ +/***/ (function(module, exports, __webpack_require__) { - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) +"use strict"; - return go$readdir(args) - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() +var childProcess = __webpack_require__(343); +var spawn = childProcess.spawn; +var exec = childProcess.exec; - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) +module.exports = function (pid, signal, callback) { + if (typeof signal === 'function' && callback === undefined) { + callback = signal; + signal = undefined; + } - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } + pid = parseInt(pid); + if (Number.isNaN(pid)) { + if (callback) { + return callback(new Error("pid must be a number")); + } else { + throw new Error("pid must be a number"); + } } - } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + var tree = {}; + var pidsToProcess = {}; + tree[pid] = []; + pidsToProcess[pid] = 1; - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + switch (process.platform) { + case 'win32': + exec('taskkill /pid ' + pid + ' /T /F', callback); + break; + case 'darwin': + buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { + return spawn('pgrep', ['-P', parentPid]); + }, function () { + killAll(tree, signal, callback); + }); + break; + // case 'sunos': + // buildProcessTreeSunOS(pid, tree, pidsToProcess, function () { + // killAll(tree, signal, callback); + // }); + // break; + default: // Linux + buildProcessTree(pid, tree, pidsToProcess, function (parentPid) { + return spawn('ps', ['-o', 'pid', '--no-headers', '--ppid', parentPid]); + }, function () { + killAll(tree, signal, callback); + }); + break; + } +}; - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } +function killAll (tree, signal, callback) { + var killed = {}; + try { + Object.keys(tree).forEach(function (pid) { + tree[pid].forEach(function (pidpid) { + if (!killed[pidpid]) { + killPid(pidpid, signal); + killed[pidpid] = 1; + } + }); + if (!killed[pid]) { + killPid(pid, signal); + killed[pid] = 1; + } + }); + } catch (err) { + if (callback) { + return callback(err); + } else { + throw err; + } + } + if (callback) { + return callback(); + } +} - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } +function killPid(pid, signal) { + try { + process.kill(parseInt(pid, 10), signal); + } + catch (err) { + if (err.code !== 'ESRCH') throw err; + } +} - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream +function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesList, cb) { + var ps = spawnChildProcessesList(parentPid); + var allData = ''; + ps.stdout.on('data', function (data) { + var data = data.toString('ascii'); + allData += data; + }); - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + var onClose = function (code) { + delete pidsToProcess[parentPid]; - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() + if (code != 0) { + // no more parent processes + if (Object.keys(pidsToProcess).length == 0) { + cb(); + } + return; + } - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } + allData.match(/\d+/g).forEach(function (pid) { + pid = parseInt(pid, 10); + tree[parentPid].push(pid); + tree[pid] = []; + pidsToProcess[pid] = 1; + buildProcessTree(pid, tree, pidsToProcess, spawnChildProcessesList, cb); + }); + }; - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } + ps.on('close', onClose); +} - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } - function createReadStream (path, options) { - return new ReadStream(path, options) - } +/***/ }), +/* 397 */ +/***/ (function(module, exports) { - function createWriteStream (path, options) { - return new WriteStream(path, options) - } +module.exports = require("util"); - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null +/***/ }), +/* 398 */ +/***/ (function(module, exports, __webpack_require__) { - return go$open(path, flags, mode, cb) +"use strict"; - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +const SEP = /\r?\n/; +const observe_readable_1 = __webpack_require__(399); +/** + * Creates an Observable from a Readable Stream that: + * - splits data from `readable` into lines + * - completes when `readable` emits "end" + * - fails if `readable` emits "errors" + * + * @param {ReadableStream} readable + * @return {Rx.Observable} + */ +function observeLines(readable) { + const done$ = observe_readable_1.observeReadable(readable).pipe(operators_1.share()); + const scan$ = Rx.fromEvent(readable, 'data').pipe(operators_1.scan(({ buffer }, chunk) => { + buffer += chunk; + const lines = []; + while (true) { + const match = buffer.match(SEP); + if (!match || match.index === undefined) { + break; + } + lines.push(buffer.slice(0, match.index)); + buffer = buffer.slice(match.index + match[0].length); } - }) - } - } - - return fs -} - -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} - -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } + return { buffer, lines }; + }, { buffer: '' }), + // stop if done completes or errors + operators_1.takeUntil(done$.pipe(operators_1.materialize())), operators_1.share()); + return Rx.merge( + // use done$ to provide completion/errors + done$, + // merge in the "lines" from each step + scan$.pipe(operators_1.mergeMap(({ lines }) => lines || [])), + // inject the "unsplit" data at the end + scan$.pipe(operators_1.last(), operators_1.mergeMap(({ buffer }) => (buffer ? [buffer] : [])), + // if there were no lines, last() will error, so catch and complete + operators_1.catchError(() => Rx.empty()))); } +exports.observeLines = observeLines; /***/ }), -/* 424 */ +/* 399 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(25) - -var origCwd = process.cwd -var cwd = null - -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +"use strict"; -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const operators_1 = __webpack_require__(241); +/** + * Produces an Observable from a ReadableSteam that: + * - completes on the first "end" event + * - fails on the first "error" event + */ +function observeReadable(readable) { + return Rx.race(Rx.fromEvent(readable, 'end').pipe(operators_1.first(), operators_1.ignoreElements()), Rx.fromEvent(readable, 'error').pipe(operators_1.first(), operators_1.mergeMap((err) => Rx.throwError(err)))); } +exports.observeReadable = observeReadable; -module.exports = patch - -function patch (fs) { - // (re-)implement some things that are known busted or missing. - - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } - - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } - - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. - - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) +/***/ }), +/* 400 */ +/***/ (function(module, exports, __webpack_require__) { - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) +"use strict"; - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tooling_log_1 = __webpack_require__(401); +exports.ToolingLog = tooling_log_1.ToolingLog; +var tooling_log_text_writer_1 = __webpack_require__(402); +exports.ToolingLogTextWriter = tooling_log_text_writer_1.ToolingLogTextWriter; +var log_levels_1 = __webpack_require__(403); +exports.pickLevelFromFlags = log_levels_1.pickLevelFromFlags; +exports.parseLogLevel = log_levels_1.parseLogLevel; +var tooling_log_collecting_writer_1 = __webpack_require__(404); +exports.ToolingLogCollectingWriter = tooling_log_collecting_writer_1.ToolingLogCollectingWriter; - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) +/***/ }), +/* 401 */ +/***/ (function(module, exports, __webpack_require__) { - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } +"use strict"; - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. - - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } - - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const Rx = tslib_1.__importStar(__webpack_require__(140)); +const tooling_log_text_writer_1 = __webpack_require__(402); +class ToolingLog { + constructor(writerConfig) { + this.identWidth = 0; + this.writers = writerConfig ? [new tooling_log_text_writer_1.ToolingLogTextWriter(writerConfig)] : []; + this.written$ = new Rx.Subject(); } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) - - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } + indent(delta = 0) { + this.identWidth = Math.max(this.identWidth + delta, 0); + return this.identWidth; } - }})(fs.readSync) - - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) + verbose(...args) { + this.sendToWriters('verbose', args); } - - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) + debug(...args) { + this.sendToWriters('debug', args); + } + info(...args) { + this.sendToWriters('info', args); + } + success(...args) { + this.sendToWriters('success', args); + } + warning(...args) { + this.sendToWriters('warning', args); + } + error(error) { + this.sendToWriters('error', [error]); + } + write(...args) { + this.sendToWriters('write', args); + } + getWriters() { + return this.writers.slice(0); + } + setWriters(writers) { + this.writers = [...writers]; + } + getWritten$() { + return this.written$.asObservable(); + } + sendToWriters(type, args) { + const msg = { + type, + indent: this.identWidth, + args, + }; + let written = false; + for (const writer of this.writers) { + if (writer.write(msg)) { + written = true; + } + } + if (written) { + this.written$.next(msg); } - } - return ret } - } +} +exports.ToolingLog = ToolingLog; - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } +/***/ }), +/* 402 */ +/***/ (function(module, exports, __webpack_require__) { - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } +"use strict"; - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const util_1 = __webpack_require__(397); +const chalk_1 = tslib_1.__importDefault(__webpack_require__(386)); +const log_levels_1 = __webpack_require__(403); +const { magentaBright, yellow, red, blue, green, dim } = chalk_1.default; +const PREFIX_INDENT = ' '.repeat(6); +const MSG_PREFIXES = { + verbose: ` ${magentaBright('sill')} `, + debug: ` ${dim('debg')} `, + info: ` ${blue('info')} `, + success: ` ${green('succ')} `, + warning: ` ${yellow('warn')} `, + error: `${red('ERROR')} `, +}; +const has = (obj, key) => obj.hasOwnProperty(key); +function shouldWriteType(level, type) { + if (type === 'write') { + return level.name !== 'silent'; } - } - - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } + return Boolean(level.flags[type === 'success' ? 'info' : type]); +} +function stringifyError(error) { + if (typeof error !== 'string' && !(error instanceof Error)) { + error = new Error(`"${error}" thrown`); } - } - - - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + if (typeof error === 'string') { + return error; } - } - - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } + return error.stack || error.message || error; +} +class ToolingLogTextWriter { + constructor(config) { + this.level = log_levels_1.parseLogLevel(config.level); + this.writeTo = config.writeTo; + if (!this.writeTo || typeof this.writeTo.write !== 'function') { + throw new Error('ToolingLogTextWriter requires the `writeTo` option be set to a stream (like process.stdout)'); + } } - } - - - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) + write(msg) { + if (!shouldWriteType(this.level, msg.type)) { + return false; + } + const prefix = has(MSG_PREFIXES, msg.type) ? MSG_PREFIXES[msg.type] : ''; + ToolingLogTextWriter.write(this.writeTo, prefix, msg); + return true; } - } - - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; + static write(writeTo, prefix, msg) { + const txt = msg.type === 'error' + ? stringifyError(msg.args[0]) + : util_1.format(msg.args[0], ...msg.args.slice(1)); + (prefix + txt).split('\n').forEach((line, i) => { + let lineIndent = ''; + if (msg.indent > 0) { + // if we are indenting write some spaces followed by a symbol + lineIndent += ' '.repeat(msg.indent - 1); + lineIndent += line.startsWith('-') ? '└' : '│'; + } + if (line && prefix && i > 0) { + // apply additional indentation to lines after + // the first if this message gets a prefix + lineIndent += PREFIX_INDENT; + } + writeTo.write(`${lineIndent}${line}\n`); + }); } - } +} +exports.ToolingLogTextWriter = ToolingLogTextWriter; - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true - if (er.code === "ENOSYS") - return true +/***/ }), +/* 403 */ +/***/ (function(module, exports, __webpack_require__) { - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } +"use strict"; - return false - } +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const LEVELS = ['silent', 'error', 'warning', 'info', 'debug', 'verbose']; +function pickLevelFromFlags(flags, options = {}) { + if (flags.verbose) + return 'verbose'; + if (flags.debug) + return 'debug'; + if (flags.quiet) + return 'error'; + if (flags.silent) + return 'silent'; + return options.default || 'info'; +} +exports.pickLevelFromFlags = pickLevelFromFlags; +function parseLogLevel(name) { + const i = LEVELS.indexOf(name); + if (i === -1) { + const msg = `Invalid log level "${name}" ` + `(expected one of ${LEVELS.join(',')})`; + throw new Error(msg); + } + const flags = {}; + LEVELS.forEach((level, levelI) => { + flags[level] = levelI <= i; + }); + return { + name, + flags: flags, + }; } +exports.parseLogLevel = parseLogLevel; /***/ }), -/* 425 */ +/* 404 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27).Stream +"use strict"; -module.exports = legacy +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tooling_log_text_writer_1 = __webpack_require__(402); +class ToolingLogCollectingWriter extends tooling_log_text_writer_1.ToolingLogTextWriter { + constructor(level = 'verbose') { + super({ + level, + writeTo: { + write: (msg) => { + // trim trailing new line + this.messages.push(msg.slice(0, -1)); + }, + }, + }); + this.messages = []; + } +} +exports.ToolingLogCollectingWriter = ToolingLogCollectingWriter; -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); +/***/ }), +/* 405 */ +/***/ (function(module, exports, __webpack_require__) { - Stream.call(this); +"use strict"; - var self = this; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var absolute_path_serializer_1 = __webpack_require__(406); +exports.createAbsolutePathSerializer = absolute_path_serializer_1.createAbsolutePathSerializer; - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; +/***/ }), +/* 406 */ +/***/ (function(module, exports, __webpack_require__) { - options = options || {}; +"use strict"; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } - - if (this.encoding) this.setEncoding(this.encoding); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const repo_root_1 = __webpack_require__(407); +function createAbsolutePathSerializer(rootPath = repo_root_1.REPO_ROOT) { + return { + print: (value) => value.replace(rootPath, '').replace(/\\/g, '/'), + test: (value) => typeof value === 'string' && value.startsWith(rootPath), + }; +} +exports.createAbsolutePathSerializer = createAbsolutePathSerializer; - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } - if (this.start > this.end) { - throw new Error('start must be <= end'); - } +/***/ }), +/* 407 */ +/***/ (function(module, exports, __webpack_require__) { - this.pos = this.start; - } +"use strict"; - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const path_1 = tslib_1.__importDefault(__webpack_require__(4)); +const fs_1 = tslib_1.__importDefault(__webpack_require__(349)); +const load_json_file_1 = tslib_1.__importDefault(__webpack_require__(408)); +const isKibanaDir = (dir) => { + try { + const path = path_1.default.resolve(dir, 'package.json'); + const json = load_json_file_1.default.sync(path); + if (json && typeof json === 'object' && 'name' in json && json.name === 'kibana') { + return true; + } } - - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } - - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } - - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); - - Stream.call(this); - - this.path = path; - this.fd = null; - this.writable = true; - - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; - - options = options || {}; - - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; + catch (error) { + if (error && error.code === 'ENOENT') { + return false; + } + throw error; } - - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } - - this.pos = this.start; +}; +// search for the kibana directory, since this file is moved around it might +// not be where we think but should always be a relatively close parent +// of this directory +const startDir = fs_1.default.realpathSync(__dirname); +const { root: rootDir } = path_1.default.parse(startDir); +let cursor = startDir; +while (true) { + if (isKibanaDir(cursor)) { + break; } - - this.busy = false; - this._queue = []; - - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); + const parent = path_1.default.dirname(cursor); + if (parent === rootDir) { + throw new Error(`unable to find kibana directory from ${startDir}`); } - } + cursor = parent; } +exports.REPO_ROOT = cursor; /***/ }), -/* 426 */ +/* 408 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const path = __webpack_require__(4); +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(409); +const stripBom = __webpack_require__(414); +const parseJson = __webpack_require__(415); -module.exports = clone - -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +const parse = (data, filePath, options = {}) => { + data = stripBom(data); - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + if (typeof options.beforeParse === 'function') { + data = options.beforeParse(data); + } - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + return parseJson(data, options.reviver, path.relative(process.cwd(), filePath)); +}; - return copy -} +module.exports = async (filePath, options) => parse(await promisify(fs.readFile)(filePath, 'utf8'), filePath, options); +module.exports.sync = (filePath, options) => parse(fs.readFileSync(filePath, 'utf8'), filePath, options); /***/ }), -/* 427 */ +/* 409 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(410) +var legacy = __webpack_require__(412) +var clone = __webpack_require__(413) +var queue = [] -module.exports = string => { - if (typeof string !== 'string') { - throw new TypeError(`Expected a string, got ${typeof string}`); - } +var util = __webpack_require__(397) - // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string - // conversion translates it to FEFF (UTF-16 BOM) - if (string.charCodeAt(0) === 0xFEFF) { - return string.slice(1); - } +function noop () {} - return string; -}; +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(371).equal(queue.length, 0) + }) +} -/***/ }), -/* 428 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; +} -"use strict"; +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() -const errorEx = __webpack_require__(429); -const fallback = __webpack_require__(431); -const {default: LinesAndColumns} = __webpack_require__(432); -const {codeFrameColumns} = __webpack_require__(433); + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) -const JSONError = errorEx('JSONError', { - fileName: errorEx.append('in %s'), - codeFrame: errorEx.append('\n\n%s\n') -}); +module.exports.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) -module.exports = (string, reviver, filename) => { - if (typeof reviver === 'string') { - filename = reviver; - reviver = null; - } +// Only patch fs once, otherwise we'll run into a memory leak if +// graceful-fs is loaded multiple times, such as in test environments that +// reset the loaded modules between tests. +// We look for the string `graceful-fs` from the comment above. This +// way we are not adding any extra properties and it will detect if older +// versions of graceful-fs are installed. +if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { + fs.closeSync = module.exports.closeSync; + fs.close = module.exports.close; +} - try { - try { - return JSON.parse(string, reviver); - } catch (error) { - fallback(string, reviver); - throw error; - } - } catch (error) { - error.message = error.message.replace(/\n/g, ''); - const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null - const jsonError = new JSONError(error); - if (filename) { - jsonError.fileName = filename; - } + return go$readFile(path, options, cb) - if (indexMatch && indexMatch.length > 0) { - const lines = new LinesAndColumns(string); - const index = Number(indexMatch[1]); - const location = lines.locationForIndex(index); + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - const codeFrame = codeFrameColumns( - string, - {start: {line: location.line + 1, column: location.column + 1}}, - {highlightCode: true} - ); + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - jsonError.codeFrame = codeFrame; - } + return go$writeFile(path, data, options, cb) - throw jsonError; - } -}; + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null -/***/ }), -/* 429 */ -/***/ (function(module, exports, __webpack_require__) { + return go$appendFile(path, data, options, cb) -"use strict"; + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options + } + args.push(go$readdir$cb) -var util = __webpack_require__(29); -var isArrayish = __webpack_require__(430); + return go$readdir(args) -var errorEx = function errorEx(name, properties) { - if (!name || name.constructor !== String) { - properties = name || {}; - name = Error.name; - } + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() - var errorExError = function ErrorEXError(message) { - if (!this) { - return new ErrorEXError(message); - } + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) - message = message instanceof Error - ? message.message - : (message || this.message); + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } - Error.call(this, message); - Error.captureStackTrace(this, errorExError); + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } - this.name = name; + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } - Object.defineProperty(this, 'message', { - configurable: true, - enumerable: false, - get: function () { - var newMessage = message.split(/\r?\n/g); + var fs$ReadStream = fs.ReadStream + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } - for (var key in properties) { - if (!properties.hasOwnProperty(key)) { - continue; - } + var fs$WriteStream = fs.WriteStream + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } - var modifier = properties[key]; + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream - if ('message' in modifier) { - newMessage = modifier.message(this[key], newMessage) || newMessage; - if (!isArrayish(newMessage)) { - newMessage = [newMessage]; - } - } - } + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } - return newMessage.join('\n'); - }, - set: function (v) { - message = v; - } - }); + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - var stackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack'); - var stackGetter = stackDescriptor.get; - var stackValue = stackDescriptor.value; - delete stackDescriptor.value; - delete stackDescriptor.writable; + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } - stackDescriptor.get = function () { - var stack = (stackGetter) - ? stackGetter.call(this).split(/\r?\n+/g) - : stackValue.split(/\r?\n+/g); + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } - // starting in Node 7, the stack builder caches the message. - // just replace it. - stack[0] = this.name + ': ' + this.message; + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } - var lineCount = 1; - for (var key in properties) { - if (!properties.hasOwnProperty(key)) { - continue; - } + function createReadStream (path, options) { + return new ReadStream(path, options) + } - var modifier = properties[key]; + function createWriteStream (path, options) { + return new WriteStream(path, options) + } - if ('line' in modifier) { - var line = modifier.line(this[key]); - if (line) { - stack.splice(lineCount++, 0, ' ' + line); - } - } + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null - if ('stack' in modifier) { - modifier.stack(this[key], stack); - } - } + return go$open(path, flags, mode, cb) - return stack.join('\n'); - }; - - Object.defineProperty(this, 'stack', stackDescriptor); - }; - - if (Object.setPrototypeOf) { - Object.setPrototypeOf(errorExError.prototype, Error.prototype); - Object.setPrototypeOf(errorExError, Error); - } else { - util.inherits(errorExError, Error); - } - - return errorExError; -}; - -errorEx.append = function (str, def) { - return { - message: function (v, message) { - v = v || def; - - if (v) { - message[0] += ' ' + str.replace('%s', v.toString()); - } - - return message; - } - }; -}; - -errorEx.line = function (str, def) { - return { - line: function (v) { - v = v || def; + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - if (v) { - return str.replace('%s', v.toString()); - } + return fs +} - return null; - } - }; -}; +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) +} -module.exports = errorEx; +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} /***/ }), -/* 430 */ +/* 410 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -module.exports = function isArrayish(obj) { - if (!obj) { - return false; - } - - return obj instanceof Array || Array.isArray(obj) || - (obj.length >= 0 && obj.splice instanceof Function); -}; - +var constants = __webpack_require__(411) -/***/ }), -/* 431 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +var origCwd = process.cwd +var cwd = null +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform -module.exports = parseJson -function parseJson (txt, reviver, context) { - context = context || 20 - try { - return JSON.parse(txt, reviver) - } catch (e) { - const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i) - const errIdx = syntaxErr - ? +syntaxErr[1] - : e.message.match(/^Unexpected end of JSON.*/i) - ? txt.length - 1 - : null - if (errIdx != null) { - const start = errIdx <= context - ? 0 - : errIdx - context - const end = errIdx + context >= txt.length - ? txt.length - : errIdx + context - e.message += ` while parsing near '${ - start === 0 ? '' : '...' - }${txt.slice(start, end)}${ - end === txt.length ? '' : '...' - }'` - } else { - e.message += ` while parsing '${txt.slice(0, context * 2)}'` - } - throw e - } +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd } +try { + process.cwd() +} catch (er) {} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} -/***/ }), -/* 432 */ -/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -var LF = '\n'; -var CR = '\r'; -var LinesAndColumns = (function () { - function LinesAndColumns(string) { - this.string = string; - var offsets = [0]; - for (var offset = 0; offset < string.length;) { - switch (string[offset]) { - case LF: - offset += LF.length; - offsets.push(offset); - break; - case CR: - offset += CR.length; - if (string[offset] === LF) { - offset += LF.length; - } - offsets.push(offset); - break; - default: - offset++; - break; - } - } - this.offsets = offsets; - } - LinesAndColumns.prototype.locationForIndex = function (index) { - if (index < 0 || index > this.string.length) { - return null; - } - var line = 0; - var offsets = this.offsets; - while (offsets[line + 1] <= index) { - line++; - } - var column = index - offsets[line]; - return { line: line, column: column }; - }; - LinesAndColumns.prototype.indexForLocation = function (location) { - var line = location.line, column = location.column; - if (line < 0 || line >= this.offsets.length) { - return null; - } - if (column < 0 || column > this.lengthOfLine(line)) { - return null; - } - return this.offsets[line] + column; - }; - LinesAndColumns.prototype.lengthOfLine = function (line) { - var offset = this.offsets[line]; - var nextOffset = line === this.offsets.length - 1 ? this.string.length : this.offsets[line + 1]; - return nextOffset - offset; - }; - return LinesAndColumns; -}()); -/* harmony default export */ __webpack_exports__["default"] = (LinesAndColumns); - - -/***/ }), -/* 433 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = patch -"use strict"; +function patch (fs) { + // (re-)implement some things that are known busted or missing. + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.codeFrameColumns = codeFrameColumns; -exports.default = _default; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } -var _highlight = _interopRequireWildcard(__webpack_require__(434)); + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) -let deprecationWarningShown = false; + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) -function getDefs(chalk) { - return { - gutter: chalk.grey, - marker: chalk.red.bold, - message: chalk.red.bold - }; -} + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) -const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) -function getMarkerLines(loc, source, opts) { - const startLoc = Object.assign({ - column: 0, - line: -1 - }, loc.start); - const endLoc = Object.assign({}, startLoc, {}, loc.end); - const { - linesAbove = 2, - linesBelow = 3 - } = opts || {}; - const startLine = startLoc.line; - const startColumn = startLoc.column; - const endLine = endLoc.line; - const endColumn = endLoc.column; - let start = Math.max(startLine - (linesAbove + 1), 0); - let end = Math.min(source.length, endLine + linesBelow); + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) - if (startLine === -1) { - start = 0; + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} } - - if (endLine === -1) { - end = source.length; + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} } - const lineDiff = endLine - startLine; - const markerLines = {}; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. - if (lineDiff) { - for (let i = 0; i <= lineDiff; i++) { - const lineNumber = i + startLine; + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } - if (!startColumn) { - markerLines[lineNumber] = true; - } else if (i === 0) { - const sourceLength = source[lineNumber - 1].length; - markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; - } else if (i === lineDiff) { - markerLines[lineNumber] = [0, endColumn]; - } else { - const sourceLength = source[lineNumber - i].length; - markerLines[lineNumber] = [0, sourceLength]; + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) } } - } else { - if (startColumn === endColumn) { - if (startColumn) { - markerLines[startLine] = [startColumn, 0]; - } else { - markerLines[startLine] = true; + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) + + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er } - } else { - markerLines[startLine] = [startColumn, endColumn - startColumn]; } - } - - return { - start, - end, - markerLines - }; -} - -function codeFrameColumns(rawLines, loc, opts = {}) { - const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts); - const chalk = (0, _highlight.getChalk)(opts); - const defs = getDefs(chalk); + }})(fs.readSync) - const maybeHighlight = (chalkFn, string) => { - return highlighted ? chalkFn(string) : string; - }; + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } - const lines = rawLines.split(NEWLINE); - const { - start, - end, - markerLines - } = getMarkerLines(loc, lines, opts); - const hasColumns = loc.start && typeof loc.start.column === "number"; - const numberMaxWidth = String(end).length; - const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines; - let frame = highlightedLines.split(NEWLINE).slice(start, end).map((line, index) => { - const number = start + 1 + index; - const paddedNumber = ` ${number}`.slice(-numberMaxWidth); - const gutter = ` ${paddedNumber} | `; - const hasMarker = markerLines[number]; - const lastMarkerLine = !markerLines[number + 1]; + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - if (hasMarker) { - let markerLine = ""; + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + } - if (Array.isArray(hasMarker)) { - const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); - const numberOfMarkers = hasMarker[1] || 1; - markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join(""); + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } - if (lastMarkerLine && opts.message) { - markerLine += " " + maybeHighlight(defs.message, opts.message); + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } } + return ret } - return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join(""); } else { - return ` ${maybeHighlight(defs.gutter, gutter)}${line}`; + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} } - }).join("\n"); - - if (opts.message && !hasColumns) { - frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; } - if (highlighted) { - return chalk.reset(frame); - } else { - return frame; + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -} - -function _default(rawLines, lineNumber, colNumber, opts = {}) { - if (!deprecationWarningShown) { - deprecationWarningShown = true; - const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; - if (process.emitWarning) { - process.emitWarning(message, "DeprecationWarning"); - } else { - const deprecationError = new Error(message); - deprecationError.name = "DeprecationWarning"; - console.warn(new Error(message)); + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } } } - colNumber = Math.max(colNumber, 0); - const location = { - start: { - column: colNumber, - line: lineNumber - } - }; - return codeFrameColumns(rawLines, location, opts); -} - -/***/ }), -/* 434 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.shouldHighlight = shouldHighlight; -exports.getChalk = getChalk; -exports.default = highlight; - -var _jsTokens = _interopRequireWildcard(__webpack_require__(435)); - -var _helperValidatorIdentifier = __webpack_require__(436); - -var _chalk = _interopRequireDefault(__webpack_require__(439)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -function getDefs(chalk) { - return { - keyword: chalk.cyan, - capitalized: chalk.yellow, - jsx_tag: chalk.yellow, - punctuator: chalk.yellow, - number: chalk.magenta, - string: chalk.green, - regex: chalk.magenta, - comment: chalk.grey, - invalid: chalk.white.bgRed.bold - }; -} - -const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; -const JSX_TAG = /^[a-z][\w-]*$/i; -const BRACKET = /^[()[\]{}]$/; - -function getTokenType(match) { - const [offset, text] = match.slice(-2); - const token = (0, _jsTokens.matchToToken)(match); - - if (token.type === "name") { - if ((0, _helperValidatorIdentifier.isKeyword)(token.value) || (0, _helperValidatorIdentifier.isReservedWord)(token.value)) { - return "keyword"; - } - if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == " colorize(str)).join("\n"); - } else { - return args[0]; + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true } - }); -} - -function shouldHighlight(options) { - return _chalk.default.supportsColor || options.forceColor; -} - -function getChalk(options) { - let chalk = _chalk.default; - if (options.forceColor) { - chalk = new _chalk.default.constructor({ - enabled: true, - level: 1 - }); + return false } - - return chalk; } -function highlight(code, options = {}) { - if (shouldHighlight(options)) { - const chalk = getChalk(options); - const defs = getDefs(chalk); - return highlightTokens(defs, code); - } else { - return code; - } -} /***/ }), -/* 435 */ +/* 411 */ /***/ (function(module, exports) { -// Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell -// License: MIT. (See LICENSE.) - -Object.defineProperty(exports, "__esModule", { - value: true -}) - -// This regex comes from regex.coffee, and is inserted here by generate-index.js -// (run `npm run build`). -exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g - -exports.matchToToken = function(match) { - var token = {type: "invalid", value: match[0], closed: undefined} - if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]) - else if (match[ 5]) token.type = "comment" - else if (match[ 6]) token.type = "comment", token.closed = !!match[7] - else if (match[ 8]) token.type = "regex" - else if (match[ 9]) token.type = "number" - else if (match[10]) token.type = "name" - else if (match[11]) token.type = "punctuator" - else if (match[12]) token.type = "whitespace" - return token -} - +module.exports = require("constants"); /***/ }), -/* 436 */ +/* 412 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var Stream = __webpack_require__(382).Stream +module.exports = legacy -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "isIdentifierName", { - enumerable: true, - get: function () { - return _identifier.isIdentifierName; - } -}); -Object.defineProperty(exports, "isIdentifierChar", { - enumerable: true, - get: function () { - return _identifier.isIdentifierChar; - } -}); -Object.defineProperty(exports, "isIdentifierStart", { - enumerable: true, - get: function () { - return _identifier.isIdentifierStart; - } -}); -Object.defineProperty(exports, "isReservedWord", { - enumerable: true, - get: function () { - return _keyword.isReservedWord; - } -}); -Object.defineProperty(exports, "isStrictBindOnlyReservedWord", { - enumerable: true, - get: function () { - return _keyword.isStrictBindOnlyReservedWord; - } -}); -Object.defineProperty(exports, "isStrictBindReservedWord", { - enumerable: true, - get: function () { - return _keyword.isStrictBindReservedWord; - } -}); -Object.defineProperty(exports, "isStrictReservedWord", { - enumerable: true, - get: function () { - return _keyword.isStrictReservedWord; - } -}); -Object.defineProperty(exports, "isKeyword", { - enumerable: true, - get: function () { - return _keyword.isKeyword; +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream } -}); -var _identifier = __webpack_require__(437); + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -var _keyword = __webpack_require__(438); + Stream.call(this); -/***/ }), -/* 437 */ -/***/ (function(module, exports, __webpack_require__) { + var self = this; -"use strict"; + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isIdentifierStart = isIdentifierStart; -exports.isIdentifierChar = isIdentifierChar; -exports.isIdentifierName = isIdentifierName; -let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08c7\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\u9ffc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7ca\ua7f5-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; -let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf\u1ac0\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; -const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); -const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); -nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; -const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 107, 20, 28, 22, 13, 52, 76, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 230, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 35, 56, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2749, 1070, 4050, 582, 8634, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8952, 286, 50, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 2357, 44, 11, 6, 17, 0, 370, 43, 1301, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42717, 35, 4148, 12, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938]; -const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 176, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 135, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 419, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + options = options || {}; -function isInAstralSet(code, set) { - let pos = 0x10000; + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } - for (let i = 0, length = set.length; i < length; i += 2) { - pos += set[i]; - if (pos > code) return false; - pos += set[i + 1]; - if (pos >= code) return true; - } + if (this.encoding) this.setEncoding(this.encoding); - return false; -} + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } -function isIdentifierStart(code) { - if (code < 65) return code === 36; - if (code <= 90) return true; - if (code < 97) return code === 95; - if (code <= 122) return true; + if (this.start > this.end) { + throw new Error('start must be <= end'); + } - if (code <= 0xffff) { - return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); - } + this.pos = this.start; + } - return isInAstralSet(code, astralIdentifierStartCodes); -} + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -function isIdentifierChar(code) { - if (code < 48) return code === 36; - if (code < 58) return true; - if (code < 65) return false; - if (code <= 90) return true; - if (code < 97) return code === 95; - if (code <= 122) return true; + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } - if (code <= 0xffff) { - return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + self.fd = fd; + self.emit('open', fd); + self._read(); + }) } - return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); -} + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); -function isIdentifierName(name) { - let isFirst = true; + Stream.call(this); - for (let _i = 0, _Array$from = Array.from(name); _i < _Array$from.length; _i++) { - const char = _Array$from[_i]; - const cp = char.codePointAt(0); + this.path = path; + this.fd = null; + this.writable = true; - if (isFirst) { - if (!isIdentifierStart(cp)) { - return false; + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); } - isFirst = false; - } else if (!isIdentifierChar(cp)) { - return false; + this.pos = this.start; } - } - return true; + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } + } } + /***/ }), -/* 438 */ +/* 413 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isReservedWord = isReservedWord; -exports.isStrictReservedWord = isStrictReservedWord; -exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; -exports.isStrictBindReservedWord = isStrictBindReservedWord; -exports.isKeyword = isKeyword; -const reservedWords = { - keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], - strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], - strictBind: ["eval", "arguments"] -}; -const keywords = new Set(reservedWords.keyword); -const reservedWordsStrictSet = new Set(reservedWords.strict); -const reservedWordsStrictBindSet = new Set(reservedWords.strictBind); +module.exports = clone -function isReservedWord(word, inModule) { - return inModule && word === "await" || word === "enum"; -} +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj -function isStrictReservedWord(word, inModule) { - return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); -} + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) -function isStrictBindOnlyReservedWord(word) { - return reservedWordsStrictBindSet.has(word); -} + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) -function isStrictBindReservedWord(word, inModule) { - return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); + return copy } -function isKeyword(word) { - return keywords.has(word); -} /***/ }), -/* 439 */ +/* 414 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(440); -const stdoutColor = __webpack_require__(441).stdout; -const template = __webpack_require__(442); +module.exports = string => { + if (typeof string !== 'string') { + throw new TypeError(`Expected a string, got ${typeof string}`); + } -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string + // conversion translates it to FEFF (UTF-16 BOM) + if (string.charCodeAt(0) === 0xFEFF) { + return string.slice(1); + } -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; + return string; +}; -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); -const styles = Object.create(null); +/***/ }), +/* 415 */ +/***/ (function(module, exports, __webpack_require__) { -function applyOptions(obj, options) { - options = options || {}; +"use strict"; - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} +const errorEx = __webpack_require__(416); +const fallback = __webpack_require__(418); +const {default: LinesAndColumns} = __webpack_require__(419); +const {codeFrameColumns} = __webpack_require__(420); -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); +const JSONError = errorEx('JSONError', { + fileName: errorEx.append('in %s'), + codeFrame: errorEx.append('\n\n%s\n') +}); - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; +module.exports = (string, reviver, filename) => { + if (typeof reviver === 'string') { + filename = reviver; + reviver = null; + } - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + try { + try { + return JSON.parse(string, reviver); + } catch (error) { + fallback(string, reviver); + throw error; + } + } catch (error) { + error.message = error.message.replace(/\n/g, ''); + const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); - chalk.template.constructor = Chalk; + const jsonError = new JSONError(error); + if (filename) { + jsonError.fileName = filename; + } - return chalk.template; - } + if (indexMatch && indexMatch.length > 0) { + const lines = new LinesAndColumns(string); + const index = Number(indexMatch[1]); + const location = lines.locationForIndex(index); - applyOptions(this, options); -} - -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; -} - -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + const codeFrame = codeFrameColumns( + string, + {start: {line: location.line + 1, column: location.column + 1}}, + {highlightCode: true} + ); - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + jsonError.codeFrame = codeFrame; } - }; -} -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); + throw jsonError; } }; -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} +/***/ }), +/* 416 */ +/***/ (function(module, exports, __webpack_require__) { -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; +"use strict"; + + +var util = __webpack_require__(397); +var isArrayish = __webpack_require__(417); + +var errorEx = function errorEx(name, properties) { + if (!name || name.constructor !== String) { + properties = name || {}; + name = Error.name; } - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; + var errorExError = function ErrorEXError(message) { + if (!this) { + return new ErrorEXError(message); } - }; -} -const proto = Object.defineProperties(() => {}, styles); + message = message instanceof Error + ? message.message + : (message || this.message); -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; + Error.call(this, message); + Error.captureStackTrace(this, errorExError); - builder._styles = _styles; - builder._empty = _empty; + this.name = name; - const self = this; + Object.defineProperty(this, 'message', { + configurable: true, + enumerable: false, + get: function () { + var newMessage = message.split(/\r?\n/g); - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); + for (var key in properties) { + if (!properties.hasOwnProperty(key)) { + continue; + } - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); + var modifier = properties[key]; - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + if ('message' in modifier) { + newMessage = modifier.message(this[key], newMessage) || newMessage; + if (!isArrayish(newMessage)) { + newMessage = [newMessage]; + } + } + } - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + return newMessage.join('\n'); + }, + set: function (v) { + message = v; + } + }); - return builder; -} + var stackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack'); + var stackGetter = stackDescriptor.get; + var stackValue = stackDescriptor.value; + delete stackDescriptor.value; + delete stackDescriptor.writable; -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); + stackDescriptor.get = function () { + var stack = (stackGetter) + ? stackGetter.call(this).split(/\r?\n+/g) + : stackValue.split(/\r?\n+/g); - if (argsLen === 0) { - return ''; - } + // starting in Node 7, the stack builder caches the message. + // just replace it. + stack[0] = this.name + ': ' + this.message; - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + var lineCount = 1; + for (var key in properties) { + if (!properties.hasOwnProperty(key)) { + continue; + } - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + var modifier = properties[key]; - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + if ('line' in modifier) { + var line = modifier.line(this[key]); + if (line) { + stack.splice(lineCount++, 0, ' ' + line); + } + } - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + if ('stack' in modifier) { + modifier.stack(this[key], stack); + } + } - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + return stack.join('\n'); + }; + + Object.defineProperty(this, 'stack', stackDescriptor); + }; + + if (Object.setPrototypeOf) { + Object.setPrototypeOf(errorExError.prototype, Error.prototype); + Object.setPrototypeOf(errorExError, Error); + } else { + util.inherits(errorExError, Error); } - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + return errorExError; +}; - return str; -} +errorEx.append = function (str, def) { + return { + message: function (v, message) { + v = v || def; -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } + if (v) { + message[0] += ' ' + str.replace('%s', v.toString()); + } - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + return message; + } + }; +}; - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } +errorEx.line = function (str, def) { + return { + line: function (v) { + v = v || def; - return template(chalk, parts.join('')); -} + if (v) { + return str.replace('%s', v.toString()); + } -Object.defineProperties(Chalk.prototype, styles); + return null; + } + }; +}; -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +module.exports = errorEx; /***/ }), -/* 440 */ +/* 417 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +module.exports = function isArrayish(obj) { + if (!obj) { + return false; + } -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; + return obj instanceof Array || Array.isArray(obj) || + (obj.length >= 0 && obj.splice instanceof Function); }; -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], - - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; +/***/ }), +/* 418 */ +/***/ (function(module, exports, __webpack_require__) { - // Fix humans - styles.color.grey = styles.color.gray; +"use strict"; - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; - for (const styleName of Object.keys(group)) { - const style = group[styleName]; +module.exports = parseJson +function parseJson (txt, reviver, context) { + context = context || 20 + try { + return JSON.parse(txt, reviver) + } catch (e) { + const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i) + const errIdx = syntaxErr + ? +syntaxErr[1] + : e.message.match(/^Unexpected end of JSON.*/i) + ? txt.length - 1 + : null + if (errIdx != null) { + const start = errIdx <= context + ? 0 + : errIdx - context + const end = errIdx + context >= txt.length + ? txt.length + : errIdx + context + e.message += ` while parsing near '${ + start === 0 ? '' : '...' + }${txt.slice(start, end)}${ + end === txt.length ? '' : '...' + }'` + } else { + e.message += ` while parsing '${txt.slice(0, context * 2)}'` + } + throw e + } +} - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; - group[styleName] = styles[styleName]; +/***/ }), +/* 419 */ +/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { - codes.set(style[0], style[1]); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +var LF = '\n'; +var CR = '\r'; +var LinesAndColumns = (function () { + function LinesAndColumns(string) { + this.string = string; + var offsets = [0]; + for (var offset = 0; offset < string.length;) { + switch (string[offset]) { + case LF: + offset += LF.length; + offsets.push(offset); + break; + case CR: + offset += CR.length; + if (string[offset] === LF) { + offset += LF.length; + } + offsets.push(offset); + break; + default: + offset++; + break; + } + } + this.offsets = offsets; + } + LinesAndColumns.prototype.locationForIndex = function (index) { + if (index < 0 || index > this.string.length) { + return null; + } + var line = 0; + var offsets = this.offsets; + while (offsets[line + 1] <= index) { + line++; + } + var column = index - offsets[line]; + return { line: line, column: column }; + }; + LinesAndColumns.prototype.indexForLocation = function (location) { + var line = location.line, column = location.column; + if (line < 0 || line >= this.offsets.length) { + return null; + } + if (column < 0 || column > this.lengthOfLine(line)) { + return null; + } + return this.offsets[line] + column; + }; + LinesAndColumns.prototype.lengthOfLine = function (line) { + var offset = this.offsets[line]; + var nextOffset = line === this.offsets.length - 1 ? this.string.length : this.offsets[line + 1]; + return nextOffset - offset; + }; + return LinesAndColumns; +}()); +/* harmony default export */ __webpack_exports__["default"] = (LinesAndColumns); - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } +/***/ }), +/* 420 */ +/***/ (function(module, exports, __webpack_require__) { - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; +"use strict"; - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.codeFrameColumns = codeFrameColumns; +exports.default = _default; - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; +var _highlight = _interopRequireWildcard(__webpack_require__(421)); - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - const suite = colorConvert[key]; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - if (key === 'ansi16') { - key = 'ansi'; - } +let deprecationWarningShown = false; - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } +function getDefs(chalk) { + return { + gutter: chalk.grey, + marker: chalk.red.bold, + message: chalk.red.bold + }; +} - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } +const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } +function getMarkerLines(loc, source, opts) { + const startLoc = Object.assign({ + column: 0, + line: -1 + }, loc.start); + const endLoc = Object.assign({}, startLoc, {}, loc.end); + const { + linesAbove = 2, + linesBelow = 3 + } = opts || {}; + const startLine = startLoc.line; + const startColumn = startLoc.column; + const endLine = endLoc.line; + const endColumn = endLoc.column; + let start = Math.max(startLine - (linesAbove + 1), 0); + let end = Math.min(source.length, endLine + linesBelow); - return styles; -} + if (startLine === -1) { + start = 0; + } -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); + if (endLine === -1) { + end = source.length; + } -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) + const lineDiff = endLine - startLine; + const markerLines = {}; -/***/ }), -/* 441 */ -/***/ (function(module, exports, __webpack_require__) { + if (lineDiff) { + for (let i = 0; i <= lineDiff; i++) { + const lineNumber = i + startLine; -"use strict"; + if (!startColumn) { + markerLines[lineNumber] = true; + } else if (i === 0) { + const sourceLength = source[lineNumber - 1].length; + markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; + } else if (i === lineDiff) { + markerLines[lineNumber] = [0, endColumn]; + } else { + const sourceLength = source[lineNumber - i].length; + markerLines[lineNumber] = [0, sourceLength]; + } + } + } else { + if (startColumn === endColumn) { + if (startColumn) { + markerLines[startLine] = [startColumn, 0]; + } else { + markerLines[startLine] = true; + } + } else { + markerLines[startLine] = [startColumn, endColumn - startColumn]; + } + } -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); + return { + start, + end, + markerLines + }; +} -const env = process.env; +function codeFrameColumns(rawLines, loc, opts = {}) { + const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts); + const chalk = (0, _highlight.getChalk)(opts); + const defs = getDefs(chalk); -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} + const maybeHighlight = (chalkFn, string) => { + return highlighted ? chalkFn(string) : string; + }; -function translateLevel(level) { - if (level === 0) { - return false; - } + const lines = rawLines.split(NEWLINE); + const { + start, + end, + markerLines + } = getMarkerLines(loc, lines, opts); + const hasColumns = loc.start && typeof loc.start.column === "number"; + const numberMaxWidth = String(end).length; + const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines; + let frame = highlightedLines.split(NEWLINE).slice(start, end).map((line, index) => { + const number = start + 1 + index; + const paddedNumber = ` ${number}`.slice(-numberMaxWidth); + const gutter = ` ${paddedNumber} | `; + const hasMarker = markerLines[number]; + const lastMarkerLine = !markerLines[number + 1]; - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} + if (hasMarker) { + let markerLine = ""; -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } + if (Array.isArray(hasMarker)) { + const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); + const numberOfMarkers = hasMarker[1] || 1; + markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join(""); - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + if (lastMarkerLine && opts.message) { + markerLine += " " + maybeHighlight(defs.message, opts.message); + } + } - if (hasFlag('color=256')) { - return 2; - } + return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join(""); + } else { + return ` ${maybeHighlight(defs.gutter, gutter)}${line}`; + } + }).join("\n"); - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } + if (opts.message && !hasColumns) { + frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; + } - const min = forceColor ? 1 : 0; + if (highlighted) { + return chalk.reset(frame); + } else { + return frame; + } +} - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } +function _default(rawLines, lineNumber, colNumber, opts = {}) { + if (!deprecationWarningShown) { + deprecationWarningShown = true; + const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; - return 1; - } + if (process.emitWarning) { + process.emitWarning(message, "DeprecationWarning"); + } else { + const deprecationError = new Error(message); + deprecationError.name = "DeprecationWarning"; + console.warn(new Error(message)); + } + } - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } + colNumber = Math.max(colNumber, 0); + const location = { + start: { + column: colNumber, + line: lineNumber + } + }; + return codeFrameColumns(rawLines, location, opts); +} - return min; - } +/***/ }), +/* 421 */ +/***/ (function(module, exports, __webpack_require__) { - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } +"use strict"; - if (env.COLORTERM === 'truecolor') { - return 3; - } - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.shouldHighlight = shouldHighlight; +exports.getChalk = getChalk; +exports.default = highlight; - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } +var _jsTokens = _interopRequireWildcard(__webpack_require__(422)); - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } +var _helperValidatorIdentifier = __webpack_require__(423); - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } +var _chalk = _interopRequireDefault(__webpack_require__(426)); - if ('COLORTERM' in env) { - return 1; - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - if (env.TERM === 'dumb') { - return min; - } +function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - return min; -} +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); +function getDefs(chalk) { + return { + keyword: chalk.cyan, + capitalized: chalk.yellow, + jsx_tag: chalk.yellow, + punctuator: chalk.yellow, + number: chalk.magenta, + string: chalk.green, + regex: chalk.magenta, + comment: chalk.grey, + invalid: chalk.white.bgRed.bold + }; } -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; +const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; +const JSX_TAG = /^[a-z][\w-]*$/i; +const BRACKET = /^[()[\]{}]$/; +function getTokenType(match) { + const [offset, text] = match.slice(-2); + const token = (0, _jsTokens.matchToToken)(match); -/***/ }), -/* 442 */ -/***/ (function(module, exports, __webpack_require__) { + if (token.type === "name") { + if ((0, _helperValidatorIdentifier.isKeyword)(token.value) || (0, _helperValidatorIdentifier.isReservedWord)(token.value)) { + return "keyword"; + } -"use strict"; + if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == " escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } +function highlightTokens(defs, text) { + return text.replace(_jsTokens.default, function (...args) { + const type = getTokenType(args); + const colorize = defs[type]; - return results; + if (colorize) { + return args[0].split(NEWLINE).map(str => colorize(str)).join("\n"); + } else { + return args[0]; + } + }); } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; +function shouldHighlight(options) { + return _chalk.default.supportsColor || options.forceColor; +} - const results = []; - let matches; +function getChalk(options) { + let chalk = _chalk.default; - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + if (options.forceColor) { + chalk = new _chalk.default.constructor({ + enabled: true, + level: 1 + }); + } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } + return chalk; +} - return results; +function highlight(code, options = {}) { + if (shouldHighlight(options)) { + const chalk = getChalk(options); + const defs = getDefs(chalk); + return highlightTokens(defs, code); + } else { + return code; + } } -function buildStyle(chalk, styles) { - const enabled = {}; +/***/ }), +/* 422 */ +/***/ (function(module, exports) { - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } +// Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell +// License: MIT. (See LICENSE.) - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } +Object.defineProperty(exports, "__esModule", { + value: true +}) - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } +// This regex comes from regex.coffee, and is inserted here by generate-index.js +// (run `npm run build`). +exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g - return current; +exports.matchToToken = function(match) { + var token = {type: "invalid", value: match[0], closed: undefined} + if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]) + else if (match[ 5]) token.type = "comment" + else if (match[ 6]) token.type = "comment", token.closed = !!match[7] + else if (match[ 8]) token.type = "regex" + else if (match[ 9]) token.type = "number" + else if (match[10]) token.type = "name" + else if (match[11]) token.type = "punctuator" + else if (match[12]) token.type = "whitespace" + return token } -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } +/***/ }), +/* 423 */ +/***/ (function(module, exports, __webpack_require__) { - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); +"use strict"; - chunks.push(chunk.join('')); - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "isIdentifierName", { + enumerable: true, + get: function () { + return _identifier.isIdentifierName; + } +}); +Object.defineProperty(exports, "isIdentifierChar", { + enumerable: true, + get: function () { + return _identifier.isIdentifierChar; + } +}); +Object.defineProperty(exports, "isIdentifierStart", { + enumerable: true, + get: function () { + return _identifier.isIdentifierStart; + } +}); +Object.defineProperty(exports, "isReservedWord", { + enumerable: true, + get: function () { + return _keyword.isReservedWord; + } +}); +Object.defineProperty(exports, "isStrictBindOnlyReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindOnlyReservedWord; + } +}); +Object.defineProperty(exports, "isStrictBindReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictBindReservedWord; + } +}); +Object.defineProperty(exports, "isStrictReservedWord", { + enumerable: true, + get: function () { + return _keyword.isStrictReservedWord; + } +}); +Object.defineProperty(exports, "isKeyword", { + enumerable: true, + get: function () { + return _keyword.isKeyword; + } +}); - return chunks.join(''); -}; +var _identifier = __webpack_require__(424); +var _keyword = __webpack_require__(425); /***/ }), -/* 443 */ +/* 424 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const path_1 = __webpack_require__(16); -exports.CA_CERT_PATH = path_1.resolve(__dirname, '../certs/ca.crt'); -exports.ES_KEY_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.key'); -exports.ES_CERT_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.crt'); -exports.ES_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.p12'); -exports.ES_P12_PASSWORD = 'storepass'; -exports.ES_EMPTYPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_emptypassword.p12'); -exports.ES_NOPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_nopassword.p12'); -exports.KBN_KEY_PATH = path_1.resolve(__dirname, '../certs/kibana.key'); -exports.KBN_CERT_PATH = path_1.resolve(__dirname, '../certs/kibana.crt'); -exports.KBN_P12_PATH = path_1.resolve(__dirname, '../certs/kibana.p12'); -exports.KBN_P12_PASSWORD = 'storepass'; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isIdentifierStart = isIdentifierStart; +exports.isIdentifierChar = isIdentifierChar; +exports.isIdentifierName = isIdentifierName; +let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08c7\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\u9ffc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7ca\ua7f5-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; +let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf\u1ac0\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; +const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); +const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); +nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; +const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 107, 20, 28, 22, 13, 52, 76, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 230, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 35, 56, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2749, 1070, 4050, 582, 8634, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8952, 286, 50, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 2357, 44, 11, 6, 17, 0, 370, 43, 1301, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42717, 35, 4148, 12, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938]; +const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 176, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 135, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 419, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; -/***/ }), -/* 444 */ -/***/ (function(module, exports, __webpack_require__) { +function isInAstralSet(code, set) { + let pos = 0x10000; -"use strict"; + for (let i = 0, length = set.length; i < length; i += 2) { + pos += set[i]; + if (pos > code) return false; + pos += set[i + 1]; + if (pos >= code) return true; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var run_1 = __webpack_require__(445); -exports.run = run_1.run; -var fail_1 = __webpack_require__(446); -exports.createFailError = fail_1.createFailError; -exports.createFlagError = fail_1.createFlagError; -exports.combineErrors = fail_1.combineErrors; -exports.isFailError = fail_1.isFailError; + return false; +} +function isIdentifierStart(code) { + if (code < 65) return code === 36; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; -/***/ }), -/* 445 */ -/***/ (function(module, exports, __webpack_require__) { + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } -"use strict"; + return isInAstralSet(code, astralIdentifierStartCodes); +} -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const util_1 = __webpack_require__(29); -// @ts-ignore @types are outdated and module is super simple -const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(368)); -const tooling_log_1 = __webpack_require__(414); -const fail_1 = __webpack_require__(446); -const flags_1 = __webpack_require__(447); -const proc_runner_1 = __webpack_require__(37); -async function run(fn, options = {}) { - var _a; - const flags = flags_1.getFlags(process.argv.slice(2), options); - if (flags.help) { - process.stderr.write(flags_1.getHelp(options)); - process.exit(1); - } - const log = new tooling_log_1.ToolingLog({ - level: tooling_log_1.pickLevelFromFlags(flags), - writeTo: process.stdout, - }); - process.on('unhandledRejection', (error) => { - log.error('UNHANDLED PROMISE REJECTION'); - log.error(error instanceof Error - ? error - : new Error(`non-Error type rejection value: ${util_1.inspect(error)}`)); - process.exit(1); - }); - const handleErrorWithoutExit = (error) => { - if (fail_1.isFailError(error)) { - log.error(error.message); - if (error.showHelp) { - log.write(flags_1.getHelp(options)); - } - process.exitCode = error.exitCode; - } - else { - log.error('UNHANDLED ERROR'); - log.error(error); - process.exitCode = 1; - } - }; - const doCleanup = () => { - const tasks = cleanupTasks.slice(0); - cleanupTasks.length = 0; - for (const task of tasks) { - try { - task(); - } - catch (error) { - handleErrorWithoutExit(error); - } - } - }; - const unhookExit = exit_hook_1.default(doCleanup); - const cleanupTasks = [unhookExit]; - try { - if (!((_a = options.flags) === null || _a === void 0 ? void 0 : _a.allowUnexpected) && flags.unexpected.length) { - throw fail_1.createFlagError(`Unknown flag(s) "${flags.unexpected.join('", "')}"`); - } - try { - await proc_runner_1.withProcRunner(log, async (procRunner) => { - await fn({ - log, - flags, - procRunner, - addCleanupTask: (task) => cleanupTasks.push(task), - }); - }); - } - finally { - doCleanup(); - } - } - catch (error) { - handleErrorWithoutExit(error); - process.exit(); - } +function isIdentifierChar(code) { + if (code < 48) return code === 36; + if (code < 58) return true; + if (code < 65) return false; + if (code <= 90) return true; + if (code < 97) return code === 95; + if (code <= 122) return true; + + if (code <= 0xffff) { + return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)); + } + + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); } -exports.run = run; +function isIdentifierName(name) { + let isFirst = true; -/***/ }), -/* 446 */ -/***/ (function(module, exports, __webpack_require__) { + for (let _i = 0, _Array$from = Array.from(name); _i < _Array$from.length; _i++) { + const char = _Array$from[_i]; + const cp = char.codePointAt(0); -"use strict"; + if (isFirst) { + if (!isIdentifierStart(cp)) { + return false; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const util_1 = __webpack_require__(29); -const FAIL_TAG = Symbol('fail error'); -function createFailError(reason, options = {}) { - const { exitCode = 1, showHelp = false } = options; - return Object.assign(new Error(reason), { - exitCode, - showHelp, - [FAIL_TAG]: true, - }); -} -exports.createFailError = createFailError; -function createFlagError(reason) { - return createFailError(reason, { - showHelp: true, - }); -} -exports.createFlagError = createFlagError; -function isFailError(error) { - return Boolean(error && error[FAIL_TAG]); -} -exports.isFailError = isFailError; -function combineErrors(errors) { - if (errors.length === 1) { - return errors[0]; + isFirst = false; + } else if (!isIdentifierChar(cp)) { + return false; } - const exitCode = errors - .filter(isFailError) - .reduce((acc, error) => Math.max(acc, error.exitCode), 1); - const showHelp = errors.some((error) => isFailError(error) && error.showHelp); - const message = errors.reduce((acc, error) => { - if (isFailError(error)) { - return acc + '\n' + error.message; - } - return acc + `\nUNHANDLED ERROR\n${util_1.inspect(error)}`; - }, ''); - return createFailError(`${errors.length} errors:\n${message}`, { - exitCode, - showHelp, - }); -} -exports.combineErrors = combineErrors; + } + return true; +} /***/ }), -/* 447 */ +/* 425 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const path_1 = __webpack_require__(16); -const dedent_1 = tslib_1.__importDefault(__webpack_require__(14)); -const getopts_1 = tslib_1.__importDefault(__webpack_require__(448)); -function getFlags(argv, options) { - const unexpectedNames = new Set(); - const flagOpts = options.flags || {}; - const { verbose, quiet, silent, debug, help, _, ...others } = getopts_1.default(argv, { - string: flagOpts.string, - boolean: [...(flagOpts.boolean || []), 'verbose', 'quiet', 'silent', 'debug', 'help'], - alias: { - ...(flagOpts.alias || {}), - v: 'verbose', - }, - default: flagOpts.default, - unknown: (name) => { - unexpectedNames.add(name); - return flagOpts.guessTypesForUnexpectedFlags; - }, - }); - const unexpected = []; - for (const unexpectedName of unexpectedNames) { - const matchingArgv = []; - iterArgv: for (const [i, v] of argv.entries()) { - for (const prefix of ['--', '-']) { - if (v.startsWith(prefix)) { - // -/--name=value - if (v.startsWith(`${prefix}${unexpectedName}=`)) { - matchingArgv.push(v); - continue iterArgv; - } - // -/--name (value possibly follows) - if (v === `${prefix}${unexpectedName}`) { - matchingArgv.push(v); - // value follows -/--name - if (argv.length > i + 1 && !argv[i + 1].startsWith('-')) { - matchingArgv.push(argv[i + 1]); - } - continue iterArgv; - } - } - } - // special case for `--no-{flag}` disabling of boolean flags - if (v === `--no-${unexpectedName}`) { - matchingArgv.push(v); - continue iterArgv; - } - // special case for shortcut flags formatted as `-abc` where `a`, `b`, - // and `c` will be three separate unexpected flags - if (unexpectedName.length === 1 && - v[0] === '-' && - v[1] !== '-' && - !v.includes('=') && - v.includes(unexpectedName)) { - matchingArgv.push(`-${unexpectedName}`); - continue iterArgv; - } - } - if (matchingArgv.length) { - unexpected.push(...matchingArgv); - } - else { - throw new Error(`unable to find unexpected flag named "${unexpectedName}"`); - } - } - return { - verbose, - quiet, - silent, - debug, - help, - _, - unexpected, - ...others, - }; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isReservedWord = isReservedWord; +exports.isStrictReservedWord = isStrictReservedWord; +exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord; +exports.isStrictBindReservedWord = isStrictBindReservedWord; +exports.isKeyword = isKeyword; +const reservedWords = { + keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"], + strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"], + strictBind: ["eval", "arguments"] +}; +const keywords = new Set(reservedWords.keyword); +const reservedWordsStrictSet = new Set(reservedWords.strict); +const reservedWordsStrictBindSet = new Set(reservedWords.strictBind); + +function isReservedWord(word, inModule) { + return inModule && word === "await" || word === "enum"; } -exports.getFlags = getFlags; -function getHelp(options) { - var _a, _b; - const usage = options.usage || `node ${path_1.relative(process.cwd(), process.argv[1])}`; - const optionHelp = (dedent_1.default(((_b = (_a = options) === null || _a === void 0 ? void 0 : _a.flags) === null || _b === void 0 ? void 0 : _b.help) || '') + - '\n' + - dedent_1.default ` - --verbose, -v Log verbosely - --debug Log debug messages (less than verbose) - --quiet Only log errors - --silent Don't log anything - --help Show this message - `) - .split('\n') - .filter(Boolean) - .join('\n '); - return ` - ${usage} - ${dedent_1.default(options.description || 'Runs a dev task') - .split('\n') - .join('\n ')} +function isStrictReservedWord(word, inModule) { + return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word); +} - Options: - ${optionHelp + '\n\n'}`; +function isStrictBindOnlyReservedWord(word) { + return reservedWordsStrictBindSet.has(word); +} + +function isStrictBindReservedWord(word, inModule) { + return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word); } -exports.getHelp = getHelp; +function isKeyword(word) { + return keywords.has(word); +} /***/ }), -/* 448 */ +/* 426 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(427); +const stdoutColor = __webpack_require__(428).stdout; -const EMPTYARR = [] -const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g -const isArray = Array.isArray +const template = __webpack_require__(429); -const parseValue = function(any) { - if (any === "") return "" - if (any === "false") return false - const maybe = Number(any) - return maybe * 0 === 0 ? maybe : any -} +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); -const parseAlias = function(aliases) { - let out = {}, - key, - alias, - prev, - len, - any, - i, - k +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - for (key in aliases) { - any = aliases[key] - alias = out[key] = isArray(any) ? any : [any] +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); - for (i = 0, len = alias.length; i < len; i++) { - prev = out[alias[i]] = [key] +const styles = Object.create(null); - for (k = 0; k < len; k++) { - if (i !== k) prev.push(alias[k]) - } - } - } +function applyOptions(obj, options) { + options = options || {}; - return out + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; } -const parseDefault = function(aliases, defaults) { - let out = {}, - key, - alias, - value, - len, - i +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); - for (key in defaults) { - value = defaults[key] - alias = aliases[key] + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; - out[key] = value + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (i = 0, len = alias.length; i < len; i++) { - out[alias[i]] = value - } - } - } + chalk.template.constructor = Chalk; - return out + return chalk.template; + } + + applyOptions(this, options); } -const parseOptions = function(aliases, options, value) { - let out = {}, - key, - alias, - len, - end, - i, - k +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} - if (options !== undefined) { - for (i = 0, len = options.length; i < len; i++) { - key = options[i] - alias = aliases[key] - - out[key] = value - - if (alias === undefined) { - aliases[key] = EMPTYARR - } else { - for (k = 0, end = alias.length; k < end; k++) { - out[alias[k]] = value - } - } - } - } +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - return out + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; } -const write = function(out, key, value, aliases, unknown) { - let i, - prev, - alias = aliases[key], - len = alias === undefined ? -1 : alias.length - - if (len >= 0 || unknown === undefined || unknown(key)) { - prev = out[key] +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; - if (prev === undefined) { - out[key] = value - } else { - if (isArray(prev)) { - prev.push(value) - } else { - out[key] = [prev, value] - } - } +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } - for (i = 0; i < len; i++) { - out[alias[i]] = out[key] - } - } + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; } -const getopts = function(argv, opts) { - let unknown = (opts = opts || {}).unknown, - aliases = parseAlias(opts.alias), - strings = parseOptions(aliases, opts.string, ""), - values = parseDefault(aliases, opts.default), - bools = parseOptions(aliases, opts.boolean, false), - stopEarly = opts.stopEarly, - _ = [], - out = { _ }, - i = 0, - k = 0, - len = argv.length, - key, - arg, - end, - match, - value - - for (; i < len; i++) { - arg = argv[i] - - if (arg[0] !== "-" || arg === "-") { - if (stopEarly) while (i < len) _.push(argv[i++]) - else _.push(arg) - } else if (arg === "--") { - while (++i < len) _.push(argv[i]) - } else if (arg[1] === "-") { - end = arg.indexOf("=", 2) - if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { - key = arg.slice(5, end >= 0 ? end : undefined) - value = false - } else if (end >= 0) { - key = arg.slice(2, end) - value = - bools[key] !== undefined || - (strings[key] === undefined - ? parseValue(arg.slice(end + 1)) - : arg.slice(end + 1)) - } else { - key = arg.slice(2) - value = - bools[key] !== undefined || - (len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined - ? true - : "" - : strings[key] === undefined - ? parseValue(argv[++i]) - : argv[++i]) - } - write(out, key, value, aliases, unknown) - } else { - SHORTSPLIT.lastIndex = 2 - match = SHORTSPLIT.exec(arg) - end = match.index - value = match[0] - - for (k = 1; k < end; k++) { - write( - out, - (key = arg[k]), - k + 1 < end - ? strings[key] === undefined || - arg.substring(k + 1, (k = end)) + value - : value === "" - ? len === i + 1 || argv[i + 1][0] === "-" - ? strings[key] === undefined || "" - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) - : bools[key] !== undefined || - (strings[key] === undefined ? parseValue(value) : value), - aliases, - unknown - ) - } - } - } - - for (key in values) if (out[key] === undefined) out[key] = values[key] - for (key in bools) if (out[key] === undefined) out[key] = false - for (key in strings) if (out[key] === undefined) out[key] = "" +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } - return out + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; } -module.exports = getopts - - -/***/ }), -/* 449 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -var kbn_client_1 = __webpack_require__(450); -exports.KbnClient = kbn_client_1.KbnClient; -var kbn_client_requester_1 = __webpack_require__(451); -exports.uriencode = kbn_client_requester_1.uriencode; +const proto = Object.defineProperties(() => {}, styles); +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -/***/ }), -/* 450 */ -/***/ (function(module, exports, __webpack_require__) { + builder._styles = _styles; + builder._empty = _empty; -"use strict"; + const self = this; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const kbn_client_requester_1 = __webpack_require__(451); -const kbn_client_status_1 = __webpack_require__(494); -const kbn_client_plugins_1 = __webpack_require__(495); -const kbn_client_version_1 = __webpack_require__(496); -const kbn_client_saved_objects_1 = __webpack_require__(497); -const kbn_client_ui_settings_1 = __webpack_require__(498); -class KbnClient { - /** - * Basic Kibana server client that implements common behaviors for talking - * to the Kibana server from dev tooling. - * - * @param log ToolingLog - * @param kibanaUrls Array of kibana server urls to send requests to - * @param uiSettingDefaults Map of uiSetting values that will be merged with all uiSetting resets - */ - constructor(log, kibanaUrls, uiSettingDefaults) { - this.log = log; - this.kibanaUrls = kibanaUrls; - this.uiSettingDefaults = uiSettingDefaults; - this.requester = new kbn_client_requester_1.KbnClientRequester(this.log, this.kibanaUrls); - this.status = new kbn_client_status_1.KbnClientStatus(this.requester); - this.plugins = new kbn_client_plugins_1.KbnClientPlugins(this.status); - this.version = new kbn_client_version_1.KbnClientVersion(this.status); - this.savedObjects = new kbn_client_saved_objects_1.KbnClientSavedObjects(this.log, this.requester); - this.uiSettings = new kbn_client_ui_settings_1.KbnClientUiSettings(this.log, this.requester, this.uiSettingDefaults); - if (!kibanaUrls.length) { - throw new Error('missing Kibana urls'); - } - } - /** - * Make a direct request to the Kibana server - */ - async request(options) { - return await this.requester.request(options); - } - resolveUrl(relativeUrl) { - return this.requester.resolveUrl(relativeUrl); - } -} -exports.KbnClient = KbnClient; + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); -/***/ }), -/* 451 */ -/***/ (function(module, exports, __webpack_require__) { + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; -"use strict"; + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const url_1 = tslib_1.__importDefault(__webpack_require__(452)); -const axios_1 = tslib_1.__importDefault(__webpack_require__(453)); -const axios_2 = __webpack_require__(492); -const isConcliftOnGetError = (error) => { - return (axios_2.isAxiosResponseError(error) && error.config.method === 'GET' && error.response.status === 409); -}; -exports.uriencode = (strings, ...values) => { - const queue = strings.slice(); - if (queue.length === 0) { - throw new Error('how could strings passed to `uriencode` template tag be empty?'); - } - if (queue.length !== values.length + 1) { - throw new Error('strings and values passed to `uriencode` template tag are unbalanced'); - } - // pull the first string off the queue, there is one less item in `values` - // since the values are always wrapped in strings, so we shift the extra string - // off the queue to balance the queue and values array. - const leadingString = queue.shift(); - return queue.reduce((acc, string, i) => `${acc}${encodeURIComponent(values[i])}${string}`, leadingString); -}; -const DEFAULT_MAX_ATTEMPTS = 5; -const delay = (ms) => new Promise((resolve) => { - setTimeout(resolve, ms); -}); -class KbnClientRequester { - constructor(log, kibanaUrls) { - this.log = log; - this.kibanaUrls = kibanaUrls; - } - pickUrl() { - const url = this.kibanaUrls.shift(); - this.kibanaUrls.push(url); - return url; - } - resolveUrl(relativeUrl = '/') { - return url_1.default.resolve(this.pickUrl(), relativeUrl); - } - async request(options) { - var _a; - const url = url_1.default.resolve(this.pickUrl(), options.path); - const description = options.description || `${options.method} ${url}`; - let attempt = 0; - const maxAttempts = (_a = options.retries, (_a !== null && _a !== void 0 ? _a : DEFAULT_MAX_ATTEMPTS)); - while (true) { - attempt += 1; - try { - const response = await axios_1.default.request({ - method: options.method, - url, - data: options.body, - params: options.query, - headers: { - 'kbn-xsrf': 'kbn-client', - }, - }); - return response.data; - } - catch (error) { - const conflictOnGet = isConcliftOnGetError(error); - const requestedRetries = options.retries !== undefined; - const failedToGetResponse = axios_2.isAxiosRequestError(error); - let errorMessage; - if (conflictOnGet) { - errorMessage = `Conflict on GET (path=${options.path}, attempt=${attempt}/${maxAttempts})`; - this.log.error(errorMessage); - } - else if (requestedRetries || failedToGetResponse) { - errorMessage = `[${description}] request failed (attempt=${attempt}/${maxAttempts})`; - this.log.error(errorMessage); - } - else { - throw error; - } - if (attempt < maxAttempts) { - await delay(1000 * attempt); - continue; - } - throw new Error(`${errorMessage} -- and ran out of retries`); - } - } - } + return builder; } -exports.KbnClientRequester = KbnClientRequester; - - -/***/ }), -/* 452 */ -/***/ (function(module, exports) { - -module.exports = require("url"); - -/***/ }), -/* 453 */ -/***/ (function(module, exports, __webpack_require__) { -module.exports = __webpack_require__(454); +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); -/***/ }), -/* 454 */ -/***/ (function(module, exports, __webpack_require__) { + if (argsLen === 0) { + return ''; + } -"use strict"; + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } -var utils = __webpack_require__(455); -var bind = __webpack_require__(456); -var Axios = __webpack_require__(457); -var mergeConfig = __webpack_require__(488); -var defaults = __webpack_require__(463); + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } -/** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ -function createInstance(defaultConfig) { - var context = new Axios(defaultConfig); - var instance = bind(Axios.prototype.request, context); + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; - // Copy axios.prototype to instance - utils.extend(instance, Axios.prototype, context); + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } - // Copy context to instance - utils.extend(instance, context); + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; - return instance; + return str; } -// Create the default instance to be exported -var axios = createInstance(defaults); - -// Expose Axios class to allow class inheritance -axios.Axios = Axios; +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } -// Factory for creating new instances -axios.create = function create(instanceConfig) { - return createInstance(mergeConfig(axios.defaults, instanceConfig)); -}; + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; -// Expose Cancel & CancelToken -axios.Cancel = __webpack_require__(489); -axios.CancelToken = __webpack_require__(490); -axios.isCancel = __webpack_require__(462); + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } -// Expose all/spread -axios.all = function all(promises) { - return Promise.all(promises); -}; -axios.spread = __webpack_require__(491); + return template(chalk, parts.join('')); +} -module.exports = axios; +Object.defineProperties(Chalk.prototype, styles); -// Allow use of default import syntax in TypeScript -module.exports.default = axios; +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript /***/ }), -/* 455 */ +/* 427 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(389); +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; -var bind = __webpack_require__(456); - -/*global toString:true*/ - -// utils is a library of generic helper functions non-specific to axios +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; -var toString = Object.prototype.toString; +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -/** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ -function isArray(val) { - return toString.call(val) === '[object Array]'; -} - -/** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ -function isUndefined(val) { - return typeof val === 'undefined'; -} - -/** - * Determine if a value is a Buffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Buffer, otherwise false - */ -function isBuffer(val) { - return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) - && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); -} - -/** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ -function isArrayBuffer(val) { - return toString.call(val) === '[object ArrayBuffer]'; -} +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], -/** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ -function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); -} + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -/** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ -function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; -} + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -/** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ -function isString(val) { - return typeof val === 'string'; -} + // Fix humans + styles.color.grey = styles.color.gray; -/** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ -function isNumber(val) { - return typeof val === 'number'; -} + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -/** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ -function isObject(val) { - return val !== null && typeof val === 'object'; -} + for (const styleName of Object.keys(group)) { + const style = group[styleName]; -/** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ -function isDate(val) { - return toString.call(val) === '[object Date]'; -} + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; -/** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ -function isFile(val) { - return toString.call(val) === '[object File]'; -} + group[styleName] = styles[styleName]; -/** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ -function isBlob(val) { - return toString.call(val) === '[object Blob]'; -} + codes.set(style[0], style[1]); + } -/** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ -function isFunction(val) { - return toString.call(val) === '[object Function]'; -} + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); -/** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ -function isStream(val) { - return isObject(val) && isFunction(val.pipe); -} + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } -/** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ -function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; -} + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; -/** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ -function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); -} + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; -/** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - * nativescript - * navigator.product -> 'NativeScript' or 'NS' - */ -function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || - navigator.product === 'NativeScript' || - navigator.product === 'NS')) { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); -} + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; -/** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ -function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } - if (isArray(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } -} + const suite = colorConvert[key]; -/** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (typeof result[key] === 'object' && typeof val === 'object') { - result[key] = merge(result[key], val); - } else { - result[key] = val; - } - } + if (key === 'ansi16') { + key = 'ansi'; + } - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } -/** - * Function equal to merge with the difference being that no reference - * to original objects is kept. - * - * @see merge - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function deepMerge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (typeof result[key] === 'object' && typeof val === 'object') { - result[key] = deepMerge(result[key], val); - } else if (typeof val === 'object') { - result[key] = deepMerge({}, val); - } else { - result[key] = val; - } - } + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } -/** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ -function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind(val, thisArg); - } else { - a[key] = val; - } - }); - return a; + return styles; } -module.exports = { - isArray: isArray, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - deepMerge: deepMerge, - extend: extend, - trim: trim -}; +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) /***/ }), -/* 456 */ +/* 428 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); -module.exports = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; -}; - - -/***/ }), -/* 457 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +const env = process.env; +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} -var utils = __webpack_require__(455); -var buildURL = __webpack_require__(458); -var InterceptorManager = __webpack_require__(459); -var dispatchRequest = __webpack_require__(460); -var mergeConfig = __webpack_require__(488); +function translateLevel(level) { + if (level === 0) { + return false; + } -/** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ -function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager(), - response: new InterceptorManager() - }; + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; } -/** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ -Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = arguments[1] || {}; - config.url = arguments[0]; - } else { - config = config || {}; - } +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - config = mergeConfig(this.defaults, config); + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } - // Set config.method - if (config.method) { - config.method = config.method.toLowerCase(); - } else if (this.defaults.method) { - config.method = this.defaults.method.toLowerCase(); - } else { - config.method = 'get'; - } + if (hasFlag('color=256')) { + return 2; + } - // Hook up interceptors middleware - var chain = [dispatchRequest, undefined]; - var promise = Promise.resolve(config); + if (stream && !stream.isTTY && forceColor !== true) { + // VS code debugger doesn't have isTTY set + if (env.VSCODE_PID) { + return 1; + } + return 0; + } - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - chain.unshift(interceptor.fulfilled, interceptor.rejected); - }); + const min = forceColor ? 1 : 0; - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - chain.push(interceptor.fulfilled, interceptor.rejected); - }); + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } + return 1; + } - return promise; -}; + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } -Axios.prototype.getUri = function getUri(config) { - config = mergeConfig(this.defaults, config); - return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); -}; + return min; + } -// Provide aliases for supported request methods -utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url - })); - }; -}); + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url, - data: data - })); - }; -}); + if (env.COLORTERM === 'truecolor') { + return 3; + } -module.exports = Axios; + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } -/***/ }), -/* 458 */ -/***/ (function(module, exports, __webpack_require__) { + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } -"use strict"; + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ('COLORTERM' in env) { + return 1; + } -var utils = __webpack_require__(455); + if (env.TERM === 'dumb') { + return min; + } -function encode(val) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); + return min; } -/** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ -module.exports = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - var hashmarkIndex = url.indexOf('#'); - if (hashmarkIndex !== -1) { - url = url.slice(0, hashmarkIndex); - } - - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} - return url; +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) }; /***/ }), -/* 459 */ +/* 429 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -var utils = __webpack_require__(455); - -function InterceptorManager() { - this.handlers = []; -} +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); -/** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ -InterceptorManager.prototype.use = function use(fulfilled, rejected) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected - }); - return this.handlers.length - 1; -}; +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } -/** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ -InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } -}; + return ESCAPES.get(c) || c; +} -/** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ -InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); -}; +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; -module.exports = InterceptorManager; + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } + return results; +} -/***/ }), -/* 460 */ -/***/ (function(module, exports, __webpack_require__) { +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; -"use strict"; + const results = []; + let matches; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; -var utils = __webpack_require__(455); -var transformData = __webpack_require__(461); -var isCancel = __webpack_require__(462); -var defaults = __webpack_require__(463); + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } -/** - * Throws a `Cancel` if cancellation has been requested. - */ -function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } + return results; } -/** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ -module.exports = function dispatchRequest(config) { - throwIfCancellationRequested(config); +function buildStyle(chalk, styles) { + const enabled = {}; - // Ensure headers exist - config.headers = config.headers || {}; + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } - // Transform request data - config.data = transformData( - config.data, - config.headers, - config.transformRequest - ); + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers - ); + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); + return current; +} - var adapter = config.adapter || defaults.adapter; +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - // Transform response data - response.data = transformData( - response.data, - response.headers, - config.transformResponse - ); + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); + chunks.push(chunk.join('')); - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData( - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } - return Promise.reject(reason); - }); + return chunks.join(''); }; /***/ }), -/* 461 */ +/* 430 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var utils = __webpack_require__(455); - -/** - * Transform the data for a request or a response +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data + * 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. */ -module.exports = function transformData(data, headers, fns) { - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn(data, headers); - }); - - return data; -}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = __webpack_require__(4); +exports.CA_CERT_PATH = path_1.resolve(__dirname, '../certs/ca.crt'); +exports.ES_KEY_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.key'); +exports.ES_CERT_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.crt'); +exports.ES_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch.p12'); +exports.ES_P12_PASSWORD = 'storepass'; +exports.ES_EMPTYPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_emptypassword.p12'); +exports.ES_NOPASSWORD_P12_PATH = path_1.resolve(__dirname, '../certs/elasticsearch_nopassword.p12'); +exports.KBN_KEY_PATH = path_1.resolve(__dirname, '../certs/kibana.key'); +exports.KBN_CERT_PATH = path_1.resolve(__dirname, '../certs/kibana.crt'); +exports.KBN_P12_PATH = path_1.resolve(__dirname, '../certs/kibana.p12'); +exports.KBN_P12_PASSWORD = 'storepass'; /***/ }), -/* 462 */ +/* 431 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -module.exports = function isCancel(value) { - return !!(value && value.__CANCEL__); -}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var run_1 = __webpack_require__(432); +exports.run = run_1.run; +var fail_1 = __webpack_require__(433); +exports.createFailError = fail_1.createFailError; +exports.createFlagError = fail_1.createFlagError; +exports.combineErrors = fail_1.combineErrors; +exports.isFailError = fail_1.isFailError; /***/ }), -/* 463 */ +/* 432 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var utils = __webpack_require__(455); -var normalizeHeaderName = __webpack_require__(464); - -var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' -}; - -function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } -} - -function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = __webpack_require__(465); - } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { - // For node use HTTP adapter - adapter = __webpack_require__(475); - } - return adapter; -} - -var defaults = { - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Accept'); - normalizeHeaderName(headers, 'Content-Type'); - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const util_1 = __webpack_require__(397); +// @ts-ignore @types are outdated and module is super simple +const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(339)); +const tooling_log_1 = __webpack_require__(400); +const fail_1 = __webpack_require__(433); +const flags_1 = __webpack_require__(434); +const proc_runner_1 = __webpack_require__(7); +async function run(fn, options = {}) { + var _a; + const flags = flags_1.getFlags(process.argv.slice(2), options); + if (flags.help) { + process.stderr.write(flags_1.getHelp(options)); + process.exit(1); } - if (utils.isObject(data)) { - setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); - return JSON.stringify(data); + const log = new tooling_log_1.ToolingLog({ + level: tooling_log_1.pickLevelFromFlags(flags), + writeTo: process.stdout, + }); + process.on('unhandledRejection', (error) => { + log.error('UNHANDLED PROMISE REJECTION'); + log.error(error instanceof Error + ? error + : new Error(`non-Error type rejection value: ${util_1.inspect(error)}`)); + process.exit(1); + }); + const handleErrorWithoutExit = (error) => { + if (fail_1.isFailError(error)) { + log.error(error.message); + if (error.showHelp) { + log.write(flags_1.getHelp(options)); + } + process.exitCode = error.exitCode; + } + else { + log.error('UNHANDLED ERROR'); + log.error(error); + process.exitCode = 1; + } + }; + const doCleanup = () => { + const tasks = cleanupTasks.slice(0); + cleanupTasks.length = 0; + for (const task of tasks) { + try { + task(); + } + catch (error) { + handleErrorWithoutExit(error); + } + } + }; + const unhookExit = exit_hook_1.default(doCleanup); + const cleanupTasks = [unhookExit]; + try { + if (!((_a = options.flags) === null || _a === void 0 ? void 0 : _a.allowUnexpected) && flags.unexpected.length) { + throw fail_1.createFlagError(`Unknown flag(s) "${flags.unexpected.join('", "')}"`); + } + try { + await proc_runner_1.withProcRunner(log, async (procRunner) => { + await fn({ + log, + flags, + procRunner, + addCleanupTask: (task) => cleanupTasks.push(task), + }); + }); + } + finally { + doCleanup(); + } } - return data; - }], - - transformResponse: [function transformResponse(data) { - /*eslint no-param-reassign:0*/ - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { /* Ignore */ } + catch (error) { + handleErrorWithoutExit(error); + process.exit(); } - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } -}; +} +exports.run = run; -defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } -}; -utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; -}); +/***/ }), +/* 433 */ +/***/ (function(module, exports, __webpack_require__) { -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); -}); +"use strict"; -module.exports = defaults; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const util_1 = __webpack_require__(397); +const FAIL_TAG = Symbol('fail error'); +function createFailError(reason, options = {}) { + const { exitCode = 1, showHelp = false } = options; + return Object.assign(new Error(reason), { + exitCode, + showHelp, + [FAIL_TAG]: true, + }); +} +exports.createFailError = createFailError; +function createFlagError(reason) { + return createFailError(reason, { + showHelp: true, + }); +} +exports.createFlagError = createFlagError; +function isFailError(error) { + return Boolean(error && error[FAIL_TAG]); +} +exports.isFailError = isFailError; +function combineErrors(errors) { + if (errors.length === 1) { + return errors[0]; + } + const exitCode = errors + .filter(isFailError) + .reduce((acc, error) => Math.max(acc, error.exitCode), 1); + const showHelp = errors.some((error) => isFailError(error) && error.showHelp); + const message = errors.reduce((acc, error) => { + if (isFailError(error)) { + return acc + '\n' + error.message; + } + return acc + `\nUNHANDLED ERROR\n${util_1.inspect(error)}`; + }, ''); + return createFailError(`${errors.length} errors:\n${message}`, { + exitCode, + showHelp, + }); +} +exports.combineErrors = combineErrors; /***/ }), -/* 464 */ +/* 434 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const path_1 = __webpack_require__(4); +const dedent_1 = tslib_1.__importDefault(__webpack_require__(2)); +const getopts_1 = tslib_1.__importDefault(__webpack_require__(435)); +function getFlags(argv, options) { + const unexpectedNames = new Set(); + const flagOpts = options.flags || {}; + const { verbose, quiet, silent, debug, help, _, ...others } = getopts_1.default(argv, { + string: flagOpts.string, + boolean: [...(flagOpts.boolean || []), 'verbose', 'quiet', 'silent', 'debug', 'help'], + alias: { + ...(flagOpts.alias || {}), + v: 'verbose', + }, + default: flagOpts.default, + unknown: (name) => { + unexpectedNames.add(name); + return flagOpts.guessTypesForUnexpectedFlags; + }, + }); + const unexpected = []; + for (const unexpectedName of unexpectedNames) { + const matchingArgv = []; + iterArgv: for (const [i, v] of argv.entries()) { + for (const prefix of ['--', '-']) { + if (v.startsWith(prefix)) { + // -/--name=value + if (v.startsWith(`${prefix}${unexpectedName}=`)) { + matchingArgv.push(v); + continue iterArgv; + } + // -/--name (value possibly follows) + if (v === `${prefix}${unexpectedName}`) { + matchingArgv.push(v); + // value follows -/--name + if (argv.length > i + 1 && !argv[i + 1].startsWith('-')) { + matchingArgv.push(argv[i + 1]); + } + continue iterArgv; + } + } + } + // special case for `--no-{flag}` disabling of boolean flags + if (v === `--no-${unexpectedName}`) { + matchingArgv.push(v); + continue iterArgv; + } + // special case for shortcut flags formatted as `-abc` where `a`, `b`, + // and `c` will be three separate unexpected flags + if (unexpectedName.length === 1 && + v[0] === '-' && + v[1] !== '-' && + !v.includes('=') && + v.includes(unexpectedName)) { + matchingArgv.push(`-${unexpectedName}`); + continue iterArgv; + } + } + if (matchingArgv.length) { + unexpected.push(...matchingArgv); + } + else { + throw new Error(`unable to find unexpected flag named "${unexpectedName}"`); + } + } + return { + verbose, + quiet, + silent, + debug, + help, + _, + unexpected, + ...others, + }; +} +exports.getFlags = getFlags; +function getHelp(options) { + var _a, _b; + const usage = options.usage || `node ${path_1.relative(process.cwd(), process.argv[1])}`; + const optionHelp = (dedent_1.default(((_b = (_a = options) === null || _a === void 0 ? void 0 : _a.flags) === null || _b === void 0 ? void 0 : _b.help) || '') + + '\n' + + dedent_1.default ` + --verbose, -v Log verbosely + --debug Log debug messages (less than verbose) + --quiet Only log errors + --silent Don't log anything + --help Show this message + `) + .split('\n') + .filter(Boolean) + .join('\n '); + return ` + ${usage} -var utils = __webpack_require__(455); + ${dedent_1.default(options.description || 'Runs a dev task') + .split('\n') + .join('\n ')} -module.exports = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); -}; + Options: + ${optionHelp + '\n\n'}`; +} +exports.getHelp = getHelp; /***/ }), -/* 465 */ +/* 435 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(455); -var settle = __webpack_require__(466); -var buildURL = __webpack_require__(458); -var buildFullPath = __webpack_require__(469); -var parseHeaders = __webpack_require__(472); -var isURLSameOrigin = __webpack_require__(473); -var createError = __webpack_require__(467); - -module.exports = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } +const EMPTYARR = [] +const SHORTSPLIT = /$|[!-@[-`{-~][\s\S]*/g +const isArray = Array.isArray - var request = new XMLHttpRequest(); +const parseValue = function(any) { + if (any === "") return "" + if (any === "false") return false + const maybe = Number(any) + return maybe * 0 === 0 ? maybe : any +} - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } +const parseAlias = function(aliases) { + let out = {}, + key, + alias, + prev, + len, + any, + i, + k - var fullPath = buildFullPath(config.baseURL, config.url); - request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + for (key in aliases) { + any = aliases[key] + alias = out[key] = isArray(any) ? any : [any] - // Set the request timeout in MS - request.timeout = config.timeout; + for (i = 0, len = alias.length; i < len; i++) { + prev = out[alias[i]] = [key] - // Listen for ready state - request.onreadystatechange = function handleLoad() { - if (!request || request.readyState !== 4) { - return; + for (k = 0; k < len; k++) { + if (i !== k) prev.push(alias[k]) } + } + } - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } + return out +} - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders, - config: config, - request: request - }; +const parseDefault = function(aliases, defaults) { + let out = {}, + key, + alias, + value, + len, + i - settle(resolve, reject, response); + for (key in defaults) { + value = defaults[key] + alias = aliases[key] - // Clean up request - request = null; - }; + out[key] = value - // Handle browser request cancellation (as opposed to a manual cancellation) - request.onabort = function handleAbort() { - if (!request) { - return; + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (i = 0, len = alias.length; i < len; i++) { + out[alias[i]] = value } + } + } - reject(createError('Request aborted', config, 'ECONNABORTED', request)); + return out +} - // Clean up request - request = null; - }; +const parseOptions = function(aliases, options, value) { + let out = {}, + key, + alias, + len, + end, + i, + k - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); + if (options !== undefined) { + for (i = 0, len = options.length; i < len; i++) { + key = options[i] + alias = aliases[key] - // Clean up request - request = null; - }; + out[key] = value - // Handle timeout - request.ontimeout = function handleTimeout() { - var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; - if (config.timeoutErrorMessage) { - timeoutErrorMessage = config.timeoutErrorMessage; + if (alias === undefined) { + aliases[key] = EMPTYARR + } else { + for (k = 0, end = alias.length; k < end; k++) { + out[alias[k]] = value + } } - reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', - request)); + } + } - // Clean up request - request = null; - }; + return out +} - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - var cookies = __webpack_require__(474); +const write = function(out, key, value, aliases, unknown) { + let i, + prev, + alias = aliases[key], + len = alias === undefined ? -1 : alias.length - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; + if (len >= 0 || unknown === undefined || unknown(key)) { + prev = out[key] - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; + if (prev === undefined) { + out[key] = value + } else { + if (isArray(prev)) { + prev.push(value) + } else { + out[key] = [prev, value] } } - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); + for (i = 0; i < len; i++) { + out[alias[i]] = out[key] } + } +} - // Add withCredentials to request if needed - if (!utils.isUndefined(config.withCredentials)) { - request.withCredentials = !!config.withCredentials; - } +const getopts = function(argv, opts) { + let unknown = (opts = opts || {}).unknown, + aliases = parseAlias(opts.alias), + strings = parseOptions(aliases, opts.string, ""), + values = parseDefault(aliases, opts.default), + bools = parseOptions(aliases, opts.boolean, false), + stopEarly = opts.stopEarly, + _ = [], + out = { _ }, + i = 0, + k = 0, + len = argv.length, + key, + arg, + end, + match, + value - // Add responseType to request if needed - if (config.responseType) { - try { - request.responseType = config.responseType; - } catch (e) { - // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. - // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. - if (config.responseType !== 'json') { - throw e; - } - } - } + for (; i < len; i++) { + arg = argv[i] - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } + if (arg[0] !== "-" || arg === "-") { + if (stopEarly) while (i < len) _.push(argv[i++]) + else _.push(arg) + } else if (arg === "--") { + while (++i < len) _.push(argv[i]) + } else if (arg[1] === "-") { + end = arg.indexOf("=", 2) + if (arg[2] === "n" && arg[3] === "o" && arg[4] === "-") { + key = arg.slice(5, end >= 0 ? end : undefined) + value = false + } else if (end >= 0) { + key = arg.slice(2, end) + value = + bools[key] !== undefined || + (strings[key] === undefined + ? parseValue(arg.slice(end + 1)) + : arg.slice(end + 1)) + } else { + key = arg.slice(2) + value = + bools[key] !== undefined || + (len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined + ? true + : "" + : strings[key] === undefined + ? parseValue(argv[++i]) + : argv[++i]) + } + write(out, key, value, aliases, unknown) + } else { + SHORTSPLIT.lastIndex = 2 + match = SHORTSPLIT.exec(arg) + end = match.index + value = match[0] - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); + for (k = 1; k < end; k++) { + write( + out, + (key = arg[k]), + k + 1 < end + ? strings[key] === undefined || + arg.substring(k + 1, (k = end)) + value + : value === "" + ? len === i + 1 || argv[i + 1][0] === "-" + ? strings[key] === undefined || "" + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(argv[++i]) : argv[++i]) + : bools[key] !== undefined || + (strings[key] === undefined ? parseValue(value) : value), + aliases, + unknown + ) + } } + } - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } + for (key in values) if (out[key] === undefined) out[key] = values[key] + for (key in bools) if (out[key] === undefined) out[key] = false + for (key in strings) if (out[key] === undefined) out[key] = "" - if (requestData === undefined) { - requestData = null; - } + return out +} - // Send the request - request.send(requestData); - }); -}; +module.exports = getopts /***/ }), -/* 466 */ +/* 436 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var createError = __webpack_require__(467); - -/** - * Resolve or reject a Promise based on response status. +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. + * 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. */ -module.exports = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - if (!validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } -}; +Object.defineProperty(exports, "__esModule", { value: true }); +var kbn_client_1 = __webpack_require__(437); +exports.KbnClient = kbn_client_1.KbnClient; +var kbn_client_requester_1 = __webpack_require__(438); +exports.uriencode = kbn_client_requester_1.uriencode; /***/ }), -/* 467 */ +/* 437 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -var enhanceError = __webpack_require__(468); - -/** - * Create an Error with the specified message, config, error code, request and response. +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. + * 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. */ -module.exports = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); -}; +Object.defineProperty(exports, "__esModule", { value: true }); +const kbn_client_requester_1 = __webpack_require__(438); +const kbn_client_status_1 = __webpack_require__(481); +const kbn_client_plugins_1 = __webpack_require__(482); +const kbn_client_version_1 = __webpack_require__(483); +const kbn_client_saved_objects_1 = __webpack_require__(484); +const kbn_client_ui_settings_1 = __webpack_require__(485); +class KbnClient { + /** + * Basic Kibana server client that implements common behaviors for talking + * to the Kibana server from dev tooling. + * + * @param log ToolingLog + * @param kibanaUrls Array of kibana server urls to send requests to + * @param uiSettingDefaults Map of uiSetting values that will be merged with all uiSetting resets + */ + constructor(log, kibanaUrls, uiSettingDefaults) { + this.log = log; + this.kibanaUrls = kibanaUrls; + this.uiSettingDefaults = uiSettingDefaults; + this.requester = new kbn_client_requester_1.KbnClientRequester(this.log, this.kibanaUrls); + this.status = new kbn_client_status_1.KbnClientStatus(this.requester); + this.plugins = new kbn_client_plugins_1.KbnClientPlugins(this.status); + this.version = new kbn_client_version_1.KbnClientVersion(this.status); + this.savedObjects = new kbn_client_saved_objects_1.KbnClientSavedObjects(this.log, this.requester); + this.uiSettings = new kbn_client_ui_settings_1.KbnClientUiSettings(this.log, this.requester, this.uiSettingDefaults); + if (!kibanaUrls.length) { + throw new Error('missing Kibana urls'); + } + } + /** + * Make a direct request to the Kibana server + */ + async request(options) { + return await this.requester.request(options); + } + resolveUrl(relativeUrl) { + return this.requester.resolveUrl(relativeUrl); + } +} +exports.KbnClient = KbnClient; /***/ }), -/* 468 */ +/* 438 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -/** - * Update an Error with the specified config, error code, and response. +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. + * 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. */ -module.exports = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - - error.request = request; - error.response = response; - error.isAxiosError = true; - - error.toJSON = function() { - return { - // Standard - message: this.message, - name: this.name, - // Microsoft - description: this.description, - number: this.number, - // Mozilla - fileName: this.fileName, - lineNumber: this.lineNumber, - columnNumber: this.columnNumber, - stack: this.stack, - // Axios - config: this.config, - code: this.code - }; - }; - return error; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const url_1 = tslib_1.__importDefault(__webpack_require__(439)); +const axios_1 = tslib_1.__importDefault(__webpack_require__(440)); +const axios_2 = __webpack_require__(479); +const isConcliftOnGetError = (error) => { + return (axios_2.isAxiosResponseError(error) && error.config.method === 'GET' && error.response.status === 409); +}; +exports.uriencode = (strings, ...values) => { + const queue = strings.slice(); + if (queue.length === 0) { + throw new Error('how could strings passed to `uriencode` template tag be empty?'); + } + if (queue.length !== values.length + 1) { + throw new Error('strings and values passed to `uriencode` template tag are unbalanced'); + } + // pull the first string off the queue, there is one less item in `values` + // since the values are always wrapped in strings, so we shift the extra string + // off the queue to balance the queue and values array. + const leadingString = queue.shift(); + return queue.reduce((acc, string, i) => `${acc}${encodeURIComponent(values[i])}${string}`, leadingString); }; +const DEFAULT_MAX_ATTEMPTS = 5; +const delay = (ms) => new Promise((resolve) => { + setTimeout(resolve, ms); +}); +class KbnClientRequester { + constructor(log, kibanaUrls) { + this.log = log; + this.kibanaUrls = kibanaUrls; + } + pickUrl() { + const url = this.kibanaUrls.shift(); + this.kibanaUrls.push(url); + return url; + } + resolveUrl(relativeUrl = '/') { + return url_1.default.resolve(this.pickUrl(), relativeUrl); + } + async request(options) { + var _a; + const url = url_1.default.resolve(this.pickUrl(), options.path); + const description = options.description || `${options.method} ${url}`; + let attempt = 0; + const maxAttempts = (_a = options.retries, (_a !== null && _a !== void 0 ? _a : DEFAULT_MAX_ATTEMPTS)); + while (true) { + attempt += 1; + try { + const response = await axios_1.default.request({ + method: options.method, + url, + data: options.body, + params: options.query, + headers: { + 'kbn-xsrf': 'kbn-client', + }, + }); + return response.data; + } + catch (error) { + const conflictOnGet = isConcliftOnGetError(error); + const requestedRetries = options.retries !== undefined; + const failedToGetResponse = axios_2.isAxiosRequestError(error); + let errorMessage; + if (conflictOnGet) { + errorMessage = `Conflict on GET (path=${options.path}, attempt=${attempt}/${maxAttempts})`; + this.log.error(errorMessage); + } + else if (requestedRetries || failedToGetResponse) { + errorMessage = `[${description}] request failed (attempt=${attempt}/${maxAttempts})`; + this.log.error(errorMessage); + } + else { + throw error; + } + if (attempt < maxAttempts) { + await delay(1000 * attempt); + continue; + } + throw new Error(`${errorMessage} -- and ran out of retries`); + } + } + } +} +exports.KbnClientRequester = KbnClientRequester; /***/ }), -/* 469 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var isAbsoluteURL = __webpack_require__(470); -var combineURLs = __webpack_require__(471); - -/** - * Creates a new URL by combining the baseURL with the requestedURL, - * only when the requestedURL is not already an absolute URL. - * If the requestURL is absolute, this function returns the requestedURL untouched. - * - * @param {string} baseURL The base URL - * @param {string} requestedURL Absolute or relative URL to combine - * @returns {string} The combined full path - */ -module.exports = function buildFullPath(baseURL, requestedURL) { - if (baseURL && !isAbsoluteURL(requestedURL)) { - return combineURLs(baseURL, requestedURL); - } - return requestedURL; -}; +/* 439 */ +/***/ (function(module, exports) { +module.exports = require("url"); /***/ }), -/* 470 */ +/* 440 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -/** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ -module.exports = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); -}; - +module.exports = __webpack_require__(441); /***/ }), -/* 471 */ +/* 441 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +var utils = __webpack_require__(442); +var bind = __webpack_require__(443); +var Axios = __webpack_require__(444); +var mergeConfig = __webpack_require__(475); +var defaults = __webpack_require__(450); + /** - * Creates a new URL by combining the specified URLs + * Create an instance of Axios * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL + * @param {Object} defaultConfig The default config for the instance + * @return {Axios} A new instance of Axios */ -module.exports = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; -}; - +function createInstance(defaultConfig) { + var context = new Axios(defaultConfig); + var instance = bind(Axios.prototype.request, context); -/***/ }), -/* 472 */ -/***/ (function(module, exports, __webpack_require__) { + // Copy axios.prototype to instance + utils.extend(instance, Axios.prototype, context); -"use strict"; + // Copy context to instance + utils.extend(instance, context); + return instance; +} -var utils = __webpack_require__(455); +// Create the default instance to be exported +var axios = createInstance(defaults); -// Headers whose duplicates are ignored by node -// c.f. https://nodejs.org/api/http.html#http_message_headers -var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' -]; +// Expose Axios class to allow class inheritance +axios.Axios = Axios; -/** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ -module.exports = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; +// Factory for creating new instances +axios.create = function create(instanceConfig) { + return createInstance(mergeConfig(axios.defaults, instanceConfig)); +}; - if (!headers) { return parsed; } +// Expose Cancel & CancelToken +axios.Cancel = __webpack_require__(476); +axios.CancelToken = __webpack_require__(477); +axios.isCancel = __webpack_require__(449); - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; +axios.spread = __webpack_require__(478); - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); +module.exports = axios; - return parsed; -}; +// Allow use of default import syntax in TypeScript +module.exports.default = axios; /***/ }), -/* 473 */ +/* 442 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(455); +var bind = __webpack_require__(443); -module.exports = ( - utils.isStandardBrowserEnv() ? +/*global toString:true*/ - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; +// utils is a library of generic helper functions non-specific to axios - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; +var toString = Object.prototype.toString; - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ +function isArray(val) { + return toString.call(val) === '[object Array]'; +} - urlParsingNode.setAttribute('href', href); +/** + * Determine if a value is undefined + * + * @param {Object} val The value to test + * @returns {boolean} True if the value is undefined, otherwise false + */ +function isUndefined(val) { + return typeof val === 'undefined'; +} - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } +/** + * Determine if a value is a Buffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); +} - originURL = resolveURL(window.location.href); +/** + * Determine if a value is an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +function isArrayBuffer(val) { + return toString.call(val) === '[object ArrayBuffer]'; +} - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : +/** + * Determine if a value is a FormData + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an FormData, otherwise false + */ +function isFormData(val) { + return (typeof FormData !== 'undefined') && (val instanceof FormData); +} - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() -); +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + var result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); + } + return result; +} +/** + * Determine if a value is a String + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a String, otherwise false + */ +function isString(val) { + return typeof val === 'string'; +} -/***/ }), -/* 474 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Determine if a value is a Number + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Number, otherwise false + */ +function isNumber(val) { + return typeof val === 'number'; +} -"use strict"; +/** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ +function isObject(val) { + return val !== null && typeof val === 'object'; +} +/** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ +function isDate(val) { + return toString.call(val) === '[object Date]'; +} -var utils = __webpack_require__(455); +/** + * Determine if a value is a File + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ +function isFile(val) { + return toString.call(val) === '[object File]'; +} -module.exports = ( - utils.isStandardBrowserEnv() ? +/** + * Determine if a value is a Blob + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Blob, otherwise false + */ +function isBlob(val) { + return toString.call(val) === '[object Blob]'; +} - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); +/** + * Determine if a value is a Function + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +function isFunction(val) { + return toString.call(val) === '[object Function]'; +} - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } +/** + * Determine if a value is a Stream + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Stream, otherwise false + */ +function isStream(val) { + return isObject(val) && isFunction(val.pipe); +} - if (utils.isString(path)) { - cookie.push('path=' + path); - } +/** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +function isURLSearchParams(val) { + return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; +} - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * @returns {String} The String freed of excess whitespace + */ +function trim(str) { + return str.replace(/^\s*/, '').replace(/\s*$/, ''); +} - if (secure === true) { - cookie.push('secure'); - } +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + */ +function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || + navigator.product === 'NativeScript' || + navigator.product === 'NS')) { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); +} - document.cookie = cookie.join('; '); - }, +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } +} - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() -); +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = merge(result[key], val); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Function equal to merge with the difference being that no reference + * to original objects is kept. + * + * @see merge + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function deepMerge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = deepMerge(result[key], val); + } else if (typeof val === 'object') { + result[key] = deepMerge({}, val); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ +function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; +} + +module.exports = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + deepMerge: deepMerge, + extend: extend, + trim: trim +}; /***/ }), -/* 475 */ +/* 443 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(455); -var settle = __webpack_require__(466); -var buildFullPath = __webpack_require__(469); -var buildURL = __webpack_require__(458); -var http = __webpack_require__(476); -var https = __webpack_require__(477); -var httpFollow = __webpack_require__(478).http; -var httpsFollow = __webpack_require__(478).https; -var url = __webpack_require__(452); -var zlib = __webpack_require__(486); -var pkg = __webpack_require__(487); -var createError = __webpack_require__(467); -var enhanceError = __webpack_require__(468); +module.exports = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; +}; -var isHttps = /https:?/; -/*eslint consistent-return:0*/ -module.exports = function httpAdapter(config) { - return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) { - var resolve = function resolve(value) { - resolvePromise(value); - }; - var reject = function reject(value) { - rejectPromise(value); - }; - var data = config.data; - var headers = config.headers; +/***/ }), +/* 444 */ +/***/ (function(module, exports, __webpack_require__) { - // Set User-Agent (required by some servers) - // Only set header if it hasn't been set in config - // See https://github.com/axios/axios/issues/69 - if (!headers['User-Agent'] && !headers['user-agent']) { - headers['User-Agent'] = 'axios/' + pkg.version; - } +"use strict"; - if (data && !utils.isStream(data)) { - if (Buffer.isBuffer(data)) { - // Nothing to do... - } else if (utils.isArrayBuffer(data)) { - data = Buffer.from(new Uint8Array(data)); - } else if (utils.isString(data)) { - data = Buffer.from(data, 'utf-8'); - } else { - return reject(createError( - 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', - config - )); - } - // Add Content-Length header if data exists - headers['Content-Length'] = data.length; - } +var utils = __webpack_require__(442); +var buildURL = __webpack_require__(445); +var InterceptorManager = __webpack_require__(446); +var dispatchRequest = __webpack_require__(447); +var mergeConfig = __webpack_require__(475); - // HTTP basic authentication - var auth = undefined; - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - auth = username + ':' + password; - } +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + */ +function Axios(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + }; +} - // Parse url - var fullPath = buildFullPath(config.baseURL, config.url); - var parsed = url.parse(fullPath); - var protocol = parsed.protocol || 'http:'; +/** + * Dispatch a request + * + * @param {Object} config The config specific for this request (merged with this.defaults) + */ +Axios.prototype.request = function request(config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof config === 'string') { + config = arguments[1] || {}; + config.url = arguments[0]; + } else { + config = config || {}; + } - if (!auth && parsed.auth) { - var urlAuth = parsed.auth.split(':'); - var urlUsername = urlAuth[0] || ''; - var urlPassword = urlAuth[1] || ''; - auth = urlUsername + ':' + urlPassword; - } + config = mergeConfig(this.defaults, config); - if (auth) { - delete headers.Authorization; - } + // Set config.method + if (config.method) { + config.method = config.method.toLowerCase(); + } else if (this.defaults.method) { + config.method = this.defaults.method.toLowerCase(); + } else { + config.method = 'get'; + } - var isHttpsRequest = isHttps.test(protocol); - var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; + // Hook up interceptors middleware + var chain = [dispatchRequest, undefined]; + var promise = Promise.resolve(config); - var options = { - path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), - method: config.method.toUpperCase(), - headers: headers, - agent: agent, - agents: { http: config.httpAgent, https: config.httpsAgent }, - auth: auth - }; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + chain.unshift(interceptor.fulfilled, interceptor.rejected); + }); - if (config.socketPath) { - options.socketPath = config.socketPath; - } else { - options.hostname = parsed.hostname; - options.port = parsed.port; - } + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + chain.push(interceptor.fulfilled, interceptor.rejected); + }); - var proxy = config.proxy; - if (!proxy && proxy !== false) { - var proxyEnv = protocol.slice(0, -1) + '_proxy'; - var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; - if (proxyUrl) { - var parsedProxyUrl = url.parse(proxyUrl); - var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY; - var shouldProxy = true; + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()); + } - if (noProxyEnv) { - var noProxy = noProxyEnv.split(',').map(function trim(s) { - return s.trim(); - }); + return promise; +}; - shouldProxy = !noProxy.some(function proxyMatch(proxyElement) { - if (!proxyElement) { - return false; - } - if (proxyElement === '*') { - return true; - } - if (proxyElement[0] === '.' && - parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) { - return true; - } +Axios.prototype.getUri = function getUri(config) { + config = mergeConfig(this.defaults, config); + return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); +}; - return parsed.hostname === proxyElement; - }); - } +// Provide aliases for supported request methods +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(utils.merge(config || {}, { + method: method, + url: url + })); + }; +}); +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, data, config) { + return this.request(utils.merge(config || {}, { + method: method, + url: url, + data: data + })); + }; +}); - if (shouldProxy) { - proxy = { - host: parsedProxyUrl.hostname, - port: parsedProxyUrl.port - }; +module.exports = Axios; - if (parsedProxyUrl.auth) { - var proxyUrlAuth = parsedProxyUrl.auth.split(':'); - proxy.auth = { - username: proxyUrlAuth[0], - password: proxyUrlAuth[1] - }; - } - } - } - } - if (proxy) { - options.hostname = proxy.host; - options.host = proxy.host; - options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); - options.port = proxy.port; - options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; +/***/ }), +/* 445 */ +/***/ (function(module, exports, __webpack_require__) { - // Basic proxy authorization - if (proxy.auth) { - var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); - options.headers['Proxy-Authorization'] = 'Basic ' + base64; - } - } +"use strict"; - var transport; - var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true); - if (config.transport) { - transport = config.transport; - } else if (config.maxRedirects === 0) { - transport = isHttpsProxy ? https : http; - } else { - if (config.maxRedirects) { - options.maxRedirects = config.maxRedirects; - } - transport = isHttpsProxy ? httpsFollow : httpFollow; - } - if (config.maxContentLength && config.maxContentLength > -1) { - options.maxBodyLength = config.maxContentLength; - } +var utils = __webpack_require__(442); - // Create the request - var req = transport.request(options, function handleResponse(res) { - if (req.aborted) return; +function encode(val) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} - // uncompress the response body transparently if required - var stream = res; - switch (res.headers['content-encoding']) { - /*eslint default-case:0*/ - case 'gzip': - case 'compress': - case 'deflate': - // add the unzipper to the body stream processing pipeline - stream = (res.statusCode === 204) ? stream : stream.pipe(zlib.createUnzip()); +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ +module.exports = function buildURL(url, params, paramsSerializer) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } - // remove the content-encoding in order to not confuse downstream operations - delete res.headers['content-encoding']; - break; + var serializedParams; + if (paramsSerializer) { + serializedParams = paramsSerializer(params); + } else if (utils.isURLSearchParams(params)) { + serializedParams = params.toString(); + } else { + var parts = []; + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return; } - // return the last request in case of redirects - var lastRequest = res.req || req; + if (utils.isArray(val)) { + key = key + '[]'; + } else { + val = [val]; + } - var response = { - status: res.statusCode, - statusText: res.statusMessage, - headers: res.headers, - config: config, - request: lastRequest - }; + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString(); + } else if (utils.isObject(v)) { + v = JSON.stringify(v); + } + parts.push(encode(key) + '=' + encode(v)); + }); + }); - if (config.responseType === 'stream') { - response.data = stream; - settle(resolve, reject, response); - } else { - var responseBuffer = []; - stream.on('data', function handleStreamData(chunk) { - responseBuffer.push(chunk); + serializedParams = parts.join('&'); + } - // make sure the content length is not over the maxContentLength if specified - if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { - stream.destroy(); - reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', - config, null, lastRequest)); - } - }); + if (serializedParams) { + var hashmarkIndex = url.indexOf('#'); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } - stream.on('error', function handleStreamError(err) { - if (req.aborted) return; - reject(enhanceError(err, config, null, lastRequest)); - }); + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } - stream.on('end', function handleStreamEnd() { - var responseData = Buffer.concat(responseBuffer); - if (config.responseType !== 'arraybuffer') { - responseData = responseData.toString(config.responseEncoding); - } + return url; +}; - response.data = responseData; - settle(resolve, reject, response); - }); - } - }); - // Handle errors - req.on('error', function handleRequestError(err) { - if (req.aborted) return; - reject(enhanceError(err, config, null, req)); - }); +/***/ }), +/* 446 */ +/***/ (function(module, exports, __webpack_require__) { - // Handle request timeout - if (config.timeout) { - // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. - // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. - // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. - // And then these socket which be hang up will devoring CPU little by little. - // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. - req.setTimeout(config.timeout, function handleRequestTimeout() { - req.abort(); - reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); - }); - } +"use strict"; - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (req.aborted) return; - req.abort(); - reject(cancel); - }); - } +var utils = __webpack_require__(442); - // Send the request - if (utils.isStream(data)) { - data.on('error', function handleStreamError(err) { - reject(enhanceError(err, config, null, req)); - }).pipe(req); - } else { - req.end(data); - } +function InterceptorManager() { + this.handlers = []; +} + +/** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ +InterceptorManager.prototype.use = function use(fulfilled, rejected) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected }); + return this.handlers.length - 1; }; +/** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ +InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } +}; -/***/ }), -/* 476 */ -/***/ (function(module, exports) { - -module.exports = require("http"); +/** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ +InterceptorManager.prototype.forEach = function forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); +}; -/***/ }), -/* 477 */ -/***/ (function(module, exports) { +module.exports = InterceptorManager; -module.exports = require("https"); /***/ }), -/* 478 */ +/* 447 */ /***/ (function(module, exports, __webpack_require__) { -var url = __webpack_require__(452); -var http = __webpack_require__(476); -var https = __webpack_require__(477); -var assert = __webpack_require__(30); -var Writable = __webpack_require__(27).Writable; -var debug = __webpack_require__(479)("follow-redirects"); - -// RFC7231§4.2.1: Of the request methods defined by this specification, -// the GET, HEAD, OPTIONS, and TRACE methods are defined to be safe. -var SAFE_METHODS = { GET: true, HEAD: true, OPTIONS: true, TRACE: true }; +"use strict"; -// Create handlers that pass events from native requests -var eventHandlers = Object.create(null); -["abort", "aborted", "error", "socket", "timeout"].forEach(function (event) { - eventHandlers[event] = function (arg) { - this._redirectable.emit(event, arg); - }; -}); -// An HTTP(S) request that can be redirected -function RedirectableRequest(options, responseCallback) { - // Initialize the request - Writable.call(this); - options.headers = options.headers || {}; - this._options = options; - this._redirectCount = 0; - this._redirects = []; - this._requestBodyLength = 0; - this._requestBodyBuffers = []; +var utils = __webpack_require__(442); +var transformData = __webpack_require__(448); +var isCancel = __webpack_require__(449); +var defaults = __webpack_require__(450); - // Since http.request treats host as an alias of hostname, - // but the url module interprets host as hostname plus port, - // eliminate the host property to avoid confusion. - if (options.host) { - // Use hostname if set, because it has precedence - if (!options.hostname) { - options.hostname = options.host; - } - delete options.host; +/** + * Throws a `Cancel` if cancellation has been requested. + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); } +} - // Attach a callback if passed - if (responseCallback) { - this.on("response", responseCallback); - } +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * @returns {Promise} The Promise to be fulfilled + */ +module.exports = function dispatchRequest(config) { + throwIfCancellationRequested(config); - // React to responses of native requests - var self = this; - this._onNativeResponse = function (response) { - self._processResponse(response); - }; + // Ensure headers exist + config.headers = config.headers || {}; - // Complete the URL object when necessary - if (!options.pathname && options.path) { - var searchPos = options.path.indexOf("?"); - if (searchPos < 0) { - options.pathname = options.path; - } - else { - options.pathname = options.path.substring(0, searchPos); - options.search = options.path.substring(searchPos); + // Transform request data + config.data = transformData( + config.data, + config.headers, + config.transformRequest + ); + + // Flatten headers + config.headers = utils.merge( + config.headers.common || {}, + config.headers[config.method] || {}, + config.headers + ); + + utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + function cleanHeaderConfig(method) { + delete config.headers[method]; } - } + ); - // Perform the first request - this._performRequest(); -} -RedirectableRequest.prototype = Object.create(Writable.prototype); + var adapter = config.adapter || defaults.adapter; -// Writes buffered data to the current native request -RedirectableRequest.prototype.write = function (data, encoding, callback) { - // Validate input and shift parameters if necessary - if (!(typeof data === "string" || typeof data === "object" && ("length" in data))) { - throw new Error("data should be a string, Buffer or Uint8Array"); - } - if (typeof encoding === "function") { - callback = encoding; - encoding = null; - } + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); - // Ignore empty buffers, since writing them doesn't invoke the callback - // https://github.com/nodejs/node/issues/22066 - if (data.length === 0) { - if (callback) { - callback(); - } - return; - } - // Only write when we don't exceed the maximum body length - if (this._requestBodyLength + data.length <= this._options.maxBodyLength) { - this._requestBodyLength += data.length; - this._requestBodyBuffers.push({ data: data, encoding: encoding }); - this._currentRequest.write(data, encoding, callback); - } - // Error when we exceed the maximum body length - else { - this.emit("error", new Error("Request body larger than maxBodyLength limit")); - this.abort(); - } -}; + // Transform response data + response.data = transformData( + response.data, + response.headers, + config.transformResponse + ); -// Ends the current native request -RedirectableRequest.prototype.end = function (data, encoding, callback) { - // Shift parameters if necessary - if (typeof data === "function") { - callback = data; - data = encoding = null; - } - else if (typeof encoding === "function") { - callback = encoding; - encoding = null; - } + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); - // Write data and end - var currentRequest = this._currentRequest; - this.write(data || "", encoding, function () { - currentRequest.end(null, null, callback); + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData( + reason.response.data, + reason.response.headers, + config.transformResponse + ); + } + } + + return Promise.reject(reason); }); }; -// Sets a header value on the current native request -RedirectableRequest.prototype.setHeader = function (name, value) { - this._options.headers[name] = value; - this._currentRequest.setHeader(name, value); -}; -// Clears a header value on the current native request -RedirectableRequest.prototype.removeHeader = function (name) { - delete this._options.headers[name]; - this._currentRequest.removeHeader(name); -}; +/***/ }), +/* 448 */ +/***/ (function(module, exports, __webpack_require__) { -// Proxy all other public ClientRequest methods -[ - "abort", "flushHeaders", "getHeader", - "setNoDelay", "setSocketKeepAlive", "setTimeout", -].forEach(function (method) { - RedirectableRequest.prototype[method] = function (a, b) { - return this._currentRequest[method](a, b); - }; -}); +"use strict"; -// Proxy all public ClientRequest properties -["aborted", "connection", "socket"].forEach(function (property) { - Object.defineProperty(RedirectableRequest.prototype, property, { - get: function () { return this._currentRequest[property]; }, - }); -}); -// Executes the next native request (initial or redirect) -RedirectableRequest.prototype._performRequest = function () { - // Load the native protocol - var protocol = this._options.protocol; - var nativeProtocol = this._options.nativeProtocols[protocol]; - if (!nativeProtocol) { - this.emit("error", new Error("Unsupported protocol " + protocol)); - return; - } - - // If specified, use the agent corresponding to the protocol - // (HTTP and HTTPS use different types of agents) - if (this._options.agents) { - var scheme = protocol.substr(0, protocol.length - 1); - this._options.agent = this._options.agents[scheme]; - } - - // Create the native request - var request = this._currentRequest = - nativeProtocol.request(this._options, this._onNativeResponse); - this._currentUrl = url.format(this._options); +var utils = __webpack_require__(442); - // Set up event handlers - request._redirectable = this; - for (var event in eventHandlers) { - /* istanbul ignore else */ - if (event) { - request.on(event, eventHandlers[event]); - } - } +/** + * Transform the data for a request or a response + * + * @param {Object|String} data The data to be transformed + * @param {Array} headers The headers for the request or response + * @param {Array|Function} fns A single function or Array of functions + * @returns {*} The resulting transformed data + */ +module.exports = function transformData(data, headers, fns) { + /*eslint no-param-reassign:0*/ + utils.forEach(fns, function transform(fn) { + data = fn(data, headers); + }); - // End a redirected request - // (The first request must be ended explicitly with RedirectableRequest#end) - if (this._isRedirect) { - // Write the request entity and end. - var i = 0; - var buffers = this._requestBodyBuffers; - (function writeNext() { - if (i < buffers.length) { - var buffer = buffers[i++]; - request.write(buffer.data, buffer.encoding, writeNext); - } - else { - request.end(); - } - }()); - } + return data; }; -// Processes a response from the current native request -RedirectableRequest.prototype._processResponse = function (response) { - // Store the redirected response - if (this._options.trackRedirects) { - this._redirects.push({ - url: this._currentUrl, - headers: response.headers, - statusCode: response.statusCode, - }); - } - - // RFC7231§6.4: The 3xx (Redirection) class of status code indicates - // that further action needs to be taken by the user agent in order to - // fulfill the request. If a Location header field is provided, - // the user agent MAY automatically redirect its request to the URI - // referenced by the Location field value, - // even if the specific status code is not understood. - var location = response.headers.location; - if (location && this._options.followRedirects !== false && - response.statusCode >= 300 && response.statusCode < 400) { - // RFC7231§6.4: A client SHOULD detect and intervene - // in cyclical redirections (i.e., "infinite" redirection loops). - if (++this._redirectCount > this._options.maxRedirects) { - this.emit("error", new Error("Max redirects exceeded.")); - return; - } - - // RFC7231§6.4: Automatic redirection needs to done with - // care for methods not known to be safe […], - // since the user might not wish to redirect an unsafe request. - // RFC7231§6.4.7: The 307 (Temporary Redirect) status code indicates - // that the target resource resides temporarily under a different URI - // and the user agent MUST NOT change the request method - // if it performs an automatic redirection to that URI. - var header; - var headers = this._options.headers; - if (response.statusCode !== 307 && !(this._options.method in SAFE_METHODS)) { - this._options.method = "GET"; - // Drop a possible entity and headers related to it - this._requestBodyBuffers = []; - for (header in headers) { - if (/^content-/i.test(header)) { - delete headers[header]; - } - } - } - // Drop the Host header, as the redirect might lead to a different host - if (!this._isRedirect) { - for (header in headers) { - if (/^host$/i.test(header)) { - delete headers[header]; - } - } - } +/***/ }), +/* 449 */ +/***/ (function(module, exports, __webpack_require__) { - // Perform the redirected request - var redirectUrl = url.resolve(this._currentUrl, location); - debug("redirecting to", redirectUrl); - Object.assign(this._options, url.parse(redirectUrl)); - this._isRedirect = true; - this._performRequest(); +"use strict"; - // Discard the remainder of the response to avoid waiting for data - response.destroy(); - } - else { - // The response is not a redirect; return it as-is - response.responseUrl = this._currentUrl; - response.redirects = this._redirects; - this.emit("response", response); - // Clean up - this._requestBodyBuffers = []; - } +module.exports = function isCancel(value) { + return !!(value && value.__CANCEL__); }; -// Wraps the key/value object of protocols with redirect functionality -function wrap(protocols) { - // Default settings - var exports = { - maxRedirects: 21, - maxBodyLength: 10 * 1024 * 1024, - }; - - // Wrap each protocol - var nativeProtocols = {}; - Object.keys(protocols).forEach(function (scheme) { - var protocol = scheme + ":"; - var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; - var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol); - - // Executes a request, following redirects - wrappedProtocol.request = function (options, callback) { - if (typeof options === "string") { - options = url.parse(options); - options.maxRedirects = exports.maxRedirects; - } - else { - options = Object.assign({ - protocol: protocol, - maxRedirects: exports.maxRedirects, - maxBodyLength: exports.maxBodyLength, - }, options); - } - options.nativeProtocols = nativeProtocols; - assert.equal(options.protocol, protocol, "protocol mismatch"); - debug("options", options); - return new RedirectableRequest(options, callback); - }; - // Executes a GET request, following redirects - wrappedProtocol.get = function (options, callback) { - var request = wrappedProtocol.request(options, callback); - request.end(); - return request; - }; - }); - return exports; -} +/***/ }), +/* 450 */ +/***/ (function(module, exports, __webpack_require__) { -// Exports -module.exports = wrap({ http: http, https: https }); -module.exports.wrap = wrap; +"use strict"; -/***/ }), -/* 479 */ -/***/ (function(module, exports, __webpack_require__) { +var utils = __webpack_require__(442); +var normalizeHeaderName = __webpack_require__(451); -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ +var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' +}; -if (typeof process === 'undefined' || process.type === 'renderer') { - module.exports = __webpack_require__(480); -} else { - module.exports = __webpack_require__(483); +function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } } +function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = __webpack_require__(452); + } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { + // For node use HTTP adapter + adapter = __webpack_require__(462); + } + return adapter; +} -/***/ }), -/* 480 */ -/***/ (function(module, exports, __webpack_require__) { +var defaults = { + adapter: getDefaultAdapter(), -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Accept'); + normalizeHeaderName(headers, 'Content-Type'); + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + if (utils.isObject(data)) { + setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); + return JSON.stringify(data); + } + return data; + }], -exports = module.exports = __webpack_require__(481); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); + transformResponse: [function transformResponse(data) { + /*eslint no-param-reassign:0*/ + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { /* Ignore */ } + } + return data; + }], -/** - * Colors. - */ + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, -exports.colors = [ - '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', - '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', - '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', - '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', - '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', - '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', - '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', - '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', - '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', - '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', - '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33' -]; + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ + maxContentLength: -1, -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; } +}; - // Internet Explorer and Edge do not support colors. - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; +defaults.headers = { + common: { + 'Accept': 'application/json, text/plain, */*' } +}; - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; +}); -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); +module.exports = defaults; -/** - * Colorize log arguments if enabled. - * - * @api public - */ -function formatArgs(args) { - var useColors = this.useColors; +/***/ }), +/* 451 */ +/***/ (function(module, exports, __webpack_require__) { - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); +"use strict"; - if (!useColors) return; - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') +var utils = __webpack_require__(442); - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; +module.exports = function normalizeHeaderName(headers, normalizedName) { + utils.forEach(headers, function processHeader(value, name) { + if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { + headers[normalizedName] = value; + delete headers[name]; } }); +}; - args.splice(lastC, 0, c); -} -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ +/***/ }), +/* 452 */ +/***/ (function(module, exports, __webpack_require__) { -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} +"use strict"; -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} +var utils = __webpack_require__(442); +var settle = __webpack_require__(453); +var buildURL = __webpack_require__(445); +var buildFullPath = __webpack_require__(456); +var parseHeaders = __webpack_require__(459); +var isURLSameOrigin = __webpack_require__(460); +var createError = __webpack_require__(454); -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ +module.exports = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} + if (utils.isFormData(requestData)) { + delete requestHeaders['Content-Type']; // Let the browser set it + } - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } + var request = new XMLHttpRequest(); - return r; -} + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password || ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ + var fullPath = buildFullPath(config.baseURL, config.url); + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); -exports.enable(load()); + // Set the request timeout in MS + request.timeout = config.timeout; -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ + // Listen for ready state + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; -/***/ }), -/* 481 */ -/***/ (function(module, exports, __webpack_require__) { + settle(resolve, reject, response); + // Clean up request + request = null; + }; -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = __webpack_require__(482); + reject(createError('Request aborted', config, 'ECONNABORTED', request)); -/** - * Active `debug` instances. - */ -exports.instances = []; - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ + // Clean up request + request = null; + }; -function selectColor(namespace) { - var hash = 0, i; + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(createError('Network Error', config, null, request)); - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } + // Clean up request + request = null; + }; - return exports.colors[Math.abs(hash) % exports.colors.length]; -} + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', + request)); -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ + // Clean up request + request = null; + }; -function createDebug(namespace) { + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + var cookies = __webpack_require__(461); - var prevTime; + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; - function debug() { - // disabled? - if (!debug.enabled) return; + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } - var self = debug; + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; + // Add responseType to request if needed + if (config.responseType) { + try { + request.responseType = config.responseType; + } catch (e) { + // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. + // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. + if (config.responseType !== 'json') { + throw e; + } + } } - args[0] = exports.coerce(args[0]); + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); } - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (!request) { + return; + } - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); + request.abort(); + reject(cancel); + // Clean up request + request = null; + }); + } - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); + if (requestData === undefined) { + requestData = null; + } - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } + // Send the request + request.send(requestData); + }); +}; - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - debug.destroy = destroy; - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } +/***/ }), +/* 453 */ +/***/ (function(module, exports, __webpack_require__) { - exports.instances.push(debug); +"use strict"; - return debug; -} -function destroy () { - var index = exports.instances.indexOf(this); - if (index !== -1) { - exports.instances.splice(index, 1); - return true; - } else { - return false; - } -} +var createError = __webpack_require__(454); /** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. + * Resolve or reject a Promise based on response status. * - * @param {String} namespaces - * @api public + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. */ +module.exports = function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(createError( + 'Request failed with status code ' + response.status, + response.config, + null, + response.request, + response + )); + } +}; -function enable(namespaces) { - exports.save(namespaces); - exports.names = []; - exports.skips = []; +/***/ }), +/* 454 */ +/***/ (function(module, exports, __webpack_require__) { - var i; - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; +"use strict"; - for (i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } - for (i = 0; i < exports.instances.length; i++) { - var instance = exports.instances[i]; - instance.enabled = exports.enabled(instance.namespace); - } -} +var enhanceError = __webpack_require__(455); /** - * Disable debug output. + * Create an Error with the specified message, config, error code, request and response. * - * @api public + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. */ +module.exports = function createError(message, config, code, request, response) { + var error = new Error(message); + return enhanceError(error, config, code, request, response); +}; -function disable() { - exports.enable(''); -} -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ +/***/ }), +/* 455 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; -function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} /** - * Coerce `val`. + * Update an Error with the specified config, error code, and response. * - * @param {Mixed} val - * @return {Mixed} - * @api private + * @param {Error} error The error to update. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The error. */ +module.exports = function enhanceError(error, config, code, request, response) { + error.config = config; + if (code) { + error.code = code; + } -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} + error.request = request; + error.response = response; + error.isAxiosError = true; + + error.toJSON = function() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code + }; + }; + return error; +}; /***/ }), -/* 482 */ -/***/ (function(module, exports) { +/* 456 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Helpers. - */ +"use strict"; -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; + +var isAbsoluteURL = __webpack_require__(457); +var combineURLs = __webpack_require__(458); /** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); +module.exports = function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); + return requestedURL; }; -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} +/***/ }), +/* 457 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ +"use strict"; -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; - } - if (ms >= h) { - return Math.round(ms / h) + 'h'; - } - if (ms >= m) { - return Math.round(ms / m) + 'm'; - } - if (ms >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} /** - * Long format for `ms`. + * Determines whether the specified URL is absolute * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} - -/** - * Pluralization helper. + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} +module.exports = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); +}; /***/ }), -/* 483 */ +/* 458 */ /***/ (function(module, exports, __webpack_require__) { -/** - * Module dependencies. - */ +"use strict"; -var tty = __webpack_require__(484); -var util = __webpack_require__(29); /** - * This is the Node.js implementation of `debug()`. + * Creates a new URL by combining the specified URLs * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(481); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL */ +module.exports = function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +}; -exports.colors = [ 6, 2, 3, 4, 5, 1 ]; -try { - var supportsColor = __webpack_require__(485); - if (supportsColor && supportsColor.level >= 2) { - exports.colors = [ - 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, - 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, - 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 214, 215, 220, 221 - ]; - } -} catch (err) { - // swallow - we only care if `supports-color` is available; it doesn't have to be. -} +/***/ }), +/* 459 */ +/***/ (function(module, exports, __webpack_require__) { -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ +"use strict"; -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); +var utils = __webpack_require__(442); - obj[prop] = val; - return obj; -}, {}); +// Headers whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +var ignoreDuplicateOf = [ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]; /** - * Is stdout a TTY? Colored output is enabled when `true`. + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} headers Headers needing to be parsed + * @returns {Object} Headers parsed into an object */ +module.exports = function parseHeaders(headers) { + var parsed = {}; + var key; + var val; + var i; -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(process.stderr.fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ + if (!headers) { return parsed; } -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .split('\n').map(function(str) { - return str.trim() - }).join(' '); -}; + utils.forEach(headers.split('\n'), function parser(line) { + i = line.indexOf(':'); + key = utils.trim(line.substr(0, i)).toLowerCase(); + val = utils.trim(line.substr(i + 1)); -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ + if (key) { + if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { + return; + } + if (key === 'set-cookie') { + parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + }); -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); + return parsed; }; -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var colorCode = '\u001b[3' + (c < 8 ? c : '8;5;' + c); - var prefix = ' ' + colorCode + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push(colorCode + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = getDate() + name + ' ' + args[0]; - } -} - -function getDate() { - if (exports.inspectOpts.hideDate) { - return ''; - } else { - return new Date().toISOString() + ' '; - } -} -/** - * Invokes `util.format()` with the specified arguments and writes to stderr. - */ +/***/ }), +/* 460 */ +/***/ (function(module, exports, __webpack_require__) { -function log() { - return process.stderr.write(util.format.apply(util, arguments) + '\n'); -} +"use strict"; -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} +var utils = __webpack_require__(442); -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ +module.exports = ( + utils.isStandardBrowserEnv() ? -function load() { - return process.env.DEBUG; -} + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; -function init (debug) { - debug.inspectOpts = {}; + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} + urlParsingNode.setAttribute('href', href); -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } -exports.enable(load()); + originURL = resolveURL(window.location.href); + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : -/***/ }), -/* 484 */ -/***/ (function(module, exports) { + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })() +); -module.exports = require("tty"); /***/ }), -/* 485 */ +/* 461 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); - -const env = process.env; -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} +var utils = __webpack_require__(442); -function translateLevel(level) { - if (level === 0) { - return false; - } +module.exports = ( + utils.isStandardBrowserEnv() ? - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} + // Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + var cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + if (utils.isString(path)) { + cookie.push('path=' + path); + } - if (hasFlag('color=256')) { - return 2; - } + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } - if (stream && !stream.isTTY && forceColor !== true) { - return 0; - } + if (secure === true) { + cookie.push('secure'); + } - const min = forceColor ? 1 : 0; + document.cookie = cookie.join('; '); + }, - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, - return 1; - } + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + }; + })() : - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } + // Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })() +); - return min; - } - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } +/***/ }), +/* 462 */ +/***/ (function(module, exports, __webpack_require__) { - if (env.COLORTERM === 'truecolor') { - return 3; - } +"use strict"; - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } +var utils = __webpack_require__(442); +var settle = __webpack_require__(453); +var buildFullPath = __webpack_require__(456); +var buildURL = __webpack_require__(445); +var http = __webpack_require__(463); +var https = __webpack_require__(464); +var httpFollow = __webpack_require__(465).http; +var httpsFollow = __webpack_require__(465).https; +var url = __webpack_require__(439); +var zlib = __webpack_require__(473); +var pkg = __webpack_require__(474); +var createError = __webpack_require__(454); +var enhanceError = __webpack_require__(455); - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } +var isHttps = /https:?/; - if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } +/*eslint consistent-return:0*/ +module.exports = function httpAdapter(config) { + return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) { + var resolve = function resolve(value) { + resolvePromise(value); + }; + var reject = function reject(value) { + rejectPromise(value); + }; + var data = config.data; + var headers = config.headers; - if ('COLORTERM' in env) { - return 1; - } + // Set User-Agent (required by some servers) + // Only set header if it hasn't been set in config + // See https://github.com/axios/axios/issues/69 + if (!headers['User-Agent'] && !headers['user-agent']) { + headers['User-Agent'] = 'axios/' + pkg.version; + } - if (env.TERM === 'dumb') { - return min; - } + if (data && !utils.isStream(data)) { + if (Buffer.isBuffer(data)) { + // Nothing to do... + } else if (utils.isArrayBuffer(data)) { + data = Buffer.from(new Uint8Array(data)); + } else if (utils.isString(data)) { + data = Buffer.from(data, 'utf-8'); + } else { + return reject(createError( + 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', + config + )); + } - return min; -} + // Add Content-Length header if data exists + headers['Content-Length'] = data.length; + } -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} + // HTTP basic authentication + var auth = undefined; + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password || ''; + auth = username + ':' + password; + } -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; + // Parse url + var fullPath = buildFullPath(config.baseURL, config.url); + var parsed = url.parse(fullPath); + var protocol = parsed.protocol || 'http:'; + if (!auth && parsed.auth) { + var urlAuth = parsed.auth.split(':'); + var urlUsername = urlAuth[0] || ''; + var urlPassword = urlAuth[1] || ''; + auth = urlUsername + ':' + urlPassword; + } -/***/ }), -/* 486 */ -/***/ (function(module, exports) { + if (auth) { + delete headers.Authorization; + } -module.exports = require("zlib"); + var isHttpsRequest = isHttps.test(protocol); + var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; -/***/ }), -/* 487 */ -/***/ (function(module) { + var options = { + path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), + method: config.method.toUpperCase(), + headers: headers, + agent: agent, + agents: { http: config.httpAgent, https: config.httpsAgent }, + auth: auth + }; -module.exports = JSON.parse("{\"name\":\"axios\",\"version\":\"0.19.2\",\"description\":\"Promise based HTTP client for the browser and node.js\",\"main\":\"index.js\",\"scripts\":{\"test\":\"grunt test && bundlesize\",\"start\":\"node ./sandbox/server.js\",\"build\":\"NODE_ENV=production grunt build\",\"preversion\":\"npm test\",\"version\":\"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json\",\"postversion\":\"git push && git push --tags\",\"examples\":\"node ./examples/server.js\",\"coveralls\":\"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js\",\"fix\":\"eslint --fix lib/**/*.js\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/axios/axios.git\"},\"keywords\":[\"xhr\",\"http\",\"ajax\",\"promise\",\"node\"],\"author\":\"Matt Zabriskie\",\"license\":\"MIT\",\"bugs\":{\"url\":\"https://github.com/axios/axios/issues\"},\"homepage\":\"https://github.com/axios/axios\",\"devDependencies\":{\"bundlesize\":\"^0.17.0\",\"coveralls\":\"^3.0.0\",\"es6-promise\":\"^4.2.4\",\"grunt\":\"^1.0.2\",\"grunt-banner\":\"^0.6.0\",\"grunt-cli\":\"^1.2.0\",\"grunt-contrib-clean\":\"^1.1.0\",\"grunt-contrib-watch\":\"^1.0.0\",\"grunt-eslint\":\"^20.1.0\",\"grunt-karma\":\"^2.0.0\",\"grunt-mocha-test\":\"^0.13.3\",\"grunt-ts\":\"^6.0.0-beta.19\",\"grunt-webpack\":\"^1.0.18\",\"istanbul-instrumenter-loader\":\"^1.0.0\",\"jasmine-core\":\"^2.4.1\",\"karma\":\"^1.3.0\",\"karma-chrome-launcher\":\"^2.2.0\",\"karma-coverage\":\"^1.1.1\",\"karma-firefox-launcher\":\"^1.1.0\",\"karma-jasmine\":\"^1.1.1\",\"karma-jasmine-ajax\":\"^0.1.13\",\"karma-opera-launcher\":\"^1.0.0\",\"karma-safari-launcher\":\"^1.0.0\",\"karma-sauce-launcher\":\"^1.2.0\",\"karma-sinon\":\"^1.0.5\",\"karma-sourcemap-loader\":\"^0.3.7\",\"karma-webpack\":\"^1.7.0\",\"load-grunt-tasks\":\"^3.5.2\",\"minimist\":\"^1.2.0\",\"mocha\":\"^5.2.0\",\"sinon\":\"^4.5.0\",\"typescript\":\"^2.8.1\",\"url-search-params\":\"^0.10.0\",\"webpack\":\"^1.13.1\",\"webpack-dev-server\":\"^1.14.1\"},\"browser\":{\"./lib/adapters/http.js\":\"./lib/adapters/xhr.js\"},\"typings\":\"./index.d.ts\",\"dependencies\":{\"follow-redirects\":\"1.5.10\"},\"bundlesize\":[{\"path\":\"./dist/axios.min.js\",\"threshold\":\"5kB\"}]}"); + if (config.socketPath) { + options.socketPath = config.socketPath; + } else { + options.hostname = parsed.hostname; + options.port = parsed.port; + } -/***/ }), -/* 488 */ -/***/ (function(module, exports, __webpack_require__) { + var proxy = config.proxy; + if (!proxy && proxy !== false) { + var proxyEnv = protocol.slice(0, -1) + '_proxy'; + var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; + if (proxyUrl) { + var parsedProxyUrl = url.parse(proxyUrl); + var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY; + var shouldProxy = true; -"use strict"; + if (noProxyEnv) { + var noProxy = noProxyEnv.split(',').map(function trim(s) { + return s.trim(); + }); + shouldProxy = !noProxy.some(function proxyMatch(proxyElement) { + if (!proxyElement) { + return false; + } + if (proxyElement === '*') { + return true; + } + if (proxyElement[0] === '.' && + parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) { + return true; + } -var utils = __webpack_require__(455); + return parsed.hostname === proxyElement; + }); + } -/** - * Config-specific merge-function which creates a new config-object - * by merging two configuration objects together. - * - * @param {Object} config1 - * @param {Object} config2 - * @returns {Object} New object resulting from merging config2 to config1 - */ -module.exports = function mergeConfig(config1, config2) { - // eslint-disable-next-line no-param-reassign - config2 = config2 || {}; - var config = {}; - var valueFromConfig2Keys = ['url', 'method', 'params', 'data']; - var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy']; - var defaultToConfig2Keys = [ - 'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer', - 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', - 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', - 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent', - 'httpsAgent', 'cancelToken', 'socketPath' - ]; + if (shouldProxy) { + proxy = { + host: parsedProxyUrl.hostname, + port: parsedProxyUrl.port + }; - utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { - if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; + if (parsedProxyUrl.auth) { + var proxyUrlAuth = parsedProxyUrl.auth.split(':'); + proxy.auth = { + username: proxyUrlAuth[0], + password: proxyUrlAuth[1] + }; + } + } + } } - }); - utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop) { - if (utils.isObject(config2[prop])) { - config[prop] = utils.deepMerge(config1[prop], config2[prop]); - } else if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; - } else if (utils.isObject(config1[prop])) { - config[prop] = utils.deepMerge(config1[prop]); - } else if (typeof config1[prop] !== 'undefined') { - config[prop] = config1[prop]; - } - }); + if (proxy) { + options.hostname = proxy.host; + options.host = proxy.host; + options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); + options.port = proxy.port; + options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; - utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { - if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; - } else if (typeof config1[prop] !== 'undefined') { - config[prop] = config1[prop]; + // Basic proxy authorization + if (proxy.auth) { + var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); + options.headers['Proxy-Authorization'] = 'Basic ' + base64; + } } - }); - - var axiosKeys = valueFromConfig2Keys - .concat(mergeDeepPropertiesKeys) - .concat(defaultToConfig2Keys); - - var otherKeys = Object - .keys(config2) - .filter(function filterAxiosKeys(key) { - return axiosKeys.indexOf(key) === -1; - }); - utils.forEach(otherKeys, function otherKeysDefaultToConfig2(prop) { - if (typeof config2[prop] !== 'undefined') { - config[prop] = config2[prop]; - } else if (typeof config1[prop] !== 'undefined') { - config[prop] = config1[prop]; + var transport; + var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true); + if (config.transport) { + transport = config.transport; + } else if (config.maxRedirects === 0) { + transport = isHttpsProxy ? https : http; + } else { + if (config.maxRedirects) { + options.maxRedirects = config.maxRedirects; + } + transport = isHttpsProxy ? httpsFollow : httpFollow; } - }); - - return config; -}; + if (config.maxContentLength && config.maxContentLength > -1) { + options.maxBodyLength = config.maxContentLength; + } -/***/ }), -/* 489 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + // Create the request + var req = transport.request(options, function handleResponse(res) { + if (req.aborted) return; + // uncompress the response body transparently if required + var stream = res; + switch (res.headers['content-encoding']) { + /*eslint default-case:0*/ + case 'gzip': + case 'compress': + case 'deflate': + // add the unzipper to the body stream processing pipeline + stream = (res.statusCode === 204) ? stream : stream.pipe(zlib.createUnzip()); -/** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ -function Cancel(message) { - this.message = message; -} + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + } -Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); -}; + // return the last request in case of redirects + var lastRequest = res.req || req; -Cancel.prototype.__CANCEL__ = true; + var response = { + status: res.statusCode, + statusText: res.statusMessage, + headers: res.headers, + config: config, + request: lastRequest + }; -module.exports = Cancel; + if (config.responseType === 'stream') { + response.data = stream; + settle(resolve, reject, response); + } else { + var responseBuffer = []; + stream.on('data', function handleStreamData(chunk) { + responseBuffer.push(chunk); + // make sure the content length is not over the maxContentLength if specified + if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { + stream.destroy(); + reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', + config, null, lastRequest)); + } + }); -/***/ }), -/* 490 */ -/***/ (function(module, exports, __webpack_require__) { + stream.on('error', function handleStreamError(err) { + if (req.aborted) return; + reject(enhanceError(err, config, null, lastRequest)); + }); -"use strict"; + stream.on('end', function handleStreamEnd() { + var responseData = Buffer.concat(responseBuffer); + if (config.responseType !== 'arraybuffer') { + responseData = responseData.toString(config.responseEncoding); + } + response.data = responseData; + settle(resolve, reject, response); + }); + } + }); -var Cancel = __webpack_require__(489); + // Handle errors + req.on('error', function handleRequestError(err) { + if (req.aborted) return; + reject(enhanceError(err, config, null, req)); + }); -/** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ -function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } + // Handle request timeout + if (config.timeout) { + // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. + // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. + // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. + // And then these socket which be hang up will devoring CPU little by little. + // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. + req.setTimeout(config.timeout, function handleRequestTimeout() { + req.abort(); + reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); + }); + } - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (req.aborted) return; - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; + req.abort(); + reject(cancel); + }); } - token.reason = new Cancel(message); - resolvePromise(token.reason); + // Send the request + if (utils.isStream(data)) { + data.on('error', function handleStreamError(err) { + reject(enhanceError(err, config, null, req)); + }).pipe(req); + } else { + req.end(data); + } }); -} - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } }; -/** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ -CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; -}; -module.exports = CancelToken; +/***/ }), +/* 463 */ +/***/ (function(module, exports) { +module.exports = require("http"); /***/ }), -/* 491 */ +/* 464 */ +/***/ (function(module, exports) { + +module.exports = require("https"); + +/***/ }), +/* 465 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var url = __webpack_require__(439); +var http = __webpack_require__(463); +var https = __webpack_require__(464); +var assert = __webpack_require__(371); +var Writable = __webpack_require__(382).Writable; +var debug = __webpack_require__(466)("follow-redirects"); +// RFC7231§4.2.1: Of the request methods defined by this specification, +// the GET, HEAD, OPTIONS, and TRACE methods are defined to be safe. +var SAFE_METHODS = { GET: true, HEAD: true, OPTIONS: true, TRACE: true }; -/** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ -module.exports = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); +// Create handlers that pass events from native requests +var eventHandlers = Object.create(null); +["abort", "aborted", "error", "socket", "timeout"].forEach(function (event) { + eventHandlers[event] = function (arg) { + this._redirectable.emit(event, arg); }; -}; +}); +// An HTTP(S) request that can be redirected +function RedirectableRequest(options, responseCallback) { + // Initialize the request + Writable.call(this); + options.headers = options.headers || {}; + this._options = options; + this._redirectCount = 0; + this._redirects = []; + this._requestBodyLength = 0; + this._requestBodyBuffers = []; -/***/ }), -/* 492 */ -/***/ (function(module, exports, __webpack_require__) { + // Since http.request treats host as an alias of hostname, + // but the url module interprets host as hostname plus port, + // eliminate the host property to avoid confusion. + if (options.host) { + // Use hostname if set, because it has precedence + if (!options.hostname) { + options.hostname = options.host; + } + delete options.host; + } -"use strict"; + // Attach a callback if passed + if (responseCallback) { + this.on("response", responseCallback); + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -tslib_1.__exportStar(__webpack_require__(493), exports); + // React to responses of native requests + var self = this; + this._onNativeResponse = function (response) { + self._processResponse(response); + }; + // Complete the URL object when necessary + if (!options.pathname && options.path) { + var searchPos = options.path.indexOf("?"); + if (searchPos < 0) { + options.pathname = options.path; + } + else { + options.pathname = options.path.substring(0, searchPos); + options.search = options.path.substring(searchPos); + } + } -/***/ }), -/* 493 */ -/***/ (function(module, exports, __webpack_require__) { + // Perform the first request + this._performRequest(); +} +RedirectableRequest.prototype = Object.create(Writable.prototype); -"use strict"; +// Writes buffered data to the current native request +RedirectableRequest.prototype.write = function (data, encoding, callback) { + // Validate input and shift parameters if necessary + if (!(typeof data === "string" || typeof data === "object" && ("length" in data))) { + throw new Error("data should be a string, Buffer or Uint8Array"); + } + if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isAxiosRequestError = (error) => { - return error && error.config && error.response === undefined; -}; -exports.isAxiosResponseError = (error) => { - return error && error.response && error.response.status !== undefined; + // Ignore empty buffers, since writing them doesn't invoke the callback + // https://github.com/nodejs/node/issues/22066 + if (data.length === 0) { + if (callback) { + callback(); + } + return; + } + // Only write when we don't exceed the maximum body length + if (this._requestBodyLength + data.length <= this._options.maxBodyLength) { + this._requestBodyLength += data.length; + this._requestBodyBuffers.push({ data: data, encoding: encoding }); + this._currentRequest.write(data, encoding, callback); + } + // Error when we exceed the maximum body length + else { + this.emit("error", new Error("Request body larger than maxBodyLength limit")); + this.abort(); + } }; +// Ends the current native request +RedirectableRequest.prototype.end = function (data, encoding, callback) { + // Shift parameters if necessary + if (typeof data === "function") { + callback = data; + data = encoding = null; + } + else if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } -/***/ }), -/* 494 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + // Write data and end + var currentRequest = this._currentRequest; + this.write(data || "", encoding, function () { + currentRequest.end(null, null, callback); + }); +}; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -class KbnClientStatus { - constructor(requester) { - this.requester = requester; - } - /** - * Get the full server status - */ - async get() { - return await this.requester.request({ - method: 'GET', - path: 'api/status', - }); - } - /** - * Get the overall/merged state - */ - async getOverallState() { - const status = await this.get(); - return status.status.overall.state; - } -} -exports.KbnClientStatus = KbnClientStatus; +// Sets a header value on the current native request +RedirectableRequest.prototype.setHeader = function (name, value) { + this._options.headers[name] = value; + this._currentRequest.setHeader(name, value); +}; +// Clears a header value on the current native request +RedirectableRequest.prototype.removeHeader = function (name) { + delete this._options.headers[name]; + this._currentRequest.removeHeader(name); +}; -/***/ }), -/* 495 */ -/***/ (function(module, exports, __webpack_require__) { +// Proxy all other public ClientRequest methods +[ + "abort", "flushHeaders", "getHeader", + "setNoDelay", "setSocketKeepAlive", "setTimeout", +].forEach(function (method) { + RedirectableRequest.prototype[method] = function (a, b) { + return this._currentRequest[method](a, b); + }; +}); -"use strict"; +// Proxy all public ClientRequest properties +["aborted", "connection", "socket"].forEach(function (property) { + Object.defineProperty(RedirectableRequest.prototype, property, { + get: function () { return this._currentRequest[property]; }, + }); +}); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const PLUGIN_STATUS_ID = /^plugin:(.+?)@/; -class KbnClientPlugins { - constructor(status) { - this.status = status; - } - /** - * Get a list of plugin ids that are enabled on the server - */ - async getEnabledIds() { - const pluginIds = []; - const apiResp = await this.status.get(); - for (const status of apiResp.status.statuses) { - if (status.id) { - const match = status.id.match(PLUGIN_STATUS_ID); - if (match) { - pluginIds.push(match[1]); - } - } - } - return pluginIds; +// Executes the next native request (initial or redirect) +RedirectableRequest.prototype._performRequest = function () { + // Load the native protocol + var protocol = this._options.protocol; + var nativeProtocol = this._options.nativeProtocols[protocol]; + if (!nativeProtocol) { + this.emit("error", new Error("Unsupported protocol " + protocol)); + return; + } + + // If specified, use the agent corresponding to the protocol + // (HTTP and HTTPS use different types of agents) + if (this._options.agents) { + var scheme = protocol.substr(0, protocol.length - 1); + this._options.agent = this._options.agents[scheme]; + } + + // Create the native request + var request = this._currentRequest = + nativeProtocol.request(this._options, this._onNativeResponse); + this._currentUrl = url.format(this._options); + + // Set up event handlers + request._redirectable = this; + for (var event in eventHandlers) { + /* istanbul ignore else */ + if (event) { + request.on(event, eventHandlers[event]); } -} -exports.KbnClientPlugins = KbnClientPlugins; + } + // End a redirected request + // (The first request must be ended explicitly with RedirectableRequest#end) + if (this._isRedirect) { + // Write the request entity and end. + var i = 0; + var buffers = this._requestBodyBuffers; + (function writeNext() { + if (i < buffers.length) { + var buffer = buffers[i++]; + request.write(buffer.data, buffer.encoding, writeNext); + } + else { + request.end(); + } + }()); + } +}; -/***/ }), -/* 496 */ -/***/ (function(module, exports, __webpack_require__) { +// Processes a response from the current native request +RedirectableRequest.prototype._processResponse = function (response) { + // Store the redirected response + if (this._options.trackRedirects) { + this._redirects.push({ + url: this._currentUrl, + headers: response.headers, + statusCode: response.statusCode, + }); + } -"use strict"; + // RFC7231§6.4: The 3xx (Redirection) class of status code indicates + // that further action needs to be taken by the user agent in order to + // fulfill the request. If a Location header field is provided, + // the user agent MAY automatically redirect its request to the URI + // referenced by the Location field value, + // even if the specific status code is not understood. + var location = response.headers.location; + if (location && this._options.followRedirects !== false && + response.statusCode >= 300 && response.statusCode < 400) { + // RFC7231§6.4: A client SHOULD detect and intervene + // in cyclical redirections (i.e., "infinite" redirection loops). + if (++this._redirectCount > this._options.maxRedirects) { + this.emit("error", new Error("Max redirects exceeded.")); + return; + } -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -class KbnClientVersion { - constructor(status) { - this.status = status; + // RFC7231§6.4: Automatic redirection needs to done with + // care for methods not known to be safe […], + // since the user might not wish to redirect an unsafe request. + // RFC7231§6.4.7: The 307 (Temporary Redirect) status code indicates + // that the target resource resides temporarily under a different URI + // and the user agent MUST NOT change the request method + // if it performs an automatic redirection to that URI. + var header; + var headers = this._options.headers; + if (response.statusCode !== 307 && !(this._options.method in SAFE_METHODS)) { + this._options.method = "GET"; + // Drop a possible entity and headers related to it + this._requestBodyBuffers = []; + for (header in headers) { + if (/^content-/i.test(header)) { + delete headers[header]; + } + } } - async get() { - if (this.versionCache !== undefined) { - return this.versionCache; + + // Drop the Host header, as the redirect might lead to a different host + if (!this._isRedirect) { + for (header in headers) { + if (/^host$/i.test(header)) { + delete headers[header]; } - const status = await this.status.get(); - this.versionCache = status.version.number + (status.version.build_snapshot ? '-SNAPSHOT' : ''); - return this.versionCache; + } } -} -exports.KbnClientVersion = KbnClientVersion; + // Perform the redirected request + var redirectUrl = url.resolve(this._currentUrl, location); + debug("redirecting to", redirectUrl); + Object.assign(this._options, url.parse(redirectUrl)); + this._isRedirect = true; + this._performRequest(); -/***/ }), -/* 497 */ -/***/ (function(module, exports, __webpack_require__) { + // Discard the remainder of the response to avoid waiting for data + response.destroy(); + } + else { + // The response is not a redirect; return it as-is + response.responseUrl = this._currentUrl; + response.redirects = this._redirects; + this.emit("response", response); -"use strict"; + // Clean up + this._requestBodyBuffers = []; + } +}; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const kbn_client_requester_1 = __webpack_require__(451); -class KbnClientSavedObjects { - constructor(log, requester) { - this.log = log; - this.requester = requester; - } - /** - * Run the saved objects migration - */ - async migrate() { - this.log.debug('Migrating saved objects'); - return await this.requester.request({ - description: 'migrate saved objects', - path: kbn_client_requester_1.uriencode `/internal/saved_objects/_migrate`, - method: 'POST', - body: {}, - }); - } - /** - * Get an object - */ - async get(options) { - this.log.debug('Gettings saved object: %j', options); - return await this.requester.request({ - description: 'get saved object', - path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, - method: 'GET', - }); - } - /** - * Create a saved object - */ - async create(options) { - this.log.debug('Creating saved object: %j', options); - return await this.requester.request({ - description: 'update saved object', - path: options.id - ? kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}` - : kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}`, - query: { - overwrite: options.overwrite, - }, - method: 'POST', - body: { - attributes: options.attributes, - migrationVersion: options.migrationVersion, - references: options.references, - }, - }); - } - /** - * Update a saved object - */ - async update(options) { - this.log.debug('Updating saved object: %j', options); - return await this.requester.request({ - description: 'update saved object', - path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, - query: { - overwrite: options.overwrite, - }, - method: 'PUT', - body: { - attributes: options.attributes, - migrationVersion: options.migrationVersion, - references: options.references, - }, - }); - } - /** - * Delete an object - */ - async delete(options) { - this.log.debug('Deleting saved object %s/%s', options); - return await this.requester.request({ - description: 'delete saved object', - path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, - method: 'DELETE', - }); - } +// Wraps the key/value object of protocols with redirect functionality +function wrap(protocols) { + // Default settings + var exports = { + maxRedirects: 21, + maxBodyLength: 10 * 1024 * 1024, + }; + + // Wrap each protocol + var nativeProtocols = {}; + Object.keys(protocols).forEach(function (scheme) { + var protocol = scheme + ":"; + var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; + var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol); + + // Executes a request, following redirects + wrappedProtocol.request = function (options, callback) { + if (typeof options === "string") { + options = url.parse(options); + options.maxRedirects = exports.maxRedirects; + } + else { + options = Object.assign({ + protocol: protocol, + maxRedirects: exports.maxRedirects, + maxBodyLength: exports.maxBodyLength, + }, options); + } + options.nativeProtocols = nativeProtocols; + assert.equal(options.protocol, protocol, "protocol mismatch"); + debug("options", options); + return new RedirectableRequest(options, callback); + }; + + // Executes a GET request, following redirects + wrappedProtocol.get = function (options, callback) { + var request = wrappedProtocol.request(options, callback); + request.end(); + return request; + }; + }); + return exports; } -exports.KbnClientSavedObjects = KbnClientSavedObjects; + +// Exports +module.exports = wrap({ http: http, https: https }); +module.exports.wrap = wrap; /***/ }), -/* 498 */ +/* 466 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. */ -Object.defineProperty(exports, "__esModule", { value: true }); -const kbn_client_requester_1 = __webpack_require__(451); -class KbnClientUiSettings { - constructor(log, requester, defaults) { - this.log = log; - this.requester = requester; - this.defaults = defaults; - } - async get(setting) { - var _a; - const all = await this.getAll(); - const value = (_a = all[setting]) === null || _a === void 0 ? void 0 : _a.userValue; - this.log.verbose('uiSettings.value: %j', value); - return value; - } - /** - * Gets defaultIndex from the config doc. - */ - async getDefaultIndex() { - return await this.get('defaultIndex'); - } - /** - * Unset a uiSetting - */ - async unset(setting) { - return await this.requester.request({ - path: kbn_client_requester_1.uriencode `/api/kibana/settings/${setting}`, - method: 'DELETE', - }); - } - /** - * Replace all uiSettings with the `doc` values, `doc` is merged - * with some defaults - */ - async replace(doc, { retries = 5 } = {}) { - this.log.debug('replacing kibana config doc: %j', doc); - const changes = { - ...this.defaults, - ...doc, - }; - for (const [name, { isOverridden }] of Object.entries(await this.getAll())) { - if (!isOverridden && !changes.hasOwnProperty(name)) { - changes[name] = null; - } - } - await this.requester.request({ - method: 'POST', - path: '/api/kibana/settings', - body: { changes }, - retries, - }); - } - /** - * Add fields to the config doc (like setting timezone and defaultIndex) - */ - async update(updates) { - this.log.debug('applying update to kibana config: %j', updates); - await this.requester.request({ - path: '/api/kibana/settings', - method: 'POST', - body: { - changes: updates, - }, - }); - } - async getAll() { - const resp = await this.requester.request({ - path: '/api/kibana/settings', - method: 'GET', - }); - return resp.settings; - } + +if (typeof process === 'undefined' || process.type === 'renderer') { + module.exports = __webpack_require__(467); +} else { + module.exports = __webpack_require__(470); } -exports.KbnClientUiSettings = KbnClientUiSettings; /***/ }), -/* 499 */ +/* 467 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 +/** + * This is the web browser implementation of `debug()`. * - * 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. + * Expose `debug()` as the module. */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -tslib_1.__exportStar(__webpack_require__(500), exports); +exports = module.exports = __webpack_require__(468); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); -/***/ }), -/* 500 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Colors. + */ -"use strict"; +exports.colors = [ + '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', + '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', + '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', + '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', + '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', + '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', + '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', + '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', + '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', + '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', + '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33' +]; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. * - * 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. + * TODO: add a `localStorage` variable to explicitly enable/disable colors */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const util_1 = __webpack_require__(29); -const axios_1 = tslib_1.__importDefault(__webpack_require__(453)); -function parseConfig(log) { - const configJson = process.env.KIBANA_CI_STATS_CONFIG; - if (!configJson) { - log.debug('KIBANA_CI_STATS_CONFIG environment variable not found, disabling CiStatsReporter'); - return; - } - let config; - try { - config = JSON.parse(configJson); - } - catch (_) { - // handled below - } - if (typeof config === 'object' && config !== null) { - return validateConfig(log, config); - } - log.warning('KIBANA_CI_STATS_CONFIG is invalid, stats will not be reported'); - return; -} -function validateConfig(log, config) { - const validApiUrl = typeof config.apiUrl === 'string' && config.apiUrl.length !== 0; - if (!validApiUrl) { - log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api url, stats will not be reported'); - return; - } - const validApiToken = typeof config.apiToken === 'string' && config.apiToken.length !== 0; - if (!validApiToken) { - log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api token, stats will not be reported'); - return; - } - const validId = typeof config.buildId === 'string' && config.buildId.length !== 0; - if (!validId) { - log.warning('KIBANA_CI_STATS_CONFIG is missing a valid build id, stats will not be reported'); - return; - } - return config; -} -class CiStatsReporter { - constructor(config, log) { - this.config = config; - this.log = log; - } - static fromEnv(log) { - return new CiStatsReporter(parseConfig(log), log); - } - isEnabled() { - return !!this.config; - } - async metrics(metrics) { - var _a, _b, _c, _d; - if (!this.config) { - return; - } - let attempt = 0; - const maxAttempts = 5; - const bodySummary = metrics - .map(({ group, id, value }) => `[${group}/${id}=${value}]`) - .join(' '); - while (true) { - attempt += 1; - try { - await axios_1.default.request({ - method: 'POST', - url: '/v1/metrics', - baseURL: this.config.apiUrl, - headers: { - Authorization: `token ${this.config.apiToken}`, - }, - data: { - buildId: this.config.buildId, - metrics, - }, - }); - return; - } - catch (error) { - if (!((_a = error) === null || _a === void 0 ? void 0 : _a.request)) { - // not an axios error, must be a usage error that we should notify user about - throw error; - } - if (((_b = error) === null || _b === void 0 ? void 0 : _b.response) && error.response.status !== 502) { - // error response from service was received so warn the user and move on - this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] ${bodySummary}`); - return; - } - if (attempt === maxAttempts) { - this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}`); - return; - } - // we failed to reach the backend and we have remaining attempts, lets retry after a short delay - const reason = ((_d = (_c = error) === null || _c === void 0 ? void 0 : _c.response) === null || _d === void 0 ? void 0 : _d.status) ? `${error.response.status} response` - : 'no response'; - this.log.warning(`failed to reach kibana-ci-stats service [reason=${reason}], retrying in ${attempt} seconds`); - await new Promise((resolve) => setTimeout(resolve, attempt * 1000)); - } - } - } + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); } -exports.CiStatsReporter = CiStatsReporter; +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ -/***/ }), -/* 501 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelizeBatches", function() { return parallelizeBatches; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelize", function() { return parallelize; }); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 + +/** + * Colorize log arguments if enabled. * - * 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. + * @api public */ -async function parallelizeBatches(batches, fn) { - for (const batch of batches) { - // We need to make sure the entire batch has completed before we can move on - // to the next batch - await parallelize(batch, fn); - } -} -async function parallelize(items, fn, concurrency = 4) { - if (items.length === 0) { - return; - } - return new Promise((resolve, reject) => { - let activePromises = 0; - const values = items.slice(0); +function formatArgs(args) { + var useColors = this.useColors; - async function scheduleItem(item) { - activePromises++; + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); - try { - await fn(item); - activePromises--; + if (!useColors) return; - if (values.length > 0) { - // We have more work to do, so we schedule the next promise - scheduleItem(values.shift()); - } else if (activePromises === 0) { - // We have no more values left, and all items have completed, so we've - // completed all the work. - resolve(); - } - } catch (error) { - reject(error); - } - } + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') - values.splice(0, concurrency).map(scheduleItem); + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } }); -} -/***/ }), -/* 502 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + args.splice(lastC, 0, c); +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return getProjects; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProjectGraph", function() { return buildProjectGraph; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topologicallyBatchProjects", function() { return topologicallyBatchProjects; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "includeTransitiveProjects", function() { return includeTransitiveProjects; }); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(503); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); -/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(517); -/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(578); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". * - * http://www.apache.org/licenses/LICENSE-2.0 + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. * - * 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. + * @param {String} namespaces + * @api private */ +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + return r; +} -const glob = Object(util__WEBPACK_IMPORTED_MODULE_2__["promisify"])(glob__WEBPACK_IMPORTED_MODULE_0___default.a); -/** a Map of project names to Project instances */ +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ -async function getProjects(rootPath, projectsPathsPatterns, { - include = [], - exclude = [] -} = {}) { - const projects = new Map(); - const workspaceProjectsPaths = await Object(_workspaces__WEBPACK_IMPORTED_MODULE_5__["workspacePackagePaths"])(rootPath); +exports.enable(load()); - for (const pattern of projectsPathsPatterns) { - const pathsToProcess = await packagesFromGlobPattern({ - pattern, - rootPath - }); +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ - for (const filePath of pathsToProcess) { - const projectConfigPath = normalize(filePath); - const projectDir = path__WEBPACK_IMPORTED_MODULE_1___default.a.dirname(projectConfigPath); - const project = await _project__WEBPACK_IMPORTED_MODULE_4__["Project"].fromPath(projectDir); +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} - if (workspaceProjectsPaths.indexOf(filePath) >= 0) { - project.isWorkspaceProject = true; - } - const excludeProject = exclude.includes(project.name) || include.length > 0 && !include.includes(project.name); +/***/ }), +/* 468 */ +/***/ (function(module, exports, __webpack_require__) { - if (excludeProject) { - continue; - } - if (projects.has(project.name)) { - throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There are multiple projects with the same name [${project.name}]`, { - name: project.name, - paths: [project.path, projects.get(project.name).path] - }); - } +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ - projects.set(project.name, project); - } - } +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = __webpack_require__(469); - return projects; -} +/** + * Active `debug` instances. + */ +exports.instances = []; -function packagesFromGlobPattern({ - pattern, - rootPath -}) { - const globOptions = { - cwd: rootPath, - // Should throw in case of unusual errors when reading the file system - strict: true, - // Always returns absolute paths for matched files - absolute: true, - // Do not match ** against multiple filenames - // (This is only specified because we currently don't have a need for it.) - noglobstar: true - }; - return glob(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(pattern, 'package.json'), globOptions); -} // https://github.com/isaacs/node-glob/blob/master/common.js#L104 -// glob always returns "\\" as "/" in windows, so everyone -// gets normalized because we can't have nice things. +/** + * The currently active debug mode names, and names to skip. + */ +exports.names = []; +exports.skips = []; -function normalize(dir) { - return path__WEBPACK_IMPORTED_MODULE_1___default.a.normalize(dir); -} +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ -function buildProjectGraph(projects) { - const projectGraph = new Map(); +exports.formatters = {}; - for (const project of projects.values()) { - const projectDeps = []; - const dependencies = project.allDependencies; +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ - for (const depName of Object.keys(dependencies)) { - if (projects.has(depName)) { - const dep = projects.get(depName); - const dependentProjectIsInWorkspace = project.isWorkspaceProject || project.json.name === 'kibana'; - project.ensureValidProjectDependency(dep, dependentProjectIsInWorkspace); - projectDeps.push(dep); - } - } +function selectColor(namespace) { + var hash = 0, i; - projectGraph.set(project.name, projectDeps); + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer } - return projectGraph; + return exports.colors[Math.abs(hash) % exports.colors.length]; } -function topologicallyBatchProjects(projectsToBatch, projectGraph, { - batchByWorkspace = false -} = {}) { - // We're going to be chopping stuff out of this list, so copy it. - const projectsLeftToBatch = new Set(projectsToBatch.keys()); - const batches = []; - if (batchByWorkspace) { - const workspaceRootProject = Array.from(projectsToBatch.values()).find(p => p.isWorkspaceRoot); +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ - if (!workspaceRootProject) { - throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There was no yarn workspace root found.`); - } // Push in the workspace root first. +function createDebug(namespace) { + var prevTime; - batches.push([workspaceRootProject]); - projectsLeftToBatch.delete(workspaceRootProject.name); // In the next batch, push in all workspace projects. + function debug() { + // disabled? + if (!debug.enabled) return; - const workspaceBatch = []; + var self = debug; - for (const projectName of projectsLeftToBatch) { - const project = projectsToBatch.get(projectName); + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; - if (project.isWorkspaceProject) { - workspaceBatch.push(project); - projectsLeftToBatch.delete(projectName); - } + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; } - batches.push(workspaceBatch); - } + args[0] = exports.coerce(args[0]); - while (projectsLeftToBatch.size > 0) { - // Get all projects that have no remaining dependencies within the repo - // that haven't yet been picked. - const batch = []; + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } - for (const projectName of projectsLeftToBatch) { - const projectDeps = projectGraph.get(projectName); - const needsDependenciesBatched = projectDeps.some(dep => projectsLeftToBatch.has(dep.name)); + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); - if (!needsDependenciesBatched) { - batch.push(projectsToBatch.get(projectName)); + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; } - } // If we weren't able to find a project with no remaining dependencies, - // then we've encountered a cycle in the dependency graph. + return match; + }); + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); - const hasCycles = batch.length === 0; + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } - if (hasCycles) { - const cycleProjectNames = [...projectsLeftToBatch]; - const message = 'Encountered a cycle in the dependency graph. Projects in cycle are:\n' + cycleProjectNames.join(', '); - throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](message); - } + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + debug.destroy = destroy; - batches.push(batch); - batch.forEach(project => projectsLeftToBatch.delete(project.name)); + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); } - return batches; -} -function includeTransitiveProjects(subsetOfProjects, allProjects, { - onlyProductionDependencies = false -} = {}) { - const projectsWithDependents = new Map(); // the current list of packages we are expanding using breadth-first-search + exports.instances.push(debug); - const toProcess = [...subsetOfProjects]; + return debug; +} - while (toProcess.length > 0) { - const project = toProcess.shift(); - const dependencies = onlyProductionDependencies ? project.productionDependencies : project.allDependencies; - Object.keys(dependencies).forEach(dep => { - if (allProjects.has(dep)) { - toProcess.push(allProjects.get(dep)); - } - }); - projectsWithDependents.set(project.name, project); +function destroy () { + var index = exports.instances.indexOf(this); + if (index !== -1) { + exports.instances.splice(index, 1); + return true; + } else { + return false; } - - return projectsWithDependents; } -/***/ }), -/* 503 */ -/***/ (function(module, exports, __webpack_require__) { - -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -module.exports = glob +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ -var fs = __webpack_require__(23) -var rp = __webpack_require__(504) -var minimatch = __webpack_require__(506) -var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(510) -var EE = __webpack_require__(399).EventEmitter -var path = __webpack_require__(16) -var assert = __webpack_require__(30) -var isAbsolute = __webpack_require__(512) -var globSync = __webpack_require__(513) -var common = __webpack_require__(514) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = __webpack_require__(515) -var util = __webpack_require__(29) -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored +function enable(namespaces) { + exports.save(namespaces); -var once = __webpack_require__(404) + exports.names = []; + exports.skips = []; -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} + var i; + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) + for (i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } } - return new Glob(pattern, options, cb) + for (i = 0; i < exports.instances.length; i++) { + var instance = exports.instances[i]; + instance.enabled = exports.enabled(instance.namespace); + } } -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync +/** + * Disable debug output. + * + * @api public + */ -// old api surface -glob.glob = glob +function disable() { + exports.enable(''); +} -function extend (origin, add) { - if (add === null || typeof add !== 'object') { - return origin - } +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ - var keys = Object.keys(add) - var i = keys.length - while (i--) { - origin[keys[i]] = add[keys[i]] +function enabled(name) { + if (name[name.length - 1] === '*') { + return true; } - return origin + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; } -glob.hasMagic = function (pattern, options_) { - var options = extend({}, options_) - options.noprocess = true +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ - var g = new Glob(pattern, options) - var set = g.minimatch.set +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} - if (!pattern) - return false - if (set.length > 1) - return true +/***/ }), +/* 469 */ +/***/ (function(module, exports) { - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } +/** + * Helpers. + */ - return false -} +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts(this, pattern, options) - this._didRealPath = false +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ - // process each pattern in the minimatch set - var n = this.minimatch.set.length +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} - var self = this - this._processing = 0 - - this._emitQueue = [] - this._processQueue = [] - this.paused = false +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ - if (this.noprocess) - return this +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} - if (n === 0) - return done() +/** + * Pluralization helper. + */ - var sync = true - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) +function plural(ms, n, name) { + if (ms < n) { + return; } - sync = false - - function done () { - --self._processing - if (self._processing <= 0) { - if (sync) { - process.nextTick(function () { - self._finish() - }) - } else { - self._finish() - } - } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; } + return Math.ceil(ms / n) + ' ' + name + 's'; } -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return - if (this.realpath && !this._didRealpath) - return this._realpath() +/***/ }), +/* 470 */ +/***/ (function(module, exports, __webpack_require__) { - common.finish(this) - this.emit('end', this.found) -} +/** + * Module dependencies. + */ -Glob.prototype._realpath = function () { - if (this._didRealpath) - return +var tty = __webpack_require__(471); +var util = __webpack_require__(397); - this._didRealpath = true +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ - var n = this.matches.length - if (n === 0) - return this._finish() +exports = module.exports = __webpack_require__(468); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) +/** + * Colors. + */ - function next () { - if (--n === 0) - self._finish() +exports.colors = [ 6, 2, 3, 4, 5, 1 ]; + +try { + var supportsColor = __webpack_require__(472); + if (supportsColor && supportsColor.level >= 2) { + exports.colors = [ + 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, + 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, + 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 214, 215, 220, 221 + ]; } +} catch (err) { + // swallow - we only care if `supports-color` is available; it doesn't have to be. } -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ - var found = Object.keys(matchset) - var self = this - var n = found.length +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - if (n === 0) - return cb() + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); - var set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - rp.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here + obj[prop] = val; + return obj; +}, {}); - if (--n === 0) { - self.matches[index] = set - cb() - } - }) - }) +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(process.stderr.fd); } -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} +/** + * Map %o to `util.inspect()`, all on a single line. + */ -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n').map(function(str) { + return str.trim() + }).join(' '); +}; -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') - } -} +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) - } - } - } -} +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; - if (this.aborted) - return + if (useColors) { + var c = this.color; + var colorCode = '\u001b[3' + (c < 8 ? c : '8;5;' + c); + var prefix = ' ' + colorCode + ';1m' + name + ' ' + '\u001b[0m'; - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; } +} - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } else { + return new Date().toISOString() + ' '; } - // now n is the index of the first one that is *not* a string. +} - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break +function log() { + return process.stderr.write(util.format.apply(util, arguments) + '\n'); +} - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; } +} - var remain = pattern.slice(n) +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix +function load() { + return process.env.DEBUG; +} - var abs = this._makeAbs(read) +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() +function init (debug) { + debug.inspectOpts = {}; - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } } -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { +exports.enable(load()); - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' +/***/ }), +/* 471 */ +/***/ (function(module, exports) { - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } +module.exports = require("tty"); - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) +/***/ }), +/* 472 */ +/***/ (function(module, exports, __webpack_require__) { - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() +"use strict"; - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) +const env = process.env; - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return cb() - } +function translateLevel(level) { + if (level === 0) { + return false; + } - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - this._process([e].concat(remain), index, inGlobStar, cb) - } - cb() + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; } -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - if (isIgnored(this, e)) - return + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } - if (this.paused) { - this._emitQueue.push([index, e]) - return - } + if (hasFlag('color=256')) { + return 2; + } - var abs = isAbsolute(e) ? e : this._makeAbs(e) + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } - if (this.mark) - e = this._mark(e) + const min = forceColor ? 1 : 0; - if (this.absolute) - e = abs + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } - if (this.matches[index][e]) - return + return 1; + } - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } - this.matches[index][e] = true + return min; + } - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - this.emit('match', e) -} + if (env.COLORTERM === 'truecolor') { + return 3; + } -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } - if (lstatcb) - fs.lstat(abs, lstatcb) + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } - function lstatcb_ (er, lstat) { - if (er && er.code === 'ENOENT') - return cb() + if ('COLORTERM' in env) { + return 1; + } - var isSym = lstat && lstat.isSymbolicLink() - self.symlinks[abs] = isSym + if (env.TERM === 'dumb') { + return min; + } - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) - } + return min; } -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() - if (Array.isArray(c)) - return cb(null, c) - } +/***/ }), +/* 473 */ +/***/ (function(module, exports) { - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} +module.exports = require("zlib"); -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) - } -} +/***/ }), +/* 474 */ +/***/ (function(module) { -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return +module.exports = JSON.parse("{\"name\":\"axios\",\"version\":\"0.19.2\",\"description\":\"Promise based HTTP client for the browser and node.js\",\"main\":\"index.js\",\"scripts\":{\"test\":\"grunt test && bundlesize\",\"start\":\"node ./sandbox/server.js\",\"build\":\"NODE_ENV=production grunt build\",\"preversion\":\"npm test\",\"version\":\"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json\",\"postversion\":\"git push && git push --tags\",\"examples\":\"node ./examples/server.js\",\"coveralls\":\"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js\",\"fix\":\"eslint --fix lib/**/*.js\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/axios/axios.git\"},\"keywords\":[\"xhr\",\"http\",\"ajax\",\"promise\",\"node\"],\"author\":\"Matt Zabriskie\",\"license\":\"MIT\",\"bugs\":{\"url\":\"https://github.com/axios/axios/issues\"},\"homepage\":\"https://github.com/axios/axios\",\"devDependencies\":{\"bundlesize\":\"^0.17.0\",\"coveralls\":\"^3.0.0\",\"es6-promise\":\"^4.2.4\",\"grunt\":\"^1.0.2\",\"grunt-banner\":\"^0.6.0\",\"grunt-cli\":\"^1.2.0\",\"grunt-contrib-clean\":\"^1.1.0\",\"grunt-contrib-watch\":\"^1.0.0\",\"grunt-eslint\":\"^20.1.0\",\"grunt-karma\":\"^2.0.0\",\"grunt-mocha-test\":\"^0.13.3\",\"grunt-ts\":\"^6.0.0-beta.19\",\"grunt-webpack\":\"^1.0.18\",\"istanbul-instrumenter-loader\":\"^1.0.0\",\"jasmine-core\":\"^2.4.1\",\"karma\":\"^1.3.0\",\"karma-chrome-launcher\":\"^2.2.0\",\"karma-coverage\":\"^1.1.1\",\"karma-firefox-launcher\":\"^1.1.0\",\"karma-jasmine\":\"^1.1.1\",\"karma-jasmine-ajax\":\"^0.1.13\",\"karma-opera-launcher\":\"^1.0.0\",\"karma-safari-launcher\":\"^1.0.0\",\"karma-sauce-launcher\":\"^1.2.0\",\"karma-sinon\":\"^1.0.5\",\"karma-sourcemap-loader\":\"^0.3.7\",\"karma-webpack\":\"^1.7.0\",\"load-grunt-tasks\":\"^3.5.2\",\"minimist\":\"^1.2.0\",\"mocha\":\"^5.2.0\",\"sinon\":\"^4.5.0\",\"typescript\":\"^2.8.1\",\"url-search-params\":\"^0.10.0\",\"webpack\":\"^1.13.1\",\"webpack-dev-server\":\"^1.14.1\"},\"browser\":{\"./lib/adapters/http.js\":\"./lib/adapters/xhr.js\"},\"typings\":\"./index.d.ts\",\"dependencies\":{\"follow-redirects\":\"1.5.10\"},\"bundlesize\":[{\"path\":\"./dist/axios.min.js\",\"threshold\":\"5kB\"}]}"); - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } +/***/ }), +/* 475 */ +/***/ (function(module, exports, __webpack_require__) { - this.cache[abs] = entries - return cb(null, entries) -} +"use strict"; -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - this.emit('error', error) - this.abort() - } - break +var utils = __webpack_require__(442); - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * @returns {Object} New object resulting from merging config2 to config1 + */ +module.exports = function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() - } - if (!this.silent) - console.error('glob error', er) - break - } - - return cb() -} - -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} + var valueFromConfig2Keys = ['url', 'method', 'params', 'data']; + var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy']; + var defaultToConfig2Keys = [ + 'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer', + 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', + 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', + 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent', + 'httpsAgent', 'cancelToken', 'socketPath' + ]; + utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } + }); -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) + utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop) { + if (utils.isObject(config2[prop])) { + config[prop] = utils.deepMerge(config1[prop], config2[prop]); + } else if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (utils.isObject(config1[prop])) { + config[prop] = utils.deepMerge(config1[prop]); + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; + } + }); - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() + utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; + } + }); - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) + var axiosKeys = valueFromConfig2Keys + .concat(mergeDeepPropertiesKeys) + .concat(defaultToConfig2Keys); - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) + var otherKeys = Object + .keys(config2) + .filter(function filterAxiosKeys(key) { + return axiosKeys.indexOf(key) === -1; + }); - var isSym = this.symlinks[abs] - var len = entries.length + utils.forEach(otherKeys, function otherKeysDefaultToConfig2(prop) { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; + } + }); - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() + return config; +}; - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) +/***/ }), +/* 476 */ +/***/ (function(module, exports, __webpack_require__) { - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) - } +"use strict"; - cb() -} -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) +/** + * A `Cancel` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ +function Cancel(message) { + this.message = message; } -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} +Cancel.prototype.toString = function toString() { + return 'Cancel' + (this.message ? ': ' + this.message : ''); +}; -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' +Cancel.prototype.__CANCEL__ = true; - if (f.length > this.maxLength) - return cb() +module.exports = Cancel; - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (Array.isArray(c)) - c = 'DIR' +/***/ }), +/* 477 */ +/***/ (function(module, exports, __webpack_require__) { - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) +"use strict"; - if (needDir && c === 'FILE') - return cb() - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } +var Cancel = __webpack_require__(476); - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @class + * @param {Function} executor The executor function. + */ +function CancelToken(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); } - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) + var resolvePromise; + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) + var token = this; + executor(function cancel(message) { + if (token.reason) { + // Cancellation has already been requested + return; } - } + + token.reason = new Cancel(message); + resolvePromise(token.reason); + }); } -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return cb() +/** + * Throws a `Cancel` if cancellation has been requested. + */ +CancelToken.prototype.throwIfRequested = function throwIfRequested() { + if (this.reason) { + throw this.reason; } +}; - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat - - if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) - return cb(null, false, stat) - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c === 'FILE') - return cb() +/** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ +CancelToken.source = function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; +}; - return cb(null, c, stat) -} +module.exports = CancelToken; /***/ }), -/* 504 */ +/* 478 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = realpath -realpath.realpath = realpath -realpath.sync = realpathSync -realpath.realpathSync = realpathSync -realpath.monkeypatch = monkeypatch -realpath.unmonkeypatch = unmonkeypatch - -var fs = __webpack_require__(23) -var origRealpath = fs.realpath -var origRealpathSync = fs.realpathSync - -var version = process.version -var ok = /^v[0-5]\./.test(version) -var old = __webpack_require__(505) - -function newError (er) { - return er && er.syscall === 'realpath' && ( - er.code === 'ELOOP' || - er.code === 'ENOMEM' || - er.code === 'ENAMETOOLONG' - ) -} +"use strict"; -function realpath (p, cache, cb) { - if (ok) { - return origRealpath(p, cache, cb) - } - if (typeof cache === 'function') { - cb = cache - cache = null - } - origRealpath(p, cache, function (er, result) { - if (newError(er)) { - old.realpath(p, cache, cb) - } else { - cb(er, result) - } - }) -} +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * @returns {Function} + */ +module.exports = function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +}; -function realpathSync (p, cache) { - if (ok) { - return origRealpathSync(p, cache) - } - try { - return origRealpathSync(p, cache) - } catch (er) { - if (newError(er)) { - return old.realpathSync(p, cache) - } else { - throw er - } - } -} +/***/ }), +/* 479 */ +/***/ (function(module, exports, __webpack_require__) { -function monkeypatch () { - fs.realpath = realpath - fs.realpathSync = realpathSync -} +"use strict"; -function unmonkeypatch () { - fs.realpath = origRealpath - fs.realpathSync = origRealpathSync -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +tslib_1.__exportStar(__webpack_require__(480), exports); /***/ }), -/* 505 */ +/* 480 */ /***/ (function(module, exports, __webpack_require__) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var pathModule = __webpack_require__(16); -var isWindows = process.platform === 'win32'; -var fs = __webpack_require__(23); +"use strict"; -// JavaScript implementation of realpath, ported from node pre-v6 +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isAxiosRequestError = (error) => { + return error && error.config && error.response === undefined; +}; +exports.isAxiosResponseError = (error) => { + return error && error.response && error.response.status !== undefined; +}; -var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); -function rethrow() { - // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and - // is fairly slow to generate. - var callback; - if (DEBUG) { - var backtrace = new Error; - callback = debugCallback; - } else - callback = missingCallback; +/***/ }), +/* 481 */ +/***/ (function(module, exports, __webpack_require__) { - return callback; +"use strict"; - function debugCallback(err) { - if (err) { - backtrace.message = err.message; - err = backtrace; - missingCallback(err); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +class KbnClientStatus { + constructor(requester) { + this.requester = requester; } - } - - function missingCallback(err) { - if (err) { - if (process.throwDeprecation) - throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs - else if (!process.noDeprecation) { - var msg = 'fs: missing callback ' + (err.stack || err.message); - if (process.traceDeprecation) - console.trace(msg); - else - console.error(msg); - } + /** + * Get the full server status + */ + async get() { + return await this.requester.request({ + method: 'GET', + path: 'api/status', + }); + } + /** + * Get the overall/merged state + */ + async getOverallState() { + const status = await this.get(); + return status.status.overall.state; } - } } +exports.KbnClientStatus = KbnClientStatus; -function maybeCallback(cb) { - return typeof cb === 'function' ? cb : rethrow(); -} -var normalize = pathModule.normalize; +/***/ }), +/* 482 */ +/***/ (function(module, exports, __webpack_require__) { -// Regexp that finds the next partion of a (partial) path -// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] -if (isWindows) { - var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; -} else { - var nextPartRe = /(.*?)(?:[\/]+|$)/g; -} +"use strict"; -// Regex to find the device root, including trailing slash. E.g. 'c:\\'. -if (isWindows) { - var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; -} else { - var splitRootRe = /^[\/]*/; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const PLUGIN_STATUS_ID = /^plugin:(.+?)@/; +class KbnClientPlugins { + constructor(status) { + this.status = status; + } + /** + * Get a list of plugin ids that are enabled on the server + */ + async getEnabledIds() { + const pluginIds = []; + const apiResp = await this.status.get(); + for (const status of apiResp.status.statuses) { + if (status.id) { + const match = status.id.match(PLUGIN_STATUS_ID); + if (match) { + pluginIds.push(match[1]); + } + } + } + return pluginIds; + } } +exports.KbnClientPlugins = KbnClientPlugins; -exports.realpathSync = function realpathSync(p, cache) { - // make p is absolute - p = pathModule.resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return cache[p]; - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstatSync(base); - knownHard[base] = true; - } - } +/***/ }), +/* 483 */ +/***/ (function(module, exports, __webpack_require__) { - // walk down the path, swapping out linked pathparts for their real - // values - // NB: p.length changes. - while (pos < p.length) { - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; +"use strict"; - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - continue; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +class KbnClientVersion { + constructor(status) { + this.status = status; } - - var resolvedLink; - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // some known symbolic link. no need to stat again. - resolvedLink = cache[base]; - } else { - var stat = fs.lstatSync(base); - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - continue; - } - - // read the link if it wasn't read before - // dev/ino always return 0 on windows, so skip the check. - var linkTarget = null; - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - linkTarget = seenLinks[id]; + async get() { + if (this.versionCache !== undefined) { + return this.versionCache; } - } - if (linkTarget === null) { - fs.statSync(base); - linkTarget = fs.readlinkSync(base); - } - resolvedLink = pathModule.resolve(previous, linkTarget); - // track this, if given a cache. - if (cache) cache[base] = resolvedLink; - if (!isWindows) seenLinks[id] = linkTarget; + const status = await this.status.get(); + this.versionCache = status.version.number + (status.version.build_snapshot ? '-SNAPSHOT' : ''); + return this.versionCache; } +} +exports.KbnClientVersion = KbnClientVersion; - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } - - if (cache) cache[original] = p; - - return p; -}; - - -exports.realpath = function realpath(p, cache, cb) { - if (typeof cb !== 'function') { - cb = maybeCallback(cache); - cache = null; - } - // make p is absolute - p = pathModule.resolve(p); +/***/ }), +/* 484 */ +/***/ (function(module, exports, __webpack_require__) { - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return process.nextTick(cb.bind(null, null, cache[p])); - } +"use strict"; - var original = p, - seenLinks = {}, - knownHard = {}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const kbn_client_requester_1 = __webpack_require__(438); +class KbnClientSavedObjects { + constructor(log, requester) { + this.log = log; + this.requester = requester; + } + /** + * Run the saved objects migration + */ + async migrate() { + this.log.debug('Migrating saved objects'); + return await this.requester.request({ + description: 'migrate saved objects', + path: kbn_client_requester_1.uriencode `/internal/saved_objects/_migrate`, + method: 'POST', + body: {}, + }); + } + /** + * Get an object + */ + async get(options) { + this.log.debug('Gettings saved object: %j', options); + return await this.requester.request({ + description: 'get saved object', + path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, + method: 'GET', + }); + } + /** + * Create a saved object + */ + async create(options) { + this.log.debug('Creating saved object: %j', options); + return await this.requester.request({ + description: 'update saved object', + path: options.id + ? kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}` + : kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}`, + query: { + overwrite: options.overwrite, + }, + method: 'POST', + body: { + attributes: options.attributes, + migrationVersion: options.migrationVersion, + references: options.references, + }, + }); + } + /** + * Update a saved object + */ + async update(options) { + this.log.debug('Updating saved object: %j', options); + return await this.requester.request({ + description: 'update saved object', + path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, + query: { + overwrite: options.overwrite, + }, + method: 'PUT', + body: { + attributes: options.attributes, + migrationVersion: options.migrationVersion, + references: options.references, + }, + }); + } + /** + * Delete an object + */ + async delete(options) { + this.log.debug('Deleting saved object %s/%s', options); + return await this.requester.request({ + description: 'delete saved object', + path: kbn_client_requester_1.uriencode `/api/saved_objects/${options.type}/${options.id}`, + method: 'DELETE', + }); + } +} +exports.KbnClientSavedObjects = KbnClientSavedObjects; - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - start(); +/***/ }), +/* 485 */ +/***/ (function(module, exports, __webpack_require__) { - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; +"use strict"; - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstat(base, function(err) { - if (err) return cb(err); - knownHard[base] = true; - LOOP(); - }); - } else { - process.nextTick(LOOP); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const kbn_client_requester_1 = __webpack_require__(438); +class KbnClientUiSettings { + constructor(log, requester, defaults) { + this.log = log; + this.requester = requester; + this.defaults = defaults; } - } - - // walk down the path, swapping out linked pathparts for their real - // values - function LOOP() { - // stop if scanned past end of path - if (pos >= p.length) { - if (cache) cache[original] = p; - return cb(null, p); + async get(setting) { + var _a; + const all = await this.getAll(); + const value = (_a = all[setting]) === null || _a === void 0 ? void 0 : _a.userValue; + this.log.verbose('uiSettings.value: %j', value); + return value; } - - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - return process.nextTick(LOOP); + /** + * Gets defaultIndex from the config doc. + */ + async getDefaultIndex() { + return await this.get('defaultIndex'); } - - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // known symbolic link. no need to stat again. - return gotResolvedLink(cache[base]); + /** + * Unset a uiSetting + */ + async unset(setting) { + return await this.requester.request({ + path: kbn_client_requester_1.uriencode `/api/kibana/settings/${setting}`, + method: 'DELETE', + }); } - - return fs.lstat(base, gotStat); - } - - function gotStat(err, stat) { - if (err) return cb(err); - - // if not a symlink, skip to the next path part - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - return process.nextTick(LOOP); + /** + * Replace all uiSettings with the `doc` values, `doc` is merged + * with some defaults + */ + async replace(doc, { retries = 5 } = {}) { + this.log.debug('replacing kibana config doc: %j', doc); + const changes = { + ...this.defaults, + ...doc, + }; + for (const [name, { isOverridden }] of Object.entries(await this.getAll())) { + if (!isOverridden && !changes.hasOwnProperty(name)) { + changes[name] = null; + } + } + await this.requester.request({ + method: 'POST', + path: '/api/kibana/settings', + body: { changes }, + retries, + }); } - - // stat & read the link if not read before - // call gotTarget as soon as the link target is known - // dev/ino always return 0 on windows, so skip the check. - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - return gotTarget(null, seenLinks[id], base); - } + /** + * Add fields to the config doc (like setting timezone and defaultIndex) + */ + async update(updates) { + this.log.debug('applying update to kibana config: %j', updates); + await this.requester.request({ + path: '/api/kibana/settings', + method: 'POST', + body: { + changes: updates, + }, + }); } - fs.stat(base, function(err) { - if (err) return cb(err); + async getAll() { + const resp = await this.requester.request({ + path: '/api/kibana/settings', + method: 'GET', + }); + return resp.settings; + } +} +exports.KbnClientUiSettings = KbnClientUiSettings; - fs.readlink(base, function(err, target) { - if (!isWindows) seenLinks[id] = target; - gotTarget(err, target); - }); - }); - } - function gotTarget(err, target, base) { - if (err) return cb(err); +/***/ }), +/* 486 */ +/***/ (function(module, exports, __webpack_require__) { - var resolvedLink = pathModule.resolve(previous, target); - if (cache) cache[base] = resolvedLink; - gotResolvedLink(resolvedLink); - } +"use strict"; - function gotResolvedLink(resolvedLink) { - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } -}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +tslib_1.__exportStar(__webpack_require__(487), exports); /***/ }), -/* 506 */ +/* 487 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = minimatch -minimatch.Minimatch = Minimatch - -var path = { sep: '/' } -try { - path = __webpack_require__(16) -} catch (er) {} - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = __webpack_require__(507) - -var plTypes = { - '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, - '?': { open: '(?:', close: ')?' }, - '+': { open: '(?:', close: ')+' }, - '*': { open: '(?:', close: ')*' }, - '@': { open: '(?:', close: ')' } -} +"use strict"; -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]' - -// * => any number of characters -var star = qmark + '*?' +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(6); +const util_1 = __webpack_require__(397); +const axios_1 = tslib_1.__importDefault(__webpack_require__(440)); +function parseConfig(log) { + const configJson = process.env.KIBANA_CI_STATS_CONFIG; + if (!configJson) { + log.debug('KIBANA_CI_STATS_CONFIG environment variable not found, disabling CiStatsReporter'); + return; + } + let config; + try { + config = JSON.parse(configJson); + } + catch (_) { + // handled below + } + if (typeof config === 'object' && config !== null) { + return validateConfig(log, config); + } + log.warning('KIBANA_CI_STATS_CONFIG is invalid, stats will not be reported'); + return; +} +function validateConfig(log, config) { + const validApiUrl = typeof config.apiUrl === 'string' && config.apiUrl.length !== 0; + if (!validApiUrl) { + log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api url, stats will not be reported'); + return; + } + const validApiToken = typeof config.apiToken === 'string' && config.apiToken.length !== 0; + if (!validApiToken) { + log.warning('KIBANA_CI_STATS_CONFIG is missing a valid api token, stats will not be reported'); + return; + } + const validId = typeof config.buildId === 'string' && config.buildId.length !== 0; + if (!validId) { + log.warning('KIBANA_CI_STATS_CONFIG is missing a valid build id, stats will not be reported'); + return; + } + return config; +} +class CiStatsReporter { + constructor(config, log) { + this.config = config; + this.log = log; + } + static fromEnv(log) { + return new CiStatsReporter(parseConfig(log), log); + } + isEnabled() { + return !!this.config; + } + async metrics(metrics) { + var _a, _b, _c, _d; + if (!this.config) { + return; + } + let attempt = 0; + const maxAttempts = 5; + const bodySummary = metrics + .map(({ group, id, value }) => `[${group}/${id}=${value}]`) + .join(' '); + while (true) { + attempt += 1; + try { + await axios_1.default.request({ + method: 'POST', + url: '/v1/metrics', + baseURL: this.config.apiUrl, + headers: { + Authorization: `token ${this.config.apiToken}`, + }, + data: { + buildId: this.config.buildId, + metrics, + }, + }); + return; + } + catch (error) { + if (!((_a = error) === null || _a === void 0 ? void 0 : _a.request)) { + // not an axios error, must be a usage error that we should notify user about + throw error; + } + if (((_b = error) === null || _b === void 0 ? void 0 : _b.response) && error.response.status !== 502) { + // error response from service was received so warn the user and move on + this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] ${bodySummary}`); + return; + } + if (attempt === maxAttempts) { + this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}`); + return; + } + // we failed to reach the backend and we have remaining attempts, lets retry after a short delay + const reason = ((_d = (_c = error) === null || _c === void 0 ? void 0 : _c.response) === null || _d === void 0 ? void 0 : _d.status) ? `${error.response.status} response` + : 'no response'; + this.log.warning(`failed to reach kibana-ci-stats service [reason=${reason}], retrying in ${attempt} seconds`); + await new Promise((resolve) => setTimeout(resolve, attempt * 1000)); + } + } + } +} +exports.CiStatsReporter = CiStatsReporter; -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' +/***/ }), +/* 488 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); +/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(489); +/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(581); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(686); +/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(687); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} -// normalizes slashes. -var slashSplit = /\/+/ -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} +const commands = { + bootstrap: _bootstrap__WEBPACK_IMPORTED_MODULE_0__["BootstrapCommand"], + clean: _clean__WEBPACK_IMPORTED_MODULE_1__["CleanCommand"], + run: _run__WEBPACK_IMPORTED_MODULE_2__["RunCommand"], + watch: _watch__WEBPACK_IMPORTED_MODULE_3__["WatchCommand"] +}; -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch +/***/ }), +/* 489 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var orig = minimatch +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCommand", function() { return BootstrapCommand; }); +/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(490); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); +/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(575); +/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(580); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - return m -} -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - if (!options) options = {} +const BootstrapCommand = { + description: 'Install dependencies and crosslink projects', + name: 'bootstrap', - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } + async run(projects, projectGraph, { + options, + kbn + }) { + const batchedProjectsByWorkspace = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph, { + batchByWorkspace: true + }); + const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); + const extraArgs = [...(options['frozen-lockfile'] === true ? ['--frozen-lockfile'] : []), ...(options['prefer-offline'] === true ? ['--prefer-offline'] : [])]; - // "" only matches "" - if (pattern.trim() === '') return p === '' + for (const batch of batchedProjectsByWorkspace) { + for (const project of batch) { + if (project.isWorkspaceProject) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].verbose(`Skipping workspace project: ${project.name}`); + continue; + } - return new Minimatch(pattern, options).match(p) -} + if (project.hasDependencies()) { + await project.installDependencies({ + extraArgs + }); + } + } + } -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } + await Object(_utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__["linkProjectExecutables"])(projects, projectGraph); + /** + * At the end of the bootstrapping process we call all `kbn:bootstrap` scripts + * in the list of projects. We do this because some projects need to be + * transpiled before they can be used. Ideally we shouldn't do this unless we + * have to, as it will slow down the bootstrapping process. + */ - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } + const checksums = await Object(_utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__["getAllChecksums"])(kbn, _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"]); + const caches = new Map(); + let cachedProjectCount = 0; - if (!options) options = {} - pattern = pattern.trim() + for (const project of projects.values()) { + if (project.hasScript('kbn:bootstrap')) { + const file = new _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__["BootstrapCacheFile"](kbn, project, checksums); + const valid = options.cache && file.isValid(); - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } + if (valid) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`[${project.name}] cache up to date`); + } - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false + caches.set(project, { + file, + valid + }); + cachedProjectCount += 1; + } + } - // make the set of regexps etc. - this.make() -} + if (cachedProjectCount > 0) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`${cachedProjectCount} bootsrap builds are cached`); + } -Minimatch.prototype.debug = function () {} + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async project => { + const cache = caches.get(project); -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return + if (cache && !cache.valid) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`[${project.name}] running [kbn:bootstrap] script`); + cache.file.delete(); + await project.runScriptStreaming('kbn:bootstrap'); + cache.file.write(); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${project.name}] bootstrap complete`); + } + }); + } - var pattern = this.pattern - var options = this.options +}; - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } +/***/ }), +/* 490 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - // step 1: figure out negation, etc. - this.parseNegate() +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkProjectExecutables", function() { return linkProjectExecutables; }); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(491); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(500); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ - // step 2: expand braces - var set = this.globSet = this.braceExpand() - if (options.debug) this.debug = console.error - this.debug(this.pattern, set) - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) +/** + * Yarn does not link the executables from dependencies that are installed + * using `link:` https://github.com/yarnpkg/yarn/pull/5046 + * + * We simulate this functionality by walking through each project's project + * dependencies, and manually linking their executables if defined. The logic + * for linking was mostly adapted from lerna: https://github.com/lerna/lerna/blob/1d7eb9eeff65d5a7de64dea73613b1bf6bfa8d57/src/PackageUtilities.js#L348 + */ +async function linkProjectExecutables(projectsByName, projectGraph) { + _log__WEBPACK_IMPORTED_MODULE_2__["log"].debug(`Linking package executables`); - this.debug(this.pattern, set) + for (const [projectName, projectDeps] of projectGraph) { + const project = projectsByName.get(projectName); + const binsDir = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(project.nodeModulesLocation, '.bin'); - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) + for (const projectDep of projectDeps) { + const executables = projectDep.getExecutables(); - this.debug(this.pattern, set) + for (const name of Object.keys(executables)) { + const srcPath = executables[name]; // existing logic from lerna -- ensure that the bin we are going to + // point to exists or ignore it - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) + if (!(await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["isFile"])(srcPath))) { + continue; + } - this.debug(this.pattern, set) + const dest = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(binsDir, name); // Get relative project path with normalized path separators. - this.set = set + const projectRelativePath = Object(path__WEBPACK_IMPORTED_MODULE_0__["relative"])(project.path, srcPath).split(path__WEBPACK_IMPORTED_MODULE_0__["sep"]).join('/'); + _log__WEBPACK_IMPORTED_MODULE_2__["log"].debug(`[${project.name}] ${name} -> ${projectRelativePath}`); + await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["mkdirp"])(Object(path__WEBPACK_IMPORTED_MODULE_0__["dirname"])(dest)); + await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["createSymlink"])(srcPath, dest, 'exec'); + await Object(_fs__WEBPACK_IMPORTED_MODULE_1__["chmod"])(dest, '755'); + } + } + } } -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 +/***/ }), +/* 491 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (options.nonegate) return +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readFile", function() { return readFile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "chmod", function() { return chmod; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mkdirp", function() { return mkdirp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unlink", function() { return unlink; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyDirectory", function() { return copyDirectory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSymlink", function() { return isSymlink; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDirectory", function() { return isDirectory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFile", function() { return isFile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSymlink", function() { return createSymlink; }); +/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(492); +/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cmd_shim__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(349); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(499); +/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ncp__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(397); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_4__); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} -Minimatch.prototype.braceExpand = braceExpand -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } +const lstat = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.lstat); +const readFile = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.readFile); +const symlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.symlink); +const chmod = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.chmod); +const cmdShim = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(cmd_shim__WEBPACK_IMPORTED_MODULE_0___default.a); +const mkdir = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.mkdir); +const mkdirp = async path => await mkdir(path, { + recursive: true +}); +const unlink = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(fs__WEBPACK_IMPORTED_MODULE_1___default.a.unlink); +const copyDirectory = Object(util__WEBPACK_IMPORTED_MODULE_4__["promisify"])(ncp__WEBPACK_IMPORTED_MODULE_2__["ncp"]); - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern +async function statTest(path, block) { + try { + return block((await lstat(path))); + } catch (e) { + if (e.code === 'ENOENT') { + return false; + } - if (typeof pattern === 'undefined') { - throw new TypeError('undefined pattern') + throw e; } +} +/** + * Test if a path points to a symlink. + * @param path + */ - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - return expand(pattern) +async function isSymlink(path) { + return await statTest(path, stats => stats.isSymbolicLink()); } +/** + * Test if a path points to a directory. + * @param path + */ -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - if (pattern.length > 1024 * 64) { - throw new TypeError('pattern is too long') - } - - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' +async function isDirectory(path) { + return await statTest(path, stats => stats.isDirectory()); +} +/** + * Test if a path points to a regular file. + * @param path + */ - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this +async function isFile(path) { + return await statTest(path, stats => stats.isFile()); +} +/** + * Create a symlink at dest that points to src. Adapted from + * https://github.com/lerna/lerna/blob/2f1b87d9e2295f587e4ac74269f714271d8ed428/src/FileSystemUtilities.js#L103. + * + * @param src + * @param dest + * @param type 'dir', 'file', 'junction', or 'exec'. 'exec' on + * windows will use the `cmd-shim` module since symlinks can't be used + * for executable files on windows. + */ - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false +async function createSymlink(src, dest, type) { + if (process.platform === 'win32') { + if (type === 'exec') { + await cmdShim(src, dest); + } else { + await forceCreate(src, dest, type); } + } else { + const posixType = type === 'exec' ? 'file' : type; + const relativeSource = Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(Object(path__WEBPACK_IMPORTED_MODULE_3__["dirname"])(dest), src); + await forceCreate(relativeSource, dest, posixType); } +} - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue +async function forceCreate(src, dest, type) { + try { + // If something exists at `dest` we need to remove it first. + await unlink(dest); + } catch (error) { + if (error.code !== 'ENOENT') { + throw error; } + } - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - patternListStack.push({ - type: stateChar, - start: i - 1, - reStart: re.length, - open: plTypes[stateChar].open, - close: plTypes[stateChar].close - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - var pl = patternListStack.pop() - // negation is (?:(?!js)[^/]*) - // The others are (?:) - re += pl.close - if (pl.type === '!') { - negativeLists.push(pl) - } - pl.reEnd = re.length - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue + await symlink(src, dest, type); +} - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() +/***/ }), +/* 492 */ +/***/ (function(module, exports, __webpack_require__) { - if (inClass) { - re += '\\' + c - continue - } +// On windows, create a .cmd file. +// Read the #! in the file to see what it uses. The vast majority +// of the time, this will be either: +// "#!/usr/bin/env " +// or: +// "#! " +// +// Write a binroot/pkg.bin + ".cmd" file that has this line in it: +// @ %~dp0 %* - inClass = true - classStart = i - reClassStart = re.length - re += c - continue +module.exports = cmdShim +cmdShim.ifExists = cmdShimIfExists - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } +var fs = __webpack_require__(493) - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - } +var mkdir = __webpack_require__(497) + , path = __webpack_require__(4) + , toBatchSyntax = __webpack_require__(498) + , shebangExpr = /^#\!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+=[^ \t]+\s+)*\s*([^ \t]+)(.*)$/ - // finish up the class. - hasMagic = true - inClass = false - re += c - continue +function cmdShimIfExists (from, to, cb) { + fs.stat(from, function (er) { + if (er) return cb() + cmdShim(from, to, cb) + }) +} - default: - // swallow any state char that wasn't consumed - clearStateChar() +// Try to unlink, but ignore errors. +// Any problems will surface later. +function rm (path, cb) { + fs.unlink(path, function(er) { + cb() + }) +} - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } +function cmdShim (from, to, cb) { + fs.stat(from, function (er, stat) { + if (er) + return cb(er) - re += c + cmdShim_(from, to, cb) + }) +} - } // switch - } // for +function cmdShim_ (from, to, cb) { + var then = times(2, next, cb) + rm(to, then) + rm(to + ".cmd", then) - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] + function next(er) { + writeShim(from, to, cb) } +} - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + pl.open.length) - this.debug('setting tail', re, pl) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' +function writeShim (from, to, cb) { + // make a cmd file and a sh script + // First, check if the bin is a #! of some sort. + // If not, then assume it's something that'll be compiled, or some other + // sort of script, and just call it directly. + mkdir(path.dirname(to), function (er) { + if (er) + return cb(er) + fs.readFile(from, "utf8", function (er, data) { + if (er) return writeShim_(from, to, null, null, cb) + var firstLine = data.trim().split(/\r*\n/)[0] + , shebang = firstLine.match(shebangExpr) + if (!shebang) return writeShim_(from, to, null, null, null, cb) + var vars = shebang[1] || "" + , prog = shebang[2] + , args = shebang[3] || "" + return writeShim_(from, to, prog, args, vars, cb) }) + }) +} - this.debug('tail=%j\n %s', tail, tail, pl, re) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' +function writeShim_ (from, to, prog, args, variables, cb) { + var shTarget = path.relative(path.dirname(to), from) + , target = shTarget.split("/").join("\\") + , longProg + , shProg = prog && prog.split("\\").join("/") + , shLongProg + , pwshProg = shProg && "\"" + shProg + "$exe\"" + , pwshLongProg + shTarget = shTarget.split("\\").join("/") + args = args || "" + variables = variables || "" + if (!prog) { + prog = "\"%~dp0\\" + target + "\"" + shProg = "\"$basedir/" + shTarget + "\"" + pwshProg = shProg + args = "" + target = "" + shTarget = "" + } else { + longProg = "\"%~dp0\\" + prog + ".exe\"" + shLongProg = "\"$basedir/" + prog + "\"" + pwshLongProg = "\"$basedir/" + prog + "$exe\"" + target = "\"%~dp0\\" + target + "\"" + shTarget = "\"$basedir/" + shTarget + "\"" } - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true + // @SETLOCAL + // + // @IF EXIST "%~dp0\node.exe" ( + // @SET "_prog=%~dp0\node.exe" + // ) ELSE ( + // @SET "_prog=node" + // @SET PATHEXT=%PATHEXT:;.JS;=;% + // ) + // + // "%_prog%" "%~dp0\.\node_modules\npm\bin\npm-cli.js" %* + // @ENDLOCAL + var cmd + if (longProg) { + shLongProg = shLongProg.trim(); + args = args.trim(); + var variableDeclarationsAsBatch = toBatchSyntax.convertToSetCommands(variables) + cmd = "@SETLOCAL\r\n" + + variableDeclarationsAsBatch + + "\r\n" + + "@IF EXIST " + longProg + " (\r\n" + + " @SET \"_prog=" + longProg.replace(/(^")|("$)/g, '') + "\"\r\n" + + ") ELSE (\r\n" + + " @SET \"_prog=" + prog.replace(/(^")|("$)/g, '') + "\"\r\n" + + " @SET PATHEXT=%PATHEXT:;.JS;=;%\r\n" + + ")\r\n" + + "\r\n" + + "\"%_prog%\" " + args + " " + target + " %*\r\n" + + '@ENDLOCAL\r\n' + } else { + cmd = "@" + prog + " " + args + " " + target + " %*\r\n" } - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter + // #!/bin/sh + // basedir=`dirname "$0"` + // + // case `uname` in + // *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; + // esac + // + // if [ -x "$basedir/node.exe" ]; then + // "$basedir/node.exe" "$basedir/node_modules/npm/bin/npm-cli.js" "$@" + // ret=$? + // else + // node "$basedir/node_modules/npm/bin/npm-cli.js" "$@" + // ret=$? + // fi + // exit $ret - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } + var sh = "#!/bin/sh\n" - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } + sh = sh + + "basedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\,/,g')\")\n" + + "\n" + + "case `uname` in\n" + + " *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w \"$basedir\"`;;\n" + + "esac\n" + + "\n" - if (addPatternStart) { - re = patternStart + re + if (shLongProg) { + sh = sh + + "if [ -x "+shLongProg+" ]; then\n" + + " " + variables + shLongProg + " " + args + " " + shTarget + " \"$@\"\n" + + " ret=$?\n" + + "else \n" + + " " + variables + shProg + " " + args + " " + shTarget + " \"$@\"\n" + + " ret=$?\n" + + "fi\n" + + "exit $ret\n" + } else { + sh = sh + + shProg + " " + args + " " + shTarget + " \"$@\"\n" + + "exit $?\n" } - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) + // #!/usr/bin/env pwsh + // $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + // + // $ret=0 + // $exe = "" + // if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + // # Fix case when both the Windows and Linux builds of Node + // # are installed in the same directory + // $exe = ".exe" + // } + // if (Test-Path "$basedir/node") { + // & "$basedir/node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args + // $ret=$LASTEXITCODE + // } else { + // & "node$exe" "$basedir/node_modules/npm/bin/npm-cli.js" $args + // $ret=$LASTEXITCODE + // } + // exit $ret + var pwsh = "#!/usr/bin/env pwsh\n" + + "$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n" + + "\n" + + "$exe=\"\"\n" + + "if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n" + + " # Fix case when both the Windows and Linux builds of Node\n" + + " # are installed in the same directory\n" + + " $exe=\".exe\"\n" + + "}\n" + if (shLongProg) { + pwsh = pwsh + + "$ret=0\n" + + "if (Test-Path " + pwshLongProg + ") {\n" + + " & " + pwshLongProg + " " + args + " " + shTarget + " $args\n" + + " $ret=$LASTEXITCODE\n" + + "} else {\n" + + " & " + pwshProg + " " + args + " " + shTarget + " $args\n" + + " $ret=$LASTEXITCODE\n" + + "}\n" + + "exit $ret\n" + } else { + pwsh = pwsh + + "& " + pwshProg + " " + args + " " + shTarget + " $args\n" + + "exit $LASTEXITCODE\n" } - var flags = options.nocase ? 'i' : '' - try { - var regExp = new RegExp('^' + re + '$', flags) - } catch (er) { - // If it was an invalid regular expression, then it can't match - // anything. This trick looks for a character after the end of - // the string, which is of course impossible, except in multi-line - // mode, but it's not a /m regex. - return new RegExp('$.') + var then = times(3, next, cb) + fs.writeFile(to + ".ps1", pwsh, "utf8", then) + fs.writeFile(to + ".cmd", cmd, "utf8", then) + fs.writeFile(to, sh, "utf8", then) + function next () { + chmodShim(to, cb) } - - regExp._glob = pattern - regExp._src = re - - return regExp } -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() +function chmodShim (to, cb) { + var then = times(2, cb, cb) + fs.chmod(to, "0755", then) + fs.chmod(to + ".cmd", "0755", then) + fs.chmod(to + ".ps1", "0755", then) } -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp +function times(n, ok, cb) { + var errState = null + return function(er) { + if (!errState) { + if (er) + cb(errState = er) + else if (--n === 0) + ok() + } } - var options = this.options +} - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') +/***/ }), +/* 493 */ +/***/ (function(module, exports, __webpack_require__) { - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(494) +var legacy = __webpack_require__(495) +var clone = __webpack_require__(496) - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' +var util = __webpack_require__(397) - try { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} +/* istanbul ignore next - node 0.x polyfill */ +var gracefulQueue +var previousSymbol -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list +/* istanbul ignore else - node 0.x polyfill */ +if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { + gracefulQueue = Symbol.for('graceful-fs.queue') + // This is used in testing by future versions + previousSymbol = Symbol.for('graceful-fs.previous') +} else { + gracefulQueue = '___graceful-fs.queue' + previousSymbol = '___graceful-fs.previous' } -Minimatch.prototype.match = match -function match (f, partial) { - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options +function noop () {} - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) } - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) +// Once time initialization +if (!global[gracefulQueue]) { + // This queue can be shared by multiple loaded instances + var queue = [] + Object.defineProperty(global, gracefulQueue, { + get: function() { + return queue + } + }) - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. + // Patch fs.close/closeSync to shared queue version, because we need + // to retry() whenever a close happens *anywhere* in the program. + // This is essential when multiple graceful-fs instances are + // in play at the same time. + fs.close = (function (fs$close) { + function close (fd, cb) { + return fs$close.call(fs, fd, function (err) { + // This function uses the graceful-fs shared queue + if (!err) { + retry() + } - var set = this.set - this.debug(this.pattern, 'set', set) + if (typeof cb === 'function') + cb.apply(this, arguments) + }) + } - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } + Object.defineProperty(close, previousSymbol, { + value: fs$close + }) + return close + })(fs.close) - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate + fs.closeSync = (function (fs$closeSync) { + function closeSync (fd) { + // This function uses the graceful-fs shared queue + fs$closeSync.apply(fs, arguments) + retry() } - } - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate + Object.defineProperty(closeSync, previousSymbol, { + value: fs$closeSync + }) + return closeSync + })(fs.closeSync) + + if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(global[gracefulQueue]) + __webpack_require__(371).equal(global[gracefulQueue].length, 0) + }) + } } -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; +} - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch - this.debug('matchOne', file.length, pattern.length) + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] + return go$readFile(path, options, cb) - this.debug(pattern, p, f) + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) + return go$writeFile(path, data, options, cb) - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] + }) + } + } - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } + return go$appendFile(path, data, options, cb) - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false + }) } + } - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug('string match', p, f, hit) + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) + cb = options } + args.push(go$readdir$cb) - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') - return emptyFileEnd - } + return go$readdir(args) - // should be unreachable. - throw new Error('wtf?') -} + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } -/***/ }), -/* 507 */ -/***/ (function(module, exports, __webpack_require__) { + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } -var concatMap = __webpack_require__(508); -var balanced = __webpack_require__(509); + var fs$ReadStream = fs.ReadStream + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } -module.exports = expandTop; + var fs$WriteStream = fs.WriteStream + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); + Object.defineProperty(fs, 'ReadStream', { + get: function () { + return ReadStream + }, + set: function (val) { + ReadStream = val + }, + enumerable: true, + configurable: true + }) + Object.defineProperty(fs, 'WriteStream', { + get: function () { + return WriteStream + }, + set: function (val) { + WriteStream = val + }, + enumerable: true, + configurable: true + }) - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); + // legacy names + var FileReadStream = ReadStream + Object.defineProperty(fs, 'FileReadStream', { + get: function () { + return FileReadStream + }, + set: function (val) { + FileReadStream = val + }, + enumerable: true, + configurable: true + }) + var FileWriteStream = WriteStream + Object.defineProperty(fs, 'FileWriteStream', { + get: function () { + return FileWriteStream + }, + set: function (val) { + FileWriteStream = val + }, + enumerable: true, + configurable: true + }) - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) } - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) } - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) } - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) } - } + }) } - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; + function createReadStream (path, options) { + return new fs.ReadStream(path, options) + } - var N; + function createWriteStream (path, options) { + return new fs.WriteStream(path, options) + } - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null - N = []; + return go$open(path, flags, mode, cb) - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); + }) } } - return expansions; + return fs } +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + global[gracefulQueue].push(elem) +} - -/***/ }), -/* 508 */ -/***/ (function(module, exports) { - -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; +function retry () { + var elem = global[gracefulQueue].shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} /***/ }), -/* 509 */ +/* 494 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var constants = __webpack_require__(411) -module.exports = balanced; -function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); +var origCwd = process.cwd +var cwd = null - var r = range(a, b, str); +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd } +try { + process.cwd() +} catch (er) {} -function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) } -balanced.range = range; -function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; - - if (ai >= 0 && bi > 0) { - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [ begs.pop(), bi ]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } +module.exports = patch - bi = str.indexOf(b, i + 1); - } +function patch (fs) { + // (re-)implement some things that are known busted or missing. - i = ai < bi && ai >= 0 ? ai : bi; - } + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } - if (begs.length) { - result = [ left, right ]; - } + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) } - return result; -} + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -/***/ }), -/* 510 */ -/***/ (function(module, exports, __webpack_require__) { + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) -try { - var util = __webpack_require__(29); - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - /* istanbul ignore next */ - module.exports = __webpack_require__(511); -} + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) -/***/ }), -/* 511 */ -/***/ (function(module, exports) { + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }) + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) + + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) } - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) } + fs.lchownSync = function () {} } -} - - -/***/ }), -/* 512 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } -function posix(path) { - return path.charAt(0) === '/'; -} + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { + function read (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } -function win32(path) { - // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = Boolean(device && device.charAt(1) !== ':'); - - // UNC paths are always absolute - return Boolean(result[2] || isUnc); -} - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; + // This ensures `util.promisify` works as it does for native `fs.read`. + read.__proto__ = fs$read + return read + })(fs.read) + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) -/***/ }), -/* 513 */ -/***/ (function(module, exports, __webpack_require__) { + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } -module.exports = globSync -globSync.GlobSync = GlobSync + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) -var fs = __webpack_require__(23) -var rp = __webpack_require__(504) -var minimatch = __webpack_require__(506) -var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(503).Glob -var util = __webpack_require__(29) -var path = __webpack_require__(16) -var assert = __webpack_require__(30) -var isAbsolute = __webpack_require__(512) -var common = __webpack_require__(514) -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + } -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } - return new GlobSync(pattern, options).found -} + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } + } - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } + } - setopts(this, pattern, options) - if (this.noprocess) - return this + function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) + function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } } - this._finish() -} -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = rp.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er + function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + function callback (er, stats) { + if (stats) { + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 } + if (cb) cb.apply(this, arguments) } - }) + return options ? orig.call(fs, target, options, callback) + : orig.call(fs, target, callback) + } } - common.finish(this) -} - - -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ + function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, options) { + var stats = options ? orig.call(fs, target, options) + : orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } } - // now n is the index of the first one that is *not* a string. - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return + // ENOSYS means that the fs doesn't support the op. Just ignore + // that, because it doesn't matter. + // + // if there's no getuid, or if getuid() is something other + // than 0, and the error is EINVAL or EPERM, then just ignore + // it. + // + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // + // When running as root, or if other types of errors are + // encountered, then it's strict. + function chownErOk (er) { + if (!er) + return true - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break + if (er.code === "ENOSYS") + return true - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false } +} - var remain = pattern.slice(n) - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix +/***/ }), +/* 495 */ +/***/ (function(module, exports, __webpack_require__) { - var abs = this._makeAbs(read) +var Stream = __webpack_require__(382).Stream - //if ignored, skip processing - if (childrenIgnored(this, read)) - return +module.exports = legacy - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) + Stream.call(this); - // if the abs isn't a dir, then nothing can match! - if (!entries) - return + var self = this; - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return + options = options || {}; - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) + if (this.encoding) this.setEncoding(this.encoding); - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); } - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) + if (this.start > this.end) { + throw new Error('start must be <= end'); } - this._emitMatch(index, e) + + this.pos = this.start; } - // This was the last one, and no stats were needed - return - } - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } -GlobSync.prototype._emitMatch = function (index, e) { - if (isIgnored(this, e)) - return + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } - var abs = this._makeAbs(e) + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); - if (this.mark) - e = this._mark(e) + Stream.call(this); - if (this.absolute) { - e = abs - } + this.path = path; + this.fd = null; + this.writable = true; - if (this.matches[index][e]) - return + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } + options = options || {}; - this.matches[index][e] = true + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } - if (this.stat) - this._stat(e) -} + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } + this.pos = this.start; + } -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) + this.busy = false; + this._queue = []; - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er.code === 'ENOENT') { - // lstat failed, doesn't exist - return null + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); } } +} - var isSym = lstat && lstat.isSymbolicLink() - this.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) - return entries -} +/***/ }), +/* 496 */ +/***/ (function(module, exports, __webpack_require__) { -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries +"use strict"; - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null +module.exports = clone - if (Array.isArray(c)) - return c - } +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null - } -} - -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) - this.cache[abs] = entries + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) - // mark and cache dir-ness - return entries + return copy } -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - throw error - } - break - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break +/***/ }), +/* 497 */ +/***/ (function(module, exports, __webpack_require__) { - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break - } -} +var path = __webpack_require__(4); +var fs = __webpack_require__(349); +var _0777 = parseInt('0777', 8); -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - var entries = this._readdir(abs, inGlobStar) +function mkdirP (p, opts, f, made) { + if (typeof opts === 'function') { + f = opts; + opts = {}; + } + else if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; + + var cb = f || function () {}; + p = path.resolve(p); + + xfs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + if (path.dirname(p) === p) return cb(er); + mkdirP(path.dirname(p), opts, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, opts, cb, made); + }); + break; - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + xfs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); +} - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) +mkdirP.sync = function sync (p, opts, made) { + if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 & (~process.umask()); + } + if (!made) made = null; - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) + p = path.resolve(p); - var len = entries.length - var isSym = this.symlinks[abs] + try { + xfs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = xfs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue + return made; +}; - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) - } -} +/***/ }), +/* 498 */ +/***/ (function(module, exports) { -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) +exports.replaceDollarWithPercentPair = replaceDollarWithPercentPair +exports.convertToSetCommand = convertToSetCommand +exports.convertToSetCommands = convertToSetCommands + +function convertToSetCommand(key, value) { + var line = "" + key = key || "" + key = key.trim() + value = value || "" + value = value.trim() + if(key && value && value.length > 0) { + line = "@SET " + key + "=" + replaceDollarWithPercentPair(value) + "\r\n" + } + return line +} + +function extractVariableValuePairs(declarations) { + var pairs = {} + declarations.map(function(declaration) { + var split = declaration.split("=") + pairs[split[0]]=split[1] + }) + return pairs +} + +function convertToSetCommands(variableString) { + var variableValuePairs = extractVariableValuePairs(variableString.split(" ")) + var variableDeclarationsAsBatch = "" + Object.keys(variableValuePairs).forEach(function (key) { + variableDeclarationsAsBatch += convertToSetCommand(key, variableValuePairs[key]) + }) + return variableDeclarationsAsBatch +} + +function replaceDollarWithPercentPair(value) { + var dollarExpressions = /\$\{?([^\$@#\?\- \t{}:]+)\}?/g + var result = "" + var startIndex = 0 + value = value || "" + do { + var match = dollarExpressions.exec(value) + if(match) { + var betweenMatches = value.substring(startIndex, match.index) || "" + result += betweenMatches + "%" + match[1] + "%" + startIndex = dollarExpressions.lastIndex + } + } while (dollarExpressions.lastIndex > 0) + result += value.substr(startIndex) + return result +} + + - if (!this.matches[index]) - this.matches[index] = Object.create(null) - // If it doesn't exist, then just mark the lack of results - if (!exists) - return +/***/ }), +/* 499 */ +/***/ (function(module, exports, __webpack_require__) { - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } +var fs = __webpack_require__(349), + path = __webpack_require__(4); - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') +module.exports = ncp; +ncp.ncp = ncp; - // Mark this as a match - this._emitMatch(index, prefix) -} +function ncp (source, dest, options, callback) { + var cback = callback; -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' + if (!callback) { + cback = options; + options = {}; + } - if (f.length > this.maxLength) - return false + var basePath = process.cwd(), + currentPath = path.resolve(basePath, source), + targetPath = path.resolve(basePath, dest), + filter = options.filter, + rename = options.rename, + transform = options.transform, + clobber = options.clobber !== false, + modified = options.modified, + dereference = options.dereference, + errs = null, + started = 0, + finished = 0, + running = 0, + limit = options.limit || ncp.limit || 16; - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] + limit = (limit < 1) ? 1 : (limit > 512) ? 512 : limit; - if (Array.isArray(c)) - c = 'DIR' + startCopy(currentPath); + + function startCopy(source) { + started++; + if (filter) { + if (filter instanceof RegExp) { + if (!filter.test(source)) { + return cb(true); + } + } + else if (typeof filter === 'function') { + if (!filter(source)) { + return cb(true); + } + } + } + return getStats(source); + } - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c + function getStats(source) { + var stat = dereference ? fs.stat : fs.lstat; + if (running >= limit) { + return setImmediate(function () { + getStats(source); + }); + } + running++; + stat(source, function (err, stats) { + var item = {}; + if (err) { + return onError(err); + } - if (needDir && c === 'FILE') - return false + // We need to get the mode from the stats object and preserve it. + item.name = source; + item.mode = stats.mode; + item.mtime = stats.mtime; //modified time + item.atime = stats.atime; //access time - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. + if (stats.isDirectory()) { + return onDir(item); + } + else if (stats.isFile()) { + return onFile(item); + } + else if (stats.isSymbolicLink()) { + // Symlinks don't really need to know about the mode. + return onLink(source); + } + }); } - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return false - } + function onFile(file) { + var target = file.name.replace(currentPath, targetPath); + if(rename) { + target = rename(target); } - - if (lstat && lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat + isWritable(target, function (writable) { + if (writable) { + return copyFile(file, target); + } + if(clobber) { + rmFile(target, function () { + copyFile(file, target); + }); + } + if (modified) { + var stat = dereference ? fs.stat : fs.lstat; + stat(target, function(err, stats) { + //if souce modified time greater to target modified time copy file + if (file.mtime.getTime()>stats.mtime.getTime()) + copyFile(file, target); + else return cb(); + }); + } + else { + return cb(); } + }); + } + + function copyFile(file, target) { + var readStream = fs.createReadStream(file.name), + writeStream = fs.createWriteStream(target, { mode: file.mode }); + + readStream.on('error', onError); + writeStream.on('error', onError); + + if(transform) { + transform(readStream, writeStream, file); } else { - stat = lstat + writeStream.on('open', function() { + readStream.pipe(writeStream); + }); } + writeStream.once('finish', function() { + if (modified) { + //target file modified date sync. + fs.utimesSync(target, file.atime, file.mtime); + cb(); + } + else cb(); + }); } - this.statCache[abs] = stat - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' + function rmFile(file, done) { + fs.unlink(file, function (err) { + if (err) { + return onError(err); + } + return done(); + }); + } - this.cache[abs] = this.cache[abs] || c + function onDir(dir) { + var target = dir.name.replace(currentPath, targetPath); + isWritable(target, function (writable) { + if (writable) { + return mkDir(dir, target); + } + copyDir(dir.name); + }); + } - if (needDir && c === 'FILE') - return false + function mkDir(dir, target) { + fs.mkdir(target, dir.mode, function (err) { + if (err) { + return onError(err); + } + copyDir(dir.name); + }); + } - return c -} + function copyDir(dir) { + fs.readdir(dir, function (err, items) { + if (err) { + return onError(err); + } + items.forEach(function (item) { + startCopy(path.join(dir, item)); + }); + return cb(); + }); + } -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} + function onLink(link) { + var target = link.replace(currentPath, targetPath); + fs.readlink(link, function (err, resolvedPath) { + if (err) { + return onError(err); + } + checkLink(resolvedPath, target); + }); + } -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} + function checkLink(resolvedPath, target) { + if (dereference) { + resolvedPath = path.resolve(basePath, resolvedPath); + } + isWritable(target, function (writable) { + if (writable) { + return makeLink(resolvedPath, target); + } + fs.readlink(target, function (err, targetDest) { + if (err) { + return onError(err); + } + if (dereference) { + targetDest = path.resolve(basePath, targetDest); + } + if (targetDest === resolvedPath) { + return cb(); + } + return rmFile(target, function () { + makeLink(resolvedPath, target); + }); + }); + }); + } + function makeLink(linkPath, target) { + fs.symlink(linkPath, target, function (err) { + if (err) { + return onError(err); + } + return cb(); + }); + } -/***/ }), -/* 514 */ -/***/ (function(module, exports, __webpack_require__) { - -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} - -var path = __webpack_require__(16) -var minimatch = __webpack_require__(506) -var isAbsolute = __webpack_require__(512) -var Minimatch = minimatch.Minimatch - -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} - -function alphasort (a, b) { - return a.localeCompare(b) -} - -function setupIgnores (self, options) { - self.ignore = options.ignore || [] - - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] - - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) - } -} - -// ignore patterns are always in dot:true mode. -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern, { dot: true }) - } - - return { - matcher: new Minimatch(pattern, { dot: true }), - gmatcher: gmatcher + function isWritable(path, done) { + fs.lstat(path, function (err) { + if (err) { + if (err.code === 'ENOENT') return done(true); + return done(false); + } + return done(false); + }); } -} - -function setopts (self, pattern, options) { - if (!options) - options = {} - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") + function onError(err) { + if (options.stopOnError) { + return cback(err); } - pattern = "**/" + pattern - } - - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - self.absolute = !!options.absolute - - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) - - setupIgnores(self, options) - - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = path.resolve(options.cwd) - self.changedCwd = self.cwd !== cwd - } - - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") - - // TODO: is an absolute `cwd` supposed to be resolved against `root`? - // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') - self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) - if (process.platform === "win32") - self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") - self.nomount = !!options.nomount - - // disable comments and negation in Minimatch. - // Note that they are not supported in Glob itself anyway. - options.nonegate = true - options.nocomment = true - - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options -} - -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) - - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) + else if (!errs && options.errs) { + errs = fs.createWriteStream(options.errs); } - } - - if (!nou) - all = Object.keys(all) - - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) - - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) + else if (!errs) { + errs = []; } - if (self.nodir) { - all = all.filter(function (e) { - var notDir = !(/\/$/.test(e)) - var c = self.cache[e] || self.cache[makeAbs(self, e)] - if (notDir && c) - notDir = c !== 'DIR' && !Array.isArray(c) - return notDir - }) + if (typeof errs.write === 'undefined') { + errs.push(err); } + else { + errs.write(err.stack + '\n\n'); + } + return cb(); } - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) - - self.found = all -} - -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] + function cb(skipped) { + if (!skipped) running--; + finished++; + if ((started === finished) && (running === 0)) { + if (cback !== undefined ) { + return errs ? cback(errs) : cback(null); + } } } - - return m } -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) - } - - if (process.platform === 'win32') - abs = abs.replace(/\\/g, '/') - return abs -} -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false +/***/ }), +/* 500 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Log", function() { return Log; }); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); +/* harmony import */ var _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["LogLevel"]; }); -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ -/***/ }), -/* 515 */ -/***/ (function(module, exports, __webpack_require__) { +class Log extends _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["ToolingLog"] { + constructor() { + super(); -var wrappy = __webpack_require__(405) -var reqs = Object.create(null) -var once = __webpack_require__(404) + _defineProperty(this, "logLevel", void 0); -module.exports = wrappy(inflight) + this.setLogLevel('info'); + } -function inflight (key, cb) { - if (reqs[key]) { - reqs[key].push(cb) - return null - } else { - reqs[key] = [cb] - return makeres(key) + setLogLevel(level) { + this.logLevel = Object(_kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["parseLogLevel"])(level); + this.setWriters([new _kbn_dev_utils__WEBPACK_IMPORTED_MODULE_0__["ToolingLogTextWriter"]({ + level: this.logLevel.name, + writeTo: process.stdout + })]); } -} -function makeres (key) { - return once(function RES () { - var cbs = reqs[key] - var len = cbs.length - var args = slice(arguments) + wouldLogLevel(level) { + return this.logLevel.flags[level]; + } - // XXX It's somewhat ambiguous whether a new callback added in this - // pass should be queued for later execution if something in the - // list of callbacks throws, or if it should just be discarded. - // However, it's such an edge case that it hardly matters, and either - // choice is likely as surprising as the other. - // As it happens, we do go ahead and schedule it for later execution. - try { - for (var i = 0; i < len; i++) { - cbs[i].apply(null, args) - } - } finally { - if (cbs.length > len) { - // added more in the interim. - // de-zalgo, just in case, but don't call again. - cbs.splice(0, len) - process.nextTick(function () { - RES.apply(null, args) - }) - } else { - delete reqs[key] - } - } - }) } -function slice (args) { - var length = args.length - var array = [] - - for (var i = 0; i < length; i++) array[i] = args[i] - return array -} +const log = new Log(); /***/ }), -/* 516 */ +/* 501 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CliError", function() { return CliError; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelizeBatches", function() { return parallelizeBatches; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parallelize", function() { return parallelize; }); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -47570,39 +44042,65 @@ __webpack_require__.r(__webpack_exports__); * specific language governing permissions and limitations * under the License. */ -class CliError extends Error { - constructor(message, meta = {}) { - super(message); - this.meta = meta; +async function parallelizeBatches(batches, fn) { + for (const batch of batches) { + // We need to make sure the entire batch has completed before we can move on + // to the next batch + await parallelize(batch, fn); + } +} +async function parallelize(items, fn, concurrency = 4) { + if (items.length === 0) { + return; } + return new Promise((resolve, reject) => { + let activePromises = 0; + const values = items.slice(0); + + async function scheduleItem(item) { + activePromises++; + + try { + await fn(item); + activePromises--; + + if (values.length > 0) { + // We have more work to do, so we schedule the next promise + scheduleItem(values.shift()); + } else if (activePromises === 0) { + // We have no more values left, and all items have completed, so we've + // completed all the work. + resolve(); + } + } catch (error) { + reject(error); + } + } + + values.splice(0, concurrency).map(scheduleItem); + }); } /***/ }), -/* 517 */ +/* 502 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return Project; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(23); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(29); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(516); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(518); -/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(563); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return getProjects; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProjectGraph", function() { return buildProjectGraph; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topologicallyBatchProjects", function() { return topologicallyBatchProjects; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "includeTransitiveProjects", function() { return includeTransitiveProjects; }); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(503); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); +/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(517); +/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(573); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -47627,6243 +44125,8760 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope +const glob = Object(util__WEBPACK_IMPORTED_MODULE_2__["promisify"])(glob__WEBPACK_IMPORTED_MODULE_0___default.a); +/** a Map of project names to Project instances */ +async function getProjects(rootPath, projectsPathsPatterns, { + include = [], + exclude = [] +} = {}) { + const projects = new Map(); + const workspaceProjectsPaths = await Object(_workspaces__WEBPACK_IMPORTED_MODULE_5__["workspacePackagePaths"])(rootPath); -class Project { - static async fromPath(path) { - const pkgJson = await Object(_package_json__WEBPACK_IMPORTED_MODULE_6__["readPackageJson"])(path); - return new Project(pkgJson, path); - } - /** parsed package.json */ + for (const pattern of projectsPathsPatterns) { + const pathsToProcess = await packagesFromGlobPattern({ + pattern, + rootPath + }); + for (const filePath of pathsToProcess) { + const projectConfigPath = normalize(filePath); + const projectDir = path__WEBPACK_IMPORTED_MODULE_1___default.a.dirname(projectConfigPath); + const project = await _project__WEBPACK_IMPORTED_MODULE_4__["Project"].fromPath(projectDir); - constructor(packageJson, projectPath) { - _defineProperty(this, "json", void 0); + if (workspaceProjectsPaths.indexOf(filePath) >= 0) { + project.isWorkspaceProject = true; + } - _defineProperty(this, "packageJsonLocation", void 0); + const excludeProject = exclude.includes(project.name) || include.length > 0 && !include.includes(project.name); - _defineProperty(this, "nodeModulesLocation", void 0); + if (excludeProject) { + continue; + } - _defineProperty(this, "targetLocation", void 0); + if (projects.has(project.name)) { + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There are multiple projects with the same name [${project.name}]`, { + name: project.name, + paths: [project.path, projects.get(project.name).path] + }); + } - _defineProperty(this, "path", void 0); + projects.set(project.name, project); + } + } - _defineProperty(this, "version", void 0); + return projects; +} - _defineProperty(this, "allDependencies", void 0); +function packagesFromGlobPattern({ + pattern, + rootPath +}) { + const globOptions = { + cwd: rootPath, + // Should throw in case of unusual errors when reading the file system + strict: true, + // Always returns absolute paths for matched files + absolute: true, + // Do not match ** against multiple filenames + // (This is only specified because we currently don't have a need for it.) + noglobstar: true + }; + return glob(path__WEBPACK_IMPORTED_MODULE_1___default.a.join(pattern, 'package.json'), globOptions); +} // https://github.com/isaacs/node-glob/blob/master/common.js#L104 +// glob always returns "\\" as "/" in windows, so everyone +// gets normalized because we can't have nice things. - _defineProperty(this, "productionDependencies", void 0); - _defineProperty(this, "devDependencies", void 0); +function normalize(dir) { + return path__WEBPACK_IMPORTED_MODULE_1___default.a.normalize(dir); +} - _defineProperty(this, "scripts", void 0); +function buildProjectGraph(projects) { + const projectGraph = new Map(); - _defineProperty(this, "isWorkspaceRoot", false); + for (const project of projects.values()) { + const projectDeps = []; + const dependencies = project.allDependencies; - _defineProperty(this, "isWorkspaceProject", false); + for (const depName of Object.keys(dependencies)) { + if (projects.has(depName)) { + const dep = projects.get(depName); + const dependentProjectIsInWorkspace = project.isWorkspaceProject || project.json.name === 'kibana'; + project.ensureValidProjectDependency(dep, dependentProjectIsInWorkspace); + projectDeps.push(dep); + } + } - this.json = Object.freeze(packageJson); - this.path = projectPath; - this.packageJsonLocation = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, 'package.json'); - this.nodeModulesLocation = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, 'node_modules'); - this.targetLocation = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, 'target'); - this.version = this.json.version; - this.productionDependencies = this.json.dependencies || {}; - this.devDependencies = this.json.devDependencies || {}; - this.allDependencies = _objectSpread({}, this.devDependencies, {}, this.productionDependencies); - this.isWorkspaceRoot = this.json.hasOwnProperty('workspaces'); - this.scripts = this.json.scripts || {}; + projectGraph.set(project.name, projectDeps); } - get name() { - return this.json.name; - } + return projectGraph; +} +function topologicallyBatchProjects(projectsToBatch, projectGraph, { + batchByWorkspace = false +} = {}) { + // We're going to be chopping stuff out of this list, so copy it. + const projectsLeftToBatch = new Set(projectsToBatch.keys()); + const batches = []; - ensureValidProjectDependency(project, dependentProjectIsInWorkspace) { - const versionInPackageJson = this.allDependencies[project.name]; - let expectedVersionInPackageJson; + if (batchByWorkspace) { + const workspaceRootProject = Array.from(projectsToBatch.values()).find(p => p.isWorkspaceRoot); - if (dependentProjectIsInWorkspace) { - expectedVersionInPackageJson = project.json.version; - } else { - const relativePathToProject = normalizePath(path__WEBPACK_IMPORTED_MODULE_2___default.a.relative(this.path, project.path)); - expectedVersionInPackageJson = `link:${relativePathToProject}`; - } // No issues! + if (!workspaceRootProject) { + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`There was no yarn workspace root found.`); + } // Push in the workspace root first. - if (versionInPackageJson === expectedVersionInPackageJson) { - return; - } + batches.push([workspaceRootProject]); + projectsLeftToBatch.delete(workspaceRootProject.name); // In the next batch, push in all workspace projects. - let problemMsg; + const workspaceBatch = []; - if (Object(_package_json__WEBPACK_IMPORTED_MODULE_6__["isLinkDependency"])(versionInPackageJson) && dependentProjectIsInWorkspace) { - problemMsg = `but should be using a workspace`; - } else if (Object(_package_json__WEBPACK_IMPORTED_MODULE_6__["isLinkDependency"])(versionInPackageJson)) { - problemMsg = `using 'link:', but the path is wrong`; - } else { - problemMsg = `but it's not using the local package`; - } + for (const projectName of projectsLeftToBatch) { + const project = projectsToBatch.get(projectName); - throw new _errors__WEBPACK_IMPORTED_MODULE_4__["CliError"](`[${this.name}] depends on [${project.name}] ${problemMsg}. Update its package.json to the expected value below.`, { - actual: `"${project.name}": "${versionInPackageJson}"`, - expected: `"${project.name}": "${expectedVersionInPackageJson}"`, - package: `${this.name} (${this.packageJsonLocation})` - }); - } + if (project.isWorkspaceProject) { + workspaceBatch.push(project); + projectsLeftToBatch.delete(projectName); + } + } - getBuildConfig() { - return this.json.kibana && this.json.kibana.build || {}; + batches.push(workspaceBatch); } - /** - * Returns the directory that should be copied into the Kibana build artifact. - * This config can be specified to only include the project's build artifacts - * instead of everything located in the project directory. - */ + while (projectsLeftToBatch.size > 0) { + // Get all projects that have no remaining dependencies within the repo + // that haven't yet been picked. + const batch = []; - getIntermediateBuildDirectory() { - return path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, this.getBuildConfig().intermediateBuildDirectory || '.'); - } - - getCleanConfig() { - return this.json.kibana && this.json.kibana.clean || {}; - } + for (const projectName of projectsLeftToBatch) { + const projectDeps = projectGraph.get(projectName); + const needsDependenciesBatched = projectDeps.some(dep => projectsLeftToBatch.has(dep.name)); - hasScript(name) { - return name in this.scripts; - } + if (!needsDependenciesBatched) { + batch.push(projectsToBatch.get(projectName)); + } + } // If we weren't able to find a project with no remaining dependencies, + // then we've encountered a cycle in the dependency graph. - getExecutables() { - const raw = this.json.bin; - if (!raw) { - return {}; - } + const hasCycles = batch.length === 0; - if (typeof raw === 'string') { - return { - [this.name]: path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, raw) - }; + if (hasCycles) { + const cycleProjectNames = [...projectsLeftToBatch]; + const message = 'Encountered a cycle in the dependency graph. Projects in cycle are:\n' + cycleProjectNames.join(', '); + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](message); } - if (typeof raw === 'object') { - const binsConfig = {}; + batches.push(batch); + batch.forEach(project => projectsLeftToBatch.delete(project.name)); + } - for (const binName of Object.keys(raw)) { - binsConfig[binName] = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.path, raw[binName]); - } + return batches; +} +function includeTransitiveProjects(subsetOfProjects, allProjects, { + onlyProductionDependencies = false +} = {}) { + const projectsWithDependents = new Map(); // the current list of packages we are expanding using breadth-first-search - return binsConfig; - } + const toProcess = [...subsetOfProjects]; - throw new _errors__WEBPACK_IMPORTED_MODULE_4__["CliError"](`[${this.name}] has an invalid "bin" field in its package.json, ` + `expected an object or a string`, { - binConfig: Object(util__WEBPACK_IMPORTED_MODULE_3__["inspect"])(raw), - package: `${this.name} (${this.packageJsonLocation})` + while (toProcess.length > 0) { + const project = toProcess.shift(); + const dependencies = onlyProductionDependencies ? project.productionDependencies : project.allDependencies; + Object.keys(dependencies).forEach(dep => { + if (allProjects.has(dep)) { + toProcess.push(allProjects.get(dep)); + } }); + projectsWithDependents.set(project.name, project); } - async runScript(scriptName, args = []) { - _log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\n\nRunning script [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(scriptName)}] in [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(this.name)}]:\n`)); - return Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["runScriptInPackage"])(scriptName, args, this); - } - - runScriptStreaming(scriptName, args = []) { - return Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["runScriptInPackageStreaming"])(scriptName, args, this); - } - - hasDependencies() { - return Object.keys(this.allDependencies).length > 0; - } + return projectsWithDependents; +} - async installDependencies({ - extraArgs - }) { - _log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\n\nInstalling dependencies in [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(this.name)}]:\n`)); - await Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["installInDir"])(this.path, extraArgs); - await this.removeExtraneousNodeModules(); - } - /** - * Yarn workspaces symlinks workspace projects to the root node_modules, even - * when there is no depenency on the project. This results in unnecicary, and - * often duplicated code in the build archives. - */ +/***/ }), +/* 503 */ +/***/ (function(module, exports, __webpack_require__) { +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. - async removeExtraneousNodeModules() { - // this is only relevant for the root workspace - if (!this.isWorkspaceRoot) { - return; - } +module.exports = glob - const workspacesInfo = await Object(_scripts__WEBPACK_IMPORTED_MODULE_7__["yarnWorkspacesInfo"])(this.path); - const unusedWorkspaces = new Set(Object.keys(workspacesInfo)); // check for any cross-project dependency +var fs = __webpack_require__(349) +var rp = __webpack_require__(504) +var minimatch = __webpack_require__(506) +var Minimatch = minimatch.Minimatch +var inherits = __webpack_require__(510) +var EE = __webpack_require__(373).EventEmitter +var path = __webpack_require__(4) +var assert = __webpack_require__(371) +var isAbsolute = __webpack_require__(512) +var globSync = __webpack_require__(513) +var common = __webpack_require__(514) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = __webpack_require__(515) +var util = __webpack_require__(397) +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored - for (const name of Object.keys(workspacesInfo)) { - const workspace = workspacesInfo[name]; - workspace.workspaceDependencies.forEach(w => unusedWorkspaces.delete(w)); - } +var once = __webpack_require__(378) - unusedWorkspaces.forEach(name => { - const { - dependencies, - devDependencies - } = this.json; - const nodeModulesPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.resolve(this.nodeModulesLocation, name); - const isDependency = dependencies && dependencies.hasOwnProperty(name); - const isDevDependency = devDependencies && devDependencies.hasOwnProperty(name); +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} - if (!isDependency && !isDevDependency && fs__WEBPACK_IMPORTED_MODULE_1___default.a.existsSync(nodeModulesPath)) { - _log__WEBPACK_IMPORTED_MODULE_5__["log"].write(`No dependency on ${name}, removing link in node_modules`); - fs__WEBPACK_IMPORTED_MODULE_1___default.a.unlinkSync(nodeModulesPath); - } - }); + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) } -} // We normalize all path separators to `/` in generated files - -function normalizePath(path) { - return path.replace(/[\\\/]+/g, '/'); + return new Glob(pattern, options, cb) } -/***/ }), -/* 518 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readPackageJson", function() { return readPackageJson; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "writePackageJson", function() { return writePackageJson; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLinkDependency", function() { return isLinkDependency; }); -/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(519); -/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(read_pkg__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(545); -/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(write_pkg__WEBPACK_IMPORTED_MODULE_1__); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ +// old api surface +glob.glob = glob +function extend (origin, add) { + if (add === null || typeof add !== 'object') { + return origin + } -function readPackageJson(cwd) { - return read_pkg__WEBPACK_IMPORTED_MODULE_0___default()({ - cwd, - normalize: false - }); -} -function writePackageJson(path, json) { - return write_pkg__WEBPACK_IMPORTED_MODULE_1___default()(path, json); + var keys = Object.keys(add) + var i = keys.length + while (i--) { + origin[keys[i]] = add[keys[i]] + } + return origin } -const isLinkDependency = depVersion => depVersion.startsWith('link:'); - -/***/ }), -/* 519 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; +glob.hasMagic = function (pattern, options_) { + var options = extend({}, options_) + options.noprocess = true -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const parseJson = __webpack_require__(520); + var g = new Glob(pattern, options) + var set = g.minimatch.set -const readFileAsync = promisify(fs.readFile); + if (!pattern) + return false -module.exports = async options => { - options = { - cwd: process.cwd(), - normalize: true, - ...options - }; + if (set.length > 1) + return true - const filePath = path.resolve(options.cwd, 'package.json'); - const json = parseJson(await readFileAsync(filePath, 'utf8')); + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } - if (options.normalize) { - __webpack_require__(521)(json); - } + return false +} - return json; -}; +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } -module.exports.sync = options => { - options = { - cwd: process.cwd(), - normalize: true, - ...options - }; + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } - const filePath = path.resolve(options.cwd, 'package.json'); - const json = parseJson(fs.readFileSync(filePath, 'utf8')); + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) - if (options.normalize) { - __webpack_require__(521)(json); - } + setopts(this, pattern, options) + this._didRealPath = false - return json; -}; + // process each pattern in the minimatch set + var n = this.minimatch.set.length + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) -/***/ }), -/* 520 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } -"use strict"; + var self = this + this._processing = 0 -const errorEx = __webpack_require__(429); -const fallback = __webpack_require__(431); -const {default: LinesAndColumns} = __webpack_require__(432); -const {codeFrameColumns} = __webpack_require__(433); + this._emitQueue = [] + this._processQueue = [] + this.paused = false -const JSONError = errorEx('JSONError', { - fileName: errorEx.append('in %s'), - codeFrame: errorEx.append('\n\n%s\n') -}); + if (this.noprocess) + return this -module.exports = (string, reviver, filename) => { - if (typeof reviver === 'string') { - filename = reviver; - reviver = null; - } + if (n === 0) + return done() - try { - try { - return JSON.parse(string, reviver); - } catch (error) { - fallback(string, reviver); - throw error; - } - } catch (error) { - error.message = error.message.replace(/\n/g, ''); - const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); + var sync = true + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + sync = false - const jsonError = new JSONError(error); - if (filename) { - jsonError.fileName = filename; - } + function done () { + --self._processing + if (self._processing <= 0) { + if (sync) { + process.nextTick(function () { + self._finish() + }) + } else { + self._finish() + } + } + } +} - if (indexMatch && indexMatch.length > 0) { - const lines = new LinesAndColumns(string); - const index = Number(indexMatch[1]); - const location = lines.locationForIndex(index); +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return - const codeFrame = codeFrameColumns( - string, - {start: {line: location.line + 1, column: location.column + 1}}, - {highlightCode: true} - ); + if (this.realpath && !this._didRealpath) + return this._realpath() - jsonError.codeFrame = codeFrame; - } + common.finish(this) + this.emit('end', this.found) +} - throw jsonError; - } -}; +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + this._didRealpath = true -/***/ }), -/* 521 */ -/***/ (function(module, exports, __webpack_require__) { + var n = this.matches.length + if (n === 0) + return this._finish() -module.exports = normalize + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) -var fixer = __webpack_require__(522) -normalize.fixer = fixer + function next () { + if (--n === 0) + self._finish() + } +} -var makeWarning = __webpack_require__(543) +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() -var fieldsToFix = ['name','version','description','repository','modules','scripts' - ,'files','bin','man','bugs','keywords','readme','homepage','license'] -var otherThingsToFix = ['dependencies','people', 'typos'] + var found = Object.keys(matchset) + var self = this + var n = found.length -var thingsToFix = fieldsToFix.map(function(fieldName) { - return ucFirst(fieldName) + "Field" -}) -// two ways to do this in CoffeeScript on only one line, sub-70 chars: -// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" -// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) -thingsToFix = thingsToFix.concat(otherThingsToFix) + if (n === 0) + return cb() -function normalize (data, warn, strict) { - if(warn === true) warn = null, strict = true - if(!strict) strict = false - if(!warn || data.private) warn = function(msg) { /* noop */ } + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + rp.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here - if (data.scripts && - data.scripts.install === "node-gyp rebuild" && - !data.scripts.preinstall) { - data.gypfile = true - } - fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } - thingsToFix.forEach(function(thingName) { - fixer["fix" + ucFirst(thingName)](data, strict) + if (--n === 0) { + self.matches[index] = set + cb() + } + }) }) - data._id = data.name + "@" + data.version } -function ucFirst (string) { - return string.charAt(0).toUpperCase() + string.slice(1); +Glob.prototype._mark = function (p) { + return common.mark(this, p) } +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} -/***/ }), -/* 522 */ -/***/ (function(module, exports, __webpack_require__) { +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} -var semver = __webpack_require__(523) -var validateLicense = __webpack_require__(524); -var hostedGitInfo = __webpack_require__(529) -var isBuiltinModule = __webpack_require__(532).isCore -var depTypes = ["dependencies","devDependencies","optionalDependencies"] -var extractDescription = __webpack_require__(541) -var url = __webpack_require__(452) -var typos = __webpack_require__(542) +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} -var fixer = module.exports = { - // default warning function - warn: function() {}, - - fixRepositoryField: function(data) { - if (data.repositories) { - this.warn("repositories"); - data.repository = data.repositories[0] - } - if (!data.repository) return this.warn("missingRepository") - if (typeof data.repository === "string") { - data.repository = { - type: "git", - url: data.repository +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) } } - var r = data.repository.url || "" - if (r) { - var hosted = hostedGitInfo.fromUrl(r) - if (hosted) { - r = data.repository.url - = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) } } + } +} - if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { - this.warn("brokenGitUrl", r) - } +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return } -, fixTypos: function(data) { - Object.keys(typos.topLevel).forEach(function (d) { - if (data.hasOwnProperty(d)) { - this.warn("typo", d, typos.topLevel[d]) - } - }, this) + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ } + // now n is the index of the first one that is *not* a string. -, fixScriptsField: function(data) { - if (!data.scripts) return - if (typeof data.scripts !== "object") { - this.warn("nonObjectScripts") - delete data.scripts + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) return - } - Object.keys(data.scripts).forEach(function (k) { - if (typeof data.scripts[k] !== "string") { - this.warn("nonStringScript") - delete data.scripts[k] - } else if (typos.script[k] && !data.scripts[typos.script[k]]) { - this.warn("typo", k, typos.script[k], "scripts") - } - }, this) - } -, fixFilesField: function(data) { - var files = data.files - if (files && !Array.isArray(files)) { - this.warn("nonArrayFiles") - delete data.files - } else if (data.files) { - data.files = data.files.filter(function(file) { - if (!file || typeof file !== "string") { - this.warn("invalidFilename", file) - return false - } else { - return true - } - }, this) - } + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break } -, fixBinField: function(data) { - if (!data.bin) return; - if (typeof data.bin === "string") { - var b = {} - var match - if (match = data.name.match(/^@[^/]+[/](.*)$/)) { - b[match[1]] = data.bin + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) } else { - b[data.name] = data.bin + m = e.match(pn) } - data.bin = b + if (m) + matchedEntries.push(e) } } -, fixManField: function(data) { - if (!data.man) return; - if (typeof data.man === "string") { - data.man = [ data.man ] - } - } -, fixBundleDependenciesField: function(data) { - var bdd = "bundledDependencies" - var bd = "bundleDependencies" - if (data[bdd] && !data[bd]) { - data[bd] = data[bdd] - delete data[bdd] - } - if (data[bd] && !Array.isArray(data[bd])) { - this.warn("nonArrayBundleDependencies") - delete data[bd] - } else if (data[bd]) { - data[bd] = data[bd].filter(function(bd) { - if (!bd || typeof bd !== 'string') { - this.warn("nonStringBundleDependency", bd) - return false - } else { - if (!data.dependencies) { - data.dependencies = {} - } - if (!data.dependencies.hasOwnProperty(bd)) { - this.warn("nonDependencyBundleDependency", bd) - data.dependencies[bd] = "*" - } - return true - } - }, this) - } - } + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) -, fixDependencies: function(data, strict) { - var loose = !strict - objectifyDeps(data, this.warn) - addOptionalDepsToDeps(data, this.warn) - this.fixBundleDependenciesField(data) + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() - ;['dependencies','devDependencies'].forEach(function(deps) { - if (!(deps in data)) return - if (!data[deps] || typeof data[deps] !== "object") { - this.warn("nonObjectDependencies", deps) - delete data[deps] - return + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e } - Object.keys(data[deps]).forEach(function (d) { - var r = data[deps][d] - if (typeof r !== 'string') { - this.warn("nonStringDependency", d, JSON.stringify(r)) - delete data[deps][d] - } - var hosted = hostedGitInfo.fromUrl(data[deps][d]) - if (hosted) data[deps][d] = hosted.toString() - }, this) - }, this) - } -, fixModulesField: function (data) { - if (data.modules) { - this.warn("deprecatedModules") - delete data.modules + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) } + // This was the last one, and no stats were needed + return cb() } -, fixKeywordsField: function (data) { - if (typeof data.keywords === "string") { - data.keywords = data.keywords.split(/,\s+/) - } - if (data.keywords && !Array.isArray(data.keywords)) { - delete data.keywords - this.warn("nonArrayKeywords") - } else if (data.keywords) { - data.keywords = data.keywords.filter(function(kw) { - if (typeof kw !== "string" || !kw) { - this.warn("nonStringKeyword"); - return false - } else { - return true - } - }, this) + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e } + this._process([e].concat(remain), index, inGlobStar, cb) } + cb() +} -, fixVersionField: function(data, strict) { - // allow "loose" semver 1.0 versions in non-strict mode - // enforce strict semver 2.0 compliance in strict mode - var loose = !strict - if (!data.version) { - data.version = "" - return true - } - if (!semver.valid(data.version, loose)) { - throw new Error('Invalid version: "'+ data.version + '"') - } - data.version = semver.clean(data.version, loose) - return true - } +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return -, fixPeople: function(data) { - modifyPeople(data, unParsePerson) - modifyPeople(data, parsePerson) - } + if (isIgnored(this, e)) + return -, fixNameField: function(data, options) { - if (typeof options === "boolean") options = {strict: options} - else if (typeof options === "undefined") options = {} - var strict = options.strict - if (!data.name && !strict) { - data.name = "" - return - } - if (typeof data.name !== "string") { - throw new Error("name field must be a string.") - } - if (!strict) - data.name = data.name.trim() - ensureValidName(data.name, strict, options.allowLegacyCase) - if (isBuiltinModule(data.name)) - this.warn("conflictingName", data.name) + if (this.paused) { + this._emitQueue.push([index, e]) + return } + var abs = isAbsolute(e) ? e : this._makeAbs(e) -, fixDescriptionField: function (data) { - if (data.description && typeof data.description !== 'string') { - this.warn("nonStringDescription") - delete data.description - } - if (data.readme && !data.description) - data.description = extractDescription(data.readme) - if(data.description === undefined) delete data.description; - if (!data.description) this.warn("missingDescription") - } + if (this.mark) + e = this._mark(e) -, fixReadmeField: function (data) { - if (!data.readme) { - this.warn("missingReadme") - data.readme = "ERROR: No README data found!" - } - } + if (this.absolute) + e = abs -, fixBugsField: function(data) { - if (!data.bugs && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if(hosted && hosted.bugs()) { - data.bugs = {url: hosted.bugs()} - } - } - else if(data.bugs) { - var emailRe = /^.+@.*\..+$/ - if(typeof data.bugs == "string") { - if(emailRe.test(data.bugs)) - data.bugs = {email:data.bugs} - else if(url.parse(data.bugs).protocol) - data.bugs = {url: data.bugs} - else - this.warn("nonEmailUrlBugsString") - } - else { - bugsTypos(data.bugs, this.warn) - var oldBugs = data.bugs - data.bugs = {} - if(oldBugs.url) { - if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) - data.bugs.url = oldBugs.url - else - this.warn("nonUrlBugsUrlField") - } - if(oldBugs.email) { - if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) - data.bugs.email = oldBugs.email - else - this.warn("nonEmailBugsEmailField") - } - } - if(!data.bugs.email && !data.bugs.url) { - delete data.bugs - this.warn("emptyNormalizedBugs") - } - } + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return } -, fixHomepageField: function(data) { - if (!data.homepage && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if (hosted && hosted.docs()) data.homepage = hosted.docs() - } - if (!data.homepage) return + this.matches[index][e] = true - if(typeof data.homepage !== "string") { - this.warn("nonUrlHomepage") - return delete data.homepage - } - if(!url.parse(data.homepage).protocol) { - data.homepage = "http://" + data.homepage - } - } + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) -, fixLicenseField: function(data) { - if (!data.license) { - return this.warn("missingLicense") - } else{ - if ( - typeof(data.license) !== 'string' || - data.license.length < 1 || - data.license.trim() === '' - ) { - this.warn("invalidLicense") - } else { - if (!validateLicense(data.license).validForNewPackages) - this.warn("invalidLicense") - } - } - } + this.emit('match', e) } -function isValidScopedPackageName(spec) { - if (spec.charAt(0) !== '@') return false +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return - var rest = spec.slice(1).split('/') - if (rest.length !== 2) return false + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) - return rest[0] && rest[1] && - rest[0] === encodeURIComponent(rest[0]) && - rest[1] === encodeURIComponent(rest[1]) -} + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) -function isCorrectlyEncodedName(spec) { - return !spec.match(/[\/@\s\+%:]/) && - spec === encodeURIComponent(spec) -} + if (lstatcb) + fs.lstat(abs, lstatcb) -function ensureValidName (name, strict, allowLegacyCase) { - if (name.charAt(0) === "." || - !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || - (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || - name.toLowerCase() === "node_modules" || - name.toLowerCase() === "favicon.ico") { - throw new Error("Invalid name: " + JSON.stringify(name)) + function lstatcb_ (er, lstat) { + if (er && er.code === 'ENOENT') + return cb() + + var isSym = lstat && lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) } } -function modifyPeople (data, fn) { - if (data.author) data.author = fn(data.author) - ;["maintainers", "contributors"].forEach(function (set) { - if (!Array.isArray(data[set])) return; - data[set] = data[set].map(fn) - }) - return data -} +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return -function unParsePerson (person) { - if (typeof person === "string") return person - var name = person.name || "" - var u = person.url || person.web - var url = u ? (" ("+u+")") : "" - var e = person.email || person.mail - var email = e ? (" <"+e+">") : "" - return name+email+url -} + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return -function parsePerson (person) { - if (typeof person !== "string") return person - var name = person.match(/^([^\(<]+)/) - var url = person.match(/\(([^\)]+)\)/) - var email = person.match(/<([^>]+)>/) - var obj = {} - if (name && name[0].trim()) obj.name = name[0].trim() - if (email) obj.email = email[1]; - if (url) obj.url = url[1]; - return obj -} + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) -function addOptionalDepsToDeps (data, warn) { - var o = data.optionalDependencies - if (!o) return; - var d = data.dependencies || {} - Object.keys(o).forEach(function (k) { - d[k] = o[k] - }) - data.dependencies = d -} + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() -function depObjectify (deps, type, warn) { - if (!deps) return {} - if (typeof deps === "string") { - deps = deps.trim().split(/[\n\r\s\t ,]+/) + if (Array.isArray(c)) + return cb(null, c) } - if (!Array.isArray(deps)) return deps - warn("deprecatedArrayDependencies", type) - var o = {} - deps.filter(function (d) { - return typeof d === "string" - }).forEach(function(d) { - d = d.trim().split(/(:?[@\s><=])/) - var dn = d.shift() - var dv = d.join("") - dv = dv.trim() - dv = dv.replace(/^@/, "") - o[dn] = dv - }) - return o -} -function objectifyDeps (data, warn) { - depTypes.forEach(function (type) { - if (!data[type]) return; - data[type] = depObjectify(data[type], type, warn) - }) + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) } -function bugsTypos(bugs, warn) { - if (!bugs) return - Object.keys(bugs).forEach(function (k) { - if (typos.bugs[k]) { - warn("typo", k, typos.bugs[k], "bugs") - bugs[typos.bugs[k]] = bugs[k] - delete bugs[k] - } - }) +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } } +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return -/***/ }), -/* 523 */ -/***/ (function(module, exports) { - -exports = module.exports = SemVer - -var debug -/* istanbul ignore next */ -if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0) - args.unshift('SEMVER') - console.log.apply(console, args) + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } } -} else { - debug = function () {} -} -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -exports.SEMVER_SPEC_VERSION = '2.0.0' + this.cache[abs] = entries + return cb(null, entries) +} -var MAX_LENGTH = 256 -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16 + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + this.emit('error', error) + this.abort() + } + break -// The actual regexps go on exports.re -var re = exports.re = [] -var src = exports.src = [] -var R = 0 + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. + return cb() +} -var NUMERICIDENTIFIER = R++ -src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' -var NUMERICIDENTIFIERLOOSE = R++ -src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. -var NONNUMERICIDENTIFIER = R++ -src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) -// ## Main Version -// Three dot-separated numeric identifiers. + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() -var MAINVERSION = R++ -src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')' + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) -var MAINVERSIONLOOSE = R++ -src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. + var isSym = this.symlinks[abs] + var len = entries.length -var PRERELEASEIDENTIFIER = R++ -src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + - '|' + src[NONNUMERICIDENTIFIER] + ')' + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() -var PRERELEASEIDENTIFIERLOOSE = R++ -src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + - '|' + src[NONNUMERICIDENTIFIER] + ')' + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) -var PRERELEASE = R++ -src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + - '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } -var PRERELEASELOOSE = R++ -src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + cb() +} -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { -var BUILDIDENTIFIER = R++ -src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + //console.error('ps2', prefix, exists) -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. + if (!this.matches[index]) + this.matches[index] = Object.create(null) -var BUILD = R++ -src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + - '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') -var FULL = R++ -var FULLPLAIN = 'v?' + src[MAINVERSION] + - src[PRERELEASE] + '?' + - src[BUILD] + '?' + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} -src[FULL] = '^' + FULLPLAIN + '$' +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + '?' + - src[BUILD] + '?' + if (f.length > this.maxLength) + return cb() -var LOOSE = R++ -src[LOOSE] = '^' + LOOSEPLAIN + '$' + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] -var GTLT = R++ -src[GTLT] = '((?:<|>)?=?)' + if (Array.isArray(c)) + c = 'DIR' -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -var XRANGEIDENTIFIERLOOSE = R++ -src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' -var XRANGEIDENTIFIER = R++ -src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) -var XRANGEPLAIN = R++ -src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:' + src[PRERELEASE] + ')?' + - src[BUILD] + '?' + - ')?)?' + if (needDir && c === 'FILE') + return cb() -var XRANGEPLAINLOOSE = R++ -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?' + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } -var XRANGE = R++ -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' -var XRANGELOOSE = R++ -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++ -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])' + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) -// Tilde ranges. -// Meaning is "reasonably at or greater than" -var LONETILDE = R++ -src[LONETILDE] = '(?:~>?)' + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} -var TILDETRIM = R++ -src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' -re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') -var tildeTrimReplace = '$1~' +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return cb() + } -var TILDE = R++ -src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' -var TILDELOOSE = R++ -src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat -// Caret ranges. -// Meaning is "at least and backwards compatible with" -var LONECARET = R++ -src[LONECARET] = '(?:\\^)' + if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) + return cb(null, false, stat) -var CARETTRIM = R++ -src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' -re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') -var caretTrimReplace = '$1^' + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c -var CARET = R++ -src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' -var CARETLOOSE = R++ -src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' + if (needDir && c === 'FILE') + return cb() -// A simple gt/lt/eq thing, or just "" to indicate "any version" -var COMPARATORLOOSE = R++ -src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' -var COMPARATOR = R++ -src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + return cb(null, c, stat) +} -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -var COMPARATORTRIM = R++ -src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + - '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' -// this one has to use the /g flag -re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') -var comparatorTrimReplace = '$1$2$3' +/***/ }), +/* 504 */ +/***/ (function(module, exports, __webpack_require__) { -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -var HYPHENRANGE = R++ -src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAIN] + ')' + - '\\s*$' +module.exports = realpath +realpath.realpath = realpath +realpath.sync = realpathSync +realpath.realpathSync = realpathSync +realpath.monkeypatch = monkeypatch +realpath.unmonkeypatch = unmonkeypatch -var HYPHENRANGELOOSE = R++ -src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s*$' +var fs = __webpack_require__(349) +var origRealpath = fs.realpath +var origRealpathSync = fs.realpathSync -// Star ranges basically just allow anything at all. -var STAR = R++ -src[STAR] = '(<|>)?=?\\s*\\*' +var version = process.version +var ok = /^v[0-5]\./.test(version) +var old = __webpack_require__(505) -// Compile to actual regexp objects. -// All are flag-free, unless they were created above with a flag. -for (var i = 0; i < R; i++) { - debug(i, src[i]) - if (!re[i]) { - re[i] = new RegExp(src[i]) - } +function newError (er) { + return er && er.syscall === 'realpath' && ( + er.code === 'ELOOP' || + er.code === 'ENOMEM' || + er.code === 'ENAMETOOLONG' + ) } -exports.parse = parse -function parse (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null +function realpath (p, cache, cb) { + if (ok) { + return origRealpath(p, cache, cb) } - if (version.length > MAX_LENGTH) { - return null + if (typeof cache === 'function') { + cb = cache + cache = null } + origRealpath(p, cache, function (er, result) { + if (newError(er)) { + old.realpath(p, cache, cb) + } else { + cb(er, result) + } + }) +} - var r = options.loose ? re[LOOSE] : re[FULL] - if (!r.test(version)) { - return null +function realpathSync (p, cache) { + if (ok) { + return origRealpathSync(p, cache) } try { - return new SemVer(version, options) + return origRealpathSync(p, cache) } catch (er) { - return null + if (newError(er)) { + return old.realpathSync(p, cache) + } else { + throw er + } } } -exports.valid = valid -function valid (version, options) { - var v = parse(version, options) - return v ? v.version : null +function monkeypatch () { + fs.realpath = realpath + fs.realpathSync = realpathSync } -exports.clean = clean -function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null +function unmonkeypatch () { + fs.realpath = origRealpath + fs.realpathSync = origRealpathSync } -exports.SemVer = SemVer - -function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === options.loose) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - } - - if (!(this instanceof SemVer)) { - return new SemVer(version, options) - } - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose +/***/ }), +/* 505 */ +/***/ (function(module, exports, __webpack_require__) { - var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - if (!m) { - throw new TypeError('Invalid Version: ' + version) - } +var pathModule = __webpack_require__(4); +var isWindows = process.platform === 'win32'; +var fs = __webpack_require__(349); - this.raw = version +// JavaScript implementation of realpath, ported from node pre-v6 - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] +var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } +function rethrow() { + // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and + // is fairly slow to generate. + var callback; + if (DEBUG) { + var backtrace = new Error; + callback = debugCallback; + } else + callback = missingCallback; - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } + return callback; - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') + function debugCallback(err) { + if (err) { + backtrace.message = err.message; + err = backtrace; + missingCallback(err); + } } - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } + function missingCallback(err) { + if (err) { + if (process.throwDeprecation) + throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs + else if (!process.noDeprecation) { + var msg = 'fs: missing callback ' + (err.stack || err.message); + if (process.traceDeprecation) + console.trace(msg); + else + console.error(msg); } - return id - }) + } } +} - this.build = m[5] ? m[5].split('.') : [] - this.format() +function maybeCallback(cb) { + return typeof cb === 'function' ? cb : rethrow(); } -SemVer.prototype.format = function () { - this.version = this.major + '.' + this.minor + '.' + this.patch - if (this.prerelease.length) { - this.version += '-' + this.prerelease.join('.') - } - return this.version +var normalize = pathModule.normalize; + +// Regexp that finds the next partion of a (partial) path +// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] +if (isWindows) { + var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; +} else { + var nextPartRe = /(.*?)(?:[\/]+|$)/g; } -SemVer.prototype.toString = function () { - return this.version +// Regex to find the device root, including trailing slash. E.g. 'c:\\'. +if (isWindows) { + var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; +} else { + var splitRootRe = /^[\/]*/; } -SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) +exports.realpathSync = function realpathSync(p, cache) { + // make p is absolute + p = pathModule.resolve(p); + + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return cache[p]; } - return this.compareMain(other) || this.comparePre(other) -} + var original = p, + seenLinks = {}, + knownHard = {}; -SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + // current character position in p + var pos; + // the partial path so far, including a trailing slash if any + var current; + // the partial path without a trailing slash (except when pointing at a root) + var base; + // the partial path scanned in the previous round, with slash + var previous; - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) -} + start(); -SemVer.prototype.comparePre = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + function start() { + // Skip over roots + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ''; - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 + // On windows, check that the root exists. On unix there is no need. + if (isWindows && !knownHard[base]) { + fs.lstatSync(base); + knownHard[base] = true; + } } - var i = 0 - do { - var a = this.prerelease[i] - var b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) + // walk down the path, swapping out linked pathparts for their real + // values + // NB: p.length changes. + while (pos < p.length) { + // find the next part + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + + // continue if not a symlink + if (knownHard[base] || (cache && cache[base] === base)) { + continue; } - } while (++i) -} -// preminor will bump the version up to the next minor release, and immediately -// down to pre-release. premajor and prepatch work the same way. -SemVer.prototype.inc = function (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) + var resolvedLink; + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + // some known symbolic link. no need to stat again. + resolvedLink = cache[base]; + } else { + var stat = fs.lstatSync(base); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) cache[base] = base; + continue; } - this.inc('pre', identifier) - break - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - var i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) + // read the link if it wasn't read before + // dev/ino always return 0 on windows, so skip the check. + var linkTarget = null; + if (!isWindows) { + var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + linkTarget = seenLinks[id]; } } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } + if (linkTarget === null) { + fs.statSync(base); + linkTarget = fs.readlinkSync(base); } - break + resolvedLink = pathModule.resolve(previous, linkTarget); + // track this, if given a cache. + if (cache) cache[base] = resolvedLink; + if (!isWindows) seenLinks[id] = linkTarget; + } - default: - throw new Error('invalid increment argument: ' + release) + // resolve the link, then start over + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); } - this.format() - this.raw = this.version - return this -} -exports.inc = inc -function inc (version, release, loose, identifier) { - if (typeof (loose) === 'string') { - identifier = loose - loose = undefined - } + if (cache) cache[original] = p; - try { - return new SemVer(version, loose).inc(release, identifier).version - } catch (er) { - return null - } -} + return p; +}; -exports.diff = diff -function diff (version1, version2) { - if (eq(version1, version2)) { - return null - } else { - var v1 = parse(version1) - var v2 = parse(version2) - var prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } -} -exports.compareIdentifiers = compareIdentifiers +exports.realpath = function realpath(p, cache, cb) { + if (typeof cb !== 'function') { + cb = maybeCallback(cache); + cache = null; + } -var numeric = /^[0-9]+$/ -function compareIdentifiers (a, b) { - var anum = numeric.test(a) - var bnum = numeric.test(b) + // make p is absolute + p = pathModule.resolve(p); - if (anum && bnum) { - a = +a - b = +b + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return process.nextTick(cb.bind(null, null, cache[p])); } - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} + var original = p, + seenLinks = {}, + knownHard = {}; -exports.rcompareIdentifiers = rcompareIdentifiers -function rcompareIdentifiers (a, b) { - return compareIdentifiers(b, a) -} + // current character position in p + var pos; + // the partial path so far, including a trailing slash if any + var current; + // the partial path without a trailing slash (except when pointing at a root) + var base; + // the partial path scanned in the previous round, with slash + var previous; -exports.major = major -function major (a, loose) { - return new SemVer(a, loose).major -} + start(); -exports.minor = minor -function minor (a, loose) { - return new SemVer(a, loose).minor -} + function start() { + // Skip over roots + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ''; -exports.patch = patch -function patch (a, loose) { - return new SemVer(a, loose).patch -} + // On windows, check that the root exists. On unix there is no need. + if (isWindows && !knownHard[base]) { + fs.lstat(base, function(err) { + if (err) return cb(err); + knownHard[base] = true; + LOOP(); + }); + } else { + process.nextTick(LOOP); + } + } -exports.compare = compare -function compare (a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)) -} + // walk down the path, swapping out linked pathparts for their real + // values + function LOOP() { + // stop if scanned past end of path + if (pos >= p.length) { + if (cache) cache[original] = p; + return cb(null, p); + } -exports.compareLoose = compareLoose -function compareLoose (a, b) { - return compare(a, b, true) -} + // find the next part + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; -exports.rcompare = rcompare -function rcompare (a, b, loose) { - return compare(b, a, loose) -} + // continue if not a symlink + if (knownHard[base] || (cache && cache[base] === base)) { + return process.nextTick(LOOP); + } -exports.sort = sort -function sort (list, loose) { - return list.sort(function (a, b) { - return exports.compare(a, b, loose) - }) -} - -exports.rsort = rsort -function rsort (list, loose) { - return list.sort(function (a, b) { - return exports.rcompare(a, b, loose) - }) -} - -exports.gt = gt -function gt (a, b, loose) { - return compare(a, b, loose) > 0 -} + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + // known symbolic link. no need to stat again. + return gotResolvedLink(cache[base]); + } -exports.lt = lt -function lt (a, b, loose) { - return compare(a, b, loose) < 0 -} + return fs.lstat(base, gotStat); + } -exports.eq = eq -function eq (a, b, loose) { - return compare(a, b, loose) === 0 -} + function gotStat(err, stat) { + if (err) return cb(err); -exports.neq = neq -function neq (a, b, loose) { - return compare(a, b, loose) !== 0 -} + // if not a symlink, skip to the next path part + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) cache[base] = base; + return process.nextTick(LOOP); + } -exports.gte = gte -function gte (a, b, loose) { - return compare(a, b, loose) >= 0 -} + // stat & read the link if not read before + // call gotTarget as soon as the link target is known + // dev/ino always return 0 on windows, so skip the check. + if (!isWindows) { + var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + return gotTarget(null, seenLinks[id], base); + } + } + fs.stat(base, function(err) { + if (err) return cb(err); -exports.lte = lte -function lte (a, b, loose) { - return compare(a, b, loose) <= 0 -} + fs.readlink(base, function(err, target) { + if (!isWindows) seenLinks[id] = target; + gotTarget(err, target); + }); + }); + } -exports.cmp = cmp -function cmp (a, op, b, loose) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b + function gotTarget(err, target, base) { + if (err) return cb(err); - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b + var resolvedLink = pathModule.resolve(previous, target); + if (cache) cache[base] = resolvedLink; + gotResolvedLink(resolvedLink); + } - case '': - case '=': - case '==': - return eq(a, b, loose) + function gotResolvedLink(resolvedLink) { + // resolve the link, then start over + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } +}; - case '!=': - return neq(a, b, loose) - case '>': - return gt(a, b, loose) +/***/ }), +/* 506 */ +/***/ (function(module, exports, __webpack_require__) { - case '>=': - return gte(a, b, loose) +module.exports = minimatch +minimatch.Minimatch = Minimatch - case '<': - return lt(a, b, loose) +var path = { sep: '/' } +try { + path = __webpack_require__(4) +} catch (er) {} - case '<=': - return lte(a, b, loose) +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = __webpack_require__(507) - default: - throw new TypeError('Invalid operator: ' + op) - } +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } } -exports.Comparator = Comparator -function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } +// * => any number of characters +var star = qmark + '*?' - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) - } +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') - debug('comp', this) +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) } -var ANY = {} -Comparator.prototype.parse = function (comp) { - var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var m = comp.match(r) - - if (!m) { - throw new TypeError('Invalid comparator: ' + comp) - } - - this.operator = m[1] - if (this.operator === '=') { - this.operator = '' - } +// normalizes slashes. +var slashSplit = /\/+/ - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) } } -Comparator.prototype.toString = function () { - return this.value +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t } -Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose) +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch - if (this.semver === ANY) { - return true + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) } - if (typeof version === 'string') { - version = new SemVer(version, this.options) + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) } - return cmp(version, this.operator, this.semver, this.options) + return m } -Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') } - var rangeTmp + if (!options) options = {} - if (this.operator === '') { - rangeTmp = new Range(comp.value, options) - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options) - return satisfies(comp.semver, rangeTmp, options) + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false } - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - var sameSemVer = this.semver.version === comp.semver.version - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')) - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')) + // "" only matches "" + if (pattern.trim() === '') return p === '' - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan + return new Minimatch(pattern, options).match(p) } -exports.Range = Range -function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) } - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') } - if (range instanceof Comparator) { - return new Range(range.value, options) - } + if (!options) options = {} + pattern = pattern.trim() - if (!(this instanceof Range)) { - return new Range(range, options) + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') } this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range.split(/\s*\|\|\s*/).map(function (range) { - return this.parseRange(range.trim()) - }, this).filter(function (c) { - // throw out any that are not relevant for whatever reason - return c.length - }) - - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range) - } + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false - this.format() + // make the set of regexps etc. + this.make() } -Range.prototype.format = function () { - this.range = this.set.map(function (comps) { - return comps.join(' ').trim() - }).join('||').trim() - return this.range -} +Minimatch.prototype.debug = function () {} -Range.prototype.toString = function () { - return this.range -} +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return -Range.prototype.parseRange = function (range) { - var loose = this.options.loose - range = range.trim() - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] - range = range.replace(hr, hyphenReplace) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[COMPARATORTRIM]) + var pattern = this.pattern + var options = this.options - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace) + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace) + // step 1: figure out negation, etc. + this.parseNegate() - // normalize spaces - range = range.split(/\s+/).join(' ') + // step 2: expand braces + var set = this.globSet = this.braceExpand() - // At this point, the range is completely trimmed and - // ready to be split into comparators. + if (options.debug) this.debug = console.error - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var set = range.split(' ').map(function (comp) { - return parseComparator(comp, this.options) - }, this).join(' ').split(/\s+/) - if (this.options.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function (comp) { - return !!comp.match(compRe) - }) - } - set = set.map(function (comp) { - return new Comparator(comp, this.options) - }, this) + this.debug(this.pattern, set) - return set -} + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) -Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } + this.debug(this.pattern, set) - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - }) - }) -} + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators -function toComparators (range, options) { - return new Range(range, options).set.map(function (comp) { - return comp.map(function (c) { - return c.value - }).join(' ').trim().split(' ') + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 }) -} -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -function parseComparator (comp, options) { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} + this.debug(this.pattern, set) -function isX (id) { - return !id || id.toLowerCase() === 'x' || id === '*' + this.set = set } -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') -} +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 -function replaceTilde (comp, options) { - var r = options.loose ? re[TILDELOOSE] : re[TILDE] - return comp.replace(r, function (_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr) - var ret + if (options.nonegate) return - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else if (pr) { - debug('replaceTilde pr', pr) - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } else { - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } - debug('tilde return', ret) - return ret - }) + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate } -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) } -function replaceCaret (comp, options) { - debug('caret', comp, options) - var r = options.loose ? re[CARETLOOSE] : re[CARET] - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr) - var ret +Minimatch.prototype.braceExpand = braceExpand - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - if (M === '0') { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else { - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + (+M + 1) + '.0.0' - } +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0' - } - } - - debug('caret return', ret) - return ret - }) -} - -function replaceXRanges (comp, options) { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') -} - -function replaceXRange (comp, options) { - comp = comp.trim() - var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] - return comp.replace(r, function (ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - var xM = isX(M) - var xm = xM || isX(m) - var xp = xm || isX(p) - var anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - ret = gtlt + M + '.' + m + '.' + p - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + options = {} } + } - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -function replaceStars (comp, options) { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], '') -} + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern -// This function is passed to string.replace(re[HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0 -function hyphenReplace ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = '>=' + fM + '.0.0' - } else if (isX(fp)) { - from = '>=' + fM + '.' + fm + '.0' - } else { - from = '>=' + from + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') } - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = '<' + (+tM + 1) + '.0.0' - } else if (isX(tp)) { - to = '<' + tM + '.' + (+tm + 1) + '.0' - } else if (tpr) { - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr - } else { - to = '<=' + to + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] } - return (from + ' ' + to).trim() + return expand(pattern) } -// if ANY of the sets match ALL of its comparators, then pass -Range.prototype.test = function (version) { - if (!version) { - return false +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') } - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } + var options = this.options - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false -} + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' -function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false } } - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === ANY) { - continue - } + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue } - // Version has a -pre, but it's not one of the ones we like. - return false - } + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false - return true -} + case '\\': + clearStateChar() + escaping = true + continue -exports.satisfies = satisfies -function satisfies (version, range, options) { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) -exports.maxSatisfying = maxSatisfying -function maxSatisfying (versions, range, options) { - var max = null - var maxSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } - }) - return max -} + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } -exports.minSatisfying = minSatisfying -function minSatisfying (versions, range, options) { - var min = null - var minSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min -} + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue -exports.minVersion = minVersion -function minVersion (range, loose) { - range = new Range(range, loose) + case '(': + if (inClass) { + re += '(' + continue + } - var minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver - } + if (!stateChar) { + re += '\\(' + continue + } - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver - } + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue - minver = null - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) - } - }) - } + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue - if (minver && range.test(minver)) { - return minver - } + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } - return null -} + clearStateChar() + re += '|' + continue -exports.validRange = validRange -function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null - } -} + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() -// Determine if version is less than all the versions possible in the range -exports.ltr = ltr -function ltr (version, range, options) { - return outside(version, range, '<', options) -} + if (inClass) { + re += '\\' + c + continue + } -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr -function gtr (version, range, options) { - return outside(version, range, '>', options) -} + inClass = true + classStart = i + reClassStart = re.length + re += c + continue -exports.outside = outside -function outside (version, range, hilo, options) { - version = new SemVer(version, options) - range = new Range(range, options) + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } - var gtfn, ltefn, ltfn, comp, ecomp - switch (hilo) { - case '>': - gtfn = gt - ltefn = lte - ltfn = lt - comp = '>' - ecomp = '>=' - break - case '<': - gtfn = lt - ltefn = gte - ltfn = gt - comp = '<' - ecomp = '<=' - break - default: - throw new TypeError('Must provide a hilo val of "<" or ">"') - } + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } - // If it satisifes the range it is not outside - if (satisfies(version, range, options)) { - return false - } + // finish up the class. + hasMagic = true + inClass = false + re += c + continue - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. + default: + // swallow any state char that wasn't consumed + clearStateChar() - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } - var high = null - var low = null + re += c - comparators.forEach(function (comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' }) - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false - } + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false - } + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail } - return true -} - -exports.prerelease = prerelease -function prerelease (version, options) { - var parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null -} -exports.intersects = intersects -function intersects (r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} - -exports.coerce = coerce -function coerce (version) { - if (version instanceof SemVer) { - return version + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' } - if (typeof version !== 'string') { - return null + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true } - var match = version.match(re[COERCE]) + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] - if (match == null) { - return null + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe } - return parse(match[1] + - '.' + (match[2] || '0') + - '.' + (match[3] || '0')) -} + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + if (addPatternStart) { + re = patternStart + re + } -/***/ }), -/* 524 */ -/***/ (function(module, exports, __webpack_require__) { + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } -var parse = __webpack_require__(525); -var correct = __webpack_require__(527); + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } -var genericWarning = ( - 'license should be ' + - 'a valid SPDX license expression (without "LicenseRef"), ' + - '"UNLICENSED", or ' + - '"SEE LICENSE IN "' -); + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } -var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; + regExp._glob = pattern + regExp._src = re -function startsWith(prefix, string) { - return string.slice(0, prefix.length) === prefix; + return regExp } -function usesLicenseRef(ast) { - if (ast.hasOwnProperty('license')) { - var license = ast.license; - return ( - startsWith('LicenseRef', license) || - startsWith('DocumentRef', license) - ); - } else { - return ( - usesLicenseRef(ast.left) || - usesLicenseRef(ast.right) - ); - } +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() } -module.exports = function(argument) { - var ast; +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp - try { - ast = parse(argument); - } catch (e) { - var match - if ( - argument === 'UNLICENSED' || - argument === 'UNLICENCED' - ) { - return { - validForOldPackages: true, - validForNewPackages: true, - unlicensed: true - }; - } else if (match = fileReferenceRE.exec(argument)) { - return { - validForOldPackages: true, - validForNewPackages: true, - inFile: match[1] - }; - } else { - var result = { - validForOldPackages: false, - validForNewPackages: false, - warnings: [genericWarning] - }; - var corrected = correct(argument); - if (corrected) { - result.warnings.push( - 'license is similar to the valid expression "' + corrected + '"' - ); - } - return result; - } - } + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set - if (usesLicenseRef(ast)) { - return { - validForNewPackages: false, - validForOldPackages: false, - spdx: true, - warnings: [genericWarning] - }; - } else { - return { - validForNewPackages: true, - validForOldPackages: true, - spdx: true - }; + if (!set.length) { + this.regexp = false + return this.regexp } -}; + var options = this.options + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' -/***/ }), -/* 525 */ -/***/ (function(module, exports, __webpack_require__) { + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') -var parser = __webpack_require__(526).parser + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' -module.exports = function (argument) { - return parser.parse(argument) + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp } +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} -/***/ }), -/* 526 */ -/***/ (function(module, exports, __webpack_require__) { +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' -/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ -/* - Returns a Parser object of the following structure: + if (f === '/' && partial) return true - Parser: { - yy: {} + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') } - Parser.prototype: { - yy: {}, - trace: function(), - symbols_: {associative list: name ==> number}, - terminals_: {associative list: number ==> name}, - productions_: [...], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), - table: [...], - defaultActions: {...}, - parseError: function(str, hash), - parse: function(input), + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) - lexer: { - EOF: 1, - parseError: function(str, hash), - setInput: function(input), - input: function(), - unput: function(str), - more: function(), - less: function(n), - pastInput: function(), - upcomingInput: function(), - showPosition: function(), - test_match: function(regex_match_array, rule_index), - next: function(), - lex: function(), - begin: function(condition), - popState: function(), - _currentRules: function(), - topState: function(), - pushState: function(condition), + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. - options: { - ranges: boolean (optional: true ==> token location info will include a .range[] member) - flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) - backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) - }, + var set = this.set + this.debug(this.pattern, 'set', set) - performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), - rules: [...], - conditions: {associative list: name ==> set}, + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate } } + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} - token location info (@$, _$, etc.): { - first_line: n, - last_line: n, - first_column: n, - last_column: n, - range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) - } +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) - the parseError function receives a 'hash' object with these members for lexer and parser errors: { - text: (matched text) - token: (the produced terminal token, if any) - line: (yylineno) - } - while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { - loc: (yylloc) - expected: (string describing the set of expected tokens) - recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) - } -*/ -var spdxparse = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, -productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], -performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { -/* this == yyval */ + this.debug('matchOne', file.length, pattern.length) -var $0 = $$.length - 1; -switch (yystate) { -case 1: -return this.$ = $$[$0-1] -break; -case 2: case 4: case 5: -this.$ = {license: yytext} -break; -case 3: -this.$ = {license: $$[$0-1], plus: true} -break; -case 6: -this.$ = $$[$0] -break; -case 7: -this.$ = {exception: $$[$0]} -this.$.license = $$[$0-2].license -if ($$[$0-2].hasOwnProperty('plus')) { - this.$.plus = $$[$0-2].plus -} -break; -case 8: -this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} -break; -case 9: -this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} -break; -case 10: -this.$ = $$[$0-1] -break; -} -}, -table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], -defaultActions: {8:[2,1]}, -parseError: function parseError(str, hash) { - if (hash.recoverable) { - this.trace(str); - } else { - function _parseError (msg, hash) { - this.message = msg; - this.hash = hash; - } - _parseError.prototype = Error; + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] - throw new _parseError(str, hash); - } -}, -parse: function parse(input) { - var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - var args = lstack.slice.call(arguments, 1); - var lexer = Object.create(this.lexer); - var sharedState = { yy: {} }; - for (var k in this.yy) { - if (Object.prototype.hasOwnProperty.call(this.yy, k)) { - sharedState.yy[k] = this.yy[k]; + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false } - } - lexer.setInput(input, sharedState.yy); - sharedState.yy.lexer = lexer; - sharedState.yy.parser = this; - if (typeof lexer.yylloc == 'undefined') { - lexer.yylloc = {}; - } - var yyloc = lexer.yylloc; - lstack.push(yyloc); - var ranges = lexer.options && lexer.options.ranges; - if (typeof sharedState.yy.parseError === 'function') { - this.parseError = sharedState.yy.parseError; - } else { - this.parseError = Object.getPrototypeOf(this).parseError; - } - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - _token_stack: - var lex = function () { - var token; - token = lexer.lex() || EOF; - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === 'undefined' || !action.length || !action[0]) { - var errStr = ''; - expected = []; - for (p in table[state]) { - if (this.terminals_[p] && p > TERROR) { - expected.push('\'' + this.terminals_[p] + '\''); - } - } - if (lexer.showPosition) { - errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; - } else { - errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); - } - this.parseError(errStr, { - text: lexer.match, - token: this.terminals_[symbol] || symbol, - line: lexer.yylineno, - loc: yyloc, - expected: expected - }); - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(lexer.yytext); - lstack.push(lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = lexer.yyleng; - yytext = lexer.yytext; - yylineno = lexer.yylineno; - yyloc = lexer.yylloc; - if (recovering > 0) { - recovering--; - } - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { - first_line: lstack[lstack.length - (len || 1)].first_line, - last_line: lstack[lstack.length - 1].last_line, - first_column: lstack[lstack.length - (len || 1)].first_column, - last_column: lstack[lstack.length - 1].last_column - }; - if (ranges) { - yyval._$.range = [ - lstack[lstack.length - (len || 1)].range[0], - lstack[lstack.length - 1].range[1] - ]; - } - r = this.performAction.apply(yyval, [ - yytext, - yyleng, - yylineno, - sharedState.yy, - action[1], - vstack, - lstack - ].concat(args)); - if (typeof r !== 'undefined') { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false } - return true; -}}; -/* generated by jison-lex 0.3.4 */ -var lexer = (function(){ -var lexer = ({ -EOF:1, + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, + if (!hit) return false + } -// resets the lexer, sets new input -setInput:function (input, yy) { - this.yy = yy || this.yy || {}; - this._input = input; - this._more = this._backtrack = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = { - first_line: 1, - first_column: 0, - last_line: 1, - last_column: 0 - }; - if (this.options.ranges) { - this.yylloc.range = [0,0]; - } - this.offset = 0; - return this; - }, + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* -// consumes and returns one char from the input -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) { - this.yylloc.range[1]++; - } + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } - this._input = this._input.slice(1); - return ch; - }, + // should be unreachable. + throw new Error('wtf?') +} -// unshifts one char (or a string) into the input -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} - if (lines.length - 1) { - this.yylineno -= lines.length - 1; - } - var r = this.yylloc.range; - this.yylloc = { - first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) - + oldLines[oldLines.length - lines.length].length - lines[0].length : - this.yylloc.first_column - len - }; +/***/ }), +/* 507 */ +/***/ (function(module, exports, __webpack_require__) { - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - this.yyleng = this.yytext.length; - return this; - }, +var concatMap = __webpack_require__(508); +var balanced = __webpack_require__(509); -// When called from action, caches matched text and appends it on next action -more:function () { - this._more = true; - return this; - }, +module.exports = expandTop; -// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. -reject:function () { - if (this.options.backtrack_lexer) { - this._backtrack = true; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; - } - return this; - }, +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} -// retain first n characters of the match -less:function (n) { - this.unput(this.match.slice(n)); - }, +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} -// displays already matched input, i.e. for error messages -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} -// displays upcoming input, i.e. for error messages -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); - }, -// displays the character position where the lexing error occurred, i.e. for error messages -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; -// test the lexed token: return FALSE when not a match, otherwise return token -test_match:function (match, indexed_rule) { - var token, - lines, - backup; + var parts = []; + var m = balanced('{', '}', str); - if (this.options.backtrack_lexer) { - // save context - backup = { - yylineno: this.yylineno, - yylloc: { - first_line: this.yylloc.first_line, - last_line: this.last_line, - first_column: this.yylloc.first_column, - last_column: this.yylloc.last_column - }, - yytext: this.yytext, - match: this.match, - matches: this.matches, - matched: this.matched, - yyleng: this.yyleng, - offset: this.offset, - _more: this._more, - _input: this._input, - yy: this.yy, - conditionStack: this.conditionStack.slice(0), - done: this.done - }; - if (this.options.ranges) { - backup.yylloc.range = this.yylloc.range.slice(0); - } - } + if (!m) + return str.split(','); - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno += lines.length; - } - this.yylloc = { - first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? - lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : - this.yylloc.last_column + match[0].length - }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._backtrack = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) { - this.done = false; - } - if (token) { - return token; - } else if (this._backtrack) { - // recover context - for (var k in backup) { - this[k] = backup[k]; - } - return false; // rule action called reject() implying the next rule should be tested instead. - } - return false; - }, + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); -// return next match in input -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) { - this.done = true; - } + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } - var token, - match, - tempMatch, - index; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (this.options.backtrack_lexer) { - token = this.test_match(tempMatch, rules[i]); - if (token !== false) { - return token; - } else if (this._backtrack) { - match = false; - continue; // rule action called reject() implying a rule MISmatch. - } else { - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - } else if (!this.options.flex) { - break; - } - } - } - if (match) { - token = this.test_match(match, rules[index]); - if (token !== false) { - return token; - } - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - } - }, + parts.push.apply(parts, p); -// return next match that has a token -lex:function lex() { - var r = this.next(); - if (r) { - return r; - } else { - return this.lex(); + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } } - }, + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -begin:function begin(condition) { - this.conditionStack.push(condition); - }, + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } -// pop the previously active lexer condition state off the condition stack -popState:function popState() { - var n = this.conditionStack.length - 1; - if (n > 0) { - return this.conditionStack.pop(); - } else { - return this.conditionStack[0]; + return expansions; +} + + + +/***/ }), +/* 508 */ +/***/ (function(module, exports) { + +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + + +/***/ }), +/* 509 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; } - }, -// produce the lexer rule set which is active for the currently active lexer condition state -_currentRules:function _currentRules() { - if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - } else { - return this.conditions["INITIAL"].rules; + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + + +/***/ }), +/* 510 */ +/***/ (function(module, exports, __webpack_require__) { + +try { + var util = __webpack_require__(397); + /* istanbul ignore next */ + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + /* istanbul ignore next */ + module.exports = __webpack_require__(511); +} + + +/***/ }), +/* 511 */ +/***/ (function(module, exports) { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true } - }, + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} -// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available -topState:function topState(n) { - n = this.conditionStack.length - 1 - Math.abs(n || 0); - if (n >= 0) { - return this.conditionStack[n]; - } else { - return "INITIAL"; + +/***/ }), +/* 512 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + + +/***/ }), +/* 513 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = __webpack_require__(349) +var rp = __webpack_require__(504) +var minimatch = __webpack_require__(506) +var Minimatch = minimatch.Minimatch +var Glob = __webpack_require__(503).Glob +var util = __webpack_require__(397) +var path = __webpack_require__(4) +var assert = __webpack_require__(371) +var isAbsolute = __webpack_require__(512) +var common = __webpack_require__(514) +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = rp.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er } - }, + } + }) + } + common.finish(this) +} -// alias for begin(condition) -pushState:function pushState(condition) { - this.begin(condition); - }, -// return the number of states currently on the stack -stateStackSize:function stateStackSize() { - return this.conditionStack.length; - }, -options: {}, -performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { -var YYSTATE=YY_START; -switch($avoiding_name_collisions) { -case 0:return 5 -break; -case 1:/* skip whitespace */ -break; -case 2:return 8 -break; -case 3:return 16 -break; -case 4:return 17 -break; -case 5:return 11 -break; -case 6:return 10 -break; -case 7:return 9 -break; -case 8:return 14 -break; -case 9:return 15 -break; -case 10:return 12 -break; -case 11:return 7 -break; -case 12:return 7 -break; -case 13:return 7 -break; -case 14:return 7 -break; -case 15:return 7 -break; -case 16:return 7 -break; -case 17:return 7 -break; -case 18:return 7 -break; -case 19:return 7 -break; -case 20:return 7 -break; -case 21:return 7 -break; -case 22:return 7 -break; -case 23:return 7 -break; -case 24:return 13 -break; -case 25:return 13 -break; -case 26:return 13 -break; -case 27:return 13 -break; -case 28:return 13 -break; -case 29:return 13 -break; -case 30:return 13 -break; -case 31:return 13 -break; -case 32:return 7 -break; -case 33:return 13 -break; -case 34:return 7 -break; -case 35:return 13 -break; -case 36:return 7 -break; -case 37:return 13 -break; -case 38:return 13 -break; -case 39:return 7 -break; -case 40:return 13 -break; -case 41:return 13 -break; -case 42:return 13 -break; -case 43:return 13 -break; -case 44:return 13 -break; -case 45:return 7 -break; -case 46:return 13 -break; -case 47:return 7 -break; -case 48:return 7 -break; -case 49:return 7 -break; -case 50:return 7 -break; -case 51:return 7 -break; -case 52:return 7 -break; -case 53:return 7 -break; -case 54:return 7 -break; -case 55:return 7 -break; -case 56:return 7 -break; -case 57:return 7 -break; -case 58:return 7 -break; -case 59:return 7 -break; -case 60:return 7 -break; -case 61:return 7 -break; -case 62:return 7 -break; -case 63:return 13 -break; -case 64:return 7 -break; -case 65:return 7 -break; -case 66:return 13 -break; -case 67:return 7 -break; -case 68:return 7 -break; -case 69:return 7 -break; -case 70:return 7 -break; -case 71:return 7 -break; -case 72:return 7 -break; -case 73:return 13 -break; -case 74:return 7 -break; -case 75:return 13 -break; -case 76:return 7 -break; -case 77:return 7 -break; -case 78:return 7 -break; -case 79:return 7 -break; -case 80:return 7 -break; -case 81:return 7 -break; -case 82:return 7 -break; -case 83:return 7 -break; -case 84:return 7 -break; -case 85:return 7 -break; -case 86:return 7 -break; -case 87:return 7 -break; -case 88:return 7 -break; -case 89:return 7 -break; -case 90:return 7 -break; -case 91:return 7 -break; -case 92:return 7 -break; -case 93:return 7 -break; -case 94:return 7 -break; -case 95:return 7 -break; -case 96:return 7 -break; -case 97:return 7 -break; -case 98:return 7 -break; -case 99:return 7 -break; -case 100:return 7 -break; -case 101:return 7 -break; -case 102:return 7 -break; -case 103:return 7 -break; -case 104:return 7 -break; -case 105:return 7 -break; -case 106:return 7 -break; -case 107:return 7 -break; -case 108:return 7 -break; -case 109:return 7 -break; -case 110:return 7 -break; -case 111:return 7 -break; -case 112:return 7 -break; -case 113:return 7 -break; -case 114:return 7 -break; -case 115:return 7 -break; -case 116:return 7 -break; -case 117:return 7 -break; -case 118:return 7 -break; -case 119:return 7 -break; -case 120:return 7 -break; -case 121:return 7 -break; -case 122:return 7 -break; -case 123:return 7 -break; -case 124:return 7 -break; -case 125:return 7 -break; -case 126:return 7 -break; -case 127:return 7 -break; -case 128:return 7 -break; -case 129:return 7 -break; -case 130:return 7 -break; -case 131:return 7 -break; -case 132:return 7 -break; -case 133:return 7 -break; -case 134:return 7 -break; -case 135:return 7 -break; -case 136:return 7 -break; -case 137:return 7 -break; -case 138:return 7 -break; -case 139:return 7 -break; -case 140:return 7 -break; -case 141:return 7 -break; -case 142:return 7 -break; -case 143:return 7 -break; -case 144:return 7 -break; -case 145:return 7 -break; -case 146:return 7 -break; -case 147:return 7 -break; -case 148:return 7 -break; -case 149:return 7 -break; -case 150:return 7 -break; -case 151:return 7 -break; -case 152:return 7 -break; -case 153:return 7 -break; -case 154:return 7 -break; -case 155:return 7 -break; -case 156:return 7 -break; -case 157:return 7 -break; -case 158:return 7 -break; -case 159:return 7 -break; -case 160:return 7 -break; -case 161:return 7 -break; -case 162:return 7 -break; -case 163:return 7 -break; -case 164:return 7 -break; -case 165:return 7 -break; -case 166:return 7 -break; -case 167:return 7 -break; -case 168:return 7 -break; -case 169:return 7 -break; -case 170:return 7 -break; -case 171:return 7 -break; -case 172:return 7 -break; -case 173:return 7 -break; -case 174:return 7 -break; -case 175:return 7 -break; -case 176:return 7 -break; -case 177:return 7 -break; -case 178:return 7 -break; -case 179:return 7 -break; -case 180:return 7 -break; -case 181:return 7 -break; -case 182:return 7 -break; -case 183:return 7 -break; -case 184:return 7 -break; -case 185:return 7 -break; -case 186:return 7 -break; -case 187:return 7 -break; -case 188:return 7 -break; -case 189:return 7 -break; -case 190:return 7 -break; -case 191:return 7 -break; -case 192:return 7 -break; -case 193:return 7 -break; -case 194:return 7 -break; -case 195:return 7 -break; -case 196:return 7 -break; -case 197:return 7 -break; -case 198:return 7 -break; -case 199:return 7 -break; -case 200:return 7 -break; -case 201:return 7 -break; -case 202:return 7 -break; -case 203:return 7 -break; -case 204:return 7 -break; -case 205:return 7 -break; -case 206:return 7 -break; -case 207:return 7 -break; -case 208:return 7 -break; -case 209:return 7 -break; -case 210:return 7 -break; -case 211:return 7 -break; -case 212:return 7 -break; -case 213:return 7 -break; -case 214:return 7 -break; -case 215:return 7 -break; -case 216:return 7 -break; -case 217:return 7 -break; -case 218:return 7 -break; -case 219:return 7 -break; -case 220:return 7 -break; -case 221:return 7 -break; -case 222:return 7 -break; -case 223:return 7 -break; -case 224:return 7 -break; -case 225:return 7 -break; -case 226:return 7 -break; -case 227:return 7 -break; -case 228:return 7 -break; -case 229:return 7 -break; -case 230:return 7 -break; -case 231:return 7 -break; -case 232:return 7 -break; -case 233:return 7 -break; -case 234:return 7 -break; -case 235:return 7 -break; -case 236:return 7 -break; -case 237:return 7 -break; -case 238:return 7 -break; -case 239:return 7 -break; -case 240:return 7 -break; -case 241:return 7 -break; -case 242:return 7 -break; -case 243:return 7 -break; -case 244:return 7 -break; -case 245:return 7 -break; -case 246:return 7 -break; -case 247:return 7 -break; -case 248:return 7 -break; -case 249:return 7 -break; -case 250:return 7 -break; -case 251:return 7 -break; -case 252:return 7 -break; -case 253:return 7 -break; -case 254:return 7 -break; -case 255:return 7 -break; -case 256:return 7 -break; -case 257:return 7 -break; -case 258:return 7 -break; -case 259:return 7 -break; -case 260:return 7 -break; -case 261:return 7 -break; -case 262:return 7 -break; -case 263:return 7 -break; -case 264:return 7 -break; -case 265:return 7 -break; -case 266:return 7 -break; -case 267:return 7 -break; -case 268:return 7 -break; -case 269:return 7 -break; -case 270:return 7 -break; -case 271:return 7 -break; -case 272:return 7 -break; -case 273:return 7 -break; -case 274:return 7 -break; -case 275:return 7 -break; -case 276:return 7 -break; -case 277:return 7 -break; -case 278:return 7 -break; -case 279:return 7 -break; -case 280:return 7 -break; -case 281:return 7 -break; -case 282:return 7 -break; -case 283:return 7 -break; -case 284:return 7 -break; -case 285:return 7 -break; -case 286:return 7 -break; -case 287:return 7 -break; -case 288:return 7 -break; -case 289:return 7 -break; -case 290:return 7 -break; -case 291:return 7 -break; -case 292:return 7 -break; -case 293:return 7 -break; -case 294:return 7 -break; -case 295:return 7 -break; -case 296:return 7 -break; -case 297:return 7 -break; -case 298:return 7 -break; -case 299:return 7 -break; -case 300:return 7 -break; -case 301:return 7 -break; -case 302:return 7 -break; -case 303:return 7 -break; -case 304:return 7 -break; -case 305:return 7 -break; -case 306:return 7 -break; -case 307:return 7 -break; -case 308:return 7 -break; -case 309:return 7 -break; -case 310:return 7 -break; -case 311:return 7 -break; -case 312:return 7 -break; -case 313:return 7 -break; -case 314:return 7 -break; -case 315:return 7 -break; -case 316:return 7 -break; -case 317:return 7 -break; -case 318:return 7 -break; -case 319:return 7 -break; -case 320:return 7 -break; -case 321:return 7 -break; -case 322:return 7 -break; -case 323:return 7 -break; -case 324:return 7 -break; -case 325:return 7 -break; -case 326:return 7 -break; -case 327:return 7 -break; -case 328:return 7 -break; -case 329:return 7 -break; -case 330:return 7 -break; -case 331:return 7 -break; -case 332:return 7 -break; -case 333:return 7 -break; -case 334:return 7 -break; -case 335:return 7 -break; -case 336:return 7 -break; -case 337:return 7 -break; -case 338:return 7 -break; -case 339:return 7 -break; -case 340:return 7 -break; -case 341:return 7 -break; -case 342:return 7 -break; -case 343:return 7 -break; -case 344:return 7 -break; -case 345:return 7 -break; -case 346:return 7 -break; -case 347:return 7 -break; -case 348:return 7 -break; -case 349:return 7 -break; -case 350:return 7 -break; -case 351:return 7 -break; -case 352:return 7 -break; -case 353:return 7 -break; -case 354:return 7 -break; -case 355:return 7 -break; -case 356:return 7 -break; -case 357:return 7 -break; -case 358:return 7 -break; -case 359:return 7 -break; -case 360:return 7 -break; -case 361:return 7 -break; -case 362:return 7 -break; -case 363:return 7 -break; -case 364:return 7 -break; +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + if (isIgnored(this, e)) + return + + var abs = this._makeAbs(e) + + if (this.mark) + e = this._mark(e) + + if (this.absolute) { + e = abs + } + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er.code === 'ENOENT') { + // lstat failed, doesn't exist + return null + } + } + + var isSym = lstat && lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && lstat && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + throw error + } + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { + this.statCache[abs] = false + return false + } + } + + if (lstat && lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = true + if (stat) + c = stat.isDirectory() ? 'DIR' : 'FILE' + + this.cache[abs] = this.cache[abs] || c + + if (needDir && c === 'FILE') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + + +/***/ }), +/* 514 */ +/***/ (function(module, exports, __webpack_require__) { + +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = __webpack_require__(4) +var minimatch = __webpack_require__(506) +var isAbsolute = __webpack_require__(512) +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +// ignore patterns are always in dot:true mode. +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern, { dot: true }) + } + + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + self.absolute = !!options.absolute + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = path.resolve(options.cwd) + self.changedCwd = self.cwd !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + // TODO: is an absolute `cwd` supposed to be resolved against `root`? + // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') + self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) + if (process.platform === "win32") + self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") + self.nomount = !!options.nomount + + // disable comments and negation in Minimatch. + // Note that they are not supported in Glob itself anyway. + options.nonegate = true + options.nocomment = true + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + var notDir = !(/\/$/.test(e)) + var c = self.cache[e] || self.cache[makeAbs(self, e)] + if (notDir && c) + notDir = c !== 'DIR' && !Array.isArray(c) + return notDir + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + + if (process.platform === 'win32') + abs = abs.replace(/\\/g, '/') + + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + + +/***/ }), +/* 515 */ +/***/ (function(module, exports, __webpack_require__) { + +var wrappy = __webpack_require__(379) +var reqs = Object.create(null) +var once = __webpack_require__(378) + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} + + +/***/ }), +/* 516 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CliError", function() { return CliError; }); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ +class CliError extends Error { + constructor(message, meta = {}) { + super(message); + this.meta = meta; + } + +} + +/***/ }), +/* 517 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return Project; }); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(349); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(500); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(518); +/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(563); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + + + + + + + +class Project { + static async fromPath(path) { + const pkgJson = await Object(_package_json__WEBPACK_IMPORTED_MODULE_5__["readPackageJson"])(path); + return new Project(pkgJson, path); + } + /** parsed package.json */ + + + constructor(packageJson, projectPath) { + _defineProperty(this, "json", void 0); + + _defineProperty(this, "packageJsonLocation", void 0); + + _defineProperty(this, "nodeModulesLocation", void 0); + + _defineProperty(this, "targetLocation", void 0); + + _defineProperty(this, "path", void 0); + + _defineProperty(this, "version", void 0); + + _defineProperty(this, "allDependencies", void 0); + + _defineProperty(this, "productionDependencies", void 0); + + _defineProperty(this, "devDependencies", void 0); + + _defineProperty(this, "scripts", void 0); + + _defineProperty(this, "isWorkspaceRoot", false); + + _defineProperty(this, "isWorkspaceProject", false); + + this.json = Object.freeze(packageJson); + this.path = projectPath; + this.packageJsonLocation = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, 'package.json'); + this.nodeModulesLocation = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, 'node_modules'); + this.targetLocation = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, 'target'); + this.version = this.json.version; + this.productionDependencies = this.json.dependencies || {}; + this.devDependencies = this.json.devDependencies || {}; + this.allDependencies = _objectSpread({}, this.devDependencies, {}, this.productionDependencies); + this.isWorkspaceRoot = this.json.hasOwnProperty('workspaces'); + this.scripts = this.json.scripts || {}; + } + + get name() { + return this.json.name; + } + + ensureValidProjectDependency(project, dependentProjectIsInWorkspace) { + const versionInPackageJson = this.allDependencies[project.name]; + let expectedVersionInPackageJson; + + if (dependentProjectIsInWorkspace) { + expectedVersionInPackageJson = project.json.version; + } else { + const relativePathToProject = normalizePath(path__WEBPACK_IMPORTED_MODULE_1___default.a.relative(this.path, project.path)); + expectedVersionInPackageJson = `link:${relativePathToProject}`; + } // No issues! + + + if (versionInPackageJson === expectedVersionInPackageJson) { + return; + } + + let problemMsg; + + if (Object(_package_json__WEBPACK_IMPORTED_MODULE_5__["isLinkDependency"])(versionInPackageJson) && dependentProjectIsInWorkspace) { + problemMsg = `but should be using a workspace`; + } else if (Object(_package_json__WEBPACK_IMPORTED_MODULE_5__["isLinkDependency"])(versionInPackageJson)) { + problemMsg = `using 'link:', but the path is wrong`; + } else { + problemMsg = `but it's not using the local package`; + } + + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`[${this.name}] depends on [${project.name}] ${problemMsg}. Update its package.json to the expected value below.`, { + actual: `"${project.name}": "${versionInPackageJson}"`, + expected: `"${project.name}": "${expectedVersionInPackageJson}"`, + package: `${this.name} (${this.packageJsonLocation})` + }); + } + + getBuildConfig() { + return this.json.kibana && this.json.kibana.build || {}; + } + /** + * Returns the directory that should be copied into the Kibana build artifact. + * This config can be specified to only include the project's build artifacts + * instead of everything located in the project directory. + */ + + + getIntermediateBuildDirectory() { + return path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, this.getBuildConfig().intermediateBuildDirectory || '.'); + } + + getCleanConfig() { + return this.json.kibana && this.json.kibana.clean || {}; + } + + hasScript(name) { + return name in this.scripts; + } + + getExecutables() { + const raw = this.json.bin; + + if (!raw) { + return {}; + } + + if (typeof raw === 'string') { + return { + [this.name]: path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, raw) + }; + } + + if (typeof raw === 'object') { + const binsConfig = {}; + + for (const binName of Object.keys(raw)) { + binsConfig[binName] = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.path, raw[binName]); + } + + return binsConfig; + } + + throw new _errors__WEBPACK_IMPORTED_MODULE_3__["CliError"](`[${this.name}] has an invalid "bin" field in its package.json, ` + `expected an object or a string`, { + binConfig: Object(util__WEBPACK_IMPORTED_MODULE_2__["inspect"])(raw), + package: `${this.name} (${this.packageJsonLocation})` + }); + } + + async runScript(scriptName, args = []) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"].info(`Running script [${scriptName}] in [${this.name}]:`); + return Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["runScriptInPackage"])(scriptName, args, this); + } + + runScriptStreaming(scriptName, options = {}) { + return Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["runScriptInPackageStreaming"])({ + script: scriptName, + args: options.args || [], + pkg: this, + debug: options.debug + }); + } + + hasDependencies() { + return Object.keys(this.allDependencies).length > 0; + } + + async installDependencies({ + extraArgs + }) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"].info(`[${this.name}] running yarn`); + _log__WEBPACK_IMPORTED_MODULE_4__["log"].write(''); + await Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["installInDir"])(this.path, extraArgs); + _log__WEBPACK_IMPORTED_MODULE_4__["log"].write(''); + await this.removeExtraneousNodeModules(); + } + /** + * Yarn workspaces symlinks workspace projects to the root node_modules, even + * when there is no depenency on the project. This results in unnecicary, and + * often duplicated code in the build archives. + */ + + + async removeExtraneousNodeModules() { + // this is only relevant for the root workspace + if (!this.isWorkspaceRoot) { + return; + } + + const workspacesInfo = await Object(_scripts__WEBPACK_IMPORTED_MODULE_6__["yarnWorkspacesInfo"])(this.path); + const unusedWorkspaces = new Set(Object.keys(workspacesInfo)); // check for any cross-project dependency + + for (const name of Object.keys(workspacesInfo)) { + const workspace = workspacesInfo[name]; + workspace.workspaceDependencies.forEach(w => unusedWorkspaces.delete(w)); + } + + unusedWorkspaces.forEach(name => { + const { + dependencies, + devDependencies + } = this.json; + const nodeModulesPath = path__WEBPACK_IMPORTED_MODULE_1___default.a.resolve(this.nodeModulesLocation, name); + const isDependency = dependencies && dependencies.hasOwnProperty(name); + const isDevDependency = devDependencies && devDependencies.hasOwnProperty(name); + + if (!isDependency && !isDevDependency && fs__WEBPACK_IMPORTED_MODULE_0___default.a.existsSync(nodeModulesPath)) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"].debug(`No dependency on ${name}, removing link in node_modules`); + fs__WEBPACK_IMPORTED_MODULE_0___default.a.unlinkSync(nodeModulesPath); + } + }); + } + +} // We normalize all path separators to `/` in generated files + +function normalizePath(path) { + return path.replace(/[\\\/]+/g, '/'); +} + +/***/ }), +/* 518 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readPackageJson", function() { return readPackageJson; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "writePackageJson", function() { return writePackageJson; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLinkDependency", function() { return isLinkDependency; }); +/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(519); +/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(read_pkg__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(545); +/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(write_pkg__WEBPACK_IMPORTED_MODULE_1__); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + + +function readPackageJson(cwd) { + return read_pkg__WEBPACK_IMPORTED_MODULE_0___default()({ + cwd, + normalize: false + }); +} +function writePackageJson(path, json) { + return write_pkg__WEBPACK_IMPORTED_MODULE_1___default()(path, json); +} +const isLinkDependency = depVersion => depVersion.startsWith('link:'); + +/***/ }), +/* 519 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const parseJson = __webpack_require__(520); + +const readFileAsync = promisify(fs.readFile); + +module.exports = async options => { + options = { + cwd: process.cwd(), + normalize: true, + ...options + }; + + const filePath = path.resolve(options.cwd, 'package.json'); + const json = parseJson(await readFileAsync(filePath, 'utf8')); + + if (options.normalize) { + __webpack_require__(521)(json); + } + + return json; +}; + +module.exports.sync = options => { + options = { + cwd: process.cwd(), + normalize: true, + ...options + }; + + const filePath = path.resolve(options.cwd, 'package.json'); + const json = parseJson(fs.readFileSync(filePath, 'utf8')); + + if (options.normalize) { + __webpack_require__(521)(json); + } + + return json; +}; + + +/***/ }), +/* 520 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const errorEx = __webpack_require__(416); +const fallback = __webpack_require__(418); +const {default: LinesAndColumns} = __webpack_require__(419); +const {codeFrameColumns} = __webpack_require__(420); + +const JSONError = errorEx('JSONError', { + fileName: errorEx.append('in %s'), + codeFrame: errorEx.append('\n\n%s\n') +}); + +module.exports = (string, reviver, filename) => { + if (typeof reviver === 'string') { + filename = reviver; + reviver = null; + } + + try { + try { + return JSON.parse(string, reviver); + } catch (error) { + fallback(string, reviver); + throw error; + } + } catch (error) { + error.message = error.message.replace(/\n/g, ''); + const indexMatch = error.message.match(/in JSON at position (\d+) while parsing near/); + + const jsonError = new JSONError(error); + if (filename) { + jsonError.fileName = filename; + } + + if (indexMatch && indexMatch.length > 0) { + const lines = new LinesAndColumns(string); + const index = Number(indexMatch[1]); + const location = lines.locationForIndex(index); + + const codeFrame = codeFrameColumns( + string, + {start: {line: location.line + 1, column: location.column + 1}}, + {highlightCode: true} + ); + + jsonError.codeFrame = codeFrame; + } + + throw jsonError; + } +}; + + +/***/ }), +/* 521 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = normalize + +var fixer = __webpack_require__(522) +normalize.fixer = fixer + +var makeWarning = __webpack_require__(543) + +var fieldsToFix = ['name','version','description','repository','modules','scripts' + ,'files','bin','man','bugs','keywords','readme','homepage','license'] +var otherThingsToFix = ['dependencies','people', 'typos'] + +var thingsToFix = fieldsToFix.map(function(fieldName) { + return ucFirst(fieldName) + "Field" +}) +// two ways to do this in CoffeeScript on only one line, sub-70 chars: +// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" +// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) +thingsToFix = thingsToFix.concat(otherThingsToFix) + +function normalize (data, warn, strict) { + if(warn === true) warn = null, strict = true + if(!strict) strict = false + if(!warn || data.private) warn = function(msg) { /* noop */ } + + if (data.scripts && + data.scripts.install === "node-gyp rebuild" && + !data.scripts.preinstall) { + data.gypfile = true + } + fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } + thingsToFix.forEach(function(thingName) { + fixer["fix" + ucFirst(thingName)](data, strict) + }) + data._id = data.name + "@" + data.version +} + +function ucFirst (string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + + +/***/ }), +/* 522 */ +/***/ (function(module, exports, __webpack_require__) { + +var semver = __webpack_require__(523) +var validateLicense = __webpack_require__(524); +var hostedGitInfo = __webpack_require__(529) +var isBuiltinModule = __webpack_require__(532).isCore +var depTypes = ["dependencies","devDependencies","optionalDependencies"] +var extractDescription = __webpack_require__(541) +var url = __webpack_require__(439) +var typos = __webpack_require__(542) + +var fixer = module.exports = { + // default warning function + warn: function() {}, + + fixRepositoryField: function(data) { + if (data.repositories) { + this.warn("repositories"); + data.repository = data.repositories[0] + } + if (!data.repository) return this.warn("missingRepository") + if (typeof data.repository === "string") { + data.repository = { + type: "git", + url: data.repository + } + } + var r = data.repository.url || "" + if (r) { + var hosted = hostedGitInfo.fromUrl(r) + if (hosted) { + r = data.repository.url + = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() + } + } + + if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { + this.warn("brokenGitUrl", r) + } + } + +, fixTypos: function(data) { + Object.keys(typos.topLevel).forEach(function (d) { + if (data.hasOwnProperty(d)) { + this.warn("typo", d, typos.topLevel[d]) + } + }, this) + } + +, fixScriptsField: function(data) { + if (!data.scripts) return + if (typeof data.scripts !== "object") { + this.warn("nonObjectScripts") + delete data.scripts + return + } + Object.keys(data.scripts).forEach(function (k) { + if (typeof data.scripts[k] !== "string") { + this.warn("nonStringScript") + delete data.scripts[k] + } else if (typos.script[k] && !data.scripts[typos.script[k]]) { + this.warn("typo", k, typos.script[k], "scripts") + } + }, this) + } + +, fixFilesField: function(data) { + var files = data.files + if (files && !Array.isArray(files)) { + this.warn("nonArrayFiles") + delete data.files + } else if (data.files) { + data.files = data.files.filter(function(file) { + if (!file || typeof file !== "string") { + this.warn("invalidFilename", file) + return false + } else { + return true + } + }, this) + } + } + +, fixBinField: function(data) { + if (!data.bin) return; + if (typeof data.bin === "string") { + var b = {} + var match + if (match = data.name.match(/^@[^/]+[/](.*)$/)) { + b[match[1]] = data.bin + } else { + b[data.name] = data.bin + } + data.bin = b + } + } + +, fixManField: function(data) { + if (!data.man) return; + if (typeof data.man === "string") { + data.man = [ data.man ] + } + } +, fixBundleDependenciesField: function(data) { + var bdd = "bundledDependencies" + var bd = "bundleDependencies" + if (data[bdd] && !data[bd]) { + data[bd] = data[bdd] + delete data[bdd] + } + if (data[bd] && !Array.isArray(data[bd])) { + this.warn("nonArrayBundleDependencies") + delete data[bd] + } else if (data[bd]) { + data[bd] = data[bd].filter(function(bd) { + if (!bd || typeof bd !== 'string') { + this.warn("nonStringBundleDependency", bd) + return false + } else { + if (!data.dependencies) { + data.dependencies = {} + } + if (!data.dependencies.hasOwnProperty(bd)) { + this.warn("nonDependencyBundleDependency", bd) + data.dependencies[bd] = "*" + } + return true + } + }, this) + } + } + +, fixDependencies: function(data, strict) { + var loose = !strict + objectifyDeps(data, this.warn) + addOptionalDepsToDeps(data, this.warn) + this.fixBundleDependenciesField(data) + + ;['dependencies','devDependencies'].forEach(function(deps) { + if (!(deps in data)) return + if (!data[deps] || typeof data[deps] !== "object") { + this.warn("nonObjectDependencies", deps) + delete data[deps] + return + } + Object.keys(data[deps]).forEach(function (d) { + var r = data[deps][d] + if (typeof r !== 'string') { + this.warn("nonStringDependency", d, JSON.stringify(r)) + delete data[deps][d] + } + var hosted = hostedGitInfo.fromUrl(data[deps][d]) + if (hosted) data[deps][d] = hosted.toString() + }, this) + }, this) + } + +, fixModulesField: function (data) { + if (data.modules) { + this.warn("deprecatedModules") + delete data.modules + } + } + +, fixKeywordsField: function (data) { + if (typeof data.keywords === "string") { + data.keywords = data.keywords.split(/,\s+/) + } + if (data.keywords && !Array.isArray(data.keywords)) { + delete data.keywords + this.warn("nonArrayKeywords") + } else if (data.keywords) { + data.keywords = data.keywords.filter(function(kw) { + if (typeof kw !== "string" || !kw) { + this.warn("nonStringKeyword"); + return false + } else { + return true + } + }, this) + } + } + +, fixVersionField: function(data, strict) { + // allow "loose" semver 1.0 versions in non-strict mode + // enforce strict semver 2.0 compliance in strict mode + var loose = !strict + if (!data.version) { + data.version = "" + return true + } + if (!semver.valid(data.version, loose)) { + throw new Error('Invalid version: "'+ data.version + '"') + } + data.version = semver.clean(data.version, loose) + return true + } + +, fixPeople: function(data) { + modifyPeople(data, unParsePerson) + modifyPeople(data, parsePerson) + } + +, fixNameField: function(data, options) { + if (typeof options === "boolean") options = {strict: options} + else if (typeof options === "undefined") options = {} + var strict = options.strict + if (!data.name && !strict) { + data.name = "" + return + } + if (typeof data.name !== "string") { + throw new Error("name field must be a string.") + } + if (!strict) + data.name = data.name.trim() + ensureValidName(data.name, strict, options.allowLegacyCase) + if (isBuiltinModule(data.name)) + this.warn("conflictingName", data.name) + } + + +, fixDescriptionField: function (data) { + if (data.description && typeof data.description !== 'string') { + this.warn("nonStringDescription") + delete data.description + } + if (data.readme && !data.description) + data.description = extractDescription(data.readme) + if(data.description === undefined) delete data.description; + if (!data.description) this.warn("missingDescription") + } + +, fixReadmeField: function (data) { + if (!data.readme) { + this.warn("missingReadme") + data.readme = "ERROR: No README data found!" + } + } + +, fixBugsField: function(data) { + if (!data.bugs && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if(hosted && hosted.bugs()) { + data.bugs = {url: hosted.bugs()} + } + } + else if(data.bugs) { + var emailRe = /^.+@.*\..+$/ + if(typeof data.bugs == "string") { + if(emailRe.test(data.bugs)) + data.bugs = {email:data.bugs} + else if(url.parse(data.bugs).protocol) + data.bugs = {url: data.bugs} + else + this.warn("nonEmailUrlBugsString") + } + else { + bugsTypos(data.bugs, this.warn) + var oldBugs = data.bugs + data.bugs = {} + if(oldBugs.url) { + if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) + data.bugs.url = oldBugs.url + else + this.warn("nonUrlBugsUrlField") + } + if(oldBugs.email) { + if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) + data.bugs.email = oldBugs.email + else + this.warn("nonEmailBugsEmailField") + } + } + if(!data.bugs.email && !data.bugs.url) { + delete data.bugs + this.warn("emptyNormalizedBugs") + } + } + } + +, fixHomepageField: function(data) { + if (!data.homepage && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if (hosted && hosted.docs()) data.homepage = hosted.docs() + } + if (!data.homepage) return + + if(typeof data.homepage !== "string") { + this.warn("nonUrlHomepage") + return delete data.homepage + } + if(!url.parse(data.homepage).protocol) { + data.homepage = "http://" + data.homepage + } + } + +, fixLicenseField: function(data) { + if (!data.license) { + return this.warn("missingLicense") + } else{ + if ( + typeof(data.license) !== 'string' || + data.license.length < 1 || + data.license.trim() === '' + ) { + this.warn("invalidLicense") + } else { + if (!validateLicense(data.license).validForNewPackages) + this.warn("invalidLicense") + } + } + } +} + +function isValidScopedPackageName(spec) { + if (spec.charAt(0) !== '@') return false + + var rest = spec.slice(1).split('/') + if (rest.length !== 2) return false + + return rest[0] && rest[1] && + rest[0] === encodeURIComponent(rest[0]) && + rest[1] === encodeURIComponent(rest[1]) +} + +function isCorrectlyEncodedName(spec) { + return !spec.match(/[\/@\s\+%:]/) && + spec === encodeURIComponent(spec) +} + +function ensureValidName (name, strict, allowLegacyCase) { + if (name.charAt(0) === "." || + !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || + (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || + name.toLowerCase() === "node_modules" || + name.toLowerCase() === "favicon.ico") { + throw new Error("Invalid name: " + JSON.stringify(name)) + } +} + +function modifyPeople (data, fn) { + if (data.author) data.author = fn(data.author) + ;["maintainers", "contributors"].forEach(function (set) { + if (!Array.isArray(data[set])) return; + data[set] = data[set].map(fn) + }) + return data +} + +function unParsePerson (person) { + if (typeof person === "string") return person + var name = person.name || "" + var u = person.url || person.web + var url = u ? (" ("+u+")") : "" + var e = person.email || person.mail + var email = e ? (" <"+e+">") : "" + return name+email+url +} + +function parsePerson (person) { + if (typeof person !== "string") return person + var name = person.match(/^([^\(<]+)/) + var url = person.match(/\(([^\)]+)\)/) + var email = person.match(/<([^>]+)>/) + var obj = {} + if (name && name[0].trim()) obj.name = name[0].trim() + if (email) obj.email = email[1]; + if (url) obj.url = url[1]; + return obj +} + +function addOptionalDepsToDeps (data, warn) { + var o = data.optionalDependencies + if (!o) return; + var d = data.dependencies || {} + Object.keys(o).forEach(function (k) { + d[k] = o[k] + }) + data.dependencies = d +} + +function depObjectify (deps, type, warn) { + if (!deps) return {} + if (typeof deps === "string") { + deps = deps.trim().split(/[\n\r\s\t ,]+/) + } + if (!Array.isArray(deps)) return deps + warn("deprecatedArrayDependencies", type) + var o = {} + deps.filter(function (d) { + return typeof d === "string" + }).forEach(function(d) { + d = d.trim().split(/(:?[@\s><=])/) + var dn = d.shift() + var dv = d.join("") + dv = dv.trim() + dv = dv.replace(/^@/, "") + o[dn] = dv + }) + return o +} + +function objectifyDeps (data, warn) { + depTypes.forEach(function (type) { + if (!data[type]) return; + data[type] = depObjectify(data[type], type, warn) + }) +} + +function bugsTypos(bugs, warn) { + if (!bugs) return + Object.keys(bugs).forEach(function (k) { + if (typos.bugs[k]) { + warn("typo", k, typos.bugs[k], "bugs") + bugs[typos.bugs[k]] = bugs[k] + delete bugs[k] + } + }) +} + + +/***/ }), +/* 523 */ +/***/ (function(module, exports) { + +exports = module.exports = SemVer + +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift('SEMVER') + console.log.apply(console, args) + } +} else { + debug = function () {} +} + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0' + +var MAX_LENGTH = 256 +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 + +// The actual regexps go on exports.re +var re = exports.re = [] +var src = exports.src = [] +var R = 0 + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++ +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' +var NUMERICIDENTIFIERLOOSE = R++ +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++ +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++ +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')' + +var MAINVERSIONLOOSE = R++ +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++ +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +var PRERELEASEIDENTIFIERLOOSE = R++ +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++ +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + +var PRERELEASELOOSE = R++ +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++ +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++ +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++ +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?' + +src[FULL] = '^' + FULLPLAIN + '$' + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?' + +var LOOSE = R++ +src[LOOSE] = '^' + LOOSEPLAIN + '$' + +var GTLT = R++ +src[GTLT] = '((?:<|>)?=?)' + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++ +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' +var XRANGEIDENTIFIER = R++ +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + +var XRANGEPLAIN = R++ +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGEPLAINLOOSE = R++ +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGE = R++ +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' +var XRANGELOOSE = R++ +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++ +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])' + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++ +src[LONETILDE] = '(?:~>?)' + +var TILDETRIM = R++ +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') +var tildeTrimReplace = '$1~' + +var TILDE = R++ +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' +var TILDELOOSE = R++ +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++ +src[LONECARET] = '(?:\\^)' + +var CARETTRIM = R++ +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') +var caretTrimReplace = '$1^' + +var CARET = R++ +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' +var CARETLOOSE = R++ +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++ +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' +var COMPARATOR = R++ +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++ +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') +var comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++ +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$' + +var HYPHENRANGELOOSE = R++ +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$' + +// Star ranges basically just allow anything at all. +var STAR = R++ +src[STAR] = '(<|>)?=?\\s*\\*' + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]) + if (!re[i]) { + re[i] = new RegExp(src[i]) + } +} + +exports.parse = parse +function parse (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? re[LOOSE] : re[FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +exports.valid = valid +function valid (version, options) { + var v = parse(version, options) + return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === options.loose) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + } + + if (!(this instanceof SemVer)) { + return new SemVer(version, options) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + + var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) + + if (!m) { + throw new TypeError('Invalid Version: ' + version) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map(function (id) { + if (/^[0-9]+$/.test(id)) { + var num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }) + } + + this.build = m[5] ? m[5].split('.') : [] + this.format() } -}, -rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} -}); -return lexer; -})(); -parser.lexer = lexer; -function Parser () { - this.yy = {}; + +SemVer.prototype.format = function () { + this.version = this.major + '.' + this.minor + '.' + this.patch + if (this.prerelease.length) { + this.version += '-' + this.prerelease.join('.') + } + return this.version } -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); +SemVer.prototype.toString = function () { + return this.version +} + +SemVer.prototype.compare = function (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) +} + +SemVer.prototype.comparePre = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + var i = 0 + do { + var a = this.prerelease[i] + var b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) +} + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function (release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier) + this.inc('pre', identifier) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier) + } + this.inc('pre', identifier) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) { + this.prerelease = [0] + } else { + var i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + this.prerelease.push(0) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) { + this.prerelease = [identifier, 0] + } + } else { + this.prerelease = [identifier, 0] + } + } + break + + default: + throw new Error('invalid increment argument: ' + release) + } + this.format() + this.raw = this.version + return this +} + +exports.inc = inc +function inc (version, release, loose, identifier) { + if (typeof (loose) === 'string') { + identifier = loose + loose = undefined + } + + try { + return new SemVer(version, loose).inc(release, identifier).version + } catch (er) { + return null + } +} + +exports.diff = diff +function diff (version1, version2) { + if (eq(version1, version2)) { + return null + } else { + var v1 = parse(version1) + var v2 = parse(version2) + var prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} + +exports.compareIdentifiers = compareIdentifiers + +var numeric = /^[0-9]+$/ +function compareIdentifiers (a, b) { + var anum = numeric.test(a) + var bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +exports.rcompareIdentifiers = rcompareIdentifiers +function rcompareIdentifiers (a, b) { + return compareIdentifiers(b, a) +} + +exports.major = major +function major (a, loose) { + return new SemVer(a, loose).major +} + +exports.minor = minor +function minor (a, loose) { + return new SemVer(a, loose).minor +} + +exports.patch = patch +function patch (a, loose) { + return new SemVer(a, loose).patch +} + +exports.compare = compare +function compare (a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)) +} + +exports.compareLoose = compareLoose +function compareLoose (a, b) { + return compare(a, b, true) +} + +exports.rcompare = rcompare +function rcompare (a, b, loose) { + return compare(b, a, loose) +} + +exports.sort = sort +function sort (list, loose) { + return list.sort(function (a, b) { + return exports.compare(a, b, loose) + }) +} + +exports.rsort = rsort +function rsort (list, loose) { + return list.sort(function (a, b) { + return exports.rcompare(a, b, loose) + }) +} + +exports.gt = gt +function gt (a, b, loose) { + return compare(a, b, loose) > 0 +} + +exports.lt = lt +function lt (a, b, loose) { + return compare(a, b, loose) < 0 +} + +exports.eq = eq +function eq (a, b, loose) { + return compare(a, b, loose) === 0 +} + +exports.neq = neq +function neq (a, b, loose) { + return compare(a, b, loose) !== 0 +} + +exports.gte = gte +function gte (a, b, loose) { + return compare(a, b, loose) >= 0 +} + +exports.lte = lte +function lte (a, b, loose) { + return compare(a, b, loose) <= 0 +} + +exports.cmp = cmp +function cmp (a, op, b, loose) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) +} + +var ANY = {} +Comparator.prototype.parse = function (comp) { + var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var m = comp.match(r) + + if (!m) { + throw new TypeError('Invalid comparator: ' + comp) + } + + this.operator = m[1] + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } +} + +Comparator.prototype.toString = function () { + return this.value +} + +Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY) { + return true + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + return cmp(version, this.operator, this.semver, this.options) +} + +Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + var rangeTmp + + if (this.operator === '') { + rangeTmp = new Range(comp.value, options) + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, options) + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + var sameSemVer = this.semver.version === comp.semver.version + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')) + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')) + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First, split based on boolean or || + this.raw = range + this.set = range.split(/\s*\|\|\s*/).map(function (range) { + return this.parseRange(range.trim()) + }, this).filter(function (c) { + // throw out any that are not relevant for whatever reason + return c.length + }) -if (true) { -exports.parser = spdxparse; -exports.Parser = spdxparse.Parser; -exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; -exports.main = function commonjsMain(args) { - if (!args[1]) { - console.log('Usage: '+args[0]+' FILE'); - process.exit(1); - } - var source = __webpack_require__(23).readFileSync(__webpack_require__(16).normalize(args[1]), "utf8"); - return exports.parser.parse(source); -}; -if ( true && __webpack_require__.c[__webpack_require__.s] === module) { - exports.main(process.argv.slice(1)); + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range) + } + + this.format() } + +Range.prototype.format = function () { + this.range = this.set.map(function (comps) { + return comps.join(' ').trim() + }).join('||').trim() + return this.range } -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) +Range.prototype.toString = function () { + return this.range +} -/***/ }), -/* 527 */ -/***/ (function(module, exports, __webpack_require__) { +Range.prototype.parseRange = function (range) { + var loose = this.options.loose + range = range.trim() + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] + range = range.replace(hr, hyphenReplace) + debug('hyphen replace', range) + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, re[COMPARATORTRIM]) -var licenseIDs = __webpack_require__(528); + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace) -function valid(string) { - return licenseIDs.indexOf(string) > -1; -} + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace) -// Common transpositions of license identifier acronyms -var transpositions = [ - ['APGL', 'AGPL'], - ['Gpl', 'GPL'], - ['GLP', 'GPL'], - ['APL', 'Apache'], - ['ISD', 'ISC'], - ['GLP', 'GPL'], - ['IST', 'ISC'], - ['Claude', 'Clause'], - [' or later', '+'], - [' International', ''], - ['GNU', 'GPL'], - ['GUN', 'GPL'], - ['+', ''], - ['GNU GPL', 'GPL'], - ['GNU/GPL', 'GPL'], - ['GNU GLP', 'GPL'], - ['GNU General Public License', 'GPL'], - ['Gnu public license', 'GPL'], - ['GNU Public License', 'GPL'], - ['GNU GENERAL PUBLIC LICENSE', 'GPL'], - ['MTI', 'MIT'], - ['Mozilla Public License', 'MPL'], - ['WTH', 'WTF'], - ['-License', ''] -]; + // normalize spaces + range = range.split(/\s+/).join(' ') -var TRANSPOSED = 0; -var CORRECT = 1; + // At this point, the range is completely trimmed and + // ready to be split into comparators. -// Simple corrections to nearly valid identifiers. -var transforms = [ - // e.g. 'mit' - function(argument) { - return argument.toUpperCase(); - }, - // e.g. 'MIT ' - function(argument) { - return argument.trim(); - }, - // e.g. 'M.I.T.' - function(argument) { - return argument.replace(/\./g, ''); - }, - // e.g. 'Apache- 2.0' - function(argument) { - return argument.replace(/\s+/g, ''); - }, - // e.g. 'CC BY 4.0'' - function(argument) { - return argument.replace(/\s+/g, '-'); - }, - // e.g. 'LGPLv2.1' - function(argument) { - return argument.replace('v', '-'); - }, - // e.g. 'Apache 2.0' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1'); - }, - // e.g. 'GPL 2' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1.0'); - }, - // e.g. 'Apache Version 2.0' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); - }, - // e.g. 'Apache Version 2' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); - }, - // e.g. 'ZLIB' - function(argument) { - return argument[0].toUpperCase() + argument.slice(1); - }, - // e.g. 'MPL/2.0' - function(argument) { - return argument.replace('/', '-'); - }, - // e.g. 'Apache 2' - function(argument) { - return argument - .replace(/\s*V\s*(\d)/, '-$1') - .replace(/(\d)$/, '$1.0'); - }, - // e.g. 'GPL-2.0-' - function(argument) { - return argument.slice(0, argument.length - 1); - }, - // e.g. 'GPL2' - function(argument) { - return argument.replace(/(\d)$/, '-$1.0'); - }, - // e.g. 'BSD 3' - function(argument) { - return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); - }, - // e.g. 'BSD clause 3' - function(argument) { - return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); - }, - // e.g. 'BY-NC-4.0' - function(argument) { - return 'CC-' + argument; - }, - // e.g. 'BY-NC' - function(argument) { - return 'CC-' + argument + '-4.0'; - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, ''); - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return 'CC-' + - argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, '') + - '-4.0'; + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var set = range.split(' ').map(function (comp) { + return parseComparator(comp, this.options) + }, this).join(' ').split(/\s+/) + if (this.options.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function (comp) { + return !!comp.match(compRe) + }) } -]; - -// If all else fails, guess that strings containing certain substrings -// meant to identify certain licenses. -var lastResorts = [ - ['UNLI', 'Unlicense'], - ['WTF', 'WTFPL'], - ['2 CLAUSE', 'BSD-2-Clause'], - ['2-CLAUSE', 'BSD-2-Clause'], - ['3 CLAUSE', 'BSD-3-Clause'], - ['3-CLAUSE', 'BSD-3-Clause'], - ['AFFERO', 'AGPL-3.0'], - ['AGPL', 'AGPL-3.0'], - ['APACHE', 'Apache-2.0'], - ['ARTISTIC', 'Artistic-2.0'], - ['Affero', 'AGPL-3.0'], - ['BEER', 'Beerware'], - ['BOOST', 'BSL-1.0'], - ['BSD', 'BSD-2-Clause'], - ['ECLIPSE', 'EPL-1.0'], - ['FUCK', 'WTFPL'], - ['GNU', 'GPL-3.0'], - ['LGPL', 'LGPL-3.0'], - ['GPL', 'GPL-3.0'], - ['MIT', 'MIT'], - ['MPL', 'MPL-2.0'], - ['X11', 'X11'], - ['ZLIB', 'Zlib'] -]; + set = set.map(function (comp) { + return new Comparator(comp, this.options) + }, this) -var SUBSTRING = 0; -var IDENTIFIER = 1; + return set +} -var validTransformation = function(identifier) { - for (var i = 0; i < transforms.length; i++) { - var transformed = transforms[i](identifier); - if (transformed !== identifier && valid(transformed)) { - return transformed; - } +Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') } - return null; -}; -var validLastResort = function(identifier) { - var upperCased = identifier.toUpperCase(); - for (var i = 0; i < lastResorts.length; i++) { - var lastResort = lastResorts[i]; - if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { - return lastResort[IDENTIFIER]; - } - } - return null; -}; + return this.set.some(function (thisComparators) { + return thisComparators.every(function (thisComparator) { + return range.set.some(function (rangeComparators) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + }) + }) +} -var anyCorrection = function(identifier, check) { - for (var i = 0; i < transpositions.length; i++) { - var transposition = transpositions[i]; - var transposed = transposition[TRANSPOSED]; - if (identifier.indexOf(transposed) > -1) { - var corrected = identifier.replace( - transposed, - transposition[CORRECT] - ); - var checked = check(corrected); - if (checked !== null) { - return checked; - } +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators +function toComparators (range, options) { + return new Range(range, options).set.map(function (comp) { + return comp.map(function (c) { + return c.value + }).join(' ').trim().split(' ') + }) +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator (comp, options) { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +function isX (id) { + return !id || id.toLowerCase() === 'x' || id === '*' +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') +} + +function replaceTilde (comp, options) { + var r = options.loose ? re[TILDELOOSE] : re[TILDE] + return comp.replace(r, function (_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else if (pr) { + debug('replaceTilde pr', pr) + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } else { + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' } - } - return null; -}; -module.exports = function(identifier) { - identifier = identifier.replace(/\+$/, ''); - if (valid(identifier)) { - return identifier; - } - var transformed = validTransformation(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, function(argument) { - if (valid(argument)) { - return argument; + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') +} + +function replaceCaret (comp, options) { + debug('caret', comp, options) + var r = options.loose ? re[CARETLOOSE] : re[CARET] + return comp.replace(r, function (_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + if (M === '0') { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else { + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + (+M + 1) + '.0.0' + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0' + } } - return validTransformation(argument); - }); - if (transformed !== null) { - return transformed; - } - transformed = validLastResort(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, validLastResort); - if (transformed !== null) { - return transformed; - } - return null; -}; + debug('caret return', ret) + return ret + }) +} -/***/ }), -/* 528 */ -/***/ (function(module) { +function replaceXRanges (comp, options) { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') +} -module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); +function replaceXRange (comp, options) { + comp = comp.trim() + var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] + return comp.replace(r, function (ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + var xM = isX(M) + var xm = xM || isX(m) + var xp = xm || isX(p) + var anyX = xp -/***/ }), -/* 529 */ -/***/ (function(module, exports, __webpack_require__) { + if (gtlt === '=' && anyX) { + gtlt = '' + } -"use strict"; + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 -var url = __webpack_require__(452) -var gitHosts = __webpack_require__(530) -var GitHost = module.exports = __webpack_require__(531) + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } -var protocolToRepresentationMap = { - 'git+ssh': 'sshurl', - 'git+https': 'https', - 'ssh': 'sshurl', - 'git': 'git' -} + ret = gtlt + M + '.' + m + '.' + p + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } -function protocolToRepresentation (protocol) { - if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) - return protocolToRepresentationMap[protocol] || protocol -} + debug('xRange return', ret) -var authProtocols = { - 'git:': true, - 'https:': true, - 'git+https:': true, - 'http:': true, - 'git+http:': true + return ret + }) } -var cache = {} +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars (comp, options) { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], '') +} -module.exports.fromUrl = function (giturl, opts) { - var key = giturl + JSON.stringify(opts || {}) +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = '>=' + fM + '.0.0' + } else if (isX(fp)) { + from = '>=' + fM + '.' + fm + '.0' + } else { + from = '>=' + from + } - if (!(key in cache)) { - cache[key] = fromUrl(giturl, opts) + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = '<' + (+tM + 1) + '.0.0' + } else if (isX(tp)) { + to = '<' + tM + '.' + (+tm + 1) + '.0' + } else if (tpr) { + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr + } else { + to = '<=' + to } - return cache[key] + return (from + ' ' + to).trim() } -function fromUrl (giturl, opts) { - if (giturl == null || giturl === '') return - var url = fixupUnqualifiedGist( - isGitHubShorthand(giturl) ? 'github:' + giturl : giturl - ) - var parsed = parseGitUrl(url) - var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) - var matches = Object.keys(gitHosts).map(function (gitHostName) { - try { - var gitHostInfo = gitHosts[gitHostName] - var auth = null - if (parsed.auth && authProtocols[parsed.protocol]) { - auth = decodeURIComponent(parsed.auth) - } - var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null - var user = null - var project = null - var defaultRepresentation = null - if (shortcutMatch && shortcutMatch[1] === gitHostName) { - user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) - project = decodeURIComponent(shortcutMatch[3]) - defaultRepresentation = 'shortcut' - } else { - if (parsed.host !== gitHostInfo.domain) return - if (!gitHostInfo.protocols_re.test(parsed.protocol)) return - if (!parsed.path) return - var pathmatch = gitHostInfo.pathmatch - var matched = parsed.path.match(pathmatch) - if (!matched) return - if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) - if (matched[2] != null) project = decodeURIComponent(matched[2]) - defaultRepresentation = protocolToRepresentation(parsed.protocol) - } - return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) - } catch (ex) { - if (!(ex instanceof URIError)) throw ex - } - }).filter(function (gitHostInfo) { return gitHostInfo }) - if (matches.length !== 1) return - return matches[0] -} +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function (version) { + if (!version) { + return false + } -function isGitHubShorthand (arg) { - // Note: This does not fully test the git ref format. - // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html - // - // The only way to do this properly would be to shell out to - // git-check-ref-format, and as this is a fast sync function, - // we don't want to do that. Just let git fail if it turns - // out that the commit-ish is invalid. - // GH usernames cannot start with . or - - return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) -} + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } -function fixupUnqualifiedGist (giturl) { - // necessary for round-tripping gists - var parsed = url.parse(giturl) - if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { - return parsed.protocol + '/' + parsed.host - } else { - return giturl + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } } + return false } -function parseGitUrl (giturl) { - if (typeof giturl !== 'string') giturl = '' + giturl - var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) - if (!matched) return url.parse(giturl) - return { - protocol: 'git+ssh:', - slashes: true, - auth: matched[1], - host: matched[2], - port: null, - hostname: matched[2], - hash: matched[4], - search: null, - query: null, - pathname: '/' + matched[3], - path: '/' + matched[3], - href: 'git+ssh://' + matched[1] + '@' + matched[2] + - '/' + matched[3] + (matched[4] || '') +function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } } -} + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === ANY) { + continue + } -/***/ }), -/* 530 */ -/***/ (function(module, exports, __webpack_require__) { + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } -"use strict"; + // Version has a -pre, but it's not one of the ones we like. + return false + } + return true +} -var gitHosts = module.exports = { - github: { - // First two are insecure and generally shouldn't be used any more, but - // they are still supported. - 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'github.com', - 'treepath': 'tree', - 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' - }, - bitbucket: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'bitbucket.org', - 'treepath': 'src', - 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' - }, - gitlab: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gitlab.com', - 'treepath': 'tree', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' - }, - gist: { - 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gist.github.com', - 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, - 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', - 'bugstemplate': 'https://{domain}/{project}', - 'gittemplate': 'git://{domain}/{project}.git{#committish}', - 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{project}{/committish}', - 'docstemplate': 'https://{domain}/{project}{/committish}', - 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', - 'shortcuttemplate': '{type}:{project}{#committish}', - 'pathtemplate': '{project}{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' +exports.satisfies = satisfies +function satisfies (version, range, options) { + try { + range = new Range(range, options) + } catch (er) { + return false } + return range.test(version) } -var gitHostDefaults = { - 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', - 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', - 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', - 'shortcuttemplate': '{type}:{user}/{project}{#committish}', - 'pathtemplate': '{user}/{project}{#committish}', - 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { + var max = null + var maxSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max } -Object.keys(gitHosts).forEach(function (name) { - Object.keys(gitHostDefaults).forEach(function (key) { - if (gitHosts[name][key]) return - gitHosts[name][key] = gitHostDefaults[key] +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { + var min = null + var minSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } }) - gitHosts[name].protocols_re = RegExp('^(' + - gitHosts[name].protocols.map(function (protocol) { - return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') - }).join('|') + '):$') -}) + return min +} +exports.minVersion = minVersion +function minVersion (range, loose) { + range = new Range(range, loose) -/***/ }), -/* 531 */ -/***/ (function(module, exports, __webpack_require__) { + var minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } -"use strict"; + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } -var gitHosts = __webpack_require__(530) -var extend = Object.assign || __webpack_require__(29)._extend + minver = null + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] -var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { - var gitHostInfo = this - gitHostInfo.type = type - Object.keys(gitHosts[type]).forEach(function (key) { - gitHostInfo[key] = gitHosts[type][key] - }) - gitHostInfo.user = user - gitHostInfo.auth = auth - gitHostInfo.project = project - gitHostInfo.committish = committish - gitHostInfo.default = defaultRepresentation - gitHostInfo.opts = opts || {} -} -GitHost.prototype = {} + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }) + } -GitHost.prototype.hash = function () { - return this.committish ? '#' + this.committish : '' + if (minver && range.test(minver)) { + return minver + } + + return null } -GitHost.prototype._fill = function (template, opts) { - if (!template) return - var vars = extend({}, opts) - opts = extend(extend({}, this.opts), opts) - var self = this - Object.keys(this).forEach(function (key) { - if (self[key] != null && vars[key] == null) vars[key] = self[key] - }) - var rawAuth = vars.auth - var rawComittish = vars.committish - Object.keys(vars).forEach(function (key) { - vars[key] = encodeURIComponent(vars[key]) - }) - vars['auth@'] = rawAuth ? rawAuth + '@' : '' - if (opts.noCommittish) { - vars['#committish'] = '' - vars['/tree/committish'] = '' - vars['/comittish'] = '' - vars.comittish = '' - } else { - vars['#committish'] = rawComittish ? '#' + rawComittish : '' - vars['/tree/committish'] = vars.committish - ? '/' + vars.treepath + '/' + vars.committish - : '' - vars['/committish'] = vars.committish ? '/' + vars.committish : '' - vars.committish = vars.committish || 'master' - } - var res = template - Object.keys(vars).forEach(function (key) { - res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) - }) - if (opts.noGitPlus) { - return res.replace(/^git[+]/, '') - } else { - return res +exports.validRange = validRange +function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null } } -GitHost.prototype.ssh = function (opts) { - return this._fill(this.sshtemplate, opts) +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr +function ltr (version, range, options) { + return outside(version, range, '<', options) } -GitHost.prototype.sshurl = function (opts) { - return this._fill(this.sshurltemplate, opts) +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { + return outside(version, range, '>', options) } -GitHost.prototype.browse = function (opts) { - return this._fill(this.browsetemplate, opts) -} +exports.outside = outside +function outside (version, range, hilo, options) { + version = new SemVer(version, options) + range = new Range(range, options) -GitHost.prototype.docs = function (opts) { - return this._fill(this.docstemplate, opts) -} + var gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } -GitHost.prototype.bugs = function (opts) { - return this._fill(this.bugstemplate, opts) -} + // If it satisifes the range it is not outside + if (satisfies(version, range, options)) { + return false + } -GitHost.prototype.https = function (opts) { - return this._fill(this.httpstemplate, opts) -} + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. -GitHost.prototype.git = function (opts) { - return this._fill(this.gittemplate, opts) -} + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] -GitHost.prototype.shortcut = function (opts) { - return this._fill(this.shortcuttemplate, opts) -} + var high = null + var low = null -GitHost.prototype.path = function (opts) { - return this._fill(this.pathtemplate, opts) -} + comparators.forEach(function (comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) -GitHost.prototype.tarball = function (opts) { - return this._fill(this.tarballtemplate, opts) + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true } -GitHost.prototype.file = function (P, opts) { - return this._fill(this.filetemplate, extend({ - path: P.replace(/^[/]+/g, '') - }, opts)) +exports.prerelease = prerelease +function prerelease (version, options) { + var parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null } -GitHost.prototype.getDefaultRepresentation = function () { - return this.default +exports.intersects = intersects +function intersects (r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) } -GitHost.prototype.toString = function (opts) { - return (this[this.default] || this.sshurl).call(this, opts) -} +exports.coerce = coerce +function coerce (version) { + if (version instanceof SemVer) { + return version + } + if (typeof version !== 'string') { + return null + } -/***/ }), -/* 532 */ -/***/ (function(module, exports, __webpack_require__) { + var match = version.match(re[COERCE]) -var core = __webpack_require__(533); -var async = __webpack_require__(535); -async.core = core; -async.isCore = function isCore(x) { return core[x]; }; -async.sync = __webpack_require__(540); + if (match == null) { + return null + } -exports = async; -module.exports = async; + return parse(match[1] + + '.' + (match[2] || '0') + + '.' + (match[3] || '0')) +} /***/ }), -/* 533 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { -var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; +var parse = __webpack_require__(525); +var correct = __webpack_require__(527); -function specifierIncluded(specifier) { - var parts = specifier.split(' '); - var op = parts.length > 1 ? parts[0] : '='; - var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); +var genericWarning = ( + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "' +); - for (var i = 0; i < 3; ++i) { - var cur = Number(current[i] || 0); - var ver = Number(versionParts[i] || 0); - if (cur === ver) { - continue; // eslint-disable-line no-restricted-syntax, no-continue - } - if (op === '<') { - return cur < ver; - } else if (op === '>=') { - return cur >= ver; - } else { - return false; - } - } - return op === '>='; -} +var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; -function matchesRange(range) { - var specifiers = range.split(/ ?&& ?/); - if (specifiers.length === 0) { return false; } - for (var i = 0; i < specifiers.length; ++i) { - if (!specifierIncluded(specifiers[i])) { return false; } - } - return true; +function startsWith(prefix, string) { + return string.slice(0, prefix.length) === prefix; } -function versionIncluded(specifierValue) { - if (typeof specifierValue === 'boolean') { return specifierValue; } - if (specifierValue && typeof specifierValue === 'object') { - for (var i = 0; i < specifierValue.length; ++i) { - if (matchesRange(specifierValue[i])) { return true; } - } - return false; - } - return matchesRange(specifierValue); +function usesLicenseRef(ast) { + if (ast.hasOwnProperty('license')) { + var license = ast.license; + return ( + startsWith('LicenseRef', license) || + startsWith('DocumentRef', license) + ); + } else { + return ( + usesLicenseRef(ast.left) || + usesLicenseRef(ast.right) + ); + } } -var data = __webpack_require__(534); +module.exports = function(argument) { + var ast; -var core = {}; -for (var mod in data) { // eslint-disable-line no-restricted-syntax - if (Object.prototype.hasOwnProperty.call(data, mod)) { - core[mod] = versionIncluded(data[mod]); + try { + ast = parse(argument); + } catch (e) { + var match + if ( + argument === 'UNLICENSED' || + argument === 'UNLICENCED' + ) { + return { + validForOldPackages: true, + validForNewPackages: true, + unlicensed: true + }; + } else if (match = fileReferenceRE.exec(argument)) { + return { + validForOldPackages: true, + validForNewPackages: true, + inFile: match[1] + }; + } else { + var result = { + validForOldPackages: false, + validForNewPackages: false, + warnings: [genericWarning] + }; + var corrected = correct(argument); + if (corrected) { + result.warnings.push( + 'license is similar to the valid expression "' + corrected + '"' + ); + } + return result; } -} -module.exports = core; + } + + if (usesLicenseRef(ast)) { + return { + validForNewPackages: false, + validForOldPackages: false, + spdx: true, + warnings: [genericWarning] + }; + } else { + return { + validForNewPackages: true, + validForOldPackages: true, + spdx: true + }; + } +}; /***/ }), -/* 534 */ -/***/ (function(module) { +/* 525 */ +/***/ (function(module, exports, __webpack_require__) { + +var parser = __webpack_require__(526).parser + +module.exports = function (argument) { + return parser.parse(argument) +} -module.exports = JSON.parse("{\"assert\":true,\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debugger\":\"< 8\",\"dgram\":true,\"dns\":true,\"domain\":true,\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":\">= 10 && < 10.1\",\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0\",\"os\":true,\"path\":true,\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"string_decoder\":true,\"sys\":true,\"timers\":true,\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"v8/tools/arguments\":\">= 10\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8\":\">= 1\",\"vm\":true,\"worker_threads\":\">= 11.7\",\"zlib\":true}"); /***/ }), -/* 535 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { -var core = __webpack_require__(533); -var fs = __webpack_require__(23); -var path = __webpack_require__(16); -var caller = __webpack_require__(536); -var nodeModulesPaths = __webpack_require__(537); -var normalizeOptions = __webpack_require__(539); +/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ +/* + Returns a Parser object of the following structure: -var defaultIsFile = function isFile(file, cb) { - fs.stat(file, function (err, stat) { - if (!err) { - return cb(null, stat.isFile() || stat.isFIFO()); - } - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); - return cb(err); - }); -}; + Parser: { + yy: {} + } -module.exports = function resolve(x, options, callback) { - var cb = callback; - var opts = options; - if (typeof options === 'function') { - cb = opts; - opts = {}; - } - if (typeof x !== 'string') { - var err = new TypeError('Path must be a string.'); - return process.nextTick(function () { - cb(err); - }); + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, } + } - opts = normalizeOptions(x, opts); - var isFile = opts.isFile || defaultIsFile; - var readFile = opts.readFile || fs.readFile; + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } - var extensions = opts.extensions || ['.js']; - var basedir = opts.basedir || path.dirname(caller()); - var parent = opts.filename || basedir; - opts.paths = opts.paths || []; + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var spdxparse = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, +terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, +productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ - // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory - var absoluteStart = path.resolve(basedir); +var $0 = $$.length - 1; +switch (yystate) { +case 1: +return this.$ = $$[$0-1] +break; +case 2: case 4: case 5: +this.$ = {license: yytext} +break; +case 3: +this.$ = {license: $$[$0-1], plus: true} +break; +case 6: +this.$ = $$[$0] +break; +case 7: +this.$ = {exception: $$[$0]} +this.$.license = $$[$0-2].license +if ($$[$0-2].hasOwnProperty('plus')) { + this.$.plus = $$[$0-2].plus +} +break; +case 8: +this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} +break; +case 9: +this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} +break; +case 10: +this.$ = $$[$0-1] +break; +} +}, +table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], +defaultActions: {8:[2,1]}, +parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + function _parseError (msg, hash) { + this.message = msg; + this.hash = hash; + } + _parseError.prototype = Error; - if (opts.preserveSymlinks === false) { - fs.realpath(absoluteStart, function (realPathErr, realStart) { - if (realPathErr && realPathErr.code !== 'ENOENT') cb(err); - else init(realPathErr ? absoluteStart : realStart); - }); + throw new _parseError(str, hash); + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; } else { - init(absoluteStart); + this.parseError = Object.getPrototypeOf(this).parseError; } - - var res; - function init(basedir) { - if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { - res = path.resolve(basedir, x); - if (x === '..' || x.slice(-1) === '/') res += '/'; - if ((/\/$/).test(x) && res === basedir) { - loadAsDirectory(res, opts.package, onfile); - } else loadAsFile(res, opts.package, onfile); - } else loadNodeModules(x, basedir, function (err, n, pkg) { - if (err) cb(err); - else if (n) cb(null, n, pkg); - else if (core[x]) return cb(null, x); - else { - var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - moduleError.code = 'MODULE_NOT_FOUND'; - cb(moduleError); - } - }); + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; } - - function onfile(err, m, pkg) { - if (err) cb(err); - else if (m) cb(null, m, pkg); - else loadAsDirectory(res, function (err, d, pkg) { - if (err) cb(err); - else if (d) cb(null, d, pkg); - else { - var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - moduleError.code = 'MODULE_NOT_FOUND'; - cb(moduleError); + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; } - }); + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } } + return true; +}}; +/* generated by jison-lex 0.3.4 */ +var lexer = (function(){ +var lexer = ({ + +EOF:1, + +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; + return this; + }, - function loadAsFile(x, thePackage, callback) { - var loadAsFilePackage = thePackage; - var cb = callback; - if (typeof loadAsFilePackage === 'function') { - cb = loadAsFilePackage; - loadAsFilePackage = undefined; +// consumes and returns one char from the input +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; } - var exts = [''].concat(extensions); - load(exts, x, loadAsFilePackage); + this._input = this._input.slice(1); + return ch; + }, - function load(exts, x, loadPackage) { - if (exts.length === 0) return cb(null, undefined, loadPackage); - var file = x + exts[0]; +// unshifts one char (or a string) into the input +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); - var pkg = loadPackage; - if (pkg) onpkg(null, pkg); - else loadpkg(path.dirname(file), onpkg); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); - function onpkg(err, pkg_, dir) { - pkg = pkg_; - if (err) return cb(err); - if (dir && pkg && opts.pathFilter) { - var rfile = path.relative(dir, file); - var rel = rfile.slice(0, rfile.length - exts[0].length); - var r = opts.pathFilter(pkg, x, rel); - if (r) return load( - [''].concat(extensions.slice()), - path.resolve(dir, r), - pkg - ); - } - isFile(file, onex); - } - function onex(err, ex) { - if (err) return cb(err); - if (ex) return cb(null, file, pkg); - load(exts.slice(1), x, pkg); - } + if (lines.length - 1) { + this.yylineno -= lines.length - 1; } - } + var r = this.yylloc.range; - function loadpkg(dir, cb) { - if (dir === '' || dir === '/') return cb(null); - if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { - return cb(null); - } - if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; - var pkgfile = path.join(dir, 'package.json'); - isFile(pkgfile, function (err, ex) { - // on err, ex is false - if (!ex) return loadpkg(path.dirname(dir), cb); + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, - readFile(pkgfile, function (err, body) { - if (err) cb(err); - try { var pkg = JSON.parse(body); } catch (jsonErr) {} +// When called from action, caches matched text and appends it on next action +more:function () { + this._more = true; + return this; + }, - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - cb(null, pkg, dir); +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno }); - }); - } - function loadAsDirectory(x, loadAsDirectoryPackage, callback) { - var cb = callback; - var fpkg = loadAsDirectoryPackage; - if (typeof fpkg === 'function') { - cb = fpkg; - fpkg = opts.package; } + return this; + }, - var pkgfile = path.join(x, 'package.json'); - isFile(pkgfile, function (err, ex) { - if (err) return cb(err); - if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); - - readFile(pkgfile, function (err, body) { - if (err) return cb(err); - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} - - if (opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - - if (pkg.main) { - if (typeof pkg.main !== 'string') { - var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); - mainError.code = 'INVALID_PACKAGE_MAIN'; - return cb(mainError); - } - if (pkg.main === '.' || pkg.main === './') { - pkg.main = 'index'; - } - loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); +// retain first n characters of the match +less:function (n) { + this.unput(this.match.slice(n)); + }, - var dir = path.resolve(x, pkg.main); - loadAsDirectory(dir, pkg, function (err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - loadAsFile(path.join(x, 'index'), pkg, cb); - }); - }); - return; - } +// displays already matched input, i.e. for error messages +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, - loadAsFile(path.join(x, '/index'), pkg, cb); - }); - }); - } +// displays upcoming input, i.e. for error messages +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, - function processDirs(cb, dirs) { - if (dirs.length === 0) return cb(null, undefined); - var dir = dirs[0]; +// displays the character position where the lexing error occurred, i.e. for error messages +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, - var file = path.join(dir, x); - loadAsFile(file, opts.package, onfile); +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function (match, indexed_rule) { + var token, + lines, + backup; - function onfile(err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - loadAsDirectory(path.join(dir, x), opts.package, ondir); + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } } - function ondir(err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - processDirs(cb, dirs.slice(1)); + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; } - } - function loadNodeModules(x, start, cb) { - processDirs(cb, nodeModulesPaths(start, opts, x)); - } -}; + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; + }, +// return next match in input +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } -/***/ }), -/* 536 */ -/***/ (function(module, exports) { + var token, + match, + tempMatch, + index; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, -module.exports = function () { - // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi - var origPrepareStackTrace = Error.prepareStackTrace; - Error.prepareStackTrace = function (_, stack) { return stack; }; - var stack = (new Error()).stack; - Error.prepareStackTrace = origPrepareStackTrace; - return stack[2].getFileName(); -}; +// return next match that has a token +lex:function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin(condition) { + this.conditionStack.push(condition); + }, -/***/ }), -/* 537 */ -/***/ (function(module, exports, __webpack_require__) { +// pop the previously active lexer condition state off the condition stack +popState:function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, -var path = __webpack_require__(16); -var parse = path.parse || __webpack_require__(538); +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, -var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { - var prefix = '/'; - if ((/^([A-Za-z]:)/).test(absoluteStart)) { - prefix = ''; - } else if ((/^\\\\/).test(absoluteStart)) { - prefix = '\\\\'; - } +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, - var paths = [absoluteStart]; - var parsed = parse(absoluteStart); - while (parsed.dir !== paths[paths.length - 1]) { - paths.push(parsed.dir); - parsed = parse(parsed.dir); - } +// alias for begin(condition) +pushState:function pushState(condition) { + this.begin(condition); + }, - return paths.reduce(function (dirs, aPath) { - return dirs.concat(modules.map(function (moduleDir) { - return path.join(prefix, aPath, moduleDir); - })); - }, []); -}; +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; +switch($avoiding_name_collisions) { +case 0:return 5 +break; +case 1:/* skip whitespace */ +break; +case 2:return 8 +break; +case 3:return 16 +break; +case 4:return 17 +break; +case 5:return 11 +break; +case 6:return 10 +break; +case 7:return 9 +break; +case 8:return 14 +break; +case 9:return 15 +break; +case 10:return 12 +break; +case 11:return 7 +break; +case 12:return 7 +break; +case 13:return 7 +break; +case 14:return 7 +break; +case 15:return 7 +break; +case 16:return 7 +break; +case 17:return 7 +break; +case 18:return 7 +break; +case 19:return 7 +break; +case 20:return 7 +break; +case 21:return 7 +break; +case 22:return 7 +break; +case 23:return 7 +break; +case 24:return 13 +break; +case 25:return 13 +break; +case 26:return 13 +break; +case 27:return 13 +break; +case 28:return 13 +break; +case 29:return 13 +break; +case 30:return 13 +break; +case 31:return 13 +break; +case 32:return 7 +break; +case 33:return 13 +break; +case 34:return 7 +break; +case 35:return 13 +break; +case 36:return 7 +break; +case 37:return 13 +break; +case 38:return 13 +break; +case 39:return 7 +break; +case 40:return 13 +break; +case 41:return 13 +break; +case 42:return 13 +break; +case 43:return 13 +break; +case 44:return 13 +break; +case 45:return 7 +break; +case 46:return 13 +break; +case 47:return 7 +break; +case 48:return 7 +break; +case 49:return 7 +break; +case 50:return 7 +break; +case 51:return 7 +break; +case 52:return 7 +break; +case 53:return 7 +break; +case 54:return 7 +break; +case 55:return 7 +break; +case 56:return 7 +break; +case 57:return 7 +break; +case 58:return 7 +break; +case 59:return 7 +break; +case 60:return 7 +break; +case 61:return 7 +break; +case 62:return 7 +break; +case 63:return 13 +break; +case 64:return 7 +break; +case 65:return 7 +break; +case 66:return 13 +break; +case 67:return 7 +break; +case 68:return 7 +break; +case 69:return 7 +break; +case 70:return 7 +break; +case 71:return 7 +break; +case 72:return 7 +break; +case 73:return 13 +break; +case 74:return 7 +break; +case 75:return 13 +break; +case 76:return 7 +break; +case 77:return 7 +break; +case 78:return 7 +break; +case 79:return 7 +break; +case 80:return 7 +break; +case 81:return 7 +break; +case 82:return 7 +break; +case 83:return 7 +break; +case 84:return 7 +break; +case 85:return 7 +break; +case 86:return 7 +break; +case 87:return 7 +break; +case 88:return 7 +break; +case 89:return 7 +break; +case 90:return 7 +break; +case 91:return 7 +break; +case 92:return 7 +break; +case 93:return 7 +break; +case 94:return 7 +break; +case 95:return 7 +break; +case 96:return 7 +break; +case 97:return 7 +break; +case 98:return 7 +break; +case 99:return 7 +break; +case 100:return 7 +break; +case 101:return 7 +break; +case 102:return 7 +break; +case 103:return 7 +break; +case 104:return 7 +break; +case 105:return 7 +break; +case 106:return 7 +break; +case 107:return 7 +break; +case 108:return 7 +break; +case 109:return 7 +break; +case 110:return 7 +break; +case 111:return 7 +break; +case 112:return 7 +break; +case 113:return 7 +break; +case 114:return 7 +break; +case 115:return 7 +break; +case 116:return 7 +break; +case 117:return 7 +break; +case 118:return 7 +break; +case 119:return 7 +break; +case 120:return 7 +break; +case 121:return 7 +break; +case 122:return 7 +break; +case 123:return 7 +break; +case 124:return 7 +break; +case 125:return 7 +break; +case 126:return 7 +break; +case 127:return 7 +break; +case 128:return 7 +break; +case 129:return 7 +break; +case 130:return 7 +break; +case 131:return 7 +break; +case 132:return 7 +break; +case 133:return 7 +break; +case 134:return 7 +break; +case 135:return 7 +break; +case 136:return 7 +break; +case 137:return 7 +break; +case 138:return 7 +break; +case 139:return 7 +break; +case 140:return 7 +break; +case 141:return 7 +break; +case 142:return 7 +break; +case 143:return 7 +break; +case 144:return 7 +break; +case 145:return 7 +break; +case 146:return 7 +break; +case 147:return 7 +break; +case 148:return 7 +break; +case 149:return 7 +break; +case 150:return 7 +break; +case 151:return 7 +break; +case 152:return 7 +break; +case 153:return 7 +break; +case 154:return 7 +break; +case 155:return 7 +break; +case 156:return 7 +break; +case 157:return 7 +break; +case 158:return 7 +break; +case 159:return 7 +break; +case 160:return 7 +break; +case 161:return 7 +break; +case 162:return 7 +break; +case 163:return 7 +break; +case 164:return 7 +break; +case 165:return 7 +break; +case 166:return 7 +break; +case 167:return 7 +break; +case 168:return 7 +break; +case 169:return 7 +break; +case 170:return 7 +break; +case 171:return 7 +break; +case 172:return 7 +break; +case 173:return 7 +break; +case 174:return 7 +break; +case 175:return 7 +break; +case 176:return 7 +break; +case 177:return 7 +break; +case 178:return 7 +break; +case 179:return 7 +break; +case 180:return 7 +break; +case 181:return 7 +break; +case 182:return 7 +break; +case 183:return 7 +break; +case 184:return 7 +break; +case 185:return 7 +break; +case 186:return 7 +break; +case 187:return 7 +break; +case 188:return 7 +break; +case 189:return 7 +break; +case 190:return 7 +break; +case 191:return 7 +break; +case 192:return 7 +break; +case 193:return 7 +break; +case 194:return 7 +break; +case 195:return 7 +break; +case 196:return 7 +break; +case 197:return 7 +break; +case 198:return 7 +break; +case 199:return 7 +break; +case 200:return 7 +break; +case 201:return 7 +break; +case 202:return 7 +break; +case 203:return 7 +break; +case 204:return 7 +break; +case 205:return 7 +break; +case 206:return 7 +break; +case 207:return 7 +break; +case 208:return 7 +break; +case 209:return 7 +break; +case 210:return 7 +break; +case 211:return 7 +break; +case 212:return 7 +break; +case 213:return 7 +break; +case 214:return 7 +break; +case 215:return 7 +break; +case 216:return 7 +break; +case 217:return 7 +break; +case 218:return 7 +break; +case 219:return 7 +break; +case 220:return 7 +break; +case 221:return 7 +break; +case 222:return 7 +break; +case 223:return 7 +break; +case 224:return 7 +break; +case 225:return 7 +break; +case 226:return 7 +break; +case 227:return 7 +break; +case 228:return 7 +break; +case 229:return 7 +break; +case 230:return 7 +break; +case 231:return 7 +break; +case 232:return 7 +break; +case 233:return 7 +break; +case 234:return 7 +break; +case 235:return 7 +break; +case 236:return 7 +break; +case 237:return 7 +break; +case 238:return 7 +break; +case 239:return 7 +break; +case 240:return 7 +break; +case 241:return 7 +break; +case 242:return 7 +break; +case 243:return 7 +break; +case 244:return 7 +break; +case 245:return 7 +break; +case 246:return 7 +break; +case 247:return 7 +break; +case 248:return 7 +break; +case 249:return 7 +break; +case 250:return 7 +break; +case 251:return 7 +break; +case 252:return 7 +break; +case 253:return 7 +break; +case 254:return 7 +break; +case 255:return 7 +break; +case 256:return 7 +break; +case 257:return 7 +break; +case 258:return 7 +break; +case 259:return 7 +break; +case 260:return 7 +break; +case 261:return 7 +break; +case 262:return 7 +break; +case 263:return 7 +break; +case 264:return 7 +break; +case 265:return 7 +break; +case 266:return 7 +break; +case 267:return 7 +break; +case 268:return 7 +break; +case 269:return 7 +break; +case 270:return 7 +break; +case 271:return 7 +break; +case 272:return 7 +break; +case 273:return 7 +break; +case 274:return 7 +break; +case 275:return 7 +break; +case 276:return 7 +break; +case 277:return 7 +break; +case 278:return 7 +break; +case 279:return 7 +break; +case 280:return 7 +break; +case 281:return 7 +break; +case 282:return 7 +break; +case 283:return 7 +break; +case 284:return 7 +break; +case 285:return 7 +break; +case 286:return 7 +break; +case 287:return 7 +break; +case 288:return 7 +break; +case 289:return 7 +break; +case 290:return 7 +break; +case 291:return 7 +break; +case 292:return 7 +break; +case 293:return 7 +break; +case 294:return 7 +break; +case 295:return 7 +break; +case 296:return 7 +break; +case 297:return 7 +break; +case 298:return 7 +break; +case 299:return 7 +break; +case 300:return 7 +break; +case 301:return 7 +break; +case 302:return 7 +break; +case 303:return 7 +break; +case 304:return 7 +break; +case 305:return 7 +break; +case 306:return 7 +break; +case 307:return 7 +break; +case 308:return 7 +break; +case 309:return 7 +break; +case 310:return 7 +break; +case 311:return 7 +break; +case 312:return 7 +break; +case 313:return 7 +break; +case 314:return 7 +break; +case 315:return 7 +break; +case 316:return 7 +break; +case 317:return 7 +break; +case 318:return 7 +break; +case 319:return 7 +break; +case 320:return 7 +break; +case 321:return 7 +break; +case 322:return 7 +break; +case 323:return 7 +break; +case 324:return 7 +break; +case 325:return 7 +break; +case 326:return 7 +break; +case 327:return 7 +break; +case 328:return 7 +break; +case 329:return 7 +break; +case 330:return 7 +break; +case 331:return 7 +break; +case 332:return 7 +break; +case 333:return 7 +break; +case 334:return 7 +break; +case 335:return 7 +break; +case 336:return 7 +break; +case 337:return 7 +break; +case 338:return 7 +break; +case 339:return 7 +break; +case 340:return 7 +break; +case 341:return 7 +break; +case 342:return 7 +break; +case 343:return 7 +break; +case 344:return 7 +break; +case 345:return 7 +break; +case 346:return 7 +break; +case 347:return 7 +break; +case 348:return 7 +break; +case 349:return 7 +break; +case 350:return 7 +break; +case 351:return 7 +break; +case 352:return 7 +break; +case 353:return 7 +break; +case 354:return 7 +break; +case 355:return 7 +break; +case 356:return 7 +break; +case 357:return 7 +break; +case 358:return 7 +break; +case 359:return 7 +break; +case 360:return 7 +break; +case 361:return 7 +break; +case 362:return 7 +break; +case 363:return 7 +break; +case 364:return 7 +break; +} +}, +rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} +}); +return lexer; +})(); +parser.lexer = lexer; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); -module.exports = function nodeModulesPaths(start, opts, request) { - var modules = opts && opts.moduleDirectory - ? [].concat(opts.moduleDirectory) - : ['node_modules']; - if (opts && typeof opts.paths === 'function') { - return opts.paths( - request, - start, - function () { return getNodeModulesDirs(start, modules); }, - opts - ); +if (true) { +exports.parser = spdxparse; +exports.Parser = spdxparse.Parser; +exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; +exports.main = function commonjsMain(args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); } - - var dirs = getNodeModulesDirs(start, modules); - return opts && opts.paths ? dirs.concat(opts.paths) : dirs; + var source = __webpack_require__(349).readFileSync(__webpack_require__(4).normalize(args[1]), "utf8"); + return exports.parser.parse(source); }; - - -/***/ }), -/* 538 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var isWindows = process.platform === 'win32'; - -// Regex to split a windows path into three parts: [*, device, slash, -// tail] windows-only -var splitDeviceRe = - /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - -// Regex to split the tail part of the above into [*, dir, basename, ext] -var splitTailRe = - /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; - -var win32 = {}; - -// Function to split a filename into [root, dir, basename, ext] -function win32SplitPath(filename) { - // Separate device+slash from tail - var result = splitDeviceRe.exec(filename), - device = (result[1] || '') + (result[2] || ''), - tail = result[3] || ''; - // Split the tail into dir, basename and extension - var result2 = splitTailRe.exec(tail), - dir = result2[1], - basename = result2[2], - ext = result2[3]; - return [device, dir, basename, ext]; +if ( true && __webpack_require__.c[__webpack_require__.s] === module) { + exports.main(process.argv.slice(1)); } - -win32.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = win32SplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; - - - -// Split a filename into [root, dir, basename, ext], unix version -// 'root' is just a slash, or nothing. -var splitPathRe = - /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; -var posix = {}; - - -function posixSplitPath(filename) { - return splitPathRe.exec(filename).slice(1); } - -posix.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = posixSplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - allParts[1] = allParts[1] || ''; - allParts[2] = allParts[2] || ''; - allParts[3] = allParts[3] || ''; - - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; - - -if (isWindows) - module.exports = win32.parse; -else /* posix */ - module.exports = posix.parse; - -module.exports.posix = posix.parse; -module.exports.win32 = win32.parse; - - -/***/ }), -/* 539 */ -/***/ (function(module, exports) { - -module.exports = function (x, opts) { - /** - * This file is purposefully a passthrough. It's expected that third-party - * environments will override it at runtime in order to inject special logic - * into `resolve` (by manipulating the options). One such example is the PnP - * code path in Yarn. - */ - - return opts || {}; -}; - +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) /***/ }), -/* 540 */ +/* 527 */ /***/ (function(module, exports, __webpack_require__) { -var core = __webpack_require__(533); -var fs = __webpack_require__(23); -var path = __webpack_require__(16); -var caller = __webpack_require__(536); -var nodeModulesPaths = __webpack_require__(537); -var normalizeOptions = __webpack_require__(539); - -var defaultIsFile = function isFile(file) { - try { - var stat = fs.statSync(file); - } catch (e) { - if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; - throw e; - } - return stat.isFile() || stat.isFIFO(); -}; - -module.exports = function (x, options) { - if (typeof x !== 'string') { - throw new TypeError('Path must be a string.'); - } - var opts = normalizeOptions(x, options); - - var isFile = opts.isFile || defaultIsFile; - var readFileSync = opts.readFileSync || fs.readFileSync; - - var extensions = opts.extensions || ['.js']; - var basedir = opts.basedir || path.dirname(caller()); - var parent = opts.filename || basedir; - - opts.paths = opts.paths || []; +var licenseIDs = __webpack_require__(528); - // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory - var absoluteStart = path.resolve(basedir); +function valid(string) { + return licenseIDs.indexOf(string) > -1; +} - if (opts.preserveSymlinks === false) { - try { - absoluteStart = fs.realpathSync(absoluteStart); - } catch (realPathErr) { - if (realPathErr.code !== 'ENOENT') { - throw realPathErr; - } - } - } +// Common transpositions of license identifier acronyms +var transpositions = [ + ['APGL', 'AGPL'], + ['Gpl', 'GPL'], + ['GLP', 'GPL'], + ['APL', 'Apache'], + ['ISD', 'ISC'], + ['GLP', 'GPL'], + ['IST', 'ISC'], + ['Claude', 'Clause'], + [' or later', '+'], + [' International', ''], + ['GNU', 'GPL'], + ['GUN', 'GPL'], + ['+', ''], + ['GNU GPL', 'GPL'], + ['GNU/GPL', 'GPL'], + ['GNU GLP', 'GPL'], + ['GNU General Public License', 'GPL'], + ['Gnu public license', 'GPL'], + ['GNU Public License', 'GPL'], + ['GNU GENERAL PUBLIC LICENSE', 'GPL'], + ['MTI', 'MIT'], + ['Mozilla Public License', 'MPL'], + ['WTH', 'WTF'], + ['-License', ''] +]; - if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { - var res = path.resolve(absoluteStart, x); - if (x === '..' || x.slice(-1) === '/') res += '/'; - var m = loadAsFileSync(res) || loadAsDirectorySync(res); - if (m) return m; - } else { - var n = loadNodeModulesSync(x, absoluteStart); - if (n) return n; - } +var TRANSPOSED = 0; +var CORRECT = 1; - if (core[x]) return x; +// Simple corrections to nearly valid identifiers. +var transforms = [ + // e.g. 'mit' + function(argument) { + return argument.toUpperCase(); + }, + // e.g. 'MIT ' + function(argument) { + return argument.trim(); + }, + // e.g. 'M.I.T.' + function(argument) { + return argument.replace(/\./g, ''); + }, + // e.g. 'Apache- 2.0' + function(argument) { + return argument.replace(/\s+/g, ''); + }, + // e.g. 'CC BY 4.0'' + function(argument) { + return argument.replace(/\s+/g, '-'); + }, + // e.g. 'LGPLv2.1' + function(argument) { + return argument.replace('v', '-'); + }, + // e.g. 'Apache 2.0' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1'); + }, + // e.g. 'GPL 2' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1.0'); + }, + // e.g. 'Apache Version 2.0' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); + }, + // e.g. 'Apache Version 2' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); + }, + // e.g. 'ZLIB' + function(argument) { + return argument[0].toUpperCase() + argument.slice(1); + }, + // e.g. 'MPL/2.0' + function(argument) { + return argument.replace('/', '-'); + }, + // e.g. 'Apache 2' + function(argument) { + return argument + .replace(/\s*V\s*(\d)/, '-$1') + .replace(/(\d)$/, '$1.0'); + }, + // e.g. 'GPL-2.0-' + function(argument) { + return argument.slice(0, argument.length - 1); + }, + // e.g. 'GPL2' + function(argument) { + return argument.replace(/(\d)$/, '-$1.0'); + }, + // e.g. 'BSD 3' + function(argument) { + return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); + }, + // e.g. 'BSD clause 3' + function(argument) { + return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); + }, + // e.g. 'BY-NC-4.0' + function(argument) { + return 'CC-' + argument; + }, + // e.g. 'BY-NC' + function(argument) { + return 'CC-' + argument + '-4.0'; + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, ''); + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return 'CC-' + + argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + + '-4.0'; + } +]; - var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - err.code = 'MODULE_NOT_FOUND'; - throw err; +// If all else fails, guess that strings containing certain substrings +// meant to identify certain licenses. +var lastResorts = [ + ['UNLI', 'Unlicense'], + ['WTF', 'WTFPL'], + ['2 CLAUSE', 'BSD-2-Clause'], + ['2-CLAUSE', 'BSD-2-Clause'], + ['3 CLAUSE', 'BSD-3-Clause'], + ['3-CLAUSE', 'BSD-3-Clause'], + ['AFFERO', 'AGPL-3.0'], + ['AGPL', 'AGPL-3.0'], + ['APACHE', 'Apache-2.0'], + ['ARTISTIC', 'Artistic-2.0'], + ['Affero', 'AGPL-3.0'], + ['BEER', 'Beerware'], + ['BOOST', 'BSL-1.0'], + ['BSD', 'BSD-2-Clause'], + ['ECLIPSE', 'EPL-1.0'], + ['FUCK', 'WTFPL'], + ['GNU', 'GPL-3.0'], + ['LGPL', 'LGPL-3.0'], + ['GPL', 'GPL-3.0'], + ['MIT', 'MIT'], + ['MPL', 'MPL-2.0'], + ['X11', 'X11'], + ['ZLIB', 'Zlib'] +]; - function loadAsFileSync(x) { - var pkg = loadpkg(path.dirname(x)); +var SUBSTRING = 0; +var IDENTIFIER = 1; - if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { - var rfile = path.relative(pkg.dir, x); - var r = opts.pathFilter(pkg.pkg, x, rfile); - if (r) { - x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign - } - } +var validTransformation = function(identifier) { + for (var i = 0; i < transforms.length; i++) { + var transformed = transforms[i](identifier); + if (transformed !== identifier && valid(transformed)) { + return transformed; + } + } + return null; +}; - if (isFile(x)) { - return x; - } +var validLastResort = function(identifier) { + var upperCased = identifier.toUpperCase(); + for (var i = 0; i < lastResorts.length; i++) { + var lastResort = lastResorts[i]; + if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { + return lastResort[IDENTIFIER]; + } + } + return null; +}; - for (var i = 0; i < extensions.length; i++) { - var file = x + extensions[i]; - if (isFile(file)) { - return file; - } - } +var anyCorrection = function(identifier, check) { + for (var i = 0; i < transpositions.length; i++) { + var transposition = transpositions[i]; + var transposed = transposition[TRANSPOSED]; + if (identifier.indexOf(transposed) > -1) { + var corrected = identifier.replace( + transposed, + transposition[CORRECT] + ); + var checked = check(corrected); + if (checked !== null) { + return checked; + } } + } + return null; +}; - function loadpkg(dir) { - if (dir === '' || dir === '/') return; - if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { - return; - } - if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; +module.exports = function(identifier) { + identifier = identifier.replace(/\+$/, ''); + if (valid(identifier)) { + return identifier; + } + var transformed = validTransformation(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, function(argument) { + if (valid(argument)) { + return argument; + } + return validTransformation(argument); + }); + if (transformed !== null) { + return transformed; + } + transformed = validLastResort(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, validLastResort); + if (transformed !== null) { + return transformed; + } + return null; +}; - var pkgfile = path.join(dir, 'package.json'); - if (!isFile(pkgfile)) { - return loadpkg(path.dirname(dir)); - } +/***/ }), +/* 528 */ +/***/ (function(module) { - var body = readFileSync(pkgfile); +module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} +/***/ }), +/* 529 */ +/***/ (function(module, exports, __webpack_require__) { - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, dir); - } +"use strict"; - return { pkg: pkg, dir: dir }; - } +var url = __webpack_require__(439) +var gitHosts = __webpack_require__(530) +var GitHost = module.exports = __webpack_require__(531) - function loadAsDirectorySync(x) { - var pkgfile = path.join(x, '/package.json'); - if (isFile(pkgfile)) { - try { - var body = readFileSync(pkgfile, 'UTF8'); - var pkg = JSON.parse(body); - } catch (e) {} +var protocolToRepresentationMap = { + 'git+ssh': 'sshurl', + 'git+https': 'https', + 'ssh': 'sshurl', + 'git': 'git' +} - if (opts.packageFilter) { - pkg = opts.packageFilter(pkg, x); - } +function protocolToRepresentation (protocol) { + if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) + return protocolToRepresentationMap[protocol] || protocol +} - if (pkg.main) { - if (typeof pkg.main !== 'string') { - var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); - mainError.code = 'INVALID_PACKAGE_MAIN'; - throw mainError; - } - if (pkg.main === '.' || pkg.main === './') { - pkg.main = 'index'; - } - try { - var m = loadAsFileSync(path.resolve(x, pkg.main)); - if (m) return m; - var n = loadAsDirectorySync(path.resolve(x, pkg.main)); - if (n) return n; - } catch (e) {} - } - } +var authProtocols = { + 'git:': true, + 'https:': true, + 'git+https:': true, + 'http:': true, + 'git+http:': true +} - return loadAsFileSync(path.join(x, '/index')); - } +var cache = {} - function loadNodeModulesSync(x, start) { - var dirs = nodeModulesPaths(start, opts, x); - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - var m = loadAsFileSync(path.join(dir, '/', x)); - if (m) return m; - var n = loadAsDirectorySync(path.join(dir, '/', x)); - if (n) return n; - } - } -}; +module.exports.fromUrl = function (giturl, opts) { + var key = giturl + JSON.stringify(opts || {}) + if (!(key in cache)) { + cache[key] = fromUrl(giturl, opts) + } -/***/ }), -/* 541 */ -/***/ (function(module, exports) { + return cache[key] +} -module.exports = extractDescription +function fromUrl (giturl, opts) { + if (giturl == null || giturl === '') return + var url = fixupUnqualifiedGist( + isGitHubShorthand(giturl) ? 'github:' + giturl : giturl + ) + var parsed = parseGitUrl(url) + var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) + var matches = Object.keys(gitHosts).map(function (gitHostName) { + try { + var gitHostInfo = gitHosts[gitHostName] + var auth = null + if (parsed.auth && authProtocols[parsed.protocol]) { + auth = decodeURIComponent(parsed.auth) + } + var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null + var user = null + var project = null + var defaultRepresentation = null + if (shortcutMatch && shortcutMatch[1] === gitHostName) { + user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) + project = decodeURIComponent(shortcutMatch[3]) + defaultRepresentation = 'shortcut' + } else { + if (parsed.host !== gitHostInfo.domain) return + if (!gitHostInfo.protocols_re.test(parsed.protocol)) return + if (!parsed.path) return + var pathmatch = gitHostInfo.pathmatch + var matched = parsed.path.match(pathmatch) + if (!matched) return + if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) + if (matched[2] != null) project = decodeURIComponent(matched[2]) + defaultRepresentation = protocolToRepresentation(parsed.protocol) + } + return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) + } catch (ex) { + if (!(ex instanceof URIError)) throw ex + } + }).filter(function (gitHostInfo) { return gitHostInfo }) + if (matches.length !== 1) return + return matches[0] +} -// Extracts description from contents of a readme file in markdown format -function extractDescription (d) { - if (!d) return; - if (d === "ERROR: No README data found!") return; - // the first block of text before the first heading - // that isn't the first line heading - d = d.trim().split('\n') - for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); - var l = d.length - for (var e = s + 1; e < l && d[e].trim(); e ++); - return d.slice(s, e).join(' ').trim() +function isGitHubShorthand (arg) { + // Note: This does not fully test the git ref format. + // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html + // + // The only way to do this properly would be to shell out to + // git-check-ref-format, and as this is a fast sync function, + // we don't want to do that. Just let git fail if it turns + // out that the commit-ish is invalid. + // GH usernames cannot start with . or - + return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) } +function fixupUnqualifiedGist (giturl) { + // necessary for round-tripping gists + var parsed = url.parse(giturl) + if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { + return parsed.protocol + '/' + parsed.host + } else { + return giturl + } +} -/***/ }), -/* 542 */ -/***/ (function(module) { +function parseGitUrl (giturl) { + if (typeof giturl !== 'string') giturl = '' + giturl + var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) + if (!matched) return url.parse(giturl) + return { + protocol: 'git+ssh:', + slashes: true, + auth: matched[1], + host: matched[2], + port: null, + hostname: matched[2], + hash: matched[4], + search: null, + query: null, + pathname: '/' + matched[3], + path: '/' + matched[3], + href: 'git+ssh://' + matched[1] + '@' + matched[2] + + '/' + matched[3] + (matched[4] || '') + } +} -module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); /***/ }), -/* 543 */ +/* 530 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(29) -var messages = __webpack_require__(544) +"use strict"; -module.exports = function() { - var args = Array.prototype.slice.call(arguments, 0) - var warningName = args.shift() - if (warningName == "typo") { - return makeTypoWarning.apply(null,args) - } - else { - var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" - args.unshift(msgTemplate) - return util.format.apply(null, args) - } -} -function makeTypoWarning (providedName, probableName, field) { - if (field) { - providedName = field + "['" + providedName + "']" - probableName = field + "['" + probableName + "']" +var gitHosts = module.exports = { + github: { + // First two are insecure and generally shouldn't be used any more, but + // they are still supported. + 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'github.com', + 'treepath': 'tree', + 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' + }, + bitbucket: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'bitbucket.org', + 'treepath': 'src', + 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' + }, + gitlab: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gitlab.com', + 'treepath': 'tree', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' + }, + gist: { + 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gist.github.com', + 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, + 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', + 'bugstemplate': 'https://{domain}/{project}', + 'gittemplate': 'git://{domain}/{project}.git{#committish}', + 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{project}{/committish}', + 'docstemplate': 'https://{domain}/{project}{/committish}', + 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', + 'shortcuttemplate': '{type}:{project}{#committish}', + 'pathtemplate': '{project}{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' } - return util.format(messages.typo, providedName, probableName) } +var gitHostDefaults = { + 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', + 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', + 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', + 'shortcuttemplate': '{type}:{user}/{project}{#committish}', + 'pathtemplate': '{user}/{project}{#committish}', + 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +} -/***/ }), -/* 544 */ -/***/ (function(module) { +Object.keys(gitHosts).forEach(function (name) { + Object.keys(gitHostDefaults).forEach(function (key) { + if (gitHosts[name][key]) return + gitHosts[name][key] = gitHostDefaults[key] + }) + gitHosts[name].protocols_re = RegExp('^(' + + gitHosts[name].protocols.map(function (protocol) { + return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') + }).join('|') + '):$') +}) -module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); /***/ }), -/* 545 */ +/* 531 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const writeJsonFile = __webpack_require__(546); -const sortKeys = __webpack_require__(558); - -const dependencyKeys = new Set([ - 'dependencies', - 'devDependencies', - 'optionalDependencies', - 'peerDependencies' -]); - -function normalize(packageJson) { - const result = {}; - - for (const key of Object.keys(packageJson)) { - if (!dependencyKeys.has(key)) { - result[key] = packageJson[key]; - } else if (Object.keys(packageJson[key]).length !== 0) { - result[key] = sortKeys(packageJson[key]); - } - } +var gitHosts = __webpack_require__(530) +var extend = Object.assign || __webpack_require__(397)._extend - return result; +var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { + var gitHostInfo = this + gitHostInfo.type = type + Object.keys(gitHosts[type]).forEach(function (key) { + gitHostInfo[key] = gitHosts[type][key] + }) + gitHostInfo.user = user + gitHostInfo.auth = auth + gitHostInfo.project = project + gitHostInfo.committish = committish + gitHostInfo.default = defaultRepresentation + gitHostInfo.opts = opts || {} } +GitHost.prototype = {} -module.exports = async (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } +GitHost.prototype.hash = function () { + return this.committish ? '#' + this.committish : '' +} - options = { - normalize: true, - ...options, - detectIndent: true - }; +GitHost.prototype._fill = function (template, opts) { + if (!template) return + var vars = extend({}, opts) + opts = extend(extend({}, this.opts), opts) + var self = this + Object.keys(this).forEach(function (key) { + if (self[key] != null && vars[key] == null) vars[key] = self[key] + }) + var rawAuth = vars.auth + var rawComittish = vars.committish + Object.keys(vars).forEach(function (key) { + vars[key] = encodeURIComponent(vars[key]) + }) + vars['auth@'] = rawAuth ? rawAuth + '@' : '' + if (opts.noCommittish) { + vars['#committish'] = '' + vars['/tree/committish'] = '' + vars['/comittish'] = '' + vars.comittish = '' + } else { + vars['#committish'] = rawComittish ? '#' + rawComittish : '' + vars['/tree/committish'] = vars.committish + ? '/' + vars.treepath + '/' + vars.committish + : '' + vars['/committish'] = vars.committish ? '/' + vars.committish : '' + vars.committish = vars.committish || 'master' + } + var res = template + Object.keys(vars).forEach(function (key) { + res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) + }) + if (opts.noGitPlus) { + return res.replace(/^git[+]/, '') + } else { + return res + } +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +GitHost.prototype.ssh = function (opts) { + return this._fill(this.sshtemplate, opts) +} - data = options.normalize ? normalize(data) : data; +GitHost.prototype.sshurl = function (opts) { + return this._fill(this.sshurltemplate, opts) +} - return writeJsonFile(filePath, data, options); -}; +GitHost.prototype.browse = function (opts) { + return this._fill(this.browsetemplate, opts) +} -module.exports.sync = (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } +GitHost.prototype.docs = function (opts) { + return this._fill(this.docstemplate, opts) +} - options = { - normalize: true, - ...options, - detectIndent: true - }; +GitHost.prototype.bugs = function (opts) { + return this._fill(this.bugstemplate, opts) +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +GitHost.prototype.https = function (opts) { + return this._fill(this.httpstemplate, opts) +} - data = options.normalize ? normalize(data) : data; +GitHost.prototype.git = function (opts) { + return this._fill(this.gittemplate, opts) +} - writeJsonFile.sync(filePath, data, options); -}; +GitHost.prototype.shortcut = function (opts) { + return this._fill(this.shortcuttemplate, opts) +} +GitHost.prototype.path = function (opts) { + return this._fill(this.pathtemplate, opts) +} -/***/ }), -/* 546 */ -/***/ (function(module, exports, __webpack_require__) { +GitHost.prototype.tarball = function (opts) { + return this._fill(this.tarballtemplate, opts) +} -"use strict"; +GitHost.prototype.file = function (P, opts) { + return this._fill(this.filetemplate, extend({ + path: P.replace(/^[/]+/g, '') + }, opts)) +} -const path = __webpack_require__(16); -const fs = __webpack_require__(547); -const writeFileAtomic = __webpack_require__(551); -const sortKeys = __webpack_require__(558); -const makeDir = __webpack_require__(560); -const pify = __webpack_require__(561); -const detectIndent = __webpack_require__(562); +GitHost.prototype.getDefaultRepresentation = function () { + return this.default +} -const init = (fn, filePath, data, options) => { - if (!filePath) { - throw new TypeError('Expected a filepath'); - } +GitHost.prototype.toString = function (opts) { + return (this[this.default] || this.sshurl).call(this, opts) +} - if (data === undefined) { - throw new TypeError('Expected data to stringify'); - } - options = Object.assign({ - indent: '\t', - sortKeys: false - }, options); +/***/ }), +/* 532 */ +/***/ (function(module, exports, __webpack_require__) { - if (options.sortKeys) { - data = sortKeys(data, { - deep: true, - compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined - }); - } +var core = __webpack_require__(533); +var async = __webpack_require__(535); +async.core = core; +async.isCore = function isCore(x) { return core[x]; }; +async.sync = __webpack_require__(540); - return fn(filePath, data, options); -}; +exports = async; +module.exports = async; -const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); -const main = (filePath, data, options) => { - return (options.detectIndent ? readFile(filePath) : Promise.resolve()) - .then(string => { - const indent = string ? detectIndent(string).indent : options.indent; - const json = JSON.stringify(data, options.replacer, indent); +/***/ }), +/* 533 */ +/***/ (function(module, exports, __webpack_require__) { - return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); - }); -}; +var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; -const mainSync = (filePath, data, options) => { - let {indent} = options; +function specifierIncluded(specifier) { + var parts = specifier.split(' '); + var op = parts.length > 1 ? parts[0] : '='; + var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); - if (options.detectIndent) { - try { - const file = fs.readFileSync(filePath, 'utf8'); - indent = detectIndent(file).indent; - } catch (error) { - if (error.code !== 'ENOENT') { - throw error; - } - } - } + for (var i = 0; i < 3; ++i) { + var cur = Number(current[i] || 0); + var ver = Number(versionParts[i] || 0); + if (cur === ver) { + continue; // eslint-disable-line no-restricted-syntax, no-continue + } + if (op === '<') { + return cur < ver; + } else if (op === '>=') { + return cur >= ver; + } else { + return false; + } + } + return op === '>='; +} - const json = JSON.stringify(data, options.replacer, indent); +function matchesRange(range) { + var specifiers = range.split(/ ?&& ?/); + if (specifiers.length === 0) { return false; } + for (var i = 0; i < specifiers.length; ++i) { + if (!specifierIncluded(specifiers[i])) { return false; } + } + return true; +} - return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); -}; +function versionIncluded(specifierValue) { + if (typeof specifierValue === 'boolean') { return specifierValue; } + if (specifierValue && typeof specifierValue === 'object') { + for (var i = 0; i < specifierValue.length; ++i) { + if (matchesRange(specifierValue[i])) { return true; } + } + return false; + } + return matchesRange(specifierValue); +} -const writeJsonFile = (filePath, data, options) => { - return makeDir(path.dirname(filePath), {fs}) - .then(() => init(main, filePath, data, options)); -}; +var data = __webpack_require__(534); -module.exports = writeJsonFile; -// TODO: Remove this for the next major release -module.exports.default = writeJsonFile; -module.exports.sync = (filePath, data, options) => { - makeDir.sync(path.dirname(filePath), {fs}); - init(mainSync, filePath, data, options); -}; +var core = {}; +for (var mod in data) { // eslint-disable-line no-restricted-syntax + if (Object.prototype.hasOwnProperty.call(data, mod)) { + core[mod] = versionIncluded(data[mod]); + } +} +module.exports = core; /***/ }), -/* 547 */ -/***/ (function(module, exports, __webpack_require__) { +/* 534 */ +/***/ (function(module) { -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(548) -var legacy = __webpack_require__(549) -var clone = __webpack_require__(550) +module.exports = JSON.parse("{\"assert\":true,\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debugger\":\"< 8\",\"dgram\":true,\"dns\":true,\"domain\":true,\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":\">= 10 && < 10.1\",\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0\",\"os\":true,\"path\":true,\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"string_decoder\":true,\"sys\":true,\"timers\":true,\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"v8/tools/arguments\":\">= 10\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8\":\">= 1\",\"vm\":true,\"worker_threads\":\">= 11.7\",\"zlib\":true}"); -var queue = [] +/***/ }), +/* 535 */ +/***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(29) +var core = __webpack_require__(533); +var fs = __webpack_require__(349); +var path = __webpack_require__(4); +var caller = __webpack_require__(536); +var nodeModulesPaths = __webpack_require__(537); +var normalizeOptions = __webpack_require__(539); -function noop () {} +var defaultIsFile = function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } +module.exports = function resolve(x, options, callback) { + var cb = callback; + var opts = options; + if (typeof options === 'function') { + cb = opts; + opts = {}; + } + if (typeof x !== 'string') { + var err = new TypeError('Path must be a string.'); + return process.nextTick(function () { + cb(err); + }); + } -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(30).equal(queue.length, 0) - }) -} + opts = normalizeOptions(x, opts); -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} + var isFile = opts.isFile || defaultIsFile; + var readFile = opts.readFile || fs.readFile; -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) + opts.paths = opts.paths || []; -module.exports.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = path.resolve(basedir); -// Only patch fs once, otherwise we'll run into a memory leak if -// graceful-fs is loaded multiple times, such as in test environments that -// reset the loaded modules between tests. -// We look for the string `graceful-fs` from the comment above. This -// way we are not adding any extra properties and it will detect if older -// versions of graceful-fs are installed. -if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { - fs.closeSync = module.exports.closeSync; - fs.close = module.exports.close; -} + if (opts.preserveSymlinks === false) { + fs.realpath(absoluteStart, function (realPathErr, realStart) { + if (realPathErr && realPathErr.code !== 'ENOENT') cb(err); + else init(realPathErr ? absoluteStart : realStart); + }); + } else { + init(absoluteStart); + } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null + var res; + function init(basedir) { + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + res = path.resolve(basedir, x); + if (x === '..' || x.slice(-1) === '/') res += '/'; + if ((/\/$/).test(x) && res === basedir) { + loadAsDirectory(res, opts.package, onfile); + } else loadAsFile(res, opts.package, onfile); + } else loadNodeModules(x, basedir, function (err, n, pkg) { + if (err) cb(err); + else if (n) cb(null, n, pkg); + else if (core[x]) return cb(null, x); + else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } - return go$readFile(path, options, cb) + function onfile(err, m, pkg) { + if (err) cb(err); + else if (m) cb(null, m, pkg); + else loadAsDirectory(res, function (err, d, pkg) { + if (err) cb(err); + else if (d) cb(null, d, pkg); + else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + function loadAsFile(x, thePackage, callback) { + var loadAsFilePackage = thePackage; + var cb = callback; + if (typeof loadAsFilePackage === 'function') { + cb = loadAsFilePackage; + loadAsFilePackage = undefined; } - }) - } - } - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + var exts = [''].concat(extensions); + load(exts, x, loadAsFilePackage); - return go$writeFile(path, data, options, cb) + function load(exts, x, loadPackage) { + if (exts.length === 0) return cb(null, undefined, loadPackage); + var file = x + exts[0]; - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() + var pkg = loadPackage; + if (pkg) onpkg(null, pkg); + else loadpkg(path.dirname(file), onpkg); + + function onpkg(err, pkg_, dir) { + pkg = pkg_; + if (err) return cb(err); + if (dir && pkg && opts.pathFilter) { + var rfile = path.relative(dir, file); + var rel = rfile.slice(0, rfile.length - exts[0].length); + var r = opts.pathFilter(pkg, x, rel); + if (r) return load( + [''].concat(extensions.slice()), + path.resolve(dir, r), + pkg + ); + } + isFile(file, onex); + } + function onex(err, ex) { + if (err) return cb(err); + if (ex) return cb(null, file, pkg); + load(exts.slice(1), x, pkg); + } } - }) } - } - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + function loadpkg(dir, cb) { + if (dir === '' || dir === '/') return cb(null); + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return cb(null); + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); - return go$appendFile(path, data, options, cb) + var pkgfile = path.join(dir, 'package.json'); + isFile(pkgfile, function (err, ex) { + // on err, ex is false + if (!ex) return loadpkg(path.dirname(dir), cb); - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + readFile(pkgfile, function (err, body) { + if (err) cb(err); + try { var pkg = JSON.parse(body); } catch (jsonErr) {} - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + cb(null, pkg, dir); + }); + }); } - args.push(go$readdir$cb) - return go$readdir(args) + function loadAsDirectory(x, loadAsDirectoryPackage, callback) { + var cb = callback; + var fpkg = loadAsDirectoryPackage; + if (typeof fpkg === 'function') { + cb = fpkg; + fpkg = opts.package; + } - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + var pkgfile = path.join(x, 'package.json'); + isFile(pkgfile, function (err, ex) { + if (err) return cb(err); + if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) + readFile(pkgfile, function (err, body) { + if (err) return cb(err); + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - } - } + if (opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + if (pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + return cb(mainError); + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + var dir = path.resolve(x, pkg.main); + loadAsDirectory(dir, pkg, function (err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + loadAsFile(path.join(x, 'index'), pkg, cb); + }); + }); + return; + } - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } + loadAsFile(path.join(x, '/index'), pkg, cb); + }); + }); + } - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } + function processDirs(cb, dirs) { + if (dirs.length === 0) return cb(null, undefined); + var dir = dirs[0]; - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream + var file = path.join(dir, x); + loadAsFile(file, opts.package, onfile); - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + function onfile(err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + loadAsDirectory(path.join(dir, x), opts.package, ondir); + } - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() + function ondir(err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + processDirs(cb, dirs.slice(1)); + } + } + function loadNodeModules(x, start, cb) { + processDirs(cb, nodeModulesPaths(start, opts, x)); + } +}; - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } +/***/ }), +/* 536 */ +/***/ (function(module, exports) { - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } +module.exports = function () { + // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + var origPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = function (_, stack) { return stack; }; + var stack = (new Error()).stack; + Error.prepareStackTrace = origPrepareStackTrace; + return stack[2].getFileName(); +}; - function createReadStream (path, options) { - return new ReadStream(path, options) - } - function createWriteStream (path, options) { - return new WriteStream(path, options) - } +/***/ }), +/* 537 */ +/***/ (function(module, exports, __webpack_require__) { - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null +var path = __webpack_require__(4); +var parse = path.parse || __webpack_require__(538); - return go$open(path, flags, mode, cb) +var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { + var prefix = '/'; + if ((/^([A-Za-z]:)/).test(absoluteStart)) { + prefix = ''; + } else if ((/^\\\\/).test(absoluteStart)) { + prefix = '\\\\'; + } - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) + var paths = [absoluteStart]; + var parsed = parse(absoluteStart); + while (parsed.dir !== paths[paths.length - 1]) { + paths.push(parsed.dir); + parsed = parse(parsed.dir); } - } - return fs -} + return paths.reduce(function (dirs, aPath) { + return dirs.concat(modules.map(function (moduleDir) { + return path.join(prefix, aPath, moduleDir); + })); + }, []); +}; -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} +module.exports = function nodeModulesPaths(start, opts, request) { + var modules = opts && opts.moduleDirectory + ? [].concat(opts.moduleDirectory) + : ['node_modules']; -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + if (opts && typeof opts.paths === 'function') { + return opts.paths( + request, + start, + function () { return getNodeModulesDirs(start, modules); }, + opts + ); + } + + var dirs = getNodeModulesDirs(start, modules); + return opts && opts.paths ? dirs.concat(opts.paths) : dirs; +}; /***/ }), -/* 548 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(25) +"use strict"; -var origCwd = process.cwd -var cwd = null -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform +var isWindows = process.platform === 'win32'; -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +// Regex to split a windows path into three parts: [*, device, slash, +// tail] windows-only +var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} +// Regex to split the tail part of the above into [*, dir, basename, ext] +var splitTailRe = + /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; -module.exports = patch +var win32 = {}; -function patch (fs) { - // (re-)implement some things that are known busted or missing. +// Function to split a filename into [root, dir, basename, ext] +function win32SplitPath(filename) { + // Separate device+slash from tail + var result = splitDeviceRe.exec(filename), + device = (result[1] || '') + (result[2] || ''), + tail = result[3] || ''; + // Split the tail into dir, basename and extension + var result2 = splitTailRe.exec(tail), + dir = result2[1], + basename = result2[2], + ext = result2[3]; + return [device, dir, basename, ext]; +} - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) +win32.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); } - - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) + var allParts = win32SplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); } + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. - - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var posix = {}; - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) +function posixSplitPath(filename) { + return splitPathRe.exec(filename).slice(1); +} - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} +posix.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} + var allParts = posixSplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); } + allParts[1] = allParts[1] || ''; + allParts[2] = allParts[2] || ''; + allParts[3] = allParts[3] || ''; - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) +if (isWindows) + module.exports = win32.parse; +else /* posix */ + module.exports = posix.parse; - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) +module.exports.posix = posix.parse; +module.exports.win32 = win32.parse; - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) +/***/ }), +/* 539 */ +/***/ (function(module, exports) { - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } +module.exports = function (x, opts) { + /** + * This file is purposefully a passthrough. It's expected that third-party + * environments will override it at runtime in order to inject special logic + * into `resolve` (by manipulating the options). One such example is the PnP + * code path in Yarn. + */ - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } + return opts || {}; +}; - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } +/***/ }), +/* 540 */ +/***/ (function(module, exports, __webpack_require__) { - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) +var core = __webpack_require__(533); +var fs = __webpack_require__(349); +var path = __webpack_require__(4); +var caller = __webpack_require__(536); +var nodeModulesPaths = __webpack_require__(537); +var normalizeOptions = __webpack_require__(539); + +var defaultIsFile = function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; } - } + return stat.isFile() || stat.isFIFO(); +}; - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } +module.exports = function (x, options) { + if (typeof x !== 'string') { + throw new TypeError('Path must be a string.'); } - } + var opts = normalizeOptions(x, options); + var isFile = opts.isFile || defaultIsFile; + var readFileSync = opts.readFileSync || fs.readFileSync; - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = path.resolve(basedir); + + if (opts.preserveSymlinks === false) { + try { + absoluteStart = fs.realpathSync(absoluteStart); + } catch (realPathErr) { + if (realPathErr.code !== 'ENOENT') { + throw realPathErr; + } + } } - } - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + var res = path.resolve(absoluteStart, x); + if (x === '..' || x.slice(-1) === '/') res += '/'; + var m = loadAsFileSync(res) || loadAsDirectorySync(res); + if (m) return m; + } else { + var n = loadNodeModulesSync(x, absoluteStart); + if (n) return n; } - } + if (core[x]) return x; - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) - } - } + var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; + function loadAsFileSync(x) { + var pkg = loadpkg(path.dirname(x)); + + if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { + var rfile = path.relative(pkg.dir, x); + var r = opts.pathFilter(pkg.pkg, x, rfile); + if (r) { + x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign + } + } + + if (isFile(x)) { + return x; + } + + for (var i = 0; i < extensions.length; i++) { + var file = x + extensions[i]; + if (isFile(file)) { + return file; + } + } } - } - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true + function loadpkg(dir) { + if (dir === '' || dir === '/') return; + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return; + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; - if (er.code === "ENOSYS") - return true + var pkgfile = path.join(dir, 'package.json'); - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + if (!isFile(pkgfile)) { + return loadpkg(path.dirname(dir)); + } - return false - } -} + var body = readFileSync(pkgfile); + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} -/***/ }), -/* 549 */ -/***/ (function(module, exports, __webpack_require__) { + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, dir); + } -var Stream = __webpack_require__(27).Stream + return { pkg: pkg, dir: dir }; + } -module.exports = legacy + function loadAsDirectorySync(x) { + var pkgfile = path.join(x, '/package.json'); + if (isFile(pkgfile)) { + try { + var body = readFileSync(pkgfile, 'UTF8'); + var pkg = JSON.parse(body); + } catch (e) {} -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } + if (opts.packageFilter) { + pkg = opts.packageFilter(pkg, x); + } - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); + if (pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + throw mainError; + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + try { + var m = loadAsFileSync(path.resolve(x, pkg.main)); + if (m) return m; + var n = loadAsDirectorySync(path.resolve(x, pkg.main)); + if (n) return n; + } catch (e) {} + } + } - Stream.call(this); + return loadAsFileSync(path.join(x, '/index')); + } - var self = this; + function loadNodeModulesSync(x, start) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + var dir = dirs[i]; + var m = loadAsFileSync(path.join(dir, '/', x)); + if (m) return m; + var n = loadAsDirectorySync(path.join(dir, '/', x)); + if (n) return n; + } + } +}; - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; +/***/ }), +/* 541 */ +/***/ (function(module, exports) { - options = options || {}; +module.exports = extractDescription - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } +// Extracts description from contents of a readme file in markdown format +function extractDescription (d) { + if (!d) return; + if (d === "ERROR: No README data found!") return; + // the first block of text before the first heading + // that isn't the first line heading + d = d.trim().split('\n') + for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); + var l = d.length + for (var e = s + 1; e < l && d[e].trim(); e ++); + return d.slice(s, e).join(' ').trim() +} - if (this.encoding) this.setEncoding(this.encoding); - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } +/***/ }), +/* 542 */ +/***/ (function(module) { - if (this.start > this.end) { - throw new Error('start must be <= end'); - } +module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); - this.pos = this.start; - } +/***/ }), +/* 543 */ +/***/ (function(module, exports, __webpack_require__) { - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } +var util = __webpack_require__(397) +var messages = __webpack_require__(544) - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } +module.exports = function() { + var args = Array.prototype.slice.call(arguments, 0) + var warningName = args.shift() + if (warningName == "typo") { + return makeTypoWarning.apply(null,args) + } + else { + var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" + args.unshift(msgTemplate) + return util.format.apply(null, args) + } +} - self.fd = fd; - self.emit('open', fd); - self._read(); - }) +function makeTypoWarning (providedName, probableName, field) { + if (field) { + providedName = field + "['" + providedName + "']" + probableName = field + "['" + probableName + "']" } + return util.format(messages.typo, providedName, probableName) +} - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); - Stream.call(this); +/***/ }), +/* 544 */ +/***/ (function(module) { - this.path = path; - this.fd = null; - this.writable = true; +module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; +/***/ }), +/* 545 */ +/***/ (function(module, exports, __webpack_require__) { - options = options || {}; +"use strict"; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } +const path = __webpack_require__(4); +const writeJsonFile = __webpack_require__(546); +const sortKeys = __webpack_require__(558); - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } +const dependencyKeys = new Set([ + 'dependencies', + 'devDependencies', + 'optionalDependencies', + 'peerDependencies' +]); - this.pos = this.start; - } +function normalize(packageJson) { + const result = {}; - this.busy = false; - this._queue = []; + for (const key of Object.keys(packageJson)) { + if (!dependencyKeys.has(key)) { + result[key] = packageJson[key]; + } else if (Object.keys(packageJson[key]).length !== 0) { + result[key] = sortKeys(packageJson[key]); + } + } - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } + return result; } +module.exports = async (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } -/***/ }), -/* 550 */ -/***/ (function(module, exports, __webpack_require__) { + options = { + normalize: true, + ...options, + detectIndent: true + }; -"use strict"; + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); + data = options.normalize ? normalize(data) : data; -module.exports = clone + return writeJsonFile(filePath, data, options); +}; -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +module.exports.sync = (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + options = { + normalize: true, + ...options, + detectIndent: true + }; - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); - return copy -} + data = options.normalize ? normalize(data) : data; + + writeJsonFile.sync(filePath, data, options); +}; /***/ }), -/* 551 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = writeFile -module.exports.sync = writeFileSync -module.exports._getTmpname = getTmpname // for testing -module.exports._cleanupOnExit = cleanupOnExit - -var fs = __webpack_require__(552) -var MurmurHash3 = __webpack_require__(556) -var onExit = __webpack_require__(397) -var path = __webpack_require__(16) -var activeFiles = {} - -// if we run inside of a worker_thread, `process.pid` is not unique -/* istanbul ignore next */ -var threadId = (function getId () { - try { - var workerThreads = __webpack_require__(557) +const path = __webpack_require__(4); +const fs = __webpack_require__(547); +const writeFileAtomic = __webpack_require__(551); +const sortKeys = __webpack_require__(558); +const makeDir = __webpack_require__(560); +const pify = __webpack_require__(561); +const detectIndent = __webpack_require__(562); - /// if we are in main thread, this is set to `0` - return workerThreads.threadId - } catch (e) { - // worker_threads are not available, fallback to 0 - return 0 - } -})() +const init = (fn, filePath, data, options) => { + if (!filePath) { + throw new TypeError('Expected a filepath'); + } -var invocations = 0 -function getTmpname (filename) { - return filename + '.' + - MurmurHash3(__filename) - .hash(String(process.pid)) - .hash(String(threadId)) - .hash(String(++invocations)) - .result() -} + if (data === undefined) { + throw new TypeError('Expected data to stringify'); + } -function cleanupOnExit (tmpfile) { - return function () { - try { - fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) - } catch (_) {} - } -} + options = Object.assign({ + indent: '\t', + sortKeys: false + }, options); -function writeFile (filename, data, options, callback) { - if (options) { - if (options instanceof Function) { - callback = options - options = {} - } else if (typeof options === 'string') { - options = { encoding: options } - } - } else { - options = {} - } + if (options.sortKeys) { + data = sortKeys(data, { + deep: true, + compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined + }); + } - var Promise = options.Promise || global.Promise - var truename - var fd - var tmpfile - /* istanbul ignore next -- The closure only gets called when onExit triggers */ - var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) - var absoluteName = path.resolve(filename) + return fn(filePath, data, options); +}; - new Promise(function serializeSameFile (resolve) { - // make a queue if it doesn't already exist - if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] +const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); - activeFiles[absoluteName].push(resolve) // add this job to the queue - if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one - }).then(function getRealPath () { - return new Promise(function (resolve) { - fs.realpath(filename, function (_, realname) { - truename = realname || filename - tmpfile = getTmpname(truename) - resolve() - }) - }) - }).then(function stat () { - return new Promise(function stat (resolve) { - if (options.mode && options.chown) resolve() - else { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - fs.stat(truename, function (err, stats) { - if (err || !stats) resolve() - else { - options = Object.assign({}, options) +const main = (filePath, data, options) => { + return (options.detectIndent ? readFile(filePath) : Promise.resolve()) + .then(string => { + const indent = string ? detectIndent(string).indent : options.indent; + const json = JSON.stringify(data, options.replacer, indent); - if (options.mode == null) { - options.mode = stats.mode - } - if (options.chown == null && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - resolve() - } - }) - } - }) - }).then(function thenWriteFile () { - return new Promise(function (resolve, reject) { - fs.open(tmpfile, 'w', options.mode, function (err, _fd) { - fd = _fd - if (err) reject(err) - else resolve() - }) - }) - }).then(function write () { - return new Promise(function (resolve, reject) { - if (Buffer.isBuffer(data)) { - fs.write(fd, data, 0, data.length, 0, function (err) { - if (err) reject(err) - else resolve() - }) - } else if (data != null) { - fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { - if (err) reject(err) - else resolve() - }) - } else resolve() - }) - }).then(function syncAndClose () { - return new Promise(function (resolve, reject) { - if (options.fsync !== false) { - fs.fsync(fd, function (err) { - if (err) fs.close(fd, () => reject(err)) - else fs.close(fd, resolve) - }) - } else { - fs.close(fd, resolve) - } - }) - }).then(function chown () { - fd = null - if (options.chown) { - return new Promise(function (resolve, reject) { - fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function chmod () { - if (options.mode) { - return new Promise(function (resolve, reject) { - fs.chmod(tmpfile, options.mode, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function rename () { - return new Promise(function (resolve, reject) { - fs.rename(tmpfile, truename, function (err) { - if (err) reject(err) - else resolve() - }) - }) - }).then(function success () { - removeOnExitHandler() - callback() - }, function fail (err) { - return new Promise(resolve => { - return fd ? fs.close(fd, resolve) : resolve() - }).then(() => { - removeOnExitHandler() - fs.unlink(tmpfile, function () { - callback(err) - }) - }) - }).then(function checkQueue () { - activeFiles[absoluteName].shift() // remove the element added by serializeSameFile - if (activeFiles[absoluteName].length > 0) { - activeFiles[absoluteName][0]() // start next job if one is pending - } else delete activeFiles[absoluteName] - }) -} + return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); + }); +}; -function writeFileSync (filename, data, options) { - if (typeof options === 'string') options = { encoding: options } - else if (!options) options = {} - try { - filename = fs.realpathSync(filename) - } catch (ex) { - // it's ok, it'll happen on a not yet existing file - } - var tmpfile = getTmpname(filename) +const mainSync = (filePath, data, options) => { + let {indent} = options; - if (!options.mode || !options.chown) { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - try { - var stats = fs.statSync(filename) - options = Object.assign({}, options) - if (!options.mode) { - options.mode = stats.mode - } - if (!options.chown && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - } catch (ex) { - // ignore stat errors - } - } + if (options.detectIndent) { + try { + const file = fs.readFileSync(filePath, 'utf8'); + indent = detectIndent(file).indent; + } catch (error) { + if (error.code !== 'ENOENT') { + throw error; + } + } + } - var fd - var cleanup = cleanupOnExit(tmpfile) - var removeOnExitHandler = onExit(cleanup) + const json = JSON.stringify(data, options.replacer, indent); - try { - fd = fs.openSync(tmpfile, 'w', options.mode) - if (Buffer.isBuffer(data)) { - fs.writeSync(fd, data, 0, data.length, 0) - } else if (data != null) { - fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) - } - if (options.fsync !== false) { - fs.fsyncSync(fd) - } - fs.closeSync(fd) - if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) - if (options.mode) fs.chmodSync(tmpfile, options.mode) - fs.renameSync(tmpfile, filename) - removeOnExitHandler() - } catch (err) { - if (fd) { - try { - fs.closeSync(fd) - } catch (ex) { - // ignore close errors at this stage, error may have closed fd already. - } - } - removeOnExitHandler() - cleanup() - throw err - } -} + return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); +}; + +const writeJsonFile = (filePath, data, options) => { + return makeDir(path.dirname(filePath), {fs}) + .then(() => init(main, filePath, data, options)); +}; + +module.exports = writeJsonFile; +// TODO: Remove this for the next major release +module.exports.default = writeJsonFile; +module.exports.sync = (filePath, data, options) => { + makeDir.sync(path.dirname(filePath), {fs}); + init(mainSync, filePath, data, options); +}; /***/ }), -/* 552 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(23) -var polyfills = __webpack_require__(553) -var legacy = __webpack_require__(555) +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(548) +var legacy = __webpack_require__(549) +var clone = __webpack_require__(550) + var queue = [] -var util = __webpack_require__(29) +var util = __webpack_require__(397) function noop () {} @@ -53880,21 +52895,21 @@ else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { process.on('exit', function() { debug(queue) - __webpack_require__(30).equal(queue.length, 0) + __webpack_require__(371).equal(queue.length, 0) }) } -module.exports = patch(__webpack_require__(554)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { - module.exports = patch(fs) +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; } // Always patch fs.close/closeSync, because we want to // retry() whenever a close happens *anywhere* in the program. // This is essential when multiple graceful-fs instances are // in play at the same time. -module.exports.close = -fs.close = (function (fs$close) { return function (fd, cb) { +module.exports.close = (function (fs$close) { return function (fd, cb) { return fs$close.call(fs, fd, function (err) { if (!err) retry() @@ -53904,8 +52919,7 @@ fs.close = (function (fs$close) { return function (fd, cb) { }) }})(fs.close) -module.exports.closeSync = -fs.closeSync = (function (fs$closeSync) { return function (fd) { +module.exports.closeSync = (function (fs$closeSync) { return function (fd) { // Note that graceful-fs also retries when fs.closeSync() fails. // Looks like a bug to me, although it's probably a harmless one. var rval = fs$closeSync.apply(fs, arguments) @@ -53913,6 +52927,17 @@ fs.closeSync = (function (fs$closeSync) { return function (fd) { return rval }})(fs.closeSync) +// Only patch fs once, otherwise we'll run into a memory leak if +// graceful-fs is loaded multiple times, such as in test environments that +// reset the loaded modules between tests. +// We look for the string `graceful-fs` from the comment above. This +// way we are not adding any extra properties and it will detect if older +// versions of graceful-fs are installed. +if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { + fs.closeSync = module.exports.closeSync; + fs.close = module.exports.close; +} + function patch (fs) { // Everything that references the open() function needs to be in here polyfills(fs) @@ -54004,6 +53029,7 @@ function patch (fs) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) enqueue([go$readdir, [args]]) + else { if (typeof cb === 'function') cb.apply(this, arguments) @@ -54023,12 +53049,16 @@ function patch (fs) { } var fs$ReadStream = fs.ReadStream - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } var fs$WriteStream = fs.WriteStream - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } fs.ReadStream = ReadStream fs.WriteStream = WriteStream @@ -54123,11 +53153,10 @@ function retry () { /***/ }), -/* 553 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(554) -var constants = __webpack_require__(25) +var constants = __webpack_require__(411) var origCwd = process.cwd var cwd = null @@ -54273,73 +53302,36 @@ function patch (fs) { } } }})(fs.readSync) -} - -function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } - - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } -} -function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) return } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) }) }) }) } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. var threw = true + var ret try { - ret = fs.futimesSync(fd, at, mt) + ret = fs.fchmodSync(fd, mode) threw = false } finally { if (threw) { @@ -54352,145 +53344,154 @@ function patchLutimes (fs) { } return ret } - - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} } -} -function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } -} + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } -function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} } } -} - -function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -} -function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } } } -} -function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) + function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -} -function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; + function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } } -} - -// ENOSYS means that the fs doesn't support the op. Just ignore -// that, because it doesn't matter. -// -// if there's no getuid, or if getuid() is something other -// than 0, and the error is EINVAL or EPERM, then just ignore -// it. -// -// This specific case is a silent failure in cp, install, tar, -// and most other unix tools that manage permissions. -// -// When running as root, or if other types of errors are -// encountered, then it's strict. -function chownErOk (er) { - if (!er) - return true - if (er.code === "ENOSYS") - return true - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true + function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } } - return false -} - - -/***/ }), -/* 554 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var fs = __webpack_require__(23) - -module.exports = clone(fs) + function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } + } -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj + // ENOSYS means that the fs doesn't support the op. Just ignore + // that, because it doesn't matter. + // + // if there's no getuid, or if getuid() is something other + // than 0, and the error is EINVAL or EPERM, then just ignore + // it. + // + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // + // When running as root, or if other types of errors are + // encountered, then it's strict. + function chownErOk (er) { + if (!er) + return true - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + if (er.code === "ENOSYS") + return true - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } - return copy + return false + } } /***/ }), -/* 555 */ +/* 549 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27).Stream +var Stream = __webpack_require__(382).Stream module.exports = legacy @@ -54610,1452 +53611,1793 @@ function legacy (fs) { } -/***/ }), -/* 556 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * @preserve - * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) - * - * @author Jens Taylor - * @see http://github.com/homebrewing/brauhaus-diff - * @author Gary Court - * @see http://github.com/garycourt/murmurhash-js - * @author Austin Appleby - * @see http://sites.google.com/site/murmurhash/ - */ -(function(){ - var cache; - - // Call this function without `new` to use the cached object (good for - // single-threaded environments), or with `new` to create a new object. - // - // @param {string} key A UTF-16 or ASCII string - // @param {number} seed An optional positive integer - // @return {object} A MurmurHash3 object for incremental hashing - function MurmurHash3(key, seed) { - var m = this instanceof MurmurHash3 ? this : cache; - m.reset(seed) - if (typeof key === 'string' && key.length > 0) { - m.hash(key); - } - - if (m !== this) { - return m; - } - }; - - // Incrementally add a string to this hash - // - // @param {string} key A UTF-16 or ASCII string - // @return {object} this - MurmurHash3.prototype.hash = function(key) { - var h1, k1, i, top, len; - - len = key.length; - this.len += len; - - k1 = this.k1; - i = 0; - switch (this.rem) { - case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; - case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; - case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; - case 3: - k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; - k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; - } - - this.rem = (len + this.rem) & 3; // & 3 is same as % 4 - len -= this.rem; - if (len > 0) { - h1 = this.h1; - while (1) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - - h1 ^= k1; - h1 = (h1 << 13) | (h1 >>> 19); - h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; - - if (i >= len) { - break; - } - - k1 = ((key.charCodeAt(i++) & 0xffff)) ^ - ((key.charCodeAt(i++) & 0xffff) << 8) ^ - ((key.charCodeAt(i++) & 0xffff) << 16); - top = key.charCodeAt(i++); - k1 ^= ((top & 0xff) << 24) ^ - ((top & 0xff00) >> 8); - } - - k1 = 0; - switch (this.rem) { - case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; - case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; - case 1: k1 ^= (key.charCodeAt(i) & 0xffff); - } - - this.h1 = h1; - } - - this.k1 = k1; - return this; - }; - - // Get the result of this hash - // - // @return {number} The 32-bit hash - MurmurHash3.prototype.result = function() { - var k1, h1; - - k1 = this.k1; - h1 = this.h1; - - if (k1 > 0) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - h1 ^= k1; - } - - h1 ^= this.len; +/***/ }), +/* 550 */ +/***/ (function(module, exports, __webpack_require__) { - h1 ^= h1 >>> 16; - h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; - h1 ^= h1 >>> 13; - h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; - h1 ^= h1 >>> 16; +"use strict"; - return h1 >>> 0; - }; - // Reset the hash object for reuse - // - // @param {number} seed An optional positive integer - MurmurHash3.prototype.reset = function(seed) { - this.h1 = typeof seed === 'number' ? seed : 0; - this.rem = this.k1 = this.len = 0; - return this; - }; +module.exports = clone - // A cached object to use. This can be safely used if you're in a single- - // threaded environment, otherwise you need to create new hashes to use. - cache = new MurmurHash3(); +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj - if (true) { - module.exports = MurmurHash3; - } else {} -}()); + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) -/***/ }), -/* 557 */ -/***/ (function(module, exports) { + return copy +} -module.exports = require(undefined); /***/ }), -/* 558 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const isPlainObj = __webpack_require__(559); - -module.exports = (obj, opts) => { - if (!isPlainObj(obj)) { - throw new TypeError('Expected a plain object'); - } +module.exports = writeFile +module.exports.sync = writeFileSync +module.exports._getTmpname = getTmpname // for testing +module.exports._cleanupOnExit = cleanupOnExit - opts = opts || {}; +var fs = __webpack_require__(552) +var MurmurHash3 = __webpack_require__(556) +var onExit = __webpack_require__(370) +var path = __webpack_require__(4) +var activeFiles = {} - // DEPRECATED - if (typeof opts === 'function') { - throw new TypeError('Specify the compare function as an option instead'); - } +// if we run inside of a worker_thread, `process.pid` is not unique +/* istanbul ignore next */ +var threadId = (function getId () { + try { + var workerThreads = __webpack_require__(557) - const deep = opts.deep; - const seenInput = []; - const seenOutput = []; + /// if we are in main thread, this is set to `0` + return workerThreads.threadId + } catch (e) { + // worker_threads are not available, fallback to 0 + return 0 + } +})() - const sortKeys = x => { - const seenIndex = seenInput.indexOf(x); +var invocations = 0 +function getTmpname (filename) { + return filename + '.' + + MurmurHash3(__filename) + .hash(String(process.pid)) + .hash(String(threadId)) + .hash(String(++invocations)) + .result() +} - if (seenIndex !== -1) { - return seenOutput[seenIndex]; - } +function cleanupOnExit (tmpfile) { + return function () { + try { + fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) + } catch (_) {} + } +} - const ret = {}; - const keys = Object.keys(x).sort(opts.compare); +function writeFile (filename, data, options, callback) { + if (options) { + if (options instanceof Function) { + callback = options + options = {} + } else if (typeof options === 'string') { + options = { encoding: options } + } + } else { + options = {} + } - seenInput.push(x); - seenOutput.push(ret); + var Promise = options.Promise || global.Promise + var truename + var fd + var tmpfile + /* istanbul ignore next -- The closure only gets called when onExit triggers */ + var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) + var absoluteName = path.resolve(filename) - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - const val = x[key]; + new Promise(function serializeSameFile (resolve) { + // make a queue if it doesn't already exist + if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] - if (deep && Array.isArray(val)) { - const retArr = []; + activeFiles[absoluteName].push(resolve) // add this job to the queue + if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one + }).then(function getRealPath () { + return new Promise(function (resolve) { + fs.realpath(filename, function (_, realname) { + truename = realname || filename + tmpfile = getTmpname(truename) + resolve() + }) + }) + }).then(function stat () { + return new Promise(function stat (resolve) { + if (options.mode && options.chown) resolve() + else { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + fs.stat(truename, function (err, stats) { + if (err || !stats) resolve() + else { + options = Object.assign({}, options) - for (let j = 0; j < val.length; j++) { - retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; - } + if (options.mode == null) { + options.mode = stats.mode + } + if (options.chown == null && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + resolve() + } + }) + } + }) + }).then(function thenWriteFile () { + return new Promise(function (resolve, reject) { + fs.open(tmpfile, 'w', options.mode, function (err, _fd) { + fd = _fd + if (err) reject(err) + else resolve() + }) + }) + }).then(function write () { + return new Promise(function (resolve, reject) { + if (Buffer.isBuffer(data)) { + fs.write(fd, data, 0, data.length, 0, function (err) { + if (err) reject(err) + else resolve() + }) + } else if (data != null) { + fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { + if (err) reject(err) + else resolve() + }) + } else resolve() + }) + }).then(function syncAndClose () { + return new Promise(function (resolve, reject) { + if (options.fsync !== false) { + fs.fsync(fd, function (err) { + if (err) fs.close(fd, () => reject(err)) + else fs.close(fd, resolve) + }) + } else { + fs.close(fd, resolve) + } + }) + }).then(function chown () { + fd = null + if (options.chown) { + return new Promise(function (resolve, reject) { + fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function chmod () { + if (options.mode) { + return new Promise(function (resolve, reject) { + fs.chmod(tmpfile, options.mode, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function rename () { + return new Promise(function (resolve, reject) { + fs.rename(tmpfile, truename, function (err) { + if (err) reject(err) + else resolve() + }) + }) + }).then(function success () { + removeOnExitHandler() + callback() + }, function fail (err) { + return new Promise(resolve => { + return fd ? fs.close(fd, resolve) : resolve() + }).then(() => { + removeOnExitHandler() + fs.unlink(tmpfile, function () { + callback(err) + }) + }) + }).then(function checkQueue () { + activeFiles[absoluteName].shift() // remove the element added by serializeSameFile + if (activeFiles[absoluteName].length > 0) { + activeFiles[absoluteName][0]() // start next job if one is pending + } else delete activeFiles[absoluteName] + }) +} - ret[key] = retArr; - continue; - } +function writeFileSync (filename, data, options) { + if (typeof options === 'string') options = { encoding: options } + else if (!options) options = {} + try { + filename = fs.realpathSync(filename) + } catch (ex) { + // it's ok, it'll happen on a not yet existing file + } + var tmpfile = getTmpname(filename) - ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; - } + if (!options.mode || !options.chown) { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + try { + var stats = fs.statSync(filename) + options = Object.assign({}, options) + if (!options.mode) { + options.mode = stats.mode + } + if (!options.chown && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + } catch (ex) { + // ignore stat errors + } + } - return ret; - }; + var fd + var cleanup = cleanupOnExit(tmpfile) + var removeOnExitHandler = onExit(cleanup) - return sortKeys(obj); -}; + try { + fd = fs.openSync(tmpfile, 'w', options.mode) + if (Buffer.isBuffer(data)) { + fs.writeSync(fd, data, 0, data.length, 0) + } else if (data != null) { + fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) + } + if (options.fsync !== false) { + fs.fsyncSync(fd) + } + fs.closeSync(fd) + if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) + if (options.mode) fs.chmodSync(tmpfile, options.mode) + fs.renameSync(tmpfile, filename) + removeOnExitHandler() + } catch (err) { + if (fd) { + try { + fs.closeSync(fd) + } catch (ex) { + // ignore close errors at this stage, error may have closed fd already. + } + } + removeOnExitHandler() + cleanup() + throw err + } +} /***/ }), -/* 559 */ +/* 552 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var fs = __webpack_require__(349) +var polyfills = __webpack_require__(553) +var legacy = __webpack_require__(555) +var queue = [] -var toString = Object.prototype.toString; +var util = __webpack_require__(397) -module.exports = function (x) { - var prototype; - return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); -}; +function noop () {} +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } -/***/ }), -/* 560 */ -/***/ (function(module, exports, __webpack_require__) { +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(371).equal(queue.length, 0) + }) +} -"use strict"; +module.exports = patch(__webpack_require__(554)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { + module.exports = patch(fs) +} -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const pify = __webpack_require__(561); -const semver = __webpack_require__(523); +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = +fs.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() -const defaults = { - mode: 0o777 & (~process.umask()), - fs -}; + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) -const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); +module.exports.closeSync = +fs.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) -// https://github.com/nodejs/node/issues/8987 -// https://github.com/libuv/libuv/pull/1088 -const checkPath = pth => { - if (process.platform === 'win32') { - const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null - if (pathHasInvalidWinCharacters) { - const error = new Error(`Path contains invalid characters: ${pth}`); - error.code = 'EINVAL'; - throw error; - } - } -}; + return go$readFile(path, options, cb) -const permissionError = pth => { - // This replicates the exception of `fs.mkdir` with native the - // `recusive` option when run on an invalid drive under Windows. - const error = new Error(`operation not permitted, mkdir '${pth}'`); - error.code = 'EPERM'; - error.errno = -4048; - error.path = pth; - error.syscall = 'mkdir'; - return error; -}; + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } -const makeDir = (input, options) => Promise.resolve().then(() => { - checkPath(input); - options = Object.assign({}, defaults, options); + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null - // TODO: Use util.promisify when targeting Node.js 8 - const mkdir = pify(options.fs.mkdir); - const stat = pify(options.fs.stat); + return go$writeFile(path, data, options, cb) - if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { - const pth = path.resolve(input); + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$appendFile(path, data, options, cb) + + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options + } + args.push(go$readdir$cb) + + return go$readdir(args) + + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() + + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } + + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } + + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } + + var fs$ReadStream = fs.ReadStream + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + + var fs$WriteStream = fs.WriteStream + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream - return mkdir(pth, { - mode: options.mode, - recursive: true - }).then(() => pth); - } + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } - const make = pth => { - return mkdir(pth, options.mode) - .then(() => pth) - .catch(error => { - if (error.code === 'EPERM') { - throw error; - } + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } - if (error.message.includes('null bytes')) { - throw error; - } + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } - return make(path.dirname(pth)).then(() => make(pth)); - } + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } - return stat(pth) - .then(stats => stats.isDirectory() ? pth : Promise.reject()) - .catch(() => { - throw error; - }); - }); - }; + function createReadStream (path, options) { + return new ReadStream(path, options) + } - return make(path.resolve(input)); -}); + function createWriteStream (path, options) { + return new WriteStream(path, options) + } -module.exports = makeDir; -module.exports.default = makeDir; + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null -module.exports.sync = (input, options) => { - checkPath(input); - options = Object.assign({}, defaults, options); + return go$open(path, flags, mode, cb) - if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { - const pth = path.resolve(input); + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } - fs.mkdirSync(pth, { - mode: options.mode, - recursive: true - }); + return fs +} - return pth; - } +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) +} - const make = pth => { - try { - options.fs.mkdirSync(pth, options.mode); - } catch (error) { - if (error.code === 'EPERM') { - throw error; - } +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } - if (error.message.includes('null bytes')) { - throw error; - } +/***/ }), +/* 553 */ +/***/ (function(module, exports, __webpack_require__) { - make(path.dirname(pth)); - return make(pth); - } +var fs = __webpack_require__(554) +var constants = __webpack_require__(411) - try { - if (!options.fs.statSync(pth).isDirectory()) { - throw new Error('The path is not a directory'); - } - } catch (_) { - throw error; - } - } +var origCwd = process.cwd +var cwd = null - return pth; - }; +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - return make(path.resolve(input)); -}; +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +try { + process.cwd() +} catch (er) {} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} -/***/ }), -/* 561 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = patch -"use strict"; +function patch (fs) { + // (re-)implement some things that are known busted or missing. + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } -const processFn = (fn, options) => function (...args) { - const P = options.promiseModule; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } - return new P((resolve, reject) => { - if (options.multiArgs) { - args.push((...result) => { - if (options.errorFirst) { - if (result[0]) { - reject(result); - } else { - result.shift(); - resolve(result); - } - } else { - resolve(result); - } - }); - } else if (options.errorFirst) { - args.push((error, result) => { - if (error) { - reject(error); - } else { - resolve(result); - } - }); - } else { - args.push(resolve); - } + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. - fn.apply(this, args); - }); -}; + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -module.exports = (input, options) => { - options = Object.assign({ - exclude: [/.+(Sync|Stream)$/], - errorFirst: true, - promiseModule: Promise - }, options); + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) - const objType = typeof input; - if (!(input !== null && (objType === 'object' || objType === 'function'))) { - throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); - } + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) - const filter = key => { - const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); - return options.include ? options.include.some(match) : !options.exclude.some(match); - }; + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) - let ret; - if (objType === 'function') { - ret = function (...args) { - return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); - }; - } else { - ret = Object.create(Object.getPrototypeOf(input)); - } + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) - for (const key in input) { // eslint-disable-line guard-for-in - const property = input[key]; - ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; - } + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) - return ret; -}; + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} + } + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. -/***/ }), -/* 562 */ -/***/ (function(module, exports, __webpack_require__) { + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } -"use strict"; + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) +} -// detect either spaces or tabs but not both to properly handle tabs -// for indentation and spaces for alignment -const INDENT_RE = /^(?:( )+|\t+)/; +function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } -function getMostUsed(indents) { - let result = 0; - let maxUsed = 0; - let maxWeight = 0; + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) - for (const entry of indents) { - // TODO: use destructuring when targeting Node.js 6 - const key = entry[0]; - const val = entry[1]; + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } +} - const u = val[0]; - const w = val[1]; +function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } - if (u > maxUsed || (u === maxUsed && w > maxWeight)) { - maxUsed = u; - maxWeight = w; - result = Number(key); - } - } + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } - return result; + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } } -module.exports = str => { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } +function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } +} - // used to see if tabs or spaces are the most used - let tabs = 0; - let spaces = 0; +function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} - // remember the size of previous line's indentation - let prev = 0; - // remember how many indents/unindents as occurred for a given size - // and how much lines follow a given indentation - // - // indents = { - // 3: [1, 0], - // 4: [1, 5], - // 5: [1, 0], - // 12: [1, 0], - // } - const indents = new Map(); +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } +} - // pointer to the array of last used indent - let current; +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} - // whether the last action was an indent (opposed to an unindent) - let isIndent; - for (const line of str.split(/\n/g)) { - if (!line) { - // ignore empty lines - continue; - } +function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } +} - let indent; - const matches = line.match(INDENT_RE); +function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } +} - if (matches) { - indent = matches[0].length; +// ENOSYS means that the fs doesn't support the op. Just ignore +// that, because it doesn't matter. +// +// if there's no getuid, or if getuid() is something other +// than 0, and the error is EINVAL or EPERM, then just ignore +// it. +// +// This specific case is a silent failure in cp, install, tar, +// and most other unix tools that manage permissions. +// +// When running as root, or if other types of errors are +// encountered, then it's strict. +function chownErOk (er) { + if (!er) + return true - if (matches[1]) { - spaces++; - } else { - tabs++; - } - } else { - indent = 0; - } + if (er.code === "ENOSYS") + return true - const diff = indent - prev; - prev = indent; + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } - if (diff) { - // an indent or unindent has been detected + return false +} - isIndent = diff > 0; - current = indents.get(isIndent ? diff : -diff); +/***/ }), +/* 554 */ +/***/ (function(module, exports, __webpack_require__) { - if (current) { - current[0]++; - } else { - current = [1, 0]; - indents.set(diff, current); - } - } else if (current) { - // if the last action was an indent, increment the weight - current[1] += Number(isIndent); - } - } +"use strict"; - const amount = getMostUsed(indents); - let type; - let indent; - if (!amount) { - type = null; - indent = ''; - } else if (spaces >= tabs) { - type = 'space'; - indent = ' '.repeat(amount); - } else { - type = 'tab'; - indent = '\t'.repeat(amount); - } +var fs = __webpack_require__(349) - return { - amount, - type, - indent - }; -}; +module.exports = clone(fs) +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj -/***/ }), -/* 563 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); -/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(564); -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) + return copy +} -/** - * Install all dependencies in the given directory - */ -async function installInDir(directory, extraArgs = []) { - const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any - // given time (e.g. to avoid conflicts). - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', options, { - cwd: directory - }); -} -/** - * Run script in the given directory - */ +/***/ }), +/* 555 */ +/***/ (function(module, exports, __webpack_require__) { -async function runScriptInPackage(script, args, pkg) { - const execOpts = { - cwd: pkg.path - }; - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['run', script, ...args], execOpts); -} -/** - * Run script in the given directory - */ +var Stream = __webpack_require__(382).Stream -function runScriptInPackageStreaming(script, args, pkg) { - const execOpts = { - cwd: pkg.path - }; - return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])('yarn', ['run', script, ...args], execOpts, { - prefix: pkg.name - }); -} -async function yarnWorkspacesInfo(directory) { - const { - stdout - } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['--json', 'workspaces', 'info'], { - cwd: directory, - stdio: 'pipe' - }); +module.exports = legacy - try { - return JSON.parse(JSON.parse(stdout).data); - } catch (error) { - throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream } -} -/***/ }), -/* 564 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(371); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var log_symbols__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(565); -/* harmony import */ var log_symbols__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(log_symbols__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(570); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + Stream.call(this); -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + var self = this; -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; + options = options || {}; + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + if (this.encoding) this.setEncoding(this.encoding); + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } -function generateColors() { - const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_0___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green]; - const count = colorWheel.length; - let children = 0; - return () => colorWheel[children++ % count]; -} + if (this.start > this.end) { + throw new Error('start must be <= end'); + } -function spawn(command, args, opts) { - return execa__WEBPACK_IMPORTED_MODULE_1___default()(command, args, _objectSpread({ - stdio: 'inherit', - preferLocal: true - }, opts)); -} -const nextColor = generateColors(); -function spawnStreaming(command, args, opts, { - prefix -}) { - const spawned = execa__WEBPACK_IMPORTED_MODULE_1___default()(command, args, _objectSpread({ - stdio: ['ignore', 'pipe', 'pipe'], - preferLocal: true - }, opts)); - const color = nextColor(); - const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - tag: `${color.bold(prefix)}:` - }); - const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - mergeMultiline: true, - tag: `${log_symbols__WEBPACK_IMPORTED_MODULE_2___default.a.error} ${color.bold(prefix)}:` - }); - spawned.stdout.pipe(prefixedStdout).pipe(process.stdout); - spawned.stderr.pipe(prefixedStderr).pipe(process.stderr); - return spawned; -} + this.pos = this.start; + } -/***/ }), -/* 565 */ -/***/ (function(module, exports, __webpack_require__) { + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -"use strict"; + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } -const chalk = __webpack_require__(566); + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } -const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); -const main = { - info: chalk.blue('ℹ'), - success: chalk.green('✔'), - warning: chalk.yellow('⚠'), - error: chalk.red('✖') -}; + Stream.call(this); -const fallbacks = { - info: chalk.blue('i'), - success: chalk.green('√'), - warning: chalk.yellow('‼'), - error: chalk.red('×') -}; + this.path = path; + this.fd = null; + this.writable = true; -module.exports = isSupported ? main : fallbacks; + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + options = options || {}; -/***/ }), -/* 566 */ -/***/ (function(module, exports, __webpack_require__) { + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } -"use strict"; + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(567); -const stdoutColor = __webpack_require__(568).stdout; + this.pos = this.start; + } -const template = __webpack_require__(569); + this.busy = false; + this._queue = []; -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } + } +} -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); +/***/ }), +/* 556 */ +/***/ (function(module, exports, __webpack_require__) { -const styles = Object.create(null); +/** + * @preserve + * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) + * + * @author Jens Taylor + * @see http://github.com/homebrewing/brauhaus-diff + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + */ +(function(){ + var cache; -function applyOptions(obj, options) { - options = options || {}; + // Call this function without `new` to use the cached object (good for + // single-threaded environments), or with `new` to create a new object. + // + // @param {string} key A UTF-16 or ASCII string + // @param {number} seed An optional positive integer + // @return {object} A MurmurHash3 object for incremental hashing + function MurmurHash3(key, seed) { + var m = this instanceof MurmurHash3 ? this : cache; + m.reset(seed) + if (typeof key === 'string' && key.length > 0) { + m.hash(key); + } - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} + if (m !== this) { + return m; + } + }; -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); + // Incrementally add a string to this hash + // + // @param {string} key A UTF-16 or ASCII string + // @return {object} this + MurmurHash3.prototype.hash = function(key) { + var h1, k1, i, top, len; - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; + len = key.length; + this.len += len; - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + k1 = this.k1; + i = 0; + switch (this.rem) { + case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; + case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; + case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; + case 3: + k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; + k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; + } - chalk.template.constructor = Chalk; + this.rem = (len + this.rem) & 3; // & 3 is same as % 4 + len -= this.rem; + if (len > 0) { + h1 = this.h1; + while (1) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - return chalk.template; - } + h1 ^= k1; + h1 = (h1 << 13) | (h1 >>> 19); + h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; - applyOptions(this, options); -} + if (i >= len) { + break; + } -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; -} + k1 = ((key.charCodeAt(i++) & 0xffff)) ^ + ((key.charCodeAt(i++) & 0xffff) << 8) ^ + ((key.charCodeAt(i++) & 0xffff) << 16); + top = key.charCodeAt(i++); + k1 ^= ((top & 0xff) << 24) ^ + ((top & 0xff00) >> 8); + } -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + k1 = 0; + switch (this.rem) { + case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; + case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; + case 1: k1 ^= (key.charCodeAt(i) & 0xffff); + } - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); - } - }; -} + this.h1 = h1; + } -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } -}; + this.k1 = k1; + return this; + }; -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } + // Get the result of this hash + // + // @return {number} The 32-bit hash + MurmurHash3.prototype.result = function() { + var k1, h1; + + k1 = this.k1; + h1 = this.h1; - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} + if (k1 > 0) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; + h1 ^= k1; + } -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } + h1 ^= this.len; + + h1 ^= h1 >>> 16; + h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; + h1 ^= h1 >>> 13; + h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; + h1 ^= h1 >>> 16; - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} + return h1 >>> 0; + }; -const proto = Object.defineProperties(() => {}, styles); + // Reset the hash object for reuse + // + // @param {number} seed An optional positive integer + MurmurHash3.prototype.reset = function(seed) { + this.h1 = typeof seed === 'number' ? seed : 0; + this.rem = this.k1 = this.len = 0; + return this; + }; -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; + // A cached object to use. This can be safely used if you're in a single- + // threaded environment, otherwise you need to create new hashes to use. + cache = new MurmurHash3(); - builder._styles = _styles; - builder._empty = _empty; + if (true) { + module.exports = MurmurHash3; + } else {} +}()); - const self = this; - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); +/***/ }), +/* 557 */ +/***/ (function(module, exports) { - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); +module.exports = require(undefined); - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; +/***/ }), +/* 558 */ +/***/ (function(module, exports, __webpack_require__) { - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto +"use strict"; - return builder; -} +const isPlainObj = __webpack_require__(559); -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); +module.exports = (obj, opts) => { + if (!isPlainObj(obj)) { + throw new TypeError('Expected a plain object'); + } - if (argsLen === 0) { - return ''; + opts = opts || {}; + + // DEPRECATED + if (typeof opts === 'function') { + throw new TypeError('Specify the compare function as an option instead'); } - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; + const deep = opts.deep; + const seenInput = []; + const seenOutput = []; + + const sortKeys = x => { + const seenIndex = seenInput.indexOf(x); + + if (seenIndex !== -1) { + return seenOutput[seenIndex]; } - } - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + const ret = {}; + const keys = Object.keys(x).sort(opts.compare); - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + seenInput.push(x); + seenOutput.push(ret); - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = x[key]; - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } + if (deep && Array.isArray(val)) { + const retArr = []; - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + for (let j = 0; j < val.length; j++) { + retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; + } - return str; -} + ret[key] = retArr; + continue; + } -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } + ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; + } - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + return ret; + }; - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } + return sortKeys(obj); +}; - return template(chalk, parts.join('')); -} -Object.defineProperties(Chalk.prototype, styles); +/***/ }), +/* 559 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +"use strict"; + +var toString = Object.prototype.toString; + +module.exports = function (x) { + var prototype; + return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); +}; /***/ }), -/* 567 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const pify = __webpack_require__(561); +const semver = __webpack_require__(523); + +const defaults = { + mode: 0o777 & (~process.umask()), + fs }; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; +const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); + +// https://github.com/nodejs/node/issues/8987 +// https://github.com/libuv/libuv/pull/1088 +const checkPath = pth => { + if (process.platform === 'win32') { + const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); + + if (pathHasInvalidWinCharacters) { + const error = new Error(`Path contains invalid characters: ${pth}`); + error.code = 'EINVAL'; + throw error; + } + } }; -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +const permissionError = pth => { + // This replicates the exception of `fs.mkdir` with native the + // `recusive` option when run on an invalid drive under Windows. + const error = new Error(`operation not permitted, mkdir '${pth}'`); + error.code = 'EPERM'; + error.errno = -4048; + error.path = pth; + error.syscall = 'mkdir'; + return error; }; -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], +const makeDir = (input, options) => Promise.resolve().then(() => { + checkPath(input); + options = Object.assign({}, defaults, options); - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], + // TODO: Use util.promisify when targeting Node.js 8 + const mkdir = pify(options.fs.mkdir); + const stat = pify(options.fs.stat); - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; + if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { + const pth = path.resolve(input); - // Fix humans - styles.color.grey = styles.color.gray; + return mkdir(pth, { + mode: options.mode, + recursive: true + }).then(() => pth); + } - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; + const make = pth => { + return mkdir(pth, options.mode) + .then(() => pth) + .catch(error => { + if (error.code === 'EPERM') { + throw error; + } - for (const styleName of Object.keys(group)) { - const style = group[styleName]; + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; + if (error.message.includes('null bytes')) { + throw error; + } - group[styleName] = styles[styleName]; + return make(path.dirname(pth)).then(() => make(pth)); + } - codes.set(style[0], style[1]); - } + return stat(pth) + .then(stats => stats.isDirectory() ? pth : Promise.reject()) + .catch(() => { + throw error; + }); + }); + }; - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); + return make(path.resolve(input)); +}); - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false +module.exports = makeDir; +module.exports.default = makeDir; + +module.exports.sync = (input, options) => { + checkPath(input); + options = Object.assign({}, defaults, options); + + if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { + const pth = path.resolve(input); + + fs.mkdirSync(pth, { + mode: options.mode, + recursive: true }); + + return pth; } - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; + const make = pth => { + try { + options.fs.mkdirSync(pth, options.mode); + } catch (error) { + if (error.code === 'EPERM') { + throw error; + } - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; + if (error.message.includes('null bytes')) { + throw error; + } - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; + make(path.dirname(pth)); + return make(pth); + } - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; + try { + if (!options.fs.statSync(pth).isDirectory()) { + throw new Error('The path is not a directory'); + } + } catch (_) { + throw error; + } } - const suite = colorConvert[key]; + return pth; + }; - if (key === 'ansi16') { - key = 'ansi'; - } + return make(path.resolve(input)); +}; - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } +/***/ }), +/* 561 */ +/***/ (function(module, exports, __webpack_require__) { - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); +"use strict"; + + +const processFn = (fn, options) => function (...args) { + const P = options.promiseModule; + + return new P((resolve, reject) => { + if (options.multiArgs) { + args.push((...result) => { + if (options.errorFirst) { + if (result[0]) { + reject(result); + } else { + result.shift(); + resolve(result); + } + } else { + resolve(result); + } + }); + } else if (options.errorFirst) { + args.push((error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + } else { + args.push(resolve); } + + fn.apply(this, args); + }); +}; + +module.exports = (input, options) => { + options = Object.assign({ + exclude: [/.+(Sync|Stream)$/], + errorFirst: true, + promiseModule: Promise + }, options); + + const objType = typeof input; + if (!(input !== null && (objType === 'object' || objType === 'function'))) { + throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); } - return styles; -} + const filter = key => { + const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); + return options.include ? options.include.some(match) : !options.exclude.some(match); + }; -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); + let ret; + if (objType === 'function') { + ret = function (...args) { + return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); + }; + } else { + ret = Object.create(Object.getPrototypeOf(input)); + } + + for (const key in input) { // eslint-disable-line guard-for-in + const property = input[key]; + ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; + } + + return ret; +}; -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) /***/ }), -/* 568 */ +/* 562 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); -const env = process.env; +// detect either spaces or tabs but not both to properly handle tabs +// for indentation and spaces for alignment +const INDENT_RE = /^(?:( )+|\t+)/; -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} +function getMostUsed(indents) { + let result = 0; + let maxUsed = 0; + let maxWeight = 0; -function translateLevel(level) { - if (level === 0) { - return false; + for (const entry of indents) { + // TODO: use destructuring when targeting Node.js 6 + const key = entry[0]; + const val = entry[1]; + + const u = val[0]; + const w = val[1]; + + if (u > maxUsed || (u === maxUsed && w > maxWeight)) { + maxUsed = u; + maxWeight = w; + result = Number(key); + } } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; + return result; } -function supportsColor(stream) { - if (forceColor === false) { - return 0; +module.exports = str => { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); } - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } + // used to see if tabs or spaces are the most used + let tabs = 0; + let spaces = 0; - if (hasFlag('color=256')) { - return 2; - } + // remember the size of previous line's indentation + let prev = 0; - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } + // remember how many indents/unindents as occurred for a given size + // and how much lines follow a given indentation + // + // indents = { + // 3: [1, 0], + // 4: [1, 5], + // 5: [1, 0], + // 12: [1, 0], + // } + const indents = new Map(); - const min = forceColor ? 1 : 0; + // pointer to the array of last used indent + let current; - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; + // whether the last action was an indent (opposed to an unindent) + let isIndent; + + for (const line of str.split(/\n/g)) { + if (!line) { + // ignore empty lines + continue; } - return 1; - } + let indent; + const matches = line.match(INDENT_RE); - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; + if (matches) { + indent = matches[0].length; + + if (matches[1]) { + spaces++; + } else { + tabs++; + } + } else { + indent = 0; } - return min; - } + const diff = indent - prev; + prev = indent; - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } + if (diff) { + // an indent or unindent has been detected - if (env.COLORTERM === 'truecolor') { - return 3; - } + isIndent = diff > 0; - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + current = indents.get(isIndent ? diff : -diff); - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default + if (current) { + current[0]++; + } else { + current = [1, 0]; + indents.set(diff, current); + } + } else if (current) { + // if the last action was an indent, increment the weight + current[1] += Number(isIndent); } } - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } + const amount = getMostUsed(indents); - if (env.TERM === 'dumb') { - return min; + let type; + let indent; + if (!amount) { + type = null; + indent = ''; + } else if (spaces >= tabs) { + type = 'space'; + indent = ' '.repeat(amount); + } else { + type = 'tab'; + indent = '\t'.repeat(amount); } - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) + return { + amount, + type, + indent + }; }; /***/ }), -/* 569 */ -/***/ (function(module, exports, __webpack_require__) { +/* 563 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); +/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(564); +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; - -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } +/** + * Install all dependencies in the given directory + */ +async function installInDir(directory, extraArgs = []) { + const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any + // given time (e.g. to avoid conflicts). - return ESCAPES.get(c) || c; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', options, { + cwd: directory + }); } +/** + * Run script in the given directory + */ -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; +async function runScriptInPackage(script, args, pkg) { + const execOpts = { + cwd: pkg.path + }; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['run', script, ...args], execOpts); +} +/** + * Run script in the given directory + */ - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } +function runScriptInPackageStreaming({ + script, + args, + pkg, + debug +}) { + const execOpts = { + cwd: pkg.path + }; + return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])('yarn', ['run', script, ...args], execOpts, { + prefix: pkg.name, + debug + }); +} +async function yarnWorkspacesInfo(directory) { + const { + stdout + } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['--json', 'workspaces', 'info'], { + cwd: directory, + stdio: 'pipe' + }); - return results; + try { + return JSON.parse(JSON.parse(stdout).data); + } catch (error) { + throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); + } } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; +/***/ }), +/* 564 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const results = []; - let matches; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(382); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stream__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(386); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(342); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(565); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(500); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - return results; -} +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ -function buildStyle(chalk, styles) { - const enabled = {}; - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } - return current; -} +const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_1___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.green]; -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; +const getColor = () => { + const color = colorWheel.shift(); + colorWheel.push(color); + return color; +}; - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } +function spawn(command, args, opts) { + return execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: 'inherit', + preferLocal: true + }, opts)); +} - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); +function streamToLog(debug = true) { + return new stream__WEBPACK_IMPORTED_MODULE_0__["Writable"]({ + objectMode: true, - chunks.push(chunk.join('')); + write(line, _, cb) { + if (line.endsWith('\n')) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line.slice(0, -1)); + } else { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line); + } - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } + cb(); + } - return chunks.join(''); -}; + }); +} +function spawnStreaming(command, args, opts, { + prefix, + debug +}) { + const spawned = execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: ['ignore', 'pipe', 'pipe'], + preferLocal: true + }, opts)); + const color = getColor(); + const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + tag: color.bold(prefix) + }); + const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + mergeMultiline: true, + tag: color.bold(prefix) + }); + spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); + spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); + return spawned; +} /***/ }), -/* 570 */ +/* 565 */ /***/ (function(module, exports, __webpack_require__) { // Copyright IBM Corp. 2014,2018. All Rights Reserved. @@ -56063,12 +55405,12 @@ module.exports = (chalk, tmp) => { // This file is licensed under the Apache License 2.0. // License text available at https://opensource.org/licenses/Apache-2.0 -module.exports = __webpack_require__(571); -module.exports.cli = __webpack_require__(575); +module.exports = __webpack_require__(566); +module.exports.cli = __webpack_require__(570); /***/ }), -/* 571 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56079,13 +55421,13 @@ module.exports.cli = __webpack_require__(575); -var stream = __webpack_require__(27); -var util = __webpack_require__(29); -var fs = __webpack_require__(23); +var stream = __webpack_require__(382); +var util = __webpack_require__(397); +var fs = __webpack_require__(349); -var through = __webpack_require__(572); -var duplexer = __webpack_require__(573); -var StringDecoder = __webpack_require__(574).StringDecoder; +var through = __webpack_require__(567); +var duplexer = __webpack_require__(568); +var StringDecoder = __webpack_require__(569).StringDecoder; module.exports = Logger; @@ -56274,10 +55616,10 @@ function lineMerger(host) { /***/ }), -/* 572 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27) +var Stream = __webpack_require__(382) // through // @@ -56388,10 +55730,10 @@ function through (write, end, opts) { /***/ }), -/* 573 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(27) +var Stream = __webpack_require__(382) var writeMethods = ["write", "end", "destroy"] var readMethods = ["resume", "pause"] var readEvents = ["data", "close"] @@ -56481,13 +55823,13 @@ function duplex(writer, reader) { /***/ }), -/* 574 */ +/* 569 */ /***/ (function(module, exports) { module.exports = require("string_decoder"); /***/ }), -/* 575 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56498,11 +55840,11 @@ module.exports = require("string_decoder"); -var minimist = __webpack_require__(576); -var path = __webpack_require__(16); +var minimist = __webpack_require__(571); +var path = __webpack_require__(4); -var Logger = __webpack_require__(571); -var pkg = __webpack_require__(577); +var Logger = __webpack_require__(566); +var pkg = __webpack_require__(572); module.exports = cli; @@ -56556,7 +55898,7 @@ function usage($0, p) { /***/ }), -/* 576 */ +/* 571 */ /***/ (function(module, exports) { module.exports = function (args, opts) { @@ -56798,13 +56140,13 @@ function isNumber (x) { /***/ }), -/* 577 */ +/* 572 */ /***/ (function(module) { module.exports = JSON.parse("{\"name\":\"strong-log-transformer\",\"version\":\"2.1.0\",\"description\":\"Stream transformer that prefixes lines with timestamps and other things.\",\"author\":\"Ryan Graham \",\"license\":\"Apache-2.0\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/strongloop/strong-log-transformer\"},\"keywords\":[\"logging\",\"streams\"],\"bugs\":{\"url\":\"https://github.com/strongloop/strong-log-transformer/issues\"},\"homepage\":\"https://github.com/strongloop/strong-log-transformer\",\"directories\":{\"test\":\"test\"},\"bin\":{\"sl-log-transformer\":\"bin/sl-log-transformer.js\"},\"main\":\"index.js\",\"scripts\":{\"test\":\"tap --100 test/test-*\"},\"dependencies\":{\"duplexer\":\"^0.1.1\",\"minimist\":\"^1.2.0\",\"through\":\"^2.3.4\"},\"devDependencies\":{\"tap\":\"^12.0.1\"},\"engines\":{\"node\":\">=4\"}}"); /***/ }), -/* 578 */ +/* 573 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56813,12 +56155,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return copyWorkspacePackages; }); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(503); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(579); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(574); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(491); /* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(518); /* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(502); /* @@ -56912,13 +56254,13 @@ function packagesFromGlobPattern({ } /***/ }), -/* 579 */ +/* 574 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProjectPaths", function() { return getProjectPaths; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -56982,21 +56324,21 @@ function getProjectPaths({ } /***/ }), -/* 580 */ +/* 575 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAllChecksums", function() { return getAllChecksums; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(349); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(581); +/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(576); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); +/* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(397); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(371); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(342); /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(582); +/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(577); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -57225,21 +56567,21 @@ async function getAllChecksums(kbn, log) { } /***/ }), -/* 581 */ +/* 576 */ /***/ (function(module, exports) { module.exports = require("crypto"); /***/ }), -/* 582 */ +/* 577 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readYarnLock", function() { return readYarnLock; }); -/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(583); +/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(578); /* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(491); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -57281,7 +56623,7 @@ async function readYarnLock(kbn) { } /***/ }), -/* 583 */ +/* 578 */ /***/ (function(module, exports, __webpack_require__) { module.exports = @@ -57357,7 +56699,7 @@ module.exports = /* 0 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(16); +module.exports = __webpack_require__(4); /***/ }), /* 1 */ @@ -57407,13 +56749,13 @@ exports.default = function (fn) { /* 2 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(29); +module.exports = __webpack_require__(397); /***/ }), /* 3 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(23); +module.exports = __webpack_require__(349); /***/ }), /* 4 */ @@ -58840,7 +58182,7 @@ module.exports = invariant; /* 9 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(581); +module.exports = __webpack_require__(576); /***/ }), /* 10 */, @@ -59266,7 +58608,7 @@ exports.default = Lockfile; /* 17 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(27); +module.exports = __webpack_require__(382); /***/ }), /* 18 */, @@ -59318,7 +58660,7 @@ function nullify(obj = {}) { /* 22 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(30); +module.exports = __webpack_require__(371); /***/ }), /* 23 */ @@ -59505,7 +58847,7 @@ module.exports = {}; /* 36 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(11); +module.exports = __webpack_require__(364); /***/ }), /* 37 */, @@ -59790,7 +59132,7 @@ exports.f = __webpack_require__(33) ? Object.defineProperty : function definePro /* 54 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(399); +module.exports = __webpack_require__(373); /***/ }), /* 55 */ @@ -61164,7 +60506,7 @@ function onceStrict (fn) { /* 63 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(584); +module.exports = __webpack_require__(579); /***/ }), /* 64 */, @@ -62102,7 +61444,7 @@ module.exports.win32 = win32; /* 79 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(484); +module.exports = __webpack_require__(471); /***/ }), /* 80 */, @@ -67559,21 +66901,21 @@ module.exports = process && support(supportLevel); /******/ ]); /***/ }), -/* 584 */ +/* 579 */ /***/ (function(module, exports) { module.exports = require("buffer"); /***/ }), -/* 585 */ +/* 580 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCacheFile", function() { return BootstrapCacheFile; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(349); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -67662,22 +67004,20 @@ class BootstrapCacheFile { } /***/ }), -/* 586 */ +/* 581 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CleanCommand", function() { return CleanCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(587); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(675); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(582); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(670); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(491); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(500); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -67701,7 +67041,6 @@ __webpack_require__.r(__webpack_exports__); - const CleanCommand = { description: 'Remove the node_modules and target directories from all projects.', name: 'clean', @@ -67710,17 +67049,17 @@ const CleanCommand = { const toDelete = []; for (const project of projects.values()) { - if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(project.nodeModulesLocation)) { + if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_3__["isDirectory"])(project.nodeModulesLocation)) { toDelete.push({ cwd: project.path, - pattern: Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(project.path, project.nodeModulesLocation) + pattern: Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(project.path, project.nodeModulesLocation) }); } - if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["isDirectory"])(project.targetLocation)) { + if (await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_3__["isDirectory"])(project.targetLocation)) { toDelete.push({ cwd: project.path, - pattern: Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(project.path, project.targetLocation) + pattern: Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(project.path, project.targetLocation) }); } @@ -67737,9 +67076,8 @@ const CleanCommand = { } if (toDelete.length === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.green('\n\nNothing to delete')); + _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].success('Nothing to delete'); } else { - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.red('\n\nDeleting:\n')); /** * In order to avoid patterns like `/build` in packages from accidentally * impacting files outside the package we use `process.chdir()` to change @@ -67749,7 +67087,6 @@ const CleanCommand = { * `del()` does support a `cwd` option, but it's only for resolving the * patterns and does not impact the cwd check. */ - const originalCwd = process.cwd(); try { @@ -67758,8 +67095,12 @@ const CleanCommand = { cwd } of toDelete) { process.chdir(cwd); - const promise = del__WEBPACK_IMPORTED_MODULE_1___default()(pattern); - ora__WEBPACK_IMPORTED_MODULE_2___default.a.promise(promise, Object(path__WEBPACK_IMPORTED_MODULE_3__["relative"])(originalCwd, Object(path__WEBPACK_IMPORTED_MODULE_3__["join"])(cwd, String(pattern)))); + const promise = del__WEBPACK_IMPORTED_MODULE_0___default()(pattern); + + if (_utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].wouldLogLevel('info')) { + ora__WEBPACK_IMPORTED_MODULE_1___default.a.promise(promise, Object(path__WEBPACK_IMPORTED_MODULE_2__["relative"])(originalCwd, Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(cwd, String(pattern)))); + } + await promise; } } finally { @@ -67771,21 +67112,21 @@ const CleanCommand = { }; /***/ }), -/* 587 */ +/* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {promisify} = __webpack_require__(29); -const path = __webpack_require__(16); -const globby = __webpack_require__(588); -const isGlob = __webpack_require__(605); -const slash = __webpack_require__(666); -const gracefulFs = __webpack_require__(22); -const isPathCwd = __webpack_require__(668); -const isPathInside = __webpack_require__(669); -const rimraf = __webpack_require__(670); -const pMap = __webpack_require__(671); +const {promisify} = __webpack_require__(397); +const path = __webpack_require__(4); +const globby = __webpack_require__(583); +const isGlob = __webpack_require__(600); +const slash = __webpack_require__(661); +const gracefulFs = __webpack_require__(493); +const isPathCwd = __webpack_require__(663); +const isPathInside = __webpack_require__(664); +const rimraf = __webpack_require__(665); +const pMap = __webpack_require__(666); const rimrafP = promisify(rimraf); @@ -67899,19 +67240,19 @@ module.exports.sync = (patterns, {force, dryRun, cwd = process.cwd(), ...options /***/ }), -/* 588 */ +/* 583 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const arrayUnion = __webpack_require__(589); -const merge2 = __webpack_require__(590); -const glob = __webpack_require__(591); -const fastGlob = __webpack_require__(596); -const dirGlob = __webpack_require__(662); -const gitignore = __webpack_require__(664); -const {FilterStream, UniqueStream} = __webpack_require__(667); +const fs = __webpack_require__(349); +const arrayUnion = __webpack_require__(584); +const merge2 = __webpack_require__(585); +const glob = __webpack_require__(586); +const fastGlob = __webpack_require__(591); +const dirGlob = __webpack_require__(657); +const gitignore = __webpack_require__(659); +const {FilterStream, UniqueStream} = __webpack_require__(662); const DEFAULT_FILTER = () => false; @@ -68084,7 +67425,7 @@ module.exports.gitignore = gitignore; /***/ }), -/* 589 */ +/* 584 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68096,7 +67437,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 590 */ +/* 585 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68108,7 +67449,7 @@ module.exports = (...arguments_) => { * Copyright (c) 2014-2016 Teambition * Licensed under the MIT license. */ -const Stream = __webpack_require__(27) +const Stream = __webpack_require__(382) const PassThrough = Stream.PassThrough const slice = Array.prototype.slice @@ -68210,7 +67551,7 @@ function pauseStreams (streams, options) { /***/ }), -/* 591 */ +/* 586 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -68255,27 +67596,27 @@ function pauseStreams (streams, options) { module.exports = glob -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(592) -var EE = __webpack_require__(399).EventEmitter -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var inherits = __webpack_require__(587) +var EE = __webpack_require__(373).EventEmitter +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var globSync = __webpack_require__(594) -var common = __webpack_require__(595) +var globSync = __webpack_require__(589) +var common = __webpack_require__(590) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp var inflight = __webpack_require__(515) -var util = __webpack_require__(29) +var util = __webpack_require__(397) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(404) +var once = __webpack_require__(378) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -69006,22 +68347,22 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 592 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { try { - var util = __webpack_require__(29); + var util = __webpack_require__(397); /* istanbul ignore next */ if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(593); + module.exports = __webpack_require__(588); } /***/ }), -/* 593 */ +/* 588 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -69054,22 +68395,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 594 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(591).Glob -var util = __webpack_require__(29) -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var Glob = __webpack_require__(586).Glob +var util = __webpack_require__(397) +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var common = __webpack_require__(595) +var common = __webpack_require__(590) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -69546,7 +68887,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 595 */ +/* 590 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -69563,7 +68904,7 @@ function ownProp (obj, field) { return Object.prototype.hasOwnProperty.call(obj, field) } -var path = __webpack_require__(16) +var path = __webpack_require__(4) var minimatch = __webpack_require__(506) var isAbsolute = __webpack_require__(512) var Minimatch = minimatch.Minimatch @@ -69792,17 +69133,17 @@ function childrenIgnored (self, path) { /***/ }), -/* 596 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const taskManager = __webpack_require__(597); -const async_1 = __webpack_require__(625); -const stream_1 = __webpack_require__(658); -const sync_1 = __webpack_require__(659); -const settings_1 = __webpack_require__(661); -const utils = __webpack_require__(598); +const taskManager = __webpack_require__(592); +const async_1 = __webpack_require__(620); +const stream_1 = __webpack_require__(653); +const sync_1 = __webpack_require__(654); +const settings_1 = __webpack_require__(656); +const utils = __webpack_require__(593); function FastGlob(source, options) { try { assertPatternsInput(source); @@ -69860,13 +69201,13 @@ module.exports = FastGlob; /***/ }), -/* 597 */ +/* 592 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); +const utils = __webpack_require__(593); function generate(patterns, settings) { const positivePatterns = getPositivePatterns(patterns); const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); @@ -69934,28 +69275,28 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 598 */ +/* 593 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const array = __webpack_require__(599); +const array = __webpack_require__(594); exports.array = array; -const errno = __webpack_require__(600); +const errno = __webpack_require__(595); exports.errno = errno; -const fs = __webpack_require__(601); +const fs = __webpack_require__(596); exports.fs = fs; -const path = __webpack_require__(602); +const path = __webpack_require__(597); exports.path = path; -const pattern = __webpack_require__(603); +const pattern = __webpack_require__(598); exports.pattern = pattern; -const stream = __webpack_require__(624); +const stream = __webpack_require__(619); exports.stream = stream; /***/ }), -/* 599 */ +/* 594 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69968,7 +69309,7 @@ exports.flatten = flatten; /***/ }), -/* 600 */ +/* 595 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69981,7 +69322,7 @@ exports.isEnoentCodeError = isEnoentCodeError; /***/ }), -/* 601 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70006,13 +69347,13 @@ exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 602 */ +/* 597 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); +const path = __webpack_require__(4); /** * Designed to work only with simple paths: `dir\\file`. */ @@ -70027,16 +69368,16 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 603 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const globParent = __webpack_require__(604); -const isGlob = __webpack_require__(605); -const micromatch = __webpack_require__(607); +const path = __webpack_require__(4); +const globParent = __webpack_require__(599); +const isGlob = __webpack_require__(600); +const micromatch = __webpack_require__(602); const GLOBSTAR = '**'; function isStaticPattern(pattern) { return !isDynamicPattern(pattern); @@ -70125,15 +69466,15 @@ exports.matchAny = matchAny; /***/ }), -/* 604 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isGlob = __webpack_require__(605); -var pathPosixDirname = __webpack_require__(16).posix.dirname; -var isWin32 = __webpack_require__(11).platform() === 'win32'; +var isGlob = __webpack_require__(600); +var pathPosixDirname = __webpack_require__(4).posix.dirname; +var isWin32 = __webpack_require__(364).platform() === 'win32'; var slash = '/'; var backslash = /\\/g; @@ -70166,7 +69507,7 @@ module.exports = function globParent(str) { /***/ }), -/* 605 */ +/* 600 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -70176,7 +69517,7 @@ module.exports = function globParent(str) { * Released under the MIT License. */ -var isExtglob = __webpack_require__(606); +var isExtglob = __webpack_require__(601); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -70220,7 +69561,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 606 */ +/* 601 */ /***/ (function(module, exports) { /*! @@ -70246,16 +69587,16 @@ module.exports = function isExtglob(str) { /***/ }), -/* 607 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const util = __webpack_require__(29); -const braces = __webpack_require__(608); -const picomatch = __webpack_require__(618); -const utils = __webpack_require__(621); +const util = __webpack_require__(397); +const braces = __webpack_require__(603); +const picomatch = __webpack_require__(613); +const utils = __webpack_require__(616); const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); /** @@ -70720,16 +70061,16 @@ module.exports = micromatch; /***/ }), -/* 608 */ +/* 603 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(609); -const compile = __webpack_require__(611); -const expand = __webpack_require__(615); -const parse = __webpack_require__(616); +const stringify = __webpack_require__(604); +const compile = __webpack_require__(606); +const expand = __webpack_require__(610); +const parse = __webpack_require__(611); /** * Expand the given pattern or create a regex-compatible string. @@ -70897,13 +70238,13 @@ module.exports = braces; /***/ }), -/* 609 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(610); +const utils = __webpack_require__(605); module.exports = (ast, options = {}) => { let stringify = (node, parent = {}) => { @@ -70936,7 +70277,7 @@ module.exports = (ast, options = {}) => { /***/ }), -/* 610 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71055,14 +70396,14 @@ exports.flatten = (...args) => { /***/ }), -/* 611 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(612); -const utils = __webpack_require__(610); +const fill = __webpack_require__(607); +const utils = __webpack_require__(605); const compile = (ast, options = {}) => { let walk = (node, parent = {}) => { @@ -71119,7 +70460,7 @@ module.exports = compile; /***/ }), -/* 612 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71132,8 +70473,8 @@ module.exports = compile; -const util = __webpack_require__(29); -const toRegexRange = __webpack_require__(613); +const util = __webpack_require__(397); +const toRegexRange = __webpack_require__(608); const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); @@ -71375,7 +70716,7 @@ module.exports = fill; /***/ }), -/* 613 */ +/* 608 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71388,7 +70729,7 @@ module.exports = fill; -const isNumber = __webpack_require__(614); +const isNumber = __webpack_require__(609); const toRegexRange = (min, max, options) => { if (isNumber(min) === false) { @@ -71670,7 +71011,7 @@ module.exports = toRegexRange; /***/ }), -/* 614 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -71695,15 +71036,15 @@ module.exports = function(num) { /***/ }), -/* 615 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(612); -const stringify = __webpack_require__(609); -const utils = __webpack_require__(610); +const fill = __webpack_require__(607); +const stringify = __webpack_require__(604); +const utils = __webpack_require__(605); const append = (queue = '', stash = '', enclose = false) => { let result = []; @@ -71815,13 +71156,13 @@ module.exports = expand; /***/ }), -/* 616 */ +/* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(609); +const stringify = __webpack_require__(604); /** * Constants @@ -71843,7 +71184,7 @@ const { CHAR_SINGLE_QUOTE, /* ' */ CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = __webpack_require__(617); +} = __webpack_require__(612); /** * parse @@ -72155,7 +71496,7 @@ module.exports = parse; /***/ }), -/* 617 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72219,26 +71560,26 @@ module.exports = { /***/ }), -/* 618 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(619); +module.exports = __webpack_require__(614); /***/ }), -/* 619 */ +/* 614 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const scan = __webpack_require__(620); -const parse = __webpack_require__(623); -const utils = __webpack_require__(621); +const path = __webpack_require__(4); +const scan = __webpack_require__(615); +const parse = __webpack_require__(618); +const utils = __webpack_require__(616); /** * Creates a matcher function from one or more glob patterns. The @@ -72541,7 +71882,7 @@ picomatch.toRegex = (source, options) => { * @return {Object} */ -picomatch.constants = __webpack_require__(622); +picomatch.constants = __webpack_require__(617); /** * Expose "picomatch" @@ -72551,13 +71892,13 @@ module.exports = picomatch; /***/ }), -/* 620 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(621); +const utils = __webpack_require__(616); const { CHAR_ASTERISK, /* * */ @@ -72575,7 +71916,7 @@ const { CHAR_RIGHT_CURLY_BRACE, /* } */ CHAR_RIGHT_PARENTHESES, /* ) */ CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(622); +} = __webpack_require__(617); const isPathSeparator = code => { return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; @@ -72777,19 +72118,19 @@ module.exports = (input, options) => { /***/ }), -/* 621 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); +const path = __webpack_require__(4); const win32 = process.platform === 'win32'; const { REGEX_SPECIAL_CHARS, REGEX_SPECIAL_CHARS_GLOBAL, REGEX_REMOVE_BACKSLASH -} = __webpack_require__(622); +} = __webpack_require__(617); exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); @@ -72827,13 +72168,13 @@ exports.escapeLast = (input, char, lastIdx) => { /***/ }), -/* 622 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); +const path = __webpack_require__(4); const WIN_SLASH = '\\\\/'; const WIN_NO_SLASH = `[^${WIN_SLASH}]`; @@ -73013,14 +72354,14 @@ module.exports = { /***/ }), -/* 623 */ +/* 618 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(621); -const constants = __webpack_require__(622); +const utils = __webpack_require__(616); +const constants = __webpack_require__(617); /** * Constants @@ -73175,2463 +72516,3370 @@ const parse = (input, options) => { state.consumed += token.value || ''; }; - const increment = type => { - state[type]++; - stack.push(type); - }; + const increment = type => { + state[type]++; + stack.push(type); + }; + + const decrement = type => { + state[type]--; + stack.pop(); + }; + + /** + * Push tokens onto the tokens array. This helper speeds up + * tokenizing by 1) helping us avoid backtracking as much as possible, + * and 2) helping us avoid creating extra tokens when consecutive + * characters are plain text. This improves performance and simplifies + * lookbehinds. + */ + + const push = tok => { + if (prev.type === 'globstar') { + let isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); + let isExtglob = extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'); + if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = 'star'; + prev.value = '*'; + prev.output = star; + state.output += prev.output; + } + } + + if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { + extglobs[extglobs.length - 1].inner += tok.value; + } + + if (tok.value || tok.output) append(tok); + if (prev && prev.type === 'text' && tok.type === 'text') { + prev.value += tok.value; + return; + } + + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + + const extglobOpen = (type, value) => { + let token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + let output = (opts.capture ? '(' : '') + token.open; + + push({ type, value, output: state.output ? '' : ONE_CHAR }); + push({ type: 'paren', extglob: true, value: advance(), output }); + increment('parens'); + extglobs.push(token); + }; + + const extglobClose = token => { + let output = token.close + (opts.capture ? ')' : ''); + + if (token.type === 'negate') { + let extglobStar = star; + + if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { + extglobStar = globstar(opts); + } + + if (extglobStar !== star || eos() || /^\)+$/.test(input.slice(state.index + 1))) { + output = token.close = ')$))' + extglobStar; + } + + if (token.prev.type === 'bos' && eos()) { + state.negatedExtglob = true; + } + } + + push({ type: 'paren', extglob: true, value, output }); + decrement('parens'); + }; + + if (opts.fastpaths !== false && !/(^[*!]|[/{[()\]}"])/.test(input)) { + let backslashes = false; + + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === '\\') { + backslashes = true; + return m; + } + + if (first === '?') { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ''); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); + } + return QMARK.repeat(chars.length); + } + + if (first === '.') { + return DOT_LITERAL.repeat(chars.length); + } + + if (first === '*') { + if (esc) { + return esc + first + (rest ? star : ''); + } + return star; + } + return esc ? m : '\\' + m; + }); + + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ''); + } else { + output = output.replace(/\\+/g, m => { + return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); + }); + } + } + + state.output = output; + return state; + } + + /** + * Tokenize input until we reach end-of-string + */ + + while (!eos()) { + value = advance(); + + if (value === '\u0000') { + continue; + } + + /** + * Escaped characters + */ + + if (value === '\\') { + let next = peek(); + + if (next === '/' && opts.bash !== true) { + continue; + } + + if (next === '.' || next === ';') { + continue; + } + + if (!next) { + value += '\\'; + push({ type: 'text', value }); + continue; + } + + // collapse slashes to reduce potential for exploits + let match = /^\\+/.exec(input.slice(state.index + 1)); + let slashes = 0; + + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += '\\'; + } + } + + if (opts.unescape === true) { + value = advance() || ''; + } else { + value += advance() || ''; + } + + if (state.brackets === 0) { + push({ type: 'text', value }); + continue; + } + } + + /** + * If we're inside a regex character class, continue + * until we reach the closing bracket. + */ + + if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { + if (opts.posix !== false && value === ':') { + let inner = prev.value.slice(1); + if (inner.includes('[')) { + prev.posix = true; + + if (inner.includes(':')) { + let idx = prev.value.lastIndexOf('['); + let pre = prev.value.slice(0, idx); + let rest = prev.value.slice(idx + 2); + let posix = POSIX_REGEX_SOURCE[rest]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); + + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } + + if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { + value = '\\' + value; + } + + if (value === ']' && (prev.value === '[' || prev.value === '[^')) { + value = '\\' + value; + } + + if (opts.posix === true && value === '!' && prev.value === '[') { + value = '^'; + } + + prev.value += value; + append({ value }); + continue; + } + + /** + * If we're inside a quoted string, continue + * until we reach the closing double quote. + */ + + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({ value }); + continue; + } + + /** + * Double quotes + */ + + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({ type: 'text', value }); + } + continue; + } + + /** + * Parentheses + */ + + if (value === '(') { + push({ type: 'paren', value }); + increment('parens'); + continue; + } + + if (value === ')') { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '(')); + } + + let extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + + push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); + decrement('parens'); + continue; + } + + /** + * Brackets + */ + + if (value === '[') { + if (opts.nobracket === true || !input.slice(state.index + 1).includes(']')) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('closing', ']')); + } + + value = '\\' + value; + } else { + increment('brackets'); + } + + push({ type: 'bracket', value }); + continue; + } + + if (value === ']') { + if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '[')); + } + + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + decrement('brackets'); + + let prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { + value = '/' + value; + } + + prev.value += value; + append({ value }); + + // when literal brackets are explicitly disabled + // assume we should match with a regex character class + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } + + let escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + + // when literal brackets are explicitly enabled + // assume we should escape the brackets to match literal characters + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; + } + + // when the user specifies nothing, try to match both + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; + continue; + } + + /** + * Braces + */ + + if (value === '{' && opts.nobrace !== true) { + push({ type: 'brace', value, output: '(' }); + increment('braces'); + continue; + } + + if (value === '}') { + if (opts.nobrace === true || state.braces === 0) { + push({ type: 'text', value, output: '\\' + value }); + continue; + } + + let output = ')'; + + if (state.dots === true) { + let arr = tokens.slice(); + let range = []; + + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === 'brace') { + break; + } + if (arr[i].type !== 'dots') { + range.unshift(arr[i].value); + } + } + + output = expandRange(range, opts); + state.backtrack = true; + } + + push({ type: 'brace', value, output }); + decrement('braces'); + continue; + } + + /** + * Pipes + */ + + if (value === '|') { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push({ type: 'text', value }); + continue; + } - const decrement = type => { - state[type]--; - stack.pop(); - }; + /** + * Commas + */ - /** - * Push tokens onto the tokens array. This helper speeds up - * tokenizing by 1) helping us avoid backtracking as much as possible, - * and 2) helping us avoid creating extra tokens when consecutive - * characters are plain text. This improves performance and simplifies - * lookbehinds. - */ + if (value === ',') { + let output = value; - const push = tok => { - if (prev.type === 'globstar') { - let isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); - let isExtglob = extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'); - if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = 'star'; - prev.value = '*'; - prev.output = star; - state.output += prev.output; + if (state.braces > 0 && stack[stack.length - 1] === 'braces') { + output = '|'; } - } - if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { - extglobs[extglobs.length - 1].inner += tok.value; + push({ type: 'comma', value, output }); + continue; } - if (tok.value || tok.output) append(tok); - if (prev && prev.type === 'text' && tok.type === 'text') { - prev.value += tok.value; - return; + /** + * Slashes + */ + + if (value === '/') { + // if the beginning of the glob is "./", advance the start + // to the current index, and don't add the "./" characters + // to the state. This greatly simplifies lookbehinds when + // checking for BOS characters like "!" and "." (not "./") + if (prev.type === 'dot' && state.index === 1) { + state.start = state.index + 1; + state.consumed = ''; + state.output = ''; + tokens.pop(); + prev = bos; // reset "prev" to the first token + continue; + } + + push({ type: 'slash', value, output: SLASH_LITERAL }); + continue; } - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; + /** + * Dots + */ - const extglobOpen = (type, value) => { - let token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + if (value === '.') { + if (state.braces > 0 && prev.type === 'dot') { + if (prev.value === '.') prev.output = DOT_LITERAL; + prev.type = 'dots'; + prev.output += value; + prev.value += value; + state.dots = true; + continue; + } - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - let output = (opts.capture ? '(' : '') + token.open; + push({ type: 'dot', value, output: DOT_LITERAL }); + continue; + } - push({ type, value, output: state.output ? '' : ONE_CHAR }); - push({ type: 'paren', extglob: true, value: advance(), output }); - increment('parens'); - extglobs.push(token); - }; + /** + * Question marks + */ - const extglobClose = token => { - let output = token.close + (opts.capture ? ')' : ''); + if (value === '?') { + if (prev && prev.type === 'paren') { + let next = peek(); + let output = value; - if (token.type === 'negate') { - let extglobStar = star; + if (next === '<' && !utils.supportsLookbehinds()) { + throw new Error('Node.js v10 or higher is required for regex lookbehinds'); + } - if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { - extglobStar = globstar(opts); + if (prev.value === '(' && !/[!=<:]/.test(next) || (next === '<' && !/[!=]/.test(peek(2)))) { + output = '\\' + value; + } + + push({ type: 'text', value, output }); + continue; } - if (extglobStar !== star || eos() || /^\)+$/.test(input.slice(state.index + 1))) { - output = token.close = ')$))' + extglobStar; + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('qmark', value); + continue; } - if (token.prev.type === 'bos' && eos()) { - state.negatedExtglob = true; + if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { + push({ type: 'qmark', value, output: QMARK_NO_DOT }); + continue; } + + push({ type: 'qmark', value, output: QMARK }); + continue; } - push({ type: 'paren', extglob: true, value, output }); - decrement('parens'); - }; + /** + * Exclamation + */ - if (opts.fastpaths !== false && !/(^[*!]|[/{[()\]}"])/.test(input)) { - let backslashes = false; + if (value === '!') { + if (opts.noextglob !== true && peek() === '(') { + if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { + extglobOpen('negate', value); + continue; + } + } - let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { - if (first === '\\') { - backslashes = true; - return m; + if (opts.nonegate !== true && state.index === 0) { + negate(state); + continue; } + } - if (first === '?') { - if (esc) { - return esc + first + (rest ? QMARK.repeat(rest.length) : ''); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); - } - return QMARK.repeat(chars.length); + /** + * Plus + */ + + if (value === '+') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('plus', value); + continue; } - if (first === '.') { - return DOT_LITERAL.repeat(chars.length); + if (prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) { + let output = prev.extglob === true ? '\\' + value : value; + push({ type: 'plus', value, output }); + continue; } - if (first === '*') { - if (esc) { - return esc + first + (rest ? star : ''); - } - return star; + // use regex behavior inside parens + if (state.parens > 0 && opts.regex !== false) { + push({ type: 'plus', value }); + continue; } - return esc ? m : '\\' + m; - }); - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ''); - } else { - output = output.replace(/\\+/g, m => { - return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); - }); + push({ type: 'plus', value: PLUS_LITERAL }); + continue; + } + + /** + * Plain text + */ + + if (value === '@') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + push({ type: 'at', value, output: '' }); + continue; } + + push({ type: 'text', value }); + continue; } - state.output = output; - return state; - } + /** + * Plain text + */ - /** - * Tokenize input until we reach end-of-string - */ + if (value !== '*') { + if (value === '$' || value === '^') { + value = '\\' + value; + } - while (!eos()) { - value = advance(); + let match = REGEX_NON_SPECIAL_CHAR.exec(input.slice(state.index + 1)); + if (match) { + value += match[0]; + state.index += match[0].length; + } - if (value === '\u0000') { + push({ type: 'text', value }); continue; } /** - * Escaped characters + * Stars */ - if (value === '\\') { - let next = peek(); + if (prev && (prev.type === 'globstar' || prev.star === true)) { + prev.type = 'star'; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.consumed += value; + continue; + } - if (next === '/' && opts.bash !== true) { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('star', value); + continue; + } + + if (prev.type === 'star') { + if (opts.noglobstar === true) { + state.consumed += value; continue; } - if (next === '.' || next === ';') { + let prior = prev.prev; + let before = prior.prev; + let isStart = prior.type === 'slash' || prior.type === 'bos'; + let afterStar = before && (before.type === 'star' || before.type === 'globstar'); + + if (opts.bash === true && (!isStart || (!eos() && peek() !== '/'))) { + push({ type: 'star', value, output: '' }); continue; } - if (!next) { - value += '\\'; - push({ type: 'text', value }); + let isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); + let isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); + if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { + push({ type: 'star', value, output: '' }); continue; } - // collapse slashes to reduce potential for exploits - let match = /^\\+/.exec(input.slice(state.index + 1)); - let slashes = 0; - - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += '\\'; + // strip consecutive `/**/` + while (input.slice(state.index + 1, state.index + 4) === '/**') { + let after = input[state.index + 4]; + if (after && after !== '/') { + break; } + state.consumed += '/**'; + state.index += 3; } - if (opts.unescape === true) { - value = advance() || ''; - } else { - value += advance() || ''; + if (prior.type === 'bos' && eos()) { + prev.type = 'globstar'; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.consumed += value; + continue; } - if (state.brackets === 0) { - push({ type: 'text', value }); + if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = '(?:' + prior.output; + + prev.type = 'globstar'; + prev.output = globstar(opts) + '|$)'; + prev.value += value; + + state.output += prior.output + prev.output; + state.consumed += value; continue; } - } - /** - * If we're inside a regex character class, continue - * until we reach the closing bracket. - */ + let next = peek(); + if (prior.type === 'slash' && prior.prev.type !== 'bos' && next === '/') { + let end = peek(2) !== void 0 ? '|$' : ''; - if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { - if (opts.posix !== false && value === ':') { - let inner = prev.value.slice(1); - if (inner.includes('[')) { - prev.posix = true; + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = '(?:' + prior.output; - if (inner.includes(':')) { - let idx = prev.value.lastIndexOf('['); - let pre = prev.value.slice(0, idx); - let rest = prev.value.slice(idx + 2); - let posix = POSIX_REGEX_SOURCE[rest]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); + prev.type = 'globstar'; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } + state.output += prior.output + prev.output; + state.consumed += value + advance(); + + push({ type: 'slash', value, output: '' }); + continue; } - if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { - value = '\\' + value; + if (prior.type === 'bos' && next === '/') { + prev.type = 'globstar'; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.consumed += value + advance(); + push({ type: 'slash', value, output: '' }); + continue; } - if (value === ']' && (prev.value === '[' || prev.value === '[^')) { - value = '\\' + value; + // remove single star from output + state.output = state.output.slice(0, -prev.output.length); + + // reset previous token to globstar + prev.type = 'globstar'; + prev.output = globstar(opts); + prev.value += value; + + // reset output with globstar + state.output += prev.output; + state.consumed += value; + continue; + } + + let token = { type: 'star', value, output: star }; + + if (opts.bash === true) { + token.output = '.*?'; + if (prev.type === 'bos' || prev.type === 'slash') { + token.output = nodot + token.output; + } + push(token); + continue; + } + + if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { + token.output = value; + push(token); + continue; + } + + if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { + if (prev.type === 'dot') { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; + + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; + + } else { + state.output += nodot; + prev.output += nodot; } - if (opts.posix === true && value === '!' && prev.value === '[') { - value = '^'; + if (peek() !== '*') { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } + + push(token); + } + + while (state.brackets > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); + state.output = utils.escapeLast(state.output, '['); + decrement('brackets'); + } + + while (state.parens > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); + state.output = utils.escapeLast(state.output, '('); + decrement('parens'); + } + + while (state.braces > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); + state.output = utils.escapeLast(state.output, '{'); + decrement('braces'); + } + + if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { + push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); + } + + // rebuild the output if we had to backtrack at any point + if (state.backtrack === true) { + state.output = ''; + + for (let token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + + if (token.suffix) { + state.output += token.suffix; } + } + } + + return state; +}; + +/** + * Fast paths for creating regular expressions for common glob patterns. + * This can significantly speed up processing and has very little downside + * impact when none of the fast paths match. + */ + +parse.fastpaths = (input, options) => { + let opts = { ...options }; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + input = REPLACEMENTS[input] || input; + let win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(win32); + + let capture = opts.capture ? '' : '?:'; + let star = opts.bash === true ? '.*?' : STAR; + let nodot = opts.dot ? NO_DOTS : NO_DOT; + let slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + + if (opts.capture) { + star = `(${star})`; + } + + const globstar = (opts) => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const create = str => { + switch (str) { + case '*': + return `${nodot}${ONE_CHAR}${star}`; + + case '.*': + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*.*': + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*/*': + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + + case '**': + return nodot + globstar(opts); + + case '**/*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - prev.value += value; - append({ value }); - continue; - } + case '**/*.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - /** - * If we're inside a quoted string, continue - * until we reach the closing double quote. - */ + case '**/.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append({ value }); - continue; - } + default: { + let match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) return; - /** - * Double quotes - */ + let source = create(match[1], options); + if (!source) return; - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: 'text', value }); + return source + DOT_LITERAL + match[2]; } - continue; } + }; - /** - * Parentheses - */ + let output = create(input); + if (output && opts.strictSlashes !== true) { + output += `${SLASH_LITERAL}?`; + } - if (value === '(') { - push({ type: 'paren', value }); - increment('parens'); - continue; - } + return output; +}; - if (value === ')') { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '(')); - } +module.exports = parse; - let extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } - push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); - decrement('parens'); - continue; - } +/***/ }), +/* 619 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Brackets - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const merge2 = __webpack_require__(585); +function merge(streams) { + const mergedStream = merge2(streams); + streams.forEach((stream) => { + stream.once('error', (err) => mergedStream.emit('error', err)); + }); + return mergedStream; +} +exports.merge = merge; - if (value === '[') { - if (opts.nobracket === true || !input.slice(state.index + 1).includes(']')) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('closing', ']')); - } - value = '\\' + value; - } else { - increment('brackets'); - } +/***/ }), +/* 620 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'bracket', value }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(621); +const provider_1 = __webpack_require__(648); +class ProviderAsync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = []; + return new Promise((resolve, reject) => { + const stream = this.api(root, task, options); + stream.once('error', reject); + stream.on('data', (entry) => entries.push(options.transform(entry))); + stream.once('end', () => resolve(entries)); + }); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderAsync; - if (value === ']') { - if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '[')); - } +/***/ }), +/* 621 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(382); +const fsStat = __webpack_require__(622); +const fsWalk = __webpack_require__(627); +const reader_1 = __webpack_require__(647); +class ReaderStream extends reader_1.default { + constructor() { + super(...arguments); + this._walkStream = fsWalk.walkStream; + this._stat = fsStat.stat; + } + dynamic(root, options) { + return this._walkStream(root, options); + } + static(patterns, options) { + const filepaths = patterns.map(this._getFullEntryPath, this); + const stream = new stream_1.PassThrough({ objectMode: true }); + stream._write = (index, _enc, done) => { + return this._getEntry(filepaths[index], patterns[index], options) + .then((entry) => { + if (entry !== null && options.entryFilter(entry)) { + stream.push(entry); + } + if (index === filepaths.length - 1) { + stream.end(); + } + done(); + }) + .catch(done); + }; + for (let i = 0; i < filepaths.length; i++) { + stream.write(i); + } + return stream; + } + _getEntry(filepath, pattern, options) { + return this._getStat(filepath) + .then((stats) => this._makeEntry(stats, pattern)) + .catch((error) => { + if (options.errorFilter(error)) { + return null; + } + throw error; + }); + } + _getStat(filepath) { + return new Promise((resolve, reject) => { + this._stat(filepath, this._fsStatSettings, (error, stats) => { + error ? reject(error) : resolve(stats); + }); + }); + } +} +exports.default = ReaderStream; - decrement('brackets'); - let prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { - value = '/' + value; - } +/***/ }), +/* 622 */ +/***/ (function(module, exports, __webpack_require__) { - prev.value += value; - append({ value }); +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(623); +const sync = __webpack_require__(624); +const settings_1 = __webpack_require__(625); +exports.Settings = settings_1.default; +function stat(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.stat = stat; +function statSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.statSync = statSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - // when literal brackets are explicitly disabled - // assume we should match with a regex character class - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } - let escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); +/***/ }), +/* 623 */ +/***/ (function(module, exports, __webpack_require__) { - // when literal brackets are explicitly enabled - // assume we should escape the brackets to match literal characters - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings, callback) { + settings.fs.lstat(path, (lstatError, lstat) => { + if (lstatError) { + return callFailureCallback(callback, lstatError); + } + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return callSuccessCallback(callback, lstat); + } + settings.fs.stat(path, (statError, stat) => { + if (statError) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return callFailureCallback(callback, statError); + } + return callSuccessCallback(callback, lstat); + } + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + callSuccessCallback(callback, stat); + }); + }); +} +exports.read = read; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} - // when the user specifies nothing, try to match both - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; - continue; - } - /** - * Braces - */ +/***/ }), +/* 624 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '{' && opts.nobrace !== true) { - push({ type: 'brace', value, output: '(' }); - increment('braces'); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function read(path, settings) { + const lstat = settings.fs.lstatSync(path); + if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { + return lstat; + } + try { + const stat = settings.fs.statSync(path); + if (settings.markSymbolicLink) { + stat.isSymbolicLink = () => true; + } + return stat; + } + catch (error) { + if (!settings.throwErrorOnBrokenSymbolicLink) { + return lstat; + } + throw error; + } +} +exports.read = read; - if (value === '}') { - if (opts.nobrace === true || state.braces === 0) { - push({ type: 'text', value, output: '\\' + value }); - continue; - } - let output = ')'; +/***/ }), +/* 625 */ +/***/ (function(module, exports, __webpack_require__) { - if (state.dots === true) { - let arr = tokens.slice(); - let range = []; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(626); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === 'brace') { - break; - } - if (arr[i].type !== 'dots') { - range.unshift(arr[i].value); - } - } - output = expandRange(range, opts); - state.backtrack = true; - } +/***/ }), +/* 626 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'brace', value, output }); - decrement('braces'); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(349); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync +}; +function createFileSystemAdapter(fsMethods) { + if (!fsMethods) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; - /** - * Pipes - */ - if (value === '|') { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: 'text', value }); - continue; - } +/***/ }), +/* 627 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Commas - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(628); +const stream_1 = __webpack_require__(643); +const sync_1 = __webpack_require__(644); +const settings_1 = __webpack_require__(646); +exports.Settings = settings_1.default; +function walk(dir, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return new async_1.default(dir, getSettings()).read(optionsOrSettingsOrCallback); + } + new async_1.default(dir, getSettings(optionsOrSettingsOrCallback)).read(callback); +} +exports.walk = walk; +function walkSync(dir, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new sync_1.default(dir, settings); + return provider.read(); +} +exports.walkSync = walkSync; +function walkStream(dir, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + const provider = new stream_1.default(dir, settings); + return provider.read(); +} +exports.walkStream = walkStream; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - if (value === ',') { - let output = value; - if (state.braces > 0 && stack[stack.length - 1] === 'braces') { - output = '|'; - } +/***/ }), +/* 628 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'comma', value, output }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async_1 = __webpack_require__(629); +class AsyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._storage = new Set(); + } + read(callback) { + this._reader.onError((error) => { + callFailureCallback(callback, error); + }); + this._reader.onEntry((entry) => { + this._storage.add(entry); + }); + this._reader.onEnd(() => { + callSuccessCallback(callback, Array.from(this._storage)); + }); + this._reader.read(); + } +} +exports.default = AsyncProvider; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, entries) { + callback(null, entries); +} - /** - * Slashes - */ - if (value === '/') { - // if the beginning of the glob is "./", advance the start - // to the current index, and don't add the "./" characters - // to the state. This greatly simplifies lookbehinds when - // checking for BOS characters like "!" and "." (not "./") - if (prev.type === 'dot' && state.index === 1) { - state.start = state.index + 1; - state.consumed = ''; - state.output = ''; - tokens.pop(); - prev = bos; // reset "prev" to the first token - continue; - } +/***/ }), +/* 629 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const events_1 = __webpack_require__(373); +const fsScandir = __webpack_require__(630); +const fastq = __webpack_require__(639); +const common = __webpack_require__(641); +const reader_1 = __webpack_require__(642); +class AsyncReader extends reader_1.default { + constructor(_root, _settings) { + super(_root, _settings); + this._settings = _settings; + this._scandir = fsScandir.scandir; + this._emitter = new events_1.EventEmitter(); + this._queue = fastq(this._worker.bind(this), this._settings.concurrency); + this._isFatalError = false; + this._isDestroyed = false; + this._queue.drain = () => { + if (!this._isFatalError) { + this._emitter.emit('end'); + } + }; + } + read() { + this._isFatalError = false; + this._isDestroyed = false; + setImmediate(() => { + this._pushToQueue(this._root, this._settings.basePath); + }); + return this._emitter; + } + destroy() { + if (this._isDestroyed) { + throw new Error('The reader is already destroyed'); + } + this._isDestroyed = true; + this._queue.killAndDrain(); + } + onEntry(callback) { + this._emitter.on('entry', callback); + } + onError(callback) { + this._emitter.once('error', callback); + } + onEnd(callback) { + this._emitter.once('end', callback); + } + _pushToQueue(dir, base) { + const queueItem = { dir, base }; + this._queue.push(queueItem, (error) => { + if (error) { + this._handleError(error); + } + }); + } + _worker(item, done) { + this._scandir(item.dir, this._settings.fsScandirSettings, (error, entries) => { + if (error) { + return done(error, undefined); + } + for (const entry of entries) { + this._handleEntry(entry, item.base); + } + done(null, undefined); + }); + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + this._isFatalError = true; + this._isDestroyed = true; + this._emitter.emit('error', error); + } + _handleEntry(entry, base) { + if (this._isDestroyed || this._isFatalError) { + return; + } + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._emitEntry(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _emitEntry(entry) { + this._emitter.emit('entry', entry); + } +} +exports.default = AsyncReader; - push({ type: 'slash', value, output: SLASH_LITERAL }); - continue; - } - /** - * Dots - */ +/***/ }), +/* 630 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '.') { - if (state.braces > 0 && prev.type === 'dot') { - if (prev.value === '.') prev.output = DOT_LITERAL; - prev.type = 'dots'; - prev.output += value; - prev.value += value; - state.dots = true; - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const async = __webpack_require__(631); +const sync = __webpack_require__(636); +const settings_1 = __webpack_require__(637); +exports.Settings = settings_1.default; +function scandir(path, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === 'function') { + return async.read(path, getSettings(), optionsOrSettingsOrCallback); + } + async.read(path, getSettings(optionsOrSettingsOrCallback), callback); +} +exports.scandir = scandir; +function scandirSync(path, optionsOrSettings) { + const settings = getSettings(optionsOrSettings); + return sync.read(path, settings); +} +exports.scandirSync = scandirSync; +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1.default) { + return settingsOrOptions; + } + return new settings_1.default(settingsOrOptions); +} - push({ type: 'dot', value, output: DOT_LITERAL }); - continue; - } - /** - * Question marks - */ +/***/ }), +/* 631 */ +/***/ (function(module, exports, __webpack_require__) { - if (value === '?') { - if (prev && prev.type === 'paren') { - let next = peek(); - let output = value; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(622); +const rpl = __webpack_require__(632); +const constants_1 = __webpack_require__(633); +const utils = __webpack_require__(634); +function read(dir, settings, callback) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(dir, settings, callback); + } + return readdir(dir, settings, callback); +} +exports.read = read; +function readdirWithFileTypes(dir, settings, callback) { + settings.fs.readdir(dir, { withFileTypes: true }, (readdirError, dirents) => { + if (readdirError) { + return callFailureCallback(callback, readdirError); + } + const entries = dirents.map((dirent) => ({ + dirent, + name: dirent.name, + path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` + })); + if (!settings.followSymbolicLinks) { + return callSuccessCallback(callback, entries); + } + const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); + rpl(tasks, (rplError, rplEntries) => { + if (rplError) { + return callFailureCallback(callback, rplError); + } + callSuccessCallback(callback, rplEntries); + }); + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function makeRplTaskEntry(entry, settings) { + return (done) => { + if (!entry.dirent.isSymbolicLink()) { + return done(null, entry); + } + settings.fs.stat(entry.path, (statError, stats) => { + if (statError) { + if (settings.throwErrorOnBrokenSymbolicLink) { + return done(statError); + } + return done(null, entry); + } + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + return done(null, entry); + }); + }; +} +function readdir(dir, settings, callback) { + settings.fs.readdir(dir, (readdirError, names) => { + if (readdirError) { + return callFailureCallback(callback, readdirError); + } + const filepaths = names.map((name) => `${dir}${settings.pathSegmentSeparator}${name}`); + const tasks = filepaths.map((filepath) => { + return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); + }); + rpl(tasks, (rplError, results) => { + if (rplError) { + return callFailureCallback(callback, rplError); + } + const entries = []; + for (let index = 0; index < names.length; index++) { + const name = names[index]; + const stats = results[index]; + const entry = { + name, + path: filepaths[index], + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + entries.push(entry); + } + callSuccessCallback(callback, entries); + }); + }); +} +exports.readdir = readdir; +function callFailureCallback(callback, error) { + callback(error); +} +function callSuccessCallback(callback, result) { + callback(null, result); +} - if (next === '<' && !utils.supportsLookbehinds()) { - throw new Error('Node.js v10 or higher is required for regex lookbehinds'); - } - if (prev.value === '(' && !/[!=<:]/.test(next) || (next === '<' && !/[!=]/.test(peek(2)))) { - output = '\\' + value; - } +/***/ }), +/* 632 */ +/***/ (function(module, exports) { - push({ type: 'text', value, output }); - continue; - } +module.exports = runParallel - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('qmark', value); - continue; - } +function runParallel (tasks, cb) { + var results, pending, keys + var isSync = true - if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { - push({ type: 'qmark', value, output: QMARK_NO_DOT }); - continue; - } + if (Array.isArray(tasks)) { + results = [] + pending = tasks.length + } else { + keys = Object.keys(tasks) + results = {} + pending = keys.length + } - push({ type: 'qmark', value, output: QMARK }); - continue; + function done (err) { + function end () { + if (cb) cb(err, results) + cb = null } + if (isSync) process.nextTick(end) + else end() + } - /** - * Exclamation - */ - - if (value === '!') { - if (opts.noextglob !== true && peek() === '(') { - if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { - extglobOpen('negate', value); - continue; - } - } - - if (opts.nonegate !== true && state.index === 0) { - negate(state); - continue; - } + function each (i, err, result) { + results[i] = result + if (--pending === 0 || err) { + done(err) } + } - /** - * Plus - */ - - if (value === '+') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('plus', value); - continue; - } + if (!pending) { + // empty + done(null) + } else if (keys) { + // object + keys.forEach(function (key) { + tasks[key](function (err, result) { each(key, err, result) }) + }) + } else { + // array + tasks.forEach(function (task, i) { + task(function (err, result) { each(i, err, result) }) + }) + } - if (prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) { - let output = prev.extglob === true ? '\\' + value : value; - push({ type: 'plus', value, output }); - continue; - } + isSync = false +} - // use regex behavior inside parens - if (state.parens > 0 && opts.regex !== false) { - push({ type: 'plus', value }); - continue; - } - push({ type: 'plus', value: PLUS_LITERAL }); - continue; - } +/***/ }), +/* 633 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Plain text - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); +const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); +const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); +/** + * IS `true` for Node.js 10.10 and greater. + */ +exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = MAJOR_VERSION > 10 || (MAJOR_VERSION === 10 && MINOR_VERSION >= 10); - if (value === '@') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - push({ type: 'at', value, output: '' }); - continue; - } - push({ type: 'text', value }); - continue; - } +/***/ }), +/* 634 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Plain text - */ +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(635); +exports.fs = fs; - if (value !== '*') { - if (value === '$' || value === '^') { - value = '\\' + value; - } - let match = REGEX_NON_SPECIAL_CHAR.exec(input.slice(state.index + 1)); - if (match) { - value += match[0]; - state.index += match[0].length; - } +/***/ }), +/* 635 */ +/***/ (function(module, exports, __webpack_require__) { - push({ type: 'text', value }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; - /** - * Stars - */ - if (prev && (prev.type === 'globstar' || prev.star === true)) { - prev.type = 'star'; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.consumed += value; - continue; - } +/***/ }), +/* 636 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('star', value); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(622); +const constants_1 = __webpack_require__(633); +const utils = __webpack_require__(634); +function read(dir, settings) { + if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(dir, settings); + } + return readdir(dir, settings); +} +exports.read = read; +function readdirWithFileTypes(dir, settings) { + const dirents = settings.fs.readdirSync(dir, { withFileTypes: true }); + return dirents.map((dirent) => { + const entry = { + dirent, + name: dirent.name, + path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` + }; + if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { + try { + const stats = settings.fs.statSync(entry.path); + entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); + } + catch (error) { + if (settings.throwErrorOnBrokenSymbolicLink) { + throw error; + } + } + } + return entry; + }); +} +exports.readdirWithFileTypes = readdirWithFileTypes; +function readdir(dir, settings) { + const names = settings.fs.readdirSync(dir); + return names.map((name) => { + const entryPath = `${dir}${settings.pathSegmentSeparator}${name}`; + const stats = fsStat.statSync(entryPath, settings.fsStatSettings); + const entry = { + name, + path: entryPath, + dirent: utils.fs.createDirentFromStats(name, stats) + }; + if (settings.stats) { + entry.stats = stats; + } + return entry; + }); +} +exports.readdir = readdir; - if (prev.type === 'star') { - if (opts.noglobstar === true) { - state.consumed += value; - continue; - } - let prior = prev.prev; - let before = prior.prev; - let isStart = prior.type === 'slash' || prior.type === 'bos'; - let afterStar = before && (before.type === 'star' || before.type === 'globstar'); +/***/ }), +/* 637 */ +/***/ (function(module, exports, __webpack_require__) { - if (opts.bash === true && (!isStart || (!eos() && peek() !== '/'))) { - push({ type: 'star', value, output: '' }); - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsStat = __webpack_require__(622); +const fs = __webpack_require__(638); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); + this.fs = fs.createFileSystemAdapter(this._options.fs); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.stats = this._getValue(this._options.stats, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + this.fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this.followSymbolicLinks, + fs: this.fs, + throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value) { + return option === undefined ? value : option; + } +} +exports.default = Settings; - let isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); - let isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); - if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { - push({ type: 'star', value, output: '' }); - continue; - } - // strip consecutive `/**/` - while (input.slice(state.index + 1, state.index + 4) === '/**') { - let after = input[state.index + 4]; - if (after && after !== '/') { - break; - } - state.consumed += '/**'; - state.index += 3; - } +/***/ }), +/* 638 */ +/***/ (function(module, exports, __webpack_require__) { - if (prior.type === 'bos' && eos()) { - prev.type = 'globstar'; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.consumed += value; - continue; - } +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = __webpack_require__(349); +exports.FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + stat: fs.stat, + lstatSync: fs.lstatSync, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +function createFileSystemAdapter(fsMethods) { + if (!fsMethods) { + return exports.FILE_SYSTEM_ADAPTER; + } + return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); +} +exports.createFileSystemAdapter = createFileSystemAdapter; - if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = '(?:' + prior.output; - prev.type = 'globstar'; - prev.output = globstar(opts) + '|$)'; - prev.value += value; +/***/ }), +/* 639 */ +/***/ (function(module, exports, __webpack_require__) { - state.output += prior.output + prev.output; - state.consumed += value; - continue; - } +"use strict"; - let next = peek(); - if (prior.type === 'slash' && prior.prev.type !== 'bos' && next === '/') { - let end = peek(2) !== void 0 ? '|$' : ''; - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = '(?:' + prior.output; +var reusify = __webpack_require__(640) - prev.type = 'globstar'; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; +function fastqueue (context, worker, concurrency) { + if (typeof context === 'function') { + concurrency = worker + worker = context + context = null + } - state.output += prior.output + prev.output; - state.consumed += value + advance(); + var cache = reusify(Task) + var queueHead = null + var queueTail = null + var _running = 0 - push({ type: 'slash', value, output: '' }); - continue; - } + var self = { + push: push, + drain: noop, + saturated: noop, + pause: pause, + paused: false, + concurrency: concurrency, + running: running, + resume: resume, + idle: idle, + length: length, + unshift: unshift, + empty: noop, + kill: kill, + killAndDrain: killAndDrain + } - if (prior.type === 'bos' && next === '/') { - prev.type = 'globstar'; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.consumed += value + advance(); - push({ type: 'slash', value, output: '' }); - continue; - } + return self - // remove single star from output - state.output = state.output.slice(0, -prev.output.length); + function running () { + return _running + } - // reset previous token to globstar - prev.type = 'globstar'; - prev.output = globstar(opts); - prev.value += value; + function pause () { + self.paused = true + } - // reset output with globstar - state.output += prev.output; - state.consumed += value; - continue; + function length () { + var current = queueHead + var counter = 0 + + while (current) { + current = current.next + counter++ } - let token = { type: 'star', value, output: star }; + return counter + } - if (opts.bash === true) { - token.output = '.*?'; - if (prev.type === 'bos' || prev.type === 'slash') { - token.output = nodot + token.output; - } - push(token); - continue; + function resume () { + if (!self.paused) return + self.paused = false + for (var i = 0; i < self.concurrency; i++) { + _running++ + release() } + } - if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { - token.output = value; - push(token); - continue; - } + function idle () { + return _running === 0 && self.length() === 0 + } - if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { - if (prev.type === 'dot') { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; + function push (value, done) { + var current = cache.get() - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; + current.context = context + current.release = release + current.value = value + current.callback = done || noop + if (_running === self.concurrency || self.paused) { + if (queueTail) { + queueTail.next = current + queueTail = current } else { - state.output += nodot; - prev.output += nodot; + queueHead = current + queueTail = current + self.saturated() } + } else { + _running++ + worker.call(context, current.value, current.worked) + } + } - if (peek() !== '*') { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; + function unshift (value, done) { + var current = cache.get() + + current.context = context + current.release = release + current.value = value + current.callback = done || noop + + if (_running === self.concurrency || self.paused) { + if (queueHead) { + current.next = queueHead + queueHead = current + } else { + queueHead = current + queueTail = current + self.saturated() } + } else { + _running++ + worker.call(context, current.value, current.worked) } - - push(token); } - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); - state.output = utils.escapeLast(state.output, '['); - decrement('brackets'); + function release (holder) { + if (holder) { + cache.release(holder) + } + var next = queueHead + if (next) { + if (!self.paused) { + if (queueTail === queueHead) { + queueTail = null + } + queueHead = next.next + next.next = null + worker.call(context, next.value, next.worked) + if (queueTail === null) { + self.empty() + } + } else { + _running-- + } + } else if (--_running === 0) { + self.drain() + } } - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); - state.output = utils.escapeLast(state.output, '('); - decrement('parens'); + function kill () { + queueHead = null + queueTail = null + self.drain = noop } - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); - state.output = utils.escapeLast(state.output, '{'); - decrement('braces'); + function killAndDrain () { + queueHead = null + queueTail = null + self.drain() + self.drain = noop } +} - if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { - push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); - } +function noop () {} - // rebuild the output if we had to backtrack at any point - if (state.backtrack === true) { - state.output = ''; +function Task () { + this.value = null + this.callback = noop + this.next = null + this.release = noop + this.context = null - for (let token of state.tokens) { - state.output += token.output != null ? token.output : token.value; + var self = this - if (token.suffix) { - state.output += token.suffix; - } - } + this.worked = function worked (err, result) { + var callback = self.callback + self.value = null + self.callback = noop + callback.call(self.context, err, result) + self.release(self) } +} - return state; -}; +module.exports = fastqueue -/** - * Fast paths for creating regular expressions for common glob patterns. - * This can significantly speed up processing and has very little downside - * impact when none of the fast paths match. - */ -parse.fastpaths = (input, options) => { - let opts = { ...options }; - let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } +/***/ }), +/* 640 */ +/***/ (function(module, exports, __webpack_require__) { - input = REPLACEMENTS[input] || input; - let win32 = utils.isWindows(options); +"use strict"; - // create constants based on platform, for windows or posix - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); - let capture = opts.capture ? '' : '?:'; - let star = opts.bash === true ? '.*?' : STAR; - let nodot = opts.dot ? NO_DOTS : NO_DOT; - let slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; +function reusify (Constructor) { + var head = new Constructor() + var tail = head - if (opts.capture) { - star = `(${star})`; - } + function get () { + var current = head - const globstar = (opts) => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; + if (current.next) { + head = current.next + } else { + head = new Constructor() + tail = head + } - const create = str => { - switch (str) { - case '*': - return `${nodot}${ONE_CHAR}${star}`; + current.next = null - case '.*': - return `${DOT_LITERAL}${ONE_CHAR}${star}`; + return current + } - case '*.*': - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + function release (obj) { + tail.next = obj + tail = obj + } - case '*/*': - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + return { + get: get, + release: release + } +} - case '**': - return nodot + globstar(opts); +module.exports = reusify - case '**/*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - case '**/*.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; +/***/ }), +/* 641 */ +/***/ (function(module, exports, __webpack_require__) { - case '**/.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function isFatalError(settings, error) { + if (settings.errorFilter === null) { + return true; + } + return !settings.errorFilter(error); +} +exports.isFatalError = isFatalError; +function isAppliedFilter(filter, value) { + return filter === null || filter(value); +} +exports.isAppliedFilter = isAppliedFilter; +function replacePathSegmentSeparator(filepath, separator) { + return filepath.split(/[\\\/]/).join(separator); +} +exports.replacePathSegmentSeparator = replacePathSegmentSeparator; +function joinPathSegments(a, b, separator) { + if (a === '') { + return b; + } + return a + separator + b; +} +exports.joinPathSegments = joinPathSegments; - default: { - let match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; - let source = create(match[1], options); - if (!source) return; +/***/ }), +/* 642 */ +/***/ (function(module, exports, __webpack_require__) { - return source + DOT_LITERAL + match[2]; - } - } - }; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const common = __webpack_require__(641); +class Reader { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); + } +} +exports.default = Reader; - let output = create(input); - if (output && opts.strictSlashes !== true) { - output += `${SLASH_LITERAL}?`; - } - return output; -}; +/***/ }), +/* 643 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = parse; +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(382); +const async_1 = __webpack_require__(629); +class StreamProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1.default(this._root, this._settings); + this._stream = new stream_1.Readable({ + objectMode: true, + read: () => { }, + destroy: this._reader.destroy.bind(this._reader) + }); + } + read() { + this._reader.onError((error) => { + this._stream.emit('error', error); + }); + this._reader.onEntry((entry) => { + this._stream.push(entry); + }); + this._reader.onEnd(() => { + this._stream.push(null); + }); + this._reader.read(); + return this._stream; + } +} +exports.default = StreamProvider; /***/ }), -/* 624 */ +/* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const merge2 = __webpack_require__(590); -function merge(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once('error', (err) => mergedStream.emit('error', err)); - }); - return mergedStream; +const sync_1 = __webpack_require__(645); +class SyncProvider { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new sync_1.default(this._root, this._settings); + } + read() { + return this._reader.read(); + } } -exports.merge = merge; +exports.default = SyncProvider; /***/ }), -/* 625 */ +/* 645 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(626); -const provider_1 = __webpack_require__(653); -class ProviderAsync extends provider_1.default { +const fsScandir = __webpack_require__(630); +const common = __webpack_require__(641); +const reader_1 = __webpack_require__(642); +class SyncReader extends reader_1.default { constructor() { super(...arguments); - this._reader = new stream_1.default(this._settings); + this._scandir = fsScandir.scandirSync; + this._storage = new Set(); + this._queue = new Set(); } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = []; - return new Promise((resolve, reject) => { - const stream = this.api(root, task, options); - stream.once('error', reject); - stream.on('data', (entry) => entries.push(options.transform(entry))); - stream.once('end', () => resolve(entries)); + read() { + this._pushToQueue(this._root, this._settings.basePath); + this._handleQueue(); + return Array.from(this._storage); + } + _pushToQueue(dir, base) { + this._queue.add({ dir, base }); + } + _handleQueue() { + for (const item of this._queue.values()) { + this._handleDirectory(item.dir, item.base); + } + } + _handleDirectory(dir, base) { + try { + const entries = this._scandir(dir, this._settings.fsScandirSettings); + for (const entry of entries) { + this._handleEntry(entry, base); + } + } + catch (error) { + this._handleError(error); + } + } + _handleError(error) { + if (!common.isFatalError(this._settings, error)) { + return; + } + throw error; + } + _handleEntry(entry, base) { + const fullpath = entry.path; + if (base !== undefined) { + entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + } + if (common.isAppliedFilter(this._settings.entryFilter, entry)) { + this._pushToStorage(entry); + } + if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { + this._pushToQueue(fullpath, entry.path); + } + } + _pushToStorage(entry) { + this._storage.add(entry); + } +} +exports.default = SyncReader; + + +/***/ }), +/* 646 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsScandir = __webpack_require__(630); +class Settings { + constructor(_options = {}) { + this._options = _options; + this.basePath = this._getValue(this._options.basePath, undefined); + this.concurrency = this._getValue(this._options.concurrency, Infinity); + this.deepFilter = this._getValue(this._options.deepFilter, null); + this.entryFilter = this._getValue(this._options.entryFilter, null); + this.errorFilter = this._getValue(this._options.errorFilter, null); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); + this.fsScandirSettings = new fsScandir.Settings({ + followSymbolicLinks: this._options.followSymbolicLinks, + fs: this._options.fs, + pathSegmentSeparator: this._options.pathSegmentSeparator, + stats: this._options.stats, + throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink }); } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); + _getValue(option, value) { + return option === undefined ? value : option; } } -exports.default = ProviderAsync; +exports.default = Settings; /***/ }), -/* 626 */ +/* 647 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const fsStat = __webpack_require__(627); -const fsWalk = __webpack_require__(632); -const reader_1 = __webpack_require__(652); -class ReaderStream extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; +const path = __webpack_require__(4); +const fsStat = __webpack_require__(622); +const utils = __webpack_require__(593); +class Reader { + constructor(_settings) { + this._settings = _settings; + this._fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this._settings.followSymbolicLinks, + fs: this._settings.fs, + throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks + }); } - dynamic(root, options) { - return this._walkStream(root, options); + _getFullEntryPath(filepath) { + return path.resolve(this._settings.cwd, filepath); } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); + _makeEntry(stats, pattern) { + const entry = { + name: pattern, + path: pattern, + dirent: utils.fs.createDirentFromStats(pattern, stats) }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); + if (this._settings.stats) { + entry.stats = stats; } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); + return entry; } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - error ? reject(error) : resolve(stats); - }); - }); + _isFatalError(error) { + return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; } } -exports.default = ReaderStream; +exports.default = Reader; /***/ }), -/* 627 */ +/* 648 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(628); -const sync = __webpack_require__(629); -const settings_1 = __webpack_require__(630); -exports.Settings = settings_1.default; -function stat(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); +const path = __webpack_require__(4); +const deep_1 = __webpack_require__(649); +const entry_1 = __webpack_require__(650); +const error_1 = __webpack_require__(651); +const entry_2 = __webpack_require__(652); +class Provider { + constructor(_settings) { + this._settings = _settings; + this.errorFilter = new error_1.default(this._settings); + this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); + this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); + this.entryTransformer = new entry_2.default(this._settings); } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.stat = stat; -function statSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.statSync = statSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; + _getRootDirectory(task) { + return path.resolve(this._settings.cwd, task.base); + } + _getReaderOptions(task) { + const basePath = task.base === '.' ? '' : task.base; + return { + basePath, + pathSegmentSeparator: '/', + concurrency: this._settings.concurrency, + deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), + entryFilter: this.entryFilter.getFilter(task.positive, task.negative), + errorFilter: this.errorFilter.getFilter(), + followSymbolicLinks: this._settings.followSymbolicLinks, + fs: this._settings.fs, + stats: this._settings.stats, + throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, + transform: this.entryTransformer.getTransformer() + }; + } + _getMicromatchOptions() { + return { + dot: this._settings.dot, + matchBase: this._settings.baseNameMatch, + nobrace: !this._settings.braceExpansion, + nocase: !this._settings.caseSensitiveMatch, + noext: !this._settings.extglob, + noglobstar: !this._settings.globstar, + posix: true, + strictSlashes: false + }; } - return new settings_1.default(settingsOrOptions); } +exports.default = Provider; /***/ }), -/* 628 */ +/* 649 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings, callback) { - settings.fs.lstat(path, (lstatError, lstat) => { - if (lstatError) { - return callFailureCallback(callback, lstatError); +const utils = __webpack_require__(593); +class DeepFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + } + getFilter(basePath, positive, negative) { + const maxPatternDepth = this._getMaxPatternDepth(positive); + const negativeRe = this._getNegativePatternsRe(negative); + return (entry) => this._filter(basePath, entry, negativeRe, maxPatternDepth); + } + _getMaxPatternDepth(patterns) { + const globstar = patterns.some(utils.pattern.hasGlobStar); + return globstar ? Infinity : utils.pattern.getMaxNaivePatternsDepth(patterns); + } + _getNegativePatternsRe(patterns) { + const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); + return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); + } + _filter(basePath, entry, negativeRe, maxPatternDepth) { + const depth = this._getEntryDepth(basePath, entry.path); + if (this._isSkippedByDeep(depth)) { + return false; } - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return callSuccessCallback(callback, lstat); + if (this._isSkippedByMaxPatternDepth(depth, maxPatternDepth)) { + return false; } - settings.fs.stat(path, (statError, stat) => { - if (statError) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return callFailureCallback(callback, statError); - } - return callSuccessCallback(callback, lstat); - } - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; - } - callSuccessCallback(callback, stat); - }); - }); -} -exports.read = read; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); + if (this._isSkippedSymbolicLink(entry)) { + return false; + } + if (this._isSkippedDotDirectory(entry)) { + return false; + } + return this._isSkippedByNegativePatterns(entry, negativeRe); + } + _getEntryDepth(basePath, entryPath) { + const basePathDepth = basePath.split('/').length; + const entryPathDepth = entryPath.split('/').length; + return entryPathDepth - (basePath === '' ? 0 : basePathDepth); + } + _isSkippedByDeep(entryDepth) { + return entryDepth >= this._settings.deep; + } + _isSkippedByMaxPatternDepth(entryDepth, maxPatternDepth) { + return !this._settings.baseNameMatch && maxPatternDepth !== Infinity && entryDepth > maxPatternDepth; + } + _isSkippedSymbolicLink(entry) { + return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); + } + _isSkippedDotDirectory(entry) { + return !this._settings.dot && entry.name.startsWith('.'); + } + _isSkippedByNegativePatterns(entry, negativeRe) { + return !utils.pattern.matchAny(entry.path, negativeRe); + } } +exports.default = DeepFilter; /***/ }), -/* 629 */ +/* 650 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -function read(path, settings) { - const lstat = settings.fs.lstatSync(path); - if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) { - return lstat; +const utils = __webpack_require__(593); +class EntryFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this.index = new Map(); } - try { - const stat = settings.fs.statSync(path); - if (settings.markSymbolicLink) { - stat.isSymbolicLink = () => true; + getFilter(positive, negative) { + const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); + const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); + return (entry) => this._filter(entry, positiveRe, negativeRe); + } + _filter(entry, positiveRe, negativeRe) { + if (this._settings.unique) { + if (this._isDuplicateEntry(entry)) { + return false; + } + this._createIndexRecord(entry); } - return stat; + if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { + return false; + } + if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { + return false; + } + const filepath = this._settings.baseNameMatch ? entry.name : entry.path; + return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); } - catch (error) { - if (!settings.throwErrorOnBrokenSymbolicLink) { - return lstat; + _isDuplicateEntry(entry) { + return this.index.has(entry.path); + } + _createIndexRecord(entry) { + this.index.set(entry.path, undefined); + } + _onlyFileFilter(entry) { + return this._settings.onlyFiles && !entry.dirent.isFile(); + } + _onlyDirectoryFilter(entry) { + return this._settings.onlyDirectories && !entry.dirent.isDirectory(); + } + _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { + if (!this._settings.absolute) { + return false; } - throw error; + const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); + return this._isMatchToPatterns(fullpath, negativeRe); + } + _isMatchToPatterns(filepath, patternsRe) { + return utils.pattern.matchAny(filepath, patternsRe); } } -exports.read = read; +exports.default = EntryFilter; /***/ }), -/* 630 */ +/* 651 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(631); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); +const utils = __webpack_require__(593); +class ErrorFilter { + constructor(_settings) { + this._settings = _settings; } - _getValue(option, value) { - return option === undefined ? value : option; + getFilter() { + return (error) => this._isNonFatalError(error); + } + _isNonFatalError(error) { + return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; } } -exports.default = Settings; +exports.default = ErrorFilter; /***/ }), -/* 631 */ +/* 652 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync -}; -function createFileSystemAdapter(fsMethods) { - if (!fsMethods) { - return exports.FILE_SYSTEM_ADAPTER; +const utils = __webpack_require__(593); +class EntryTransformer { + constructor(_settings) { + this._settings = _settings; + } + getTransformer() { + return (entry) => this._transform(entry); + } + _transform(entry) { + let filepath = entry.path; + if (this._settings.absolute) { + filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); + filepath = utils.path.unixify(filepath); + } + if (this._settings.markDirectories && entry.dirent.isDirectory()) { + filepath += '/'; + } + if (!this._settings.objectMode) { + return filepath; + } + return Object.assign({}, entry, { path: filepath }); } - return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); } -exports.createFileSystemAdapter = createFileSystemAdapter; +exports.default = EntryTransformer; /***/ }), -/* 632 */ +/* 653 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(633); -const stream_1 = __webpack_require__(648); -const sync_1 = __webpack_require__(649); -const settings_1 = __webpack_require__(651); -exports.Settings = settings_1.default; -function walk(dir, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return new async_1.default(dir, getSettings()).read(optionsOrSettingsOrCallback); +const stream_1 = __webpack_require__(382); +const stream_2 = __webpack_require__(621); +const provider_1 = __webpack_require__(648); +class ProviderStream extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_2.default(this._settings); } - new async_1.default(dir, getSettings(optionsOrSettingsOrCallback)).read(callback); -} -exports.walk = walk; -function walkSync(dir, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new sync_1.default(dir, settings); - return provider.read(); -} -exports.walkSync = walkSync; -function walkStream(dir, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - const provider = new stream_1.default(dir, settings); - return provider.read(); -} -exports.walkStream = walkStream; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const source = this.api(root, task, options); + const dest = new stream_1.Readable({ objectMode: true, read: () => { } }); + source + .once('error', (error) => dest.emit('error', error)) + .on('data', (entry) => dest.emit('data', options.transform(entry))) + .once('end', () => dest.emit('end')); + return dest; + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); } - return new settings_1.default(settingsOrOptions); } +exports.default = ProviderStream; /***/ }), -/* 633 */ +/* 654 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(634); -class AsyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._storage = new Set(); +const sync_1 = __webpack_require__(655); +const provider_1 = __webpack_require__(648); +class ProviderSync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new sync_1.default(this._settings); } - read(callback) { - this._reader.onError((error) => { - callFailureCallback(callback, error); - }); - this._reader.onEntry((entry) => { - this._storage.add(entry); - }); - this._reader.onEnd(() => { - callSuccessCallback(callback, Array.from(this._storage)); - }); - this._reader.read(); + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = this.api(root, task, options); + return entries.map(options.transform); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); } } -exports.default = AsyncProvider; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, entries) { - callback(null, entries); -} +exports.default = ProviderSync; /***/ }), -/* 634 */ +/* 655 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = __webpack_require__(399); -const fsScandir = __webpack_require__(635); -const fastq = __webpack_require__(644); -const common = __webpack_require__(646); +const fsStat = __webpack_require__(622); +const fsWalk = __webpack_require__(627); const reader_1 = __webpack_require__(647); -class AsyncReader extends reader_1.default { - constructor(_root, _settings) { - super(_root, _settings); - this._settings = _settings; - this._scandir = fsScandir.scandir; - this._emitter = new events_1.EventEmitter(); - this._queue = fastq(this._worker.bind(this), this._settings.concurrency); - this._isFatalError = false; - this._isDestroyed = false; - this._queue.drain = () => { - if (!this._isFatalError) { - this._emitter.emit('end'); - } - }; - } - read() { - this._isFatalError = false; - this._isDestroyed = false; - setImmediate(() => { - this._pushToQueue(this._root, this._settings.basePath); - }); - return this._emitter; - } - destroy() { - if (this._isDestroyed) { - throw new Error('The reader is already destroyed'); - } - this._isDestroyed = true; - this._queue.killAndDrain(); - } - onEntry(callback) { - this._emitter.on('entry', callback); - } - onError(callback) { - this._emitter.once('error', callback); - } - onEnd(callback) { - this._emitter.once('end', callback); +class ReaderSync extends reader_1.default { + constructor() { + super(...arguments); + this._walkSync = fsWalk.walkSync; + this._statSync = fsStat.statSync; } - _pushToQueue(dir, base) { - const queueItem = { dir, base }; - this._queue.push(queueItem, (error) => { - if (error) { - this._handleError(error); - } - }); + dynamic(root, options) { + return this._walkSync(root, options); } - _worker(item, done) { - this._scandir(item.dir, this._settings.fsScandirSettings, (error, entries) => { - if (error) { - return done(error, undefined); - } - for (const entry of entries) { - this._handleEntry(entry, item.base); + static(patterns, options) { + const entries = []; + for (const pattern of patterns) { + const filepath = this._getFullEntryPath(pattern); + const entry = this._getEntry(filepath, pattern, options); + if (entry === null || !options.entryFilter(entry)) { + continue; } - done(null, undefined); - }); - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - this._isFatalError = true; - this._isDestroyed = true; - this._emitter.emit('error', error); - } - _handleEntry(entry, base) { - if (this._isDestroyed || this._isFatalError) { - return; - } - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); + entries.push(entry); } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._emitEntry(entry); + return entries; + } + _getEntry(filepath, pattern, options) { + try { + const stats = this._getStat(filepath); + return this._makeEntry(stats, pattern); } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); + catch (error) { + if (options.errorFilter(error)) { + return null; + } + throw error; } } - _emitEntry(entry) { - this._emitter.emit('entry', entry); + _getStat(filepath) { + return this._statSync(filepath, this._fsStatSettings); } } -exports.default = AsyncReader; +exports.default = ReaderSync; /***/ }), -/* 635 */ +/* 656 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(636); -const sync = __webpack_require__(641); -const settings_1 = __webpack_require__(642); -exports.Settings = settings_1.default; -function scandir(path, optionsOrSettingsOrCallback, callback) { - if (typeof optionsOrSettingsOrCallback === 'function') { - return async.read(path, getSettings(), optionsOrSettingsOrCallback); +const fs = __webpack_require__(349); +const os = __webpack_require__(364); +const CPU_COUNT = os.cpus().length; +exports.DEFAULT_FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + lstatSync: fs.lstatSync, + stat: fs.stat, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +// tslint:enable no-redundant-jsdoc +class Settings { + constructor(_options = {}) { + this._options = _options; + this.absolute = this._getValue(this._options.absolute, false); + this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); + this.braceExpansion = this._getValue(this._options.braceExpansion, true); + this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); + this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); + this.cwd = this._getValue(this._options.cwd, process.cwd()); + this.deep = this._getValue(this._options.deep, Infinity); + this.dot = this._getValue(this._options.dot, false); + this.extglob = this._getValue(this._options.extglob, true); + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); + this.fs = this._getFileSystemMethods(this._options.fs); + this.globstar = this._getValue(this._options.globstar, true); + this.ignore = this._getValue(this._options.ignore, []); + this.markDirectories = this._getValue(this._options.markDirectories, false); + this.objectMode = this._getValue(this._options.objectMode, false); + this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); + this.onlyFiles = this._getValue(this._options.onlyFiles, true); + this.stats = this._getValue(this._options.stats, false); + this.suppressErrors = this._getValue(this._options.suppressErrors, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); + this.unique = this._getValue(this._options.unique, true); + if (this.onlyDirectories) { + this.onlyFiles = false; + } + if (this.stats) { + this.objectMode = true; + } } - async.read(path, getSettings(optionsOrSettingsOrCallback), callback); -} -exports.scandir = scandir; -function scandirSync(path, optionsOrSettings) { - const settings = getSettings(optionsOrSettings); - return sync.read(path, settings); -} -exports.scandirSync = scandirSync; -function getSettings(settingsOrOptions = {}) { - if (settingsOrOptions instanceof settings_1.default) { - return settingsOrOptions; + _getValue(option, value) { + return option === undefined ? value : option; + } + _getFileSystemMethods(methods = {}) { + return Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER, methods); } - return new settings_1.default(settingsOrOptions); } +exports.default = Settings; /***/ }), -/* 636 */ +/* 657 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(627); -const rpl = __webpack_require__(637); -const constants_1 = __webpack_require__(638); -const utils = __webpack_require__(639); -function read(dir, settings, callback) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(dir, settings, callback); - } - return readdir(dir, settings, callback); -} -exports.read = read; -function readdirWithFileTypes(dir, settings, callback) { - settings.fs.readdir(dir, { withFileTypes: true }, (readdirError, dirents) => { - if (readdirError) { - return callFailureCallback(callback, readdirError); - } - const entries = dirents.map((dirent) => ({ - dirent, - name: dirent.name, - path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` - })); - if (!settings.followSymbolicLinks) { - return callSuccessCallback(callback, entries); - } - const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings)); - rpl(tasks, (rplError, rplEntries) => { - if (rplError) { - return callFailureCallback(callback, rplError); - } - callSuccessCallback(callback, rplEntries); - }); - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function makeRplTaskEntry(entry, settings) { - return (done) => { - if (!entry.dirent.isSymbolicLink()) { - return done(null, entry); - } - settings.fs.stat(entry.path, (statError, stats) => { - if (statError) { - if (settings.throwErrorOnBrokenSymbolicLink) { - return done(statError); - } - return done(null, entry); - } - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - return done(null, entry); - }); - }; -} -function readdir(dir, settings, callback) { - settings.fs.readdir(dir, (readdirError, names) => { - if (readdirError) { - return callFailureCallback(callback, readdirError); - } - const filepaths = names.map((name) => `${dir}${settings.pathSegmentSeparator}${name}`); - const tasks = filepaths.map((filepath) => { - return (done) => fsStat.stat(filepath, settings.fsStatSettings, done); - }); - rpl(tasks, (rplError, results) => { - if (rplError) { - return callFailureCallback(callback, rplError); - } - const entries = []; - for (let index = 0; index < names.length; index++) { - const name = names[index]; - const stats = results[index]; - const entry = { - name, - path: filepaths[index], - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - entries.push(entry); - } - callSuccessCallback(callback, entries); - }); - }); -} -exports.readdir = readdir; -function callFailureCallback(callback, error) { - callback(error); -} -function callSuccessCallback(callback, result) { - callback(null, result); -} +const path = __webpack_require__(4); +const pathType = __webpack_require__(658); -/***/ }), -/* 637 */ -/***/ (function(module, exports) { +const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; -module.exports = runParallel +const getPath = (filepath, cwd) => { + const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; + return path.isAbsolute(pth) ? pth : path.join(cwd, pth); +}; -function runParallel (tasks, cb) { - var results, pending, keys - var isSync = true +const addExtensions = (file, extensions) => { + if (path.extname(file)) { + return `**/${file}`; + } - if (Array.isArray(tasks)) { - results = [] - pending = tasks.length - } else { - keys = Object.keys(tasks) - results = {} - pending = keys.length - } + return `**/${file}.${getExtensions(extensions)}`; +}; - function done (err) { - function end () { - if (cb) cb(err, results) - cb = null - } - if (isSync) process.nextTick(end) - else end() - } +const getGlob = (directory, options) => { + if (options.files && !Array.isArray(options.files)) { + throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); + } - function each (i, err, result) { - results[i] = result - if (--pending === 0 || err) { - done(err) - } - } + if (options.extensions && !Array.isArray(options.extensions)) { + throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); + } - if (!pending) { - // empty - done(null) - } else if (keys) { - // object - keys.forEach(function (key) { - tasks[key](function (err, result) { each(key, err, result) }) - }) - } else { - // array - tasks.forEach(function (task, i) { - task(function (err, result) { each(i, err, result) }) - }) - } + if (options.files && options.extensions) { + return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); + } - isSync = false -} + if (options.files) { + return options.files.map(x => path.posix.join(directory, `**/${x}`)); + } + if (options.extensions) { + return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; + } -/***/ }), -/* 638 */ -/***/ (function(module, exports, __webpack_require__) { + return [path.posix.join(directory, '**')]; +}; -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.'); -const MAJOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); -const MINOR_VERSION = parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); -/** - * IS `true` for Node.js 10.10 and greater. - */ -exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = MAJOR_VERSION > 10 || (MAJOR_VERSION === 10 && MINOR_VERSION >= 10); +module.exports = async (input, options) => { + options = { + cwd: process.cwd(), + ...options + }; + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); + } -/***/ }), -/* 639 */ -/***/ (function(module, exports, __webpack_require__) { + const globs = await Promise.all([].concat(input).map(async x => { + const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); + return isDirectory ? getGlob(x, options) : x; + })); -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(640); -exports.fs = fs; + return [].concat.apply([], globs); // eslint-disable-line prefer-spread +}; + +module.exports.sync = (input, options) => { + options = { + cwd: process.cwd(), + ...options + }; + + if (typeof options.cwd !== 'string') { + throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); + } + + const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); + + return [].concat.apply([], globs); // eslint-disable-line prefer-spread +}; /***/ }), -/* 640 */ +/* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; + +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(349); + +async function isType(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); + } + + try { + const stats = await promisify(fs[fsStatType])(filePath); + return stats[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; + } + + throw error; + } +} + +function isTypeSync(fsStatType, statsMethodName, filePath) { + if (typeof filePath !== 'string') { + throw new TypeError(`Expected a string, got ${typeof filePath}`); + } + + try { + return fs[fsStatType](filePath)[statsMethodName](); + } catch (error) { + if (error.code === 'ENOENT') { + return false; + } + + throw error; + } +} + +exports.isFile = isType.bind(null, 'stat', 'isFile'); +exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); +exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); +exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); +exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); +exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 641 */ +/* 659 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(627); -const constants_1 = __webpack_require__(638); -const utils = __webpack_require__(639); -function read(dir, settings) { - if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { - return readdirWithFileTypes(dir, settings); - } - return readdir(dir, settings); -} -exports.read = read; -function readdirWithFileTypes(dir, settings) { - const dirents = settings.fs.readdirSync(dir, { withFileTypes: true }); - return dirents.map((dirent) => { - const entry = { - dirent, - name: dirent.name, - path: `${dir}${settings.pathSegmentSeparator}${dirent.name}` - }; - if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) { - try { - const stats = settings.fs.statSync(entry.path); - entry.dirent = utils.fs.createDirentFromStats(entry.name, stats); - } - catch (error) { - if (settings.throwErrorOnBrokenSymbolicLink) { - throw error; - } - } - } - return entry; - }); -} -exports.readdirWithFileTypes = readdirWithFileTypes; -function readdir(dir, settings) { - const names = settings.fs.readdirSync(dir); - return names.map((name) => { - const entryPath = `${dir}${settings.pathSegmentSeparator}${name}`; - const stats = fsStat.statSync(entryPath, settings.fsStatSettings); - const entry = { - name, - path: entryPath, - dirent: utils.fs.createDirentFromStats(name, stats) - }; - if (settings.stats) { - entry.stats = stats; - } - return entry; - }); -} -exports.readdir = readdir; + +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const fastGlob = __webpack_require__(591); +const gitIgnore = __webpack_require__(660); +const slash = __webpack_require__(661); + +const DEFAULT_IGNORE = [ + '**/node_modules/**', + '**/flow-typed/**', + '**/coverage/**', + '**/.git' +]; + +const readFileP = promisify(fs.readFile); + +const mapGitIgnorePatternTo = base => ignore => { + if (ignore.startsWith('!')) { + return '!' + path.posix.join(base, ignore.slice(1)); + } + + return path.posix.join(base, ignore); +}; + +const parseGitIgnore = (content, options) => { + const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); + + return content + .split(/\r?\n/) + .filter(Boolean) + .filter(line => !line.startsWith('#')) + .map(mapGitIgnorePatternTo(base)); +}; + +const reduceIgnore = files => { + return files.reduce((ignores, file) => { + ignores.add(parseGitIgnore(file.content, { + cwd: file.cwd, + fileName: file.filePath + })); + return ignores; + }, gitIgnore()); +}; + +const ensureAbsolutePathForCwd = (cwd, p) => { + if (path.isAbsolute(p)) { + if (p.startsWith(cwd)) { + return p; + } + + throw new Error(`Path ${p} is not in cwd ${cwd}`); + } + + return path.join(cwd, p); +}; + +const getIsIgnoredPredecate = (ignores, cwd) => { + return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); +}; + +const getFile = async (file, cwd) => { + const filePath = path.join(cwd, file); + const content = await readFileP(filePath, 'utf8'); + + return { + cwd, + filePath, + content + }; +}; + +const getFileSync = (file, cwd) => { + const filePath = path.join(cwd, file); + const content = fs.readFileSync(filePath, 'utf8'); + + return { + cwd, + filePath, + content + }; +}; + +const normalizeOptions = ({ + ignore = [], + cwd = process.cwd() +} = {}) => { + return {ignore, cwd}; +}; + +module.exports = async options => { + options = normalizeOptions(options); + + const paths = await fastGlob('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); + + const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); + const ignores = reduceIgnore(files); + + return getIsIgnoredPredecate(ignores, options.cwd); +}; + +module.exports.sync = options => { + options = normalizeOptions(options); + + const paths = fastGlob.sync('**/.gitignore', { + ignore: DEFAULT_IGNORE.concat(options.ignore), + cwd: options.cwd + }); + + const files = paths.map(file => getFileSync(file, options.cwd)); + const ignores = reduceIgnore(files); + + return getIsIgnoredPredecate(ignores, options.cwd); +}; /***/ }), -/* 642 */ -/***/ (function(module, exports, __webpack_require__) { +/* 660 */ +/***/ (function(module, exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsStat = __webpack_require__(627); -const fs = __webpack_require__(643); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); - this.fs = fs.createFileSystemAdapter(this._options.fs); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.stats = this._getValue(this._options.stats, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); - this.fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this.followSymbolicLinks, - fs: this.fs, - throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; +// A simple implementation of make-array +function makeArray (subject) { + return Array.isArray(subject) + ? subject + : [subject] +} +const REGEX_TEST_BLANK_LINE = /^\s+$/ +const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ +const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ +const REGEX_SPLITALL_CRLF = /\r?\n/g +// /foo, +// ./foo, +// ../foo, +// . +// .. +const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ -/***/ }), -/* 643 */ -/***/ (function(module, exports, __webpack_require__) { +const SLASH = '/' +const KEY_IGNORE = typeof Symbol !== 'undefined' + ? Symbol.for('node-ignore') + /* istanbul ignore next */ + : 'node-ignore' -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -exports.FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - stat: fs.stat, - lstatSync: fs.lstatSync, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -function createFileSystemAdapter(fsMethods) { - if (!fsMethods) { - return exports.FILE_SYSTEM_ADAPTER; - } - return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods); -} -exports.createFileSystemAdapter = createFileSystemAdapter; +const define = (object, key, value) => + Object.defineProperty(object, key, {value}) +const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g -/***/ }), -/* 644 */ -/***/ (function(module, exports, __webpack_require__) { +// Sanitize the range of a regular expression +// The cases are complicated, see test cases for details +const sanitizeRange = range => range.replace( + REGEX_REGEXP_RANGE, + (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) + ? match + // Invalid range (out of order) which is ok for gitignore rules but + // fatal for JavaScript regular expression, so eliminate it. + : '' +) -"use strict"; +// > If the pattern ends with a slash, +// > it is removed for the purpose of the following description, +// > but it would only find a match with a directory. +// > In other words, foo/ will match a directory foo and paths underneath it, +// > but will not match a regular file or a symbolic link foo +// > (this is consistent with the way how pathspec works in general in Git). +// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' +// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call +// you could use option `mark: true` with `glob` +// '`foo/`' should not continue with the '`..`' +const DEFAULT_REPLACER_PREFIX = [ -var reusify = __webpack_require__(645) + // > Trailing spaces are ignored unless they are quoted with backslash ("\") + [ + // (a\ ) -> (a ) + // (a ) -> (a) + // (a \ ) -> (a ) + /\\?\s+$/, + match => match.indexOf('\\') === 0 + ? ' ' + : '' + ], -function fastqueue (context, worker, concurrency) { - if (typeof context === 'function') { - concurrency = worker - worker = context - context = null - } + // replace (\ ) with ' ' + [ + /\\\s/g, + () => ' ' + ], - var cache = reusify(Task) - var queueHead = null - var queueTail = null - var _running = 0 + // Escape metacharacters + // which is written down by users but means special for regular expressions. - var self = { - push: push, - drain: noop, - saturated: noop, - pause: pause, - paused: false, - concurrency: concurrency, - running: running, - resume: resume, - idle: idle, - length: length, - unshift: unshift, - empty: noop, - kill: kill, - killAndDrain: killAndDrain - } + // > There are 12 characters with special meanings: + // > - the backslash \, + // > - the caret ^, + // > - the dollar sign $, + // > - the period or dot ., + // > - the vertical bar or pipe symbol |, + // > - the question mark ?, + // > - the asterisk or star *, + // > - the plus sign +, + // > - the opening parenthesis (, + // > - the closing parenthesis ), + // > - and the opening square bracket [, + // > - the opening curly brace {, + // > These special characters are often called "metacharacters". + [ + /[\\^$.|*+(){]/g, + match => `\\${match}` + ], - return self + [ + // > [abc] matches any character inside the brackets + // > (in this case a, b, or c); + /\[([^\]/]*)($|\])/g, + (match, p1, p2) => p2 === ']' + ? `[${sanitizeRange(p1)}]` + : `\\${match}` + ], - function running () { - return _running - } + [ + // > a question mark (?) matches a single character + /(?!\\)\?/g, + () => '[^/]' + ], - function pause () { - self.paused = true - } + // leading slash + [ - function length () { - var current = queueHead - var counter = 0 + // > A leading slash matches the beginning of the pathname. + // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". + // A leading slash matches the beginning of the pathname + /^\//, + () => '^' + ], - while (current) { - current = current.next - counter++ - } + // replace special metacharacter slash after the leading slash + [ + /\//g, + () => '\\/' + ], - return counter - } + [ + // > A leading "**" followed by a slash means match in all directories. + // > For example, "**/foo" matches file or directory "foo" anywhere, + // > the same as pattern "foo". + // > "**/foo/bar" matches file or directory "bar" anywhere that is directly + // > under directory "foo". + // Notice that the '*'s have been replaced as '\\*' + /^\^*\\\*\\\*\\\//, - function resume () { - if (!self.paused) return - self.paused = false - for (var i = 0; i < self.concurrency; i++) { - _running++ - release() + // '**/foo' <-> 'foo' + () => '^(?:.*\\/)?' + ] +] + +const DEFAULT_REPLACER_SUFFIX = [ + // starting + [ + // there will be no leading '/' + // (which has been replaced by section "leading slash") + // If starts with '**', adding a '^' to the regular expression also works + /^(?=[^^])/, + function startingReplacer () { + return !/\/(?!$)/.test(this) + // > If the pattern does not contain a slash /, + // > Git treats it as a shell glob pattern + // Actually, if there is only a trailing slash, + // git also treats it as a shell glob pattern + ? '(?:^|\\/)' + + // > Otherwise, Git treats the pattern as a shell glob suitable for + // > consumption by fnmatch(3) + : '^' } - } + ], - function idle () { - return _running === 0 && self.length() === 0 - } + // two globstars + [ + // Use lookahead assertions so that we could match more than one `'/**'` + /\\\/\\\*\\\*(?=\\\/|$)/g, - function push (value, done) { - var current = cache.get() + // Zero, one or several directories + // should not use '*', or it will be replaced by the next replacer - current.context = context - current.release = release - current.value = value - current.callback = done || noop + // Check if it is not the last `'/**'` + (_, index, str) => index + 6 < str.length - if (_running === self.concurrency || self.paused) { - if (queueTail) { - queueTail.next = current - queueTail = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } + // case: /**/ + // > A slash followed by two consecutive asterisks then a slash matches + // > zero or more directories. + // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. + // '/**/' + ? '(?:\\/[^\\/]+)*' - function unshift (value, done) { - var current = cache.get() + // case: /** + // > A trailing `"/**"` matches everything inside. - current.context = context - current.release = release - current.value = value - current.callback = done || noop + // #21: everything inside but it should not include the current folder + : '\\/.+' + ], - if (_running === self.concurrency || self.paused) { - if (queueHead) { - current.next = queueHead - queueHead = current - } else { - queueHead = current - queueTail = current - self.saturated() - } - } else { - _running++ - worker.call(context, current.value, current.worked) - } - } + // intermediate wildcards + [ + // Never replace escaped '*' + // ignore rule '\*' will match the path '*' - function release (holder) { - if (holder) { - cache.release(holder) - } - var next = queueHead - if (next) { - if (!self.paused) { - if (queueTail === queueHead) { - queueTail = null - } - queueHead = next.next - next.next = null - worker.call(context, next.value, next.worked) - if (queueTail === null) { - self.empty() - } - } else { - _running-- - } - } else if (--_running === 0) { - self.drain() - } - } + // 'abc.*/' -> go + // 'abc.*' -> skip this rule + /(^|[^\\]+)\\\*(?=.+)/g, - function kill () { - queueHead = null - queueTail = null - self.drain = noop - } + // '*.js' matches '.js' + // '*.js' doesn't match 'abc' + (_, p1) => `${p1}[^\\/]*` + ], - function killAndDrain () { - queueHead = null - queueTail = null - self.drain() - self.drain = noop - } -} + // trailing wildcard + [ + /(\^|\\\/)?\\\*$/, + (_, p1) => { + const prefix = p1 + // '\^': + // '/*' does not match '' + // '/*' does not match everything -function noop () {} + // '\\\/': + // 'abc/*' does not match 'abc/' + ? `${p1}[^/]+` -function Task () { - this.value = null - this.callback = noop - this.next = null - this.release = noop - this.context = null + // 'a*' matches 'a' + // 'a*' matches 'aa' + : '[^/]*' - var self = this + return `${prefix}(?=$|\\/$)` + } + ], - this.worked = function worked (err, result) { - var callback = self.callback - self.value = null - self.callback = noop - callback.call(self.context, err, result) - self.release(self) - } -} + [ + // unescape + /\\\\\\/g, + () => '\\' + ] +] -module.exports = fastqueue +const POSITIVE_REPLACERS = [ + ...DEFAULT_REPLACER_PREFIX, + // 'f' + // matches + // - /f(end) + // - /f/ + // - (start)f(end) + // - (start)f/ + // doesn't match + // - oof + // - foo + // pseudo: + // -> (^|/)f(/|$) -/***/ }), -/* 645 */ -/***/ (function(module, exports, __webpack_require__) { + // ending + [ + // 'js' will not match 'js.' + // 'ab' will not match 'abc' + /(?:[^*/])$/, -"use strict"; + // 'js*' will not match 'a.js' + // 'js/' will not match 'a.js' + // 'js' will match 'a.js' and 'a.js/' + match => `${match}(?=$|\\/)` + ], + ...DEFAULT_REPLACER_SUFFIX +] -function reusify (Constructor) { - var head = new Constructor() - var tail = head +const NEGATIVE_REPLACERS = [ + ...DEFAULT_REPLACER_PREFIX, - function get () { - var current = head + // #24, #38 + // The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore) + // A negative pattern without a trailing wildcard should not + // re-include the things inside that directory. - if (current.next) { - head = current.next - } else { - head = new Constructor() - tail = head - } + // eg: + // ['node_modules/*', '!node_modules'] + // should ignore `node_modules/a.js` + [ + /(?:[^*])$/, + match => `${match}(?=$|\\/$)` + ], - current.next = null + ...DEFAULT_REPLACER_SUFFIX +] - return current - } +// A simple cache, because an ignore rule only has only one certain meaning +const regexCache = Object.create(null) - function release (obj) { - tail.next = obj - tail = obj +// @param {pattern} +const makeRegex = (pattern, negative, ignorecase) => { + const r = regexCache[pattern] + if (r) { + return r } - return { - get: get, - release: release + const replacers = negative + ? NEGATIVE_REPLACERS + : POSITIVE_REPLACERS + + const source = replacers.reduce( + (prev, current) => prev.replace(current[0], current[1].bind(pattern)), + pattern + ) + + return regexCache[pattern] = ignorecase + ? new RegExp(source, 'i') + : new RegExp(source) +} + +const isString = subject => typeof subject === 'string' + +// > A blank line matches no files, so it can serve as a separator for readability. +const checkPattern = pattern => pattern + && isString(pattern) + && !REGEX_TEST_BLANK_LINE.test(pattern) + + // > A line starting with # serves as a comment. + && pattern.indexOf('#') !== 0 + +const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) + +class IgnoreRule { + constructor ( + origin, + pattern, + negative, + regex + ) { + this.origin = origin + this.pattern = pattern + this.negative = negative + this.regex = regex } } -module.exports = reusify +const createRule = (pattern, ignorecase) => { + const origin = pattern + let negative = false + + // > An optional prefix "!" which negates the pattern; + if (pattern.indexOf('!') === 0) { + negative = true + pattern = pattern.substr(1) + } + + pattern = pattern + // > Put a backslash ("\") in front of the first "!" for patterns that + // > begin with a literal "!", for example, `"\!important!.txt"`. + .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') + // > Put a backslash ("\") in front of the first hash for patterns that + // > begin with a hash. + .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') + const regex = makeRegex(pattern, negative, ignorecase) -/***/ }), -/* 646 */ -/***/ (function(module, exports, __webpack_require__) { + return new IgnoreRule( + origin, + pattern, + negative, + regex + ) +} -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isFatalError(settings, error) { - if (settings.errorFilter === null) { - return true; - } - return !settings.errorFilter(error); -} -exports.isFatalError = isFatalError; -function isAppliedFilter(filter, value) { - return filter === null || filter(value); -} -exports.isAppliedFilter = isAppliedFilter; -function replacePathSegmentSeparator(filepath, separator) { - return filepath.split(/[\\\/]/).join(separator); -} -exports.replacePathSegmentSeparator = replacePathSegmentSeparator; -function joinPathSegments(a, b, separator) { - if (a === '') { - return b; - } - return a + separator + b; -} -exports.joinPathSegments = joinPathSegments; +const throwError = (message, Ctor) => { + throw new Ctor(message) +} +const checkPath = (path, originalPath, doThrow) => { + if (!isString(path)) { + return doThrow( + `path must be a string, but got \`${originalPath}\``, + TypeError + ) + } -/***/ }), -/* 647 */ -/***/ (function(module, exports, __webpack_require__) { + // We don't know if we should ignore '', so throw + if (!path) { + return doThrow(`path must not be empty`, TypeError) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const common = __webpack_require__(646); -class Reader { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); - } -} -exports.default = Reader; + // Check if it is a relative path + if (checkPath.isNotRelative(path)) { + const r = '`path.relative()`d' + return doThrow( + `path should be a ${r} string, but got "${originalPath}"`, + RangeError + ) + } + return true +} -/***/ }), -/* 648 */ -/***/ (function(module, exports, __webpack_require__) { +const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const async_1 = __webpack_require__(634); -class StreamProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new async_1.default(this._root, this._settings); - this._stream = new stream_1.Readable({ - objectMode: true, - read: () => { }, - destroy: this._reader.destroy.bind(this._reader) - }); - } - read() { - this._reader.onError((error) => { - this._stream.emit('error', error); - }); - this._reader.onEntry((entry) => { - this._stream.push(entry); - }); - this._reader.onEnd(() => { - this._stream.push(null); - }); - this._reader.read(); - return this._stream; - } -} -exports.default = StreamProvider; +checkPath.isNotRelative = isNotRelative +checkPath.convert = p => p +class Ignore { + constructor ({ + ignorecase = true + } = {}) { + this._rules = [] + this._ignorecase = ignorecase + define(this, KEY_IGNORE, true) + this._initCache() + } -/***/ }), -/* 649 */ -/***/ (function(module, exports, __webpack_require__) { + _initCache () { + this._ignoreCache = Object.create(null) + this._testCache = Object.create(null) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(650); -class SyncProvider { - constructor(_root, _settings) { - this._root = _root; - this._settings = _settings; - this._reader = new sync_1.default(this._root, this._settings); - } - read() { - return this._reader.read(); - } -} -exports.default = SyncProvider; + _addPattern (pattern) { + // #32 + if (pattern && pattern[KEY_IGNORE]) { + this._rules = this._rules.concat(pattern._rules) + this._added = true + return + } + if (checkPattern(pattern)) { + const rule = createRule(pattern, this._ignorecase) + this._added = true + this._rules.push(rule) + } + } -/***/ }), -/* 650 */ -/***/ (function(module, exports, __webpack_require__) { + // @param {Array | string | Ignore} pattern + add (pattern) { + this._added = false -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = __webpack_require__(635); -const common = __webpack_require__(646); -const reader_1 = __webpack_require__(647); -class SyncReader extends reader_1.default { - constructor() { - super(...arguments); - this._scandir = fsScandir.scandirSync; - this._storage = new Set(); - this._queue = new Set(); - } - read() { - this._pushToQueue(this._root, this._settings.basePath); - this._handleQueue(); - return Array.from(this._storage); - } - _pushToQueue(dir, base) { - this._queue.add({ dir, base }); - } - _handleQueue() { - for (const item of this._queue.values()) { - this._handleDirectory(item.dir, item.base); - } - } - _handleDirectory(dir, base) { - try { - const entries = this._scandir(dir, this._settings.fsScandirSettings); - for (const entry of entries) { - this._handleEntry(entry, base); - } - } - catch (error) { - this._handleError(error); - } - } - _handleError(error) { - if (!common.isFatalError(this._settings, error)) { - return; - } - throw error; - } - _handleEntry(entry, base) { - const fullpath = entry.path; - if (base !== undefined) { - entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator); - } - if (common.isAppliedFilter(this._settings.entryFilter, entry)) { - this._pushToStorage(entry); - } - if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) { - this._pushToQueue(fullpath, entry.path); - } - } - _pushToStorage(entry) { - this._storage.add(entry); - } -} -exports.default = SyncReader; + makeArray( + isString(pattern) + ? splitPattern(pattern) + : pattern + ).forEach(this._addPattern, this) + // Some rules have just added to the ignore, + // making the behavior changed. + if (this._added) { + this._initCache() + } -/***/ }), -/* 651 */ -/***/ (function(module, exports, __webpack_require__) { + return this + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsScandir = __webpack_require__(635); -class Settings { - constructor(_options = {}) { - this._options = _options; - this.basePath = this._getValue(this._options.basePath, undefined); - this.concurrency = this._getValue(this._options.concurrency, Infinity); - this.deepFilter = this._getValue(this._options.deepFilter, null); - this.entryFilter = this._getValue(this._options.entryFilter, null); - this.errorFilter = this._getValue(this._options.errorFilter, null); - this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep); - this.fsScandirSettings = new fsScandir.Settings({ - followSymbolicLinks: this._options.followSymbolicLinks, - fs: this._options.fs, - pathSegmentSeparator: this._options.pathSegmentSeparator, - stats: this._options.stats, - throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink - }); - } - _getValue(option, value) { - return option === undefined ? value : option; - } -} -exports.default = Settings; + // legacy + addPattern (pattern) { + return this.add(pattern) + } + // | ignored : unignored + // negative | 0:0 | 0:1 | 1:0 | 1:1 + // -------- | ------- | ------- | ------- | -------- + // 0 | TEST | TEST | SKIP | X + // 1 | TESTIF | SKIP | TEST | X -/***/ }), -/* 652 */ -/***/ (function(module, exports, __webpack_require__) { + // - SKIP: always skip + // - TEST: always test + // - TESTIF: only test if checkUnignored + // - X: that never happen -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const fsStat = __webpack_require__(627); -const utils = __webpack_require__(598); -class Reader { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } -} -exports.default = Reader; + // @param {boolean} whether should check if the path is unignored, + // setting `checkUnignored` to `false` could reduce additional + // path matching. + // @returns {TestResult} true if a file is ignored + _testOne (path, checkUnignored) { + let ignored = false + let unignored = false -/***/ }), -/* 653 */ -/***/ (function(module, exports, __webpack_require__) { + this._rules.forEach(rule => { + const {negative} = rule + if ( + unignored === negative && ignored !== unignored + || negative && !ignored && !unignored && !checkUnignored + ) { + return + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(16); -const deep_1 = __webpack_require__(654); -const entry_1 = __webpack_require__(655); -const error_1 = __webpack_require__(656); -const entry_2 = __webpack_require__(657); -class Provider { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === '.' ? '' : task.base; - return { - basePath, - pathSegmentSeparator: '/', - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } -} -exports.default = Provider; + const matched = rule.regex.test(path) + if (matched) { + ignored = !negative + unignored = negative + } + }) -/***/ }), -/* 654 */ -/***/ (function(module, exports, __webpack_require__) { + return { + ignored, + unignored + } + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class DeepFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const maxPatternDepth = this._getMaxPatternDepth(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, negativeRe, maxPatternDepth); - } - _getMaxPatternDepth(patterns) { - const globstar = patterns.some(utils.pattern.hasGlobStar); - return globstar ? Infinity : utils.pattern.getMaxNaivePatternsDepth(patterns); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); - return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); - } - _filter(basePath, entry, negativeRe, maxPatternDepth) { - const depth = this._getEntryDepth(basePath, entry.path); - if (this._isSkippedByDeep(depth)) { - return false; - } - if (this._isSkippedByMaxPatternDepth(depth, maxPatternDepth)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - if (this._isSkippedDotDirectory(entry)) { - return false; - } - return this._isSkippedByNegativePatterns(entry, negativeRe); - } - _getEntryDepth(basePath, entryPath) { - const basePathDepth = basePath.split('/').length; - const entryPathDepth = entryPath.split('/').length; - return entryPathDepth - (basePath === '' ? 0 : basePathDepth); - } - _isSkippedByDeep(entryDepth) { - return entryDepth >= this._settings.deep; - } - _isSkippedByMaxPatternDepth(entryDepth, maxPatternDepth) { - return !this._settings.baseNameMatch && maxPatternDepth !== Infinity && entryDepth > maxPatternDepth; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _isSkippedDotDirectory(entry) { - return !this._settings.dot && entry.name.startsWith('.'); - } - _isSkippedByNegativePatterns(entry, negativeRe) { - return !utils.pattern.matchAny(entry.path, negativeRe); - } -} -exports.default = DeepFilter; + // @returns {TestResult} + _test (originalPath, cache, checkUnignored, slices) { + const path = originalPath + // Supports nullable path + && checkPath.convert(originalPath) + checkPath(path, originalPath, throwError) -/***/ }), -/* 655 */ -/***/ (function(module, exports, __webpack_require__) { + return this._t(path, cache, checkUnignored, slices) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class EntryFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = new Map(); - } - getFilter(positive, negative) { - const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); - const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); - return (entry) => this._filter(entry, positiveRe, negativeRe); - } - _filter(entry, positiveRe, negativeRe) { - if (this._settings.unique) { - if (this._isDuplicateEntry(entry)) { - return false; - } - this._createIndexRecord(entry); - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - if (this._isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) { - return false; - } - const filepath = this._settings.baseNameMatch ? entry.name : entry.path; - return this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); - } - _isDuplicateEntry(entry) { - return this.index.has(entry.path); - } - _createIndexRecord(entry) { - this.index.set(entry.path, undefined); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isSkippedByAbsoluteNegativePatterns(entry, negativeRe) { - if (!this._settings.absolute) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, entry.path); - return this._isMatchToPatterns(fullpath, negativeRe); - } - _isMatchToPatterns(filepath, patternsRe) { - return utils.pattern.matchAny(filepath, patternsRe); - } -} -exports.default = EntryFilter; + _t (path, cache, checkUnignored, slices) { + if (path in cache) { + return cache[path] + } + if (!slices) { + // path/to/a.js + // ['path', 'to', 'a.js'] + slices = path.split(SLASH) + } -/***/ }), -/* 656 */ -/***/ (function(module, exports, __webpack_require__) { + slices.pop() -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class ErrorFilter { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } -} -exports.default = ErrorFilter; + // If the path has no parent directory, just test it + if (!slices.length) { + return cache[path] = this._testOne(path, checkUnignored) + } + const parent = this._t( + slices.join(SLASH) + SLASH, + cache, + checkUnignored, + slices + ) -/***/ }), -/* 657 */ -/***/ (function(module, exports, __webpack_require__) { + // If the path contains a parent directory, check the parent first + return cache[path] = parent.ignored + // > It is not possible to re-include a file if a parent directory of + // > that file is excluded. + ? parent + : this._testOne(path, checkUnignored) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(598); -class EntryTransformer { - constructor(_settings) { - this._settings = _settings; - } - getTransformer() { - return (entry) => this._transform(entry); - } - _transform(entry) { - let filepath = entry.path; - if (this._settings.absolute) { - filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); - filepath = utils.path.unixify(filepath); - } - if (this._settings.markDirectories && entry.dirent.isDirectory()) { - filepath += '/'; - } - if (!this._settings.objectMode) { - return filepath; - } - return Object.assign({}, entry, { path: filepath }); - } -} -exports.default = EntryTransformer; + ignores (path) { + return this._test(path, this._ignoreCache, false).ignored + } + createFilter () { + return path => !this.ignores(path) + } -/***/ }), -/* 658 */ -/***/ (function(module, exports, __webpack_require__) { + filter (paths) { + return makeArray(paths).filter(this.createFilter()) + } -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(27); -const stream_2 = __webpack_require__(626); -const provider_1 = __webpack_require__(653); -class ProviderStream extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const dest = new stream_1.Readable({ objectMode: true, read: () => { } }); - source - .once('error', (error) => dest.emit('error', error)) - .on('data', (entry) => dest.emit('data', options.transform(entry))) - .once('end', () => dest.emit('end')); - return dest; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderStream; + // @returns {TestResult} + test (path) { + return this._test(path, this._testCache, true) + } +} +const factory = options => new Ignore(options) -/***/ }), -/* 659 */ -/***/ (function(module, exports, __webpack_require__) { +const returnFalse = () => false -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(660); -const provider_1 = __webpack_require__(653); -class ProviderSync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderSync; +const isPathValid = path => + checkPath(path && checkPath.convert(path), path, returnFalse) +factory.isPathValid = isPathValid -/***/ }), -/* 660 */ -/***/ (function(module, exports, __webpack_require__) { +// Fixes typescript +factory.default = factory -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(627); -const fsWalk = __webpack_require__(632); -const reader_1 = __webpack_require__(652); -class ReaderSync extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } - catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } -} -exports.default = ReaderSync; +module.exports = factory + +// Windows +// -------------------------------------------------------------- +/* istanbul ignore if */ +if ( + // Detect `process` so that it can run in browsers. + typeof process !== 'undefined' + && ( + process.env && process.env.IGNORE_TEST_WIN32 + || process.platform === 'win32' + ) +) { + /* eslint no-control-regex: "off" */ + const makePosix = str => /^\\\\\?\\/.test(str) + || /["<>|\u0000-\u001F]+/u.test(str) + ? str + : str.replace(/\\/g, '/') + + checkPath.convert = makePosix + + // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' + // 'd:\\foo' + const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i + checkPath.isNotRelative = path => + REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) + || isNotRelative(path) +} /***/ }), @@ -75639,59 +75887,17 @@ exports.default = ReaderSync; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); -const os = __webpack_require__(11); -const CPU_COUNT = os.cpus().length; -exports.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - lstatSync: fs.lstatSync, - stat: fs.stat, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -// tslint:enable no-redundant-jsdoc -class Settings { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - } - _getValue(option, value) { - return option === undefined ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER, methods); - } -} -exports.default = Settings; + +module.exports = path => { + const isExtendedLengthPath = /^\\\\\?\\/.test(path); + const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex + + if (isExtendedLengthPath || hasNonAscii) { + return path; + } + + return path.replace(/\\/g, '/'); +}; /***/ }), @@ -75700,1739 +75906,1725 @@ exports.default = Settings; "use strict"; -const path = __webpack_require__(16); -const pathType = __webpack_require__(663); +const {Transform} = __webpack_require__(382); -const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; - -const getPath = (filepath, cwd) => { - const pth = filepath[0] === '!' ? filepath.slice(1) : filepath; - return path.isAbsolute(pth) ? pth : path.join(cwd, pth); -}; - -const addExtensions = (file, extensions) => { - if (path.extname(file)) { - return `**/${file}`; +class ObjectTransform extends Transform { + constructor() { + super({ + objectMode: true + }); } +} - return `**/${file}.${getExtensions(extensions)}`; -}; - -const getGlob = (directory, options) => { - if (options.files && !Array.isArray(options.files)) { - throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof options.files}\``); +class FilterStream extends ObjectTransform { + constructor(filter) { + super(); + this._filter = filter; } - if (options.extensions && !Array.isArray(options.extensions)) { - throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof options.extensions}\``); - } + _transform(data, encoding, callback) { + if (this._filter(data)) { + this.push(data); + } - if (options.files && options.extensions) { - return options.files.map(x => path.posix.join(directory, addExtensions(x, options.extensions))); + callback(); } +} - if (options.files) { - return options.files.map(x => path.posix.join(directory, `**/${x}`)); +class UniqueStream extends ObjectTransform { + constructor() { + super(); + this._pushed = new Set(); } - if (options.extensions) { - return [path.posix.join(directory, `**/*.${getExtensions(options.extensions)}`)]; + _transform(data, encoding, callback) { + if (!this._pushed.has(data)) { + this.push(data); + this._pushed.add(data); + } + + callback(); } +} - return [path.posix.join(directory, '**')]; +module.exports = { + FilterStream, + UniqueStream }; -module.exports = async (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } +/***/ }), +/* 663 */ +/***/ (function(module, exports, __webpack_require__) { - const globs = await Promise.all([].concat(input).map(async x => { - const isDirectory = await pathType.isDirectory(getPath(x, options.cwd)); - return isDirectory ? getGlob(x, options) : x; - })); +"use strict"; - return [].concat.apply([], globs); // eslint-disable-line prefer-spread -}; +const path = __webpack_require__(4); -module.exports.sync = (input, options) => { - options = { - cwd: process.cwd(), - ...options - }; +module.exports = path_ => { + let cwd = process.cwd(); - if (typeof options.cwd !== 'string') { - throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof options.cwd}\``); - } + path_ = path.resolve(path_); - const globs = [].concat(input).map(x => pathType.isDirectorySync(getPath(x, options.cwd)) ? getGlob(x, options) : x); + if (process.platform === 'win32') { + cwd = cwd.toLowerCase(); + path_ = path_.toLowerCase(); + } - return [].concat.apply([], globs); // eslint-disable-line prefer-spread + return path_ === cwd; }; /***/ }), -/* 663 */ +/* 664 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); +const path = __webpack_require__(4); -async function isType(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } +module.exports = (childPath, parentPath) => { + childPath = path.resolve(childPath); + parentPath = path.resolve(parentPath); - try { - const stats = await promisify(fs[fsStatType])(filePath); - return stats[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } + if (process.platform === 'win32') { + childPath = childPath.toLowerCase(); + parentPath = parentPath.toLowerCase(); + } - throw error; + if (childPath === parentPath) { + return false; } + + childPath += path.sep; + parentPath += path.sep; + + return childPath.startsWith(parentPath); +}; + + +/***/ }), +/* 665 */ +/***/ (function(module, exports, __webpack_require__) { + +const assert = __webpack_require__(371) +const path = __webpack_require__(4) +const fs = __webpack_require__(349) +let glob = undefined +try { + glob = __webpack_require__(586) +} catch (_err) { + // treat glob as optional. } -function isTypeSync(fsStatType, statsMethodName, filePath) { - if (typeof filePath !== 'string') { - throw new TypeError(`Expected a string, got ${typeof filePath}`); - } +const defaultGlobOpts = { + nosort: true, + silent: true +} - try { - return fs[fsStatType](filePath)[statsMethodName](); - } catch (error) { - if (error.code === 'ENOENT') { - return false; - } +// for EMFILE handling +let timeout = 0 - throw error; - } +const isWindows = (process.platform === "win32") + +const defaults = options => { + const methods = [ + 'unlink', + 'chmod', + 'stat', + 'lstat', + 'rmdir', + 'readdir' + ] + methods.forEach(m => { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) + + options.maxBusyTries = options.maxBusyTries || 3 + options.emfileWait = options.emfileWait || 1000 + if (options.glob === false) { + options.disableGlob = true + } + if (options.disableGlob !== true && glob === undefined) { + throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') + } + options.disableGlob = options.disableGlob || false + options.glob = options.glob || defaultGlobOpts } -exports.isFile = isType.bind(null, 'stat', 'isFile'); -exports.isDirectory = isType.bind(null, 'stat', 'isDirectory'); -exports.isSymlink = isType.bind(null, 'lstat', 'isSymbolicLink'); -exports.isFileSync = isTypeSync.bind(null, 'statSync', 'isFile'); -exports.isDirectorySync = isTypeSync.bind(null, 'statSync', 'isDirectory'); -exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); +const rimraf = (p, options, cb) => { + if (typeof options === 'function') { + cb = options + options = {} + } + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert.equal(typeof cb, 'function', 'rimraf: callback function required') + assert(options, 'rimraf: invalid options argument provided') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + defaults(options) + + let busyTries = 0 + let errState = null + let n = 0 + + const next = (er) => { + errState = errState || er + if (--n === 0) + cb(errState) + } + + const afterGlob = (er, results) => { + if (er) + return cb(er) + + n = results.length + if (n === 0) + return cb() + + results.forEach(p => { + const CB = (er) => { + if (er) { + if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && + busyTries < options.maxBusyTries) { + busyTries ++ + // try again, with the same exact callback as this one. + return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) + } + + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(() => rimraf_(p, options, CB), timeout ++) + } + + // already gone + if (er.code === "ENOENT") er = null + } + timeout = 0 + next(er) + } + rimraf_(p, options, CB) + }) + } -/***/ }), -/* 664 */ -/***/ (function(module, exports, __webpack_require__) { + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) -"use strict"; + options.lstat(p, (er, stat) => { + if (!er) + return afterGlob(null, [p]) -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const fastGlob = __webpack_require__(596); -const gitIgnore = __webpack_require__(665); -const slash = __webpack_require__(666); + glob(p, options.glob, afterGlob) + }) -const DEFAULT_IGNORE = [ - '**/node_modules/**', - '**/flow-typed/**', - '**/coverage/**', - '**/.git' -]; +} -const readFileP = promisify(fs.readFile); +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +const rimraf_ = (p, options, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') -const mapGitIgnorePatternTo = base => ignore => { - if (ignore.startsWith('!')) { - return '!' + path.posix.join(base, ignore.slice(1)); - } + // sunos lets the root user unlink directories, which is... weird. + // so we have to lstat here and make sure it's not a dir. + options.lstat(p, (er, st) => { + if (er && er.code === "ENOENT") + return cb(null) - return path.posix.join(base, ignore); -}; + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) -const parseGitIgnore = (content, options) => { - const base = slash(path.relative(options.cwd, path.dirname(options.fileName))); + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) - return content - .split(/\r?\n/) - .filter(Boolean) - .filter(line => !line.startsWith('#')) - .map(mapGitIgnorePatternTo(base)); -}; + options.unlink(p, er => { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) + }) +} -const reduceIgnore = files => { - return files.reduce((ignores, file) => { - ignores.add(parseGitIgnore(file.content, { - cwd: file.cwd, - fileName: file.filePath - })); - return ignores; - }, gitIgnore()); -}; +const fixWinEPERM = (p, options, er, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) -const ensureAbsolutePathForCwd = (cwd, p) => { - if (path.isAbsolute(p)) { - if (p.startsWith(cwd)) { - return p; - } + options.chmod(p, 0o666, er2 => { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, (er3, stats) => { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} - throw new Error(`Path ${p} is not in cwd ${cwd}`); - } +const fixWinEPERMSync = (p, options, er) => { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) - return path.join(cwd, p); -}; + try { + options.chmodSync(p, 0o666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } -const getIsIgnoredPredecate = (ignores, cwd) => { - return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); -}; + let stats + try { + stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } -const getFile = async (file, cwd) => { - const filePath = path.join(cwd, file); - const content = await readFileP(filePath, 'utf8'); + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} - return { - cwd, - filePath, - content - }; -}; +const rmdir = (p, options, originalEr, cb) => { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') -const getFileSync = (file, cwd) => { - const filePath = path.join(cwd, file); - const content = fs.readFileSync(filePath, 'utf8'); + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, er => { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) +} - return { - cwd, - filePath, - content - }; -}; +const rmkids = (p, options, cb) => { + assert(p) + assert(options) + assert(typeof cb === 'function') -const normalizeOptions = ({ - ignore = [], - cwd = process.cwd() -} = {}) => { - return {ignore, cwd}; -}; + options.readdir(p, (er, files) => { + if (er) + return cb(er) + let n = files.length + if (n === 0) + return options.rmdir(p, cb) + let errState + files.forEach(f => { + rimraf(path.join(p, f), options, er => { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} -module.exports = async options => { - options = normalizeOptions(options); +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +const rimrafSync = (p, options) => { + options = options || {} + defaults(options) - const paths = await fastGlob('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert(options, 'rimraf: missing options') + assert.equal(typeof options, 'object', 'rimraf: options should be object') - const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); - const ignores = reduceIgnore(files); + let results - return getIsIgnoredPredecate(ignores, options.cwd); -}; + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } + } -module.exports.sync = options => { - options = normalizeOptions(options); + if (!results.length) + return - const paths = fastGlob.sync('**/.gitignore', { - ignore: DEFAULT_IGNORE.concat(options.ignore), - cwd: options.cwd - }); + for (let i = 0; i < results.length; i++) { + const p = results[i] - const files = paths.map(file => getFileSync(file, options.cwd)); - const ignores = reduceIgnore(files); + let st + try { + st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return - return getIsIgnoredPredecate(ignores, options.cwd); -}; + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } + try { + // sunos lets the root user unlink directories, which is... weird. + if (st && st.isDirectory()) + rmdirSync(p, options, null) + else + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er -/***/ }), -/* 665 */ -/***/ (function(module, exports) { + rmdirSync(p, options, er) + } + } +} -// A simple implementation of make-array -function makeArray (subject) { - return Array.isArray(subject) - ? subject - : [subject] +const rmdirSync = (p, options, originalEr) => { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) + } } -const REGEX_TEST_BLANK_LINE = /^\s+$/ -const REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\!/ -const REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\#/ -const REGEX_SPLITALL_CRLF = /\r?\n/g -// /foo, -// ./foo, -// ../foo, -// . -// .. -const REGEX_TEST_INVALID_PATH = /^\.*\/|^\.+$/ +const rmkidsSync = (p, options) => { + assert(p) + assert(options) + options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) -const SLASH = '/' -const KEY_IGNORE = typeof Symbol !== 'undefined' - ? Symbol.for('node-ignore') - /* istanbul ignore next */ - : 'node-ignore' + // We only end up here once we got ENOTEMPTY at least once, and + // at this point, we are guaranteed to have removed all the kids. + // So, we know that it won't be ENOENT or ENOTDIR or anything else. + // try really hard to delete stuff on windows, because it has a + // PROFOUNDLY annoying habit of not closing handles promptly when + // files are deleted, resulting in spurious ENOTEMPTY errors. + const retries = isWindows ? 100 : 1 + let i = 0 + do { + let threw = true + try { + const ret = options.rmdirSync(p, options) + threw = false + return ret + } finally { + if (++i < retries && threw) + continue + } + } while (true) +} -const define = (object, key, value) => - Object.defineProperty(object, key, {value}) +module.exports = rimraf +rimraf.sync = rimrafSync -const REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g -// Sanitize the range of a regular expression -// The cases are complicated, see test cases for details -const sanitizeRange = range => range.replace( - REGEX_REGEXP_RANGE, - (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0) - ? match - // Invalid range (out of order) which is ok for gitignore rules but - // fatal for JavaScript regular expression, so eliminate it. - : '' -) +/***/ }), +/* 666 */ +/***/ (function(module, exports, __webpack_require__) { -// > If the pattern ends with a slash, -// > it is removed for the purpose of the following description, -// > but it would only find a match with a directory. -// > In other words, foo/ will match a directory foo and paths underneath it, -// > but will not match a regular file or a symbolic link foo -// > (this is consistent with the way how pathspec works in general in Git). -// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`' -// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call -// you could use option `mark: true` with `glob` +"use strict"; -// '`foo/`' should not continue with the '`..`' -const DEFAULT_REPLACER_PREFIX = [ +const AggregateError = __webpack_require__(667); - // > Trailing spaces are ignored unless they are quoted with backslash ("\") - [ - // (a\ ) -> (a ) - // (a ) -> (a) - // (a \ ) -> (a ) - /\\?\s+$/, - match => match.indexOf('\\') === 0 - ? ' ' - : '' - ], +module.exports = async ( + iterable, + mapper, + { + concurrency = Infinity, + stopOnError = true + } = {} +) => { + return new Promise((resolve, reject) => { + if (typeof mapper !== 'function') { + throw new TypeError('Mapper function is required'); + } - // replace (\ ) with ' ' - [ - /\\\s/g, - () => ' ' - ], + if (!(typeof concurrency === 'number' && concurrency >= 1)) { + throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); + } - // Escape metacharacters - // which is written down by users but means special for regular expressions. + const ret = []; + const errors = []; + const iterator = iterable[Symbol.iterator](); + let isRejected = false; + let isIterableDone = false; + let resolvingCount = 0; + let currentIndex = 0; - // > There are 12 characters with special meanings: - // > - the backslash \, - // > - the caret ^, - // > - the dollar sign $, - // > - the period or dot ., - // > - the vertical bar or pipe symbol |, - // > - the question mark ?, - // > - the asterisk or star *, - // > - the plus sign +, - // > - the opening parenthesis (, - // > - the closing parenthesis ), - // > - and the opening square bracket [, - // > - the opening curly brace {, - // > These special characters are often called "metacharacters". - [ - /[\\^$.|*+(){]/g, - match => `\\${match}` - ], + const next = () => { + if (isRejected) { + return; + } - [ - // > [abc] matches any character inside the brackets - // > (in this case a, b, or c); - /\[([^\]/]*)($|\])/g, - (match, p1, p2) => p2 === ']' - ? `[${sanitizeRange(p1)}]` - : `\\${match}` - ], + const nextItem = iterator.next(); + const i = currentIndex; + currentIndex++; - [ - // > a question mark (?) matches a single character - /(?!\\)\?/g, - () => '[^/]' - ], + if (nextItem.done) { + isIterableDone = true; - // leading slash - [ + if (resolvingCount === 0) { + if (!stopOnError && errors.length !== 0) { + reject(new AggregateError(errors)); + } else { + resolve(ret); + } + } - // > A leading slash matches the beginning of the pathname. - // > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c". - // A leading slash matches the beginning of the pathname - /^\//, - () => '^' - ], + return; + } - // replace special metacharacter slash after the leading slash - [ - /\//g, - () => '\\/' - ], + resolvingCount++; - [ - // > A leading "**" followed by a slash means match in all directories. - // > For example, "**/foo" matches file or directory "foo" anywhere, - // > the same as pattern "foo". - // > "**/foo/bar" matches file or directory "bar" anywhere that is directly - // > under directory "foo". - // Notice that the '*'s have been replaced as '\\*' - /^\^*\\\*\\\*\\\//, + (async () => { + try { + const element = await nextItem.value; + ret[i] = await mapper(element, i); + resolvingCount--; + next(); + } catch (error) { + if (stopOnError) { + isRejected = true; + reject(error); + } else { + errors.push(error); + resolvingCount--; + next(); + } + } + })(); + }; - // '**/foo' <-> 'foo' - () => '^(?:.*\\/)?' - ] -] + for (let i = 0; i < concurrency; i++) { + next(); -const DEFAULT_REPLACER_SUFFIX = [ - // starting - [ - // there will be no leading '/' - // (which has been replaced by section "leading slash") - // If starts with '**', adding a '^' to the regular expression also works - /^(?=[^^])/, - function startingReplacer () { - return !/\/(?!$)/.test(this) - // > If the pattern does not contain a slash /, - // > Git treats it as a shell glob pattern - // Actually, if there is only a trailing slash, - // git also treats it as a shell glob pattern - ? '(?:^|\\/)' + if (isIterableDone) { + break; + } + } + }); +}; - // > Otherwise, Git treats the pattern as a shell glob suitable for - // > consumption by fnmatch(3) - : '^' - } - ], - // two globstars - [ - // Use lookahead assertions so that we could match more than one `'/**'` - /\\\/\\\*\\\*(?=\\\/|$)/g, +/***/ }), +/* 667 */ +/***/ (function(module, exports, __webpack_require__) { - // Zero, one or several directories - // should not use '*', or it will be replaced by the next replacer +"use strict"; - // Check if it is not the last `'/**'` - (_, index, str) => index + 6 < str.length +const indentString = __webpack_require__(668); +const cleanStack = __webpack_require__(669); - // case: /**/ - // > A slash followed by two consecutive asterisks then a slash matches - // > zero or more directories. - // > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on. - // '/**/' - ? '(?:\\/[^\\/]+)*' +const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); - // case: /** - // > A trailing `"/**"` matches everything inside. +class AggregateError extends Error { + constructor(errors) { + if (!Array.isArray(errors)) { + throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + } - // #21: everything inside but it should not include the current folder - : '\\/.+' - ], + errors = [...errors].map(error => { + if (error instanceof Error) { + return error; + } - // intermediate wildcards - [ - // Never replace escaped '*' - // ignore rule '\*' will match the path '*' + if (error !== null && typeof error === 'object') { + // Handle plain error objects with message property and/or possibly other metadata + return Object.assign(new Error(error.message), error); + } - // 'abc.*/' -> go - // 'abc.*' -> skip this rule - /(^|[^\\]+)\\\*(?=.+)/g, + return new Error(error); + }); - // '*.js' matches '.js' - // '*.js' doesn't match 'abc' - (_, p1) => `${p1}[^\\/]*` - ], + let message = errors + .map(error => { + // The `stack` property is not standardized, so we can't assume it exists + return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); + }) + .join('\n'); + message = '\n' + indentString(message, 4); + super(message); - // trailing wildcard - [ - /(\^|\\\/)?\\\*$/, - (_, p1) => { - const prefix = p1 - // '\^': - // '/*' does not match '' - // '/*' does not match everything + this.name = 'AggregateError'; - // '\\\/': - // 'abc/*' does not match 'abc/' - ? `${p1}[^/]+` + Object.defineProperty(this, '_errors', {value: errors}); + } - // 'a*' matches 'a' - // 'a*' matches 'aa' - : '[^/]*' + * [Symbol.iterator]() { + for (const error of this._errors) { + yield error; + } + } +} - return `${prefix}(?=$|\\/$)` - } - ], +module.exports = AggregateError; - [ - // unescape - /\\\\\\/g, - () => '\\' - ] -] -const POSITIVE_REPLACERS = [ - ...DEFAULT_REPLACER_PREFIX, +/***/ }), +/* 668 */ +/***/ (function(module, exports, __webpack_require__) { - // 'f' - // matches - // - /f(end) - // - /f/ - // - (start)f(end) - // - (start)f/ - // doesn't match - // - oof - // - foo - // pseudo: - // -> (^|/)f(/|$) +"use strict"; - // ending - [ - // 'js' will not match 'js.' - // 'ab' will not match 'abc' - /(?:[^*/])$/, - // 'js*' will not match 'a.js' - // 'js/' will not match 'a.js' - // 'js' will match 'a.js' and 'a.js/' - match => `${match}(?=$|\\/)` - ], +module.exports = (string, count = 1, options) => { + options = { + indent: ' ', + includeEmptyLines: false, + ...options + }; - ...DEFAULT_REPLACER_SUFFIX -] + if (typeof string !== 'string') { + throw new TypeError( + `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` + ); + } -const NEGATIVE_REPLACERS = [ - ...DEFAULT_REPLACER_PREFIX, + if (typeof count !== 'number') { + throw new TypeError( + `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` + ); + } - // #24, #38 - // The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore) - // A negative pattern without a trailing wildcard should not - // re-include the things inside that directory. + if (typeof options.indent !== 'string') { + throw new TypeError( + `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\`` + ); + } - // eg: - // ['node_modules/*', '!node_modules'] - // should ignore `node_modules/a.js` - [ - /(?:[^*])$/, - match => `${match}(?=$|\\/$)` - ], + if (count === 0) { + return string; + } - ...DEFAULT_REPLACER_SUFFIX -] + const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; -// A simple cache, because an ignore rule only has only one certain meaning -const regexCache = Object.create(null) + return string.replace(regex, options.indent.repeat(count)); +}; -// @param {pattern} -const makeRegex = (pattern, negative, ignorecase) => { - const r = regexCache[pattern] - if (r) { - return r - } - const replacers = negative - ? NEGATIVE_REPLACERS - : POSITIVE_REPLACERS +/***/ }), +/* 669 */ +/***/ (function(module, exports, __webpack_require__) { - const source = replacers.reduce( - (prev, current) => prev.replace(current[0], current[1].bind(pattern)), - pattern - ) +"use strict"; - return regexCache[pattern] = ignorecase - ? new RegExp(source, 'i') - : new RegExp(source) -} +const os = __webpack_require__(364); -const isString = subject => typeof subject === 'string' +const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; +const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; +const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir(); -// > A blank line matches no files, so it can serve as a separator for readability. -const checkPattern = pattern => pattern - && isString(pattern) - && !REGEX_TEST_BLANK_LINE.test(pattern) +module.exports = (stack, options) => { + options = Object.assign({pretty: false}, options); - // > A line starting with # serves as a comment. - && pattern.indexOf('#') !== 0 + return stack.replace(/\\/g, '/') + .split('\n') + .filter(line => { + const pathMatches = line.match(extractPathRegex); + if (pathMatches === null || !pathMatches[1]) { + return true; + } -const splitPattern = pattern => pattern.split(REGEX_SPLITALL_CRLF) + const match = pathMatches[1]; -class IgnoreRule { - constructor ( - origin, - pattern, - negative, - regex - ) { - this.origin = origin - this.pattern = pattern - this.negative = negative - this.regex = regex - } -} + // Electron + if ( + match.includes('.app/Contents/Resources/electron.asar') || + match.includes('.app/Contents/Resources/default_app.asar') + ) { + return false; + } -const createRule = (pattern, ignorecase) => { - const origin = pattern - let negative = false + return !pathRegex.test(match); + }) + .filter(line => line.trim() !== '') + .map(line => { + if (options.pretty) { + return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); + } - // > An optional prefix "!" which negates the pattern; - if (pattern.indexOf('!') === 0) { - negative = true - pattern = pattern.substr(1) - } + return line; + }) + .join('\n'); +}; - pattern = pattern - // > Put a backslash ("\") in front of the first "!" for patterns that - // > begin with a literal "!", for example, `"\!important!.txt"`. - .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!') - // > Put a backslash ("\") in front of the first hash for patterns that - // > begin with a hash. - .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#') - const regex = makeRegex(pattern, negative, ignorecase) +/***/ }), +/* 670 */ +/***/ (function(module, exports, __webpack_require__) { - return new IgnoreRule( - origin, - pattern, - negative, - regex - ) -} +"use strict"; -const throwError = (message, Ctor) => { - throw new Ctor(message) -} +const chalk = __webpack_require__(671); +const cliCursor = __webpack_require__(675); +const cliSpinners = __webpack_require__(679); +const logSymbols = __webpack_require__(681); -const checkPath = (path, originalPath, doThrow) => { - if (!isString(path)) { - return doThrow( - `path must be a string, but got \`${originalPath}\``, - TypeError - ) - } +class Ora { + constructor(options) { + if (typeof options === 'string') { + options = { + text: options + }; + } - // We don't know if we should ignore '', so throw - if (!path) { - return doThrow(`path must not be empty`, TypeError) - } + this.options = Object.assign({ + text: '', + color: 'cyan', + stream: process.stderr + }, options); - // Check if it is a relative path - if (checkPath.isNotRelative(path)) { - const r = '`path.relative()`d' - return doThrow( - `path should be a ${r} string, but got "${originalPath}"`, - RangeError - ) - } + const sp = this.options.spinner; + this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary - return true -} + if (this.spinner.frames === undefined) { + throw new Error('Spinner must define `frames`'); + } -const isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path) + this.text = this.options.text; + this.color = this.options.color; + this.interval = this.options.interval || this.spinner.interval || 100; + this.stream = this.options.stream; + this.id = null; + this.frameIndex = 0; + this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); + } + frame() { + const frames = this.spinner.frames; + let frame = frames[this.frameIndex]; -checkPath.isNotRelative = isNotRelative -checkPath.convert = p => p + if (this.color) { + frame = chalk[this.color](frame); + } -class Ignore { - constructor ({ - ignorecase = true - } = {}) { - this._rules = [] - this._ignorecase = ignorecase - define(this, KEY_IGNORE, true) - this._initCache() - } + this.frameIndex = ++this.frameIndex % frames.length; - _initCache () { - this._ignoreCache = Object.create(null) - this._testCache = Object.create(null) - } + return frame + ' ' + this.text; + } + clear() { + if (!this.enabled) { + return this; + } - _addPattern (pattern) { - // #32 - if (pattern && pattern[KEY_IGNORE]) { - this._rules = this._rules.concat(pattern._rules) - this._added = true - return - } + this.stream.clearLine(); + this.stream.cursorTo(0); - if (checkPattern(pattern)) { - const rule = createRule(pattern, this._ignorecase) - this._added = true - this._rules.push(rule) - } - } + return this; + } + render() { + this.clear(); + this.stream.write(this.frame()); - // @param {Array | string | Ignore} pattern - add (pattern) { - this._added = false + return this; + } + start(text) { + if (text) { + this.text = text; + } - makeArray( - isString(pattern) - ? splitPattern(pattern) - : pattern - ).forEach(this._addPattern, this) + if (!this.enabled || this.id) { + return this; + } - // Some rules have just added to the ignore, - // making the behavior changed. - if (this._added) { - this._initCache() - } + cliCursor.hide(this.stream); + this.render(); + this.id = setInterval(this.render.bind(this), this.interval); - return this - } + return this; + } + stop() { + if (!this.enabled) { + return this; + } - // legacy - addPattern (pattern) { - return this.add(pattern) - } + clearInterval(this.id); + this.id = null; + this.frameIndex = 0; + this.clear(); + cliCursor.show(this.stream); - // | ignored : unignored - // negative | 0:0 | 0:1 | 1:0 | 1:1 - // -------- | ------- | ------- | ------- | -------- - // 0 | TEST | TEST | SKIP | X - // 1 | TESTIF | SKIP | TEST | X + return this; + } + succeed(text) { + return this.stopAndPersist({symbol: logSymbols.success, text}); + } + fail(text) { + return this.stopAndPersist({symbol: logSymbols.error, text}); + } + warn(text) { + return this.stopAndPersist({symbol: logSymbols.warning, text}); + } + info(text) { + return this.stopAndPersist({symbol: logSymbols.info, text}); + } + stopAndPersist(options) { + if (!this.enabled) { + return this; + } - // - SKIP: always skip - // - TEST: always test - // - TESTIF: only test if checkUnignored - // - X: that never happen + // Legacy argument + // TODO: Deprecate sometime in the future + if (typeof options === 'string') { + options = { + symbol: options + }; + } - // @param {boolean} whether should check if the path is unignored, - // setting `checkUnignored` to `false` could reduce additional - // path matching. + options = options || {}; - // @returns {TestResult} true if a file is ignored - _testOne (path, checkUnignored) { - let ignored = false - let unignored = false + this.stop(); + this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); - this._rules.forEach(rule => { - const {negative} = rule - if ( - unignored === negative && ignored !== unignored - || negative && !ignored && !unignored && !checkUnignored - ) { - return - } + return this; + } +} - const matched = rule.regex.test(path) +module.exports = function (opts) { + return new Ora(opts); +}; - if (matched) { - ignored = !negative - unignored = negative - } - }) +module.exports.promise = (action, options) => { + if (typeof action.then !== 'function') { + throw new TypeError('Parameter `action` must be a Promise'); + } - return { - ignored, - unignored - } - } + const spinner = new Ora(options); + spinner.start(); - // @returns {TestResult} - _test (originalPath, cache, checkUnignored, slices) { - const path = originalPath - // Supports nullable path - && checkPath.convert(originalPath) + action.then( + () => { + spinner.succeed(); + }, + () => { + spinner.fail(); + } + ); - checkPath(path, originalPath, throwError) + return spinner; +}; - return this._t(path, cache, checkUnignored, slices) - } - _t (path, cache, checkUnignored, slices) { - if (path in cache) { - return cache[path] - } +/***/ }), +/* 671 */ +/***/ (function(module, exports, __webpack_require__) { - if (!slices) { - // path/to/a.js - // ['path', 'to', 'a.js'] - slices = path.split(SLASH) - } +"use strict"; - slices.pop() +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(672); +const stdoutColor = __webpack_require__(673).stdout; - // If the path has no parent directory, just test it - if (!slices.length) { - return cache[path] = this._testOne(path, checkUnignored) - } +const template = __webpack_require__(674); - const parent = this._t( - slices.join(SLASH) + SLASH, - cache, - checkUnignored, - slices - ) +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); - // If the path contains a parent directory, check the parent first - return cache[path] = parent.ignored - // > It is not possible to re-include a file if a parent directory of - // > that file is excluded. - ? parent - : this._testOne(path, checkUnignored) - } +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - ignores (path) { - return this._test(path, this._ignoreCache, false).ignored - } +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); - createFilter () { - return path => !this.ignores(path) - } +const styles = Object.create(null); - filter (paths) { - return makeArray(paths).filter(this.createFilter()) - } +function applyOptions(obj, options) { + options = options || {}; - // @returns {TestResult} - test (path) { - return this._test(path, this._testCache, true) - } + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; } -const factory = options => new Ignore(options) +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); -const returnFalse = () => false + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; -const isPathValid = path => - checkPath(path && checkPath.convert(path), path, returnFalse) + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); -factory.isPathValid = isPathValid + chalk.template.constructor = Chalk; -// Fixes typescript -factory.default = factory + return chalk.template; + } -module.exports = factory + applyOptions(this, options); +} -// Windows -// -------------------------------------------------------------- -/* istanbul ignore if */ -if ( - // Detect `process` so that it can run in browsers. - typeof process !== 'undefined' - && ( - process.env && process.env.IGNORE_TEST_WIN32 - || process.platform === 'win32' - ) -) { - /* eslint no-control-regex: "off" */ - const makePosix = str => /^\\\\\?\\/.test(str) - || /["<>|\u0000-\u001F]+/u.test(str) - ? str - : str.replace(/\\/g, '/') +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} - checkPath.convert = makePosix +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - // 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/' - // 'd:\\foo' - const REGIX_IS_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\//i - checkPath.isNotRelative = path => - REGIX_IS_WINDOWS_PATH_ABSOLUTE.test(path) - || isNotRelative(path) + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; } +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; -/***/ }), -/* 666 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } -module.exports = path => { - const isExtendedLengthPath = /^\\\\\?\\/.test(path); - const hasNonAscii = /[^\u0000-\u0080]+/.test(path); // eslint-disable-line no-control-regex + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} - if (isExtendedLengthPath || hasNonAscii) { - return path; +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; } - return path.replace(/\\/g, '/'); -}; - + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} -/***/ }), -/* 667 */ -/***/ (function(module, exports, __webpack_require__) { +const proto = Object.defineProperties(() => {}, styles); -"use strict"; +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -const {Transform} = __webpack_require__(27); + builder._styles = _styles; + builder._empty = _empty; -class ObjectTransform extends Transform { - constructor() { - super({ - objectMode: true - }); - } -} + const self = this; -class FilterStream extends ObjectTransform { - constructor(filter) { - super(); - this._filter = filter; - } + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); - _transform(data, encoding, callback) { - if (this._filter(data)) { - this.push(data); + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; } + }); - callback(); - } + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; } -class UniqueStream extends ObjectTransform { - constructor() { - super(); - this._pushed = new Set(); +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + + if (argsLen === 0) { + return ''; } - _transform(data, encoding, callback) { - if (!this._pushed.has(data)) { - this.push(data); - this._pushed.add(data); + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; } + } - callback(); + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; } -} -module.exports = { - FilterStream, - UniqueStream -}; + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; -/***/ }), -/* 668 */ -/***/ (function(module, exports, __webpack_require__) { + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } -"use strict"; + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -const path = __webpack_require__(16); + return str; +} -module.exports = path_ => { - let cwd = process.cwd(); +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } - path_ = path.resolve(path_); + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; - if (process.platform === 'win32') { - cwd = cwd.toLowerCase(); - path_ = path_.toLowerCase(); + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); } - return path_ === cwd; -}; + return template(chalk, parts.join('')); +} + +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript /***/ }), -/* 669 */ +/* 672 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(389); -const path = __webpack_require__(16); - -module.exports = (childPath, parentPath) => { - childPath = path.resolve(childPath); - parentPath = path.resolve(parentPath); - - if (process.platform === 'win32') { - childPath = childPath.toLowerCase(); - parentPath = parentPath.toLowerCase(); - } - - if (childPath === parentPath) { - return false; - } - - childPath += path.sep; - parentPath += path.sep; +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; - return childPath.startsWith(parentPath); +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; }; +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -/***/ }), -/* 670 */ -/***/ (function(module, exports, __webpack_require__) { +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], -const assert = __webpack_require__(30) -const path = __webpack_require__(16) -const fs = __webpack_require__(23) -let glob = undefined -try { - glob = __webpack_require__(591) -} catch (_err) { - // treat glob as optional. -} + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -const defaultGlobOpts = { - nosort: true, - silent: true -} + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -// for EMFILE handling -let timeout = 0 + // Fix humans + styles.color.grey = styles.color.gray; -const isWindows = (process.platform === "win32") + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -const defaults = options => { - const methods = [ - 'unlink', - 'chmod', - 'stat', - 'lstat', - 'rmdir', - 'readdir' - ] - methods.forEach(m => { - options[m] = options[m] || fs[m] - m = m + 'Sync' - options[m] = options[m] || fs[m] - }) + for (const styleName of Object.keys(group)) { + const style = group[styleName]; - options.maxBusyTries = options.maxBusyTries || 3 - options.emfileWait = options.emfileWait || 1000 - if (options.glob === false) { - options.disableGlob = true - } - if (options.disableGlob !== true && glob === undefined) { - throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') - } - options.disableGlob = options.disableGlob || false - options.glob = options.glob || defaultGlobOpts -} + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; -const rimraf = (p, options, cb) => { - if (typeof options === 'function') { - cb = options - options = {} - } + group[styleName] = styles[styleName]; - assert(p, 'rimraf: missing path') - assert.equal(typeof p, 'string', 'rimraf: path should be a string') - assert.equal(typeof cb, 'function', 'rimraf: callback function required') - assert(options, 'rimraf: invalid options argument provided') - assert.equal(typeof options, 'object', 'rimraf: options should be object') + codes.set(style[0], style[1]); + } - defaults(options) + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); - let busyTries = 0 - let errState = null - let n = 0 + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } - const next = (er) => { - errState = errState || er - if (--n === 0) - cb(errState) - } + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; - const afterGlob = (er, results) => { - if (er) - return cb(er) + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; - n = results.length - if (n === 0) - return cb() + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; - results.forEach(p => { - const CB = (er) => { - if (er) { - if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && - busyTries < options.maxBusyTries) { - busyTries ++ - // try again, with the same exact callback as this one. - return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) - } + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; - // this one won't happen if graceful-fs is used. - if (er.code === "EMFILE" && timeout < options.emfileWait) { - return setTimeout(() => rimraf_(p, options, CB), timeout ++) - } + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } - // already gone - if (er.code === "ENOENT") er = null - } + const suite = colorConvert[key]; - timeout = 0 - next(er) - } - rimraf_(p, options, CB) - }) - } + if (key === 'ansi16') { + key = 'ansi'; + } - if (options.disableGlob || !glob.hasMagic(p)) - return afterGlob(null, [p]) + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } - options.lstat(p, (er, stat) => { - if (!er) - return afterGlob(null, [p]) + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } - glob(p, options.glob, afterGlob) - }) + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } + return styles; } -// Two possible strategies. -// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR -// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR -// -// Both result in an extra syscall when you guess wrong. However, there -// are likely far more normal files in the world than directories. This -// is based on the assumption that a the average number of files per -// directory is >= 1. -// -// If anyone ever complains about this, then I guess the strategy could -// be made configurable somehow. But until then, YAGNI. -const rimraf_ = (p, options, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); - // sunos lets the root user unlink directories, which is... weird. - // so we have to lstat here and make sure it's not a dir. - options.lstat(p, (er, st) => { - if (er && er.code === "ENOENT") - return cb(null) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) - // Windows can EPERM on stat. Life is suffering. - if (er && er.code === "EPERM" && isWindows) - fixWinEPERM(p, options, er, cb) +/***/ }), +/* 673 */ +/***/ (function(module, exports, __webpack_require__) { - if (st && st.isDirectory()) - return rmdir(p, options, er, cb) +"use strict"; - options.unlink(p, er => { - if (er) { - if (er.code === "ENOENT") - return cb(null) - if (er.code === "EPERM") - return (isWindows) - ? fixWinEPERM(p, options, er, cb) - : rmdir(p, options, er, cb) - if (er.code === "EISDIR") - return rmdir(p, options, er, cb) - } - return cb(er) - }) - }) -} +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); -const fixWinEPERM = (p, options, er, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') - if (er) - assert(er instanceof Error) +const env = process.env; - options.chmod(p, 0o666, er2 => { - if (er2) - cb(er2.code === "ENOENT" ? null : er) - else - options.stat(p, (er3, stats) => { - if (er3) - cb(er3.code === "ENOENT" ? null : er) - else if (stats.isDirectory()) - rmdir(p, options, er, cb) - else - options.unlink(p, cb) - }) - }) +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; } -const fixWinEPERMSync = (p, options, er) => { - assert(p) - assert(options) - if (er) - assert(er instanceof Error) +function translateLevel(level) { + if (level === 0) { + return false; + } - try { - options.chmodSync(p, 0o666) - } catch (er2) { - if (er2.code === "ENOENT") - return - else - throw er - } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} - let stats - try { - stats = options.statSync(p) - } catch (er3) { - if (er3.code === "ENOENT") - return - else - throw er - } +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - if (stats.isDirectory()) - rmdirSync(p, options, er) - else - options.unlinkSync(p) -} + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } -const rmdir = (p, options, originalEr, cb) => { - assert(p) - assert(options) - if (originalEr) - assert(originalEr instanceof Error) - assert(typeof cb === 'function') + if (hasFlag('color=256')) { + return 2; + } - // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) - // if we guessed wrong, and it's not a directory, then - // raise the original error. - options.rmdir(p, er => { - if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) - rmkids(p, options, cb) - else if (er && er.code === "ENOTDIR") - cb(originalEr) - else - cb(er) - }) -} + if (stream && !stream.isTTY && forceColor !== true) { + // VS code debugger doesn't have isTTY set + if (env.VSCODE_PID) { + return 1; + } + return 0; + } -const rmkids = (p, options, cb) => { - assert(p) - assert(options) - assert(typeof cb === 'function') + const min = forceColor ? 1 : 0; - options.readdir(p, (er, files) => { - if (er) - return cb(er) - let n = files.length - if (n === 0) - return options.rmdir(p, cb) - let errState - files.forEach(f => { - rimraf(path.join(p, f), options, er => { - if (errState) - return - if (er) - return cb(errState = er) - if (--n === 0) - options.rmdir(p, cb) - }) - }) - }) -} + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -// this looks simpler, and is strictly *faster*, but will -// tie up the JavaScript thread and fail on excessively -// deep directory trees. -const rimrafSync = (p, options) => { - options = options || {} - defaults(options) + return 1; + } - assert(p, 'rimraf: missing path') - assert.equal(typeof p, 'string', 'rimraf: path should be a string') - assert(options, 'rimraf: missing options') - assert.equal(typeof options, 'object', 'rimraf: options should be object') + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } - let results + return min; + } - if (options.disableGlob || !glob.hasMagic(p)) { - results = [p] - } else { - try { - options.lstatSync(p) - results = [p] - } catch (er) { - results = glob.sync(p, options.glob) - } - } + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - if (!results.length) - return + if (env.COLORTERM === 'truecolor') { + return 3; + } - for (let i = 0; i < results.length; i++) { - const p = results[i] + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - let st - try { - st = options.lstatSync(p) - } catch (er) { - if (er.code === "ENOENT") - return + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } - // Windows can EPERM on stat. Life is suffering. - if (er.code === "EPERM" && isWindows) - fixWinEPERMSync(p, options, er) - } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } - try { - // sunos lets the root user unlink directories, which is... weird. - if (st && st.isDirectory()) - rmdirSync(p, options, null) - else - options.unlinkSync(p) - } catch (er) { - if (er.code === "ENOENT") - return - if (er.code === "EPERM") - return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) - if (er.code !== "EISDIR") - throw er + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } - rmdirSync(p, options, er) - } - } -} + if ('COLORTERM' in env) { + return 1; + } -const rmdirSync = (p, options, originalEr) => { - assert(p) - assert(options) - if (originalEr) - assert(originalEr instanceof Error) + if (env.TERM === 'dumb') { + return min; + } - try { - options.rmdirSync(p) - } catch (er) { - if (er.code === "ENOENT") - return - if (er.code === "ENOTDIR") - throw originalEr - if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") - rmkidsSync(p, options) - } + return min; } -const rmkidsSync = (p, options) => { - assert(p) - assert(options) - options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) - - // We only end up here once we got ENOTEMPTY at least once, and - // at this point, we are guaranteed to have removed all the kids. - // So, we know that it won't be ENOENT or ENOTDIR or anything else. - // try really hard to delete stuff on windows, because it has a - // PROFOUNDLY annoying habit of not closing handles promptly when - // files are deleted, resulting in spurious ENOTEMPTY errors. - const retries = isWindows ? 100 : 1 - let i = 0 - do { - let threw = true - try { - const ret = options.rmdirSync(p, options) - threw = false - return ret - } finally { - if (++i < retries && threw) - continue - } - } while (true) +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); } -module.exports = rimraf -rimraf.sync = rimrafSync +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; /***/ }), -/* 671 */ +/* 674 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const AggregateError = __webpack_require__(672); - -module.exports = async ( - iterable, - mapper, - { - concurrency = Infinity, - stopOnError = true - } = {} -) => { - return new Promise((resolve, reject) => { - if (typeof mapper !== 'function') { - throw new TypeError('Mapper function is required'); - } - - if (!(typeof concurrency === 'number' && concurrency >= 1)) { - throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${concurrency}\` (${typeof concurrency})`); - } +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; - const ret = []; - const errors = []; - const iterator = iterable[Symbol.iterator](); - let isRejected = false; - let isIterableDone = false; - let resolvingCount = 0; - let currentIndex = 0; +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); - const next = () => { - if (isRejected) { - return; - } +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } - const nextItem = iterator.next(); - const i = currentIndex; - currentIndex++; + return ESCAPES.get(c) || c; +} - if (nextItem.done) { - isIterableDone = true; +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; - if (resolvingCount === 0) { - if (!stopOnError && errors.length !== 0) { - reject(new AggregateError(errors)); - } else { - resolve(ret); - } - } + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } - return; - } + return results; +} - resolvingCount++; +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; - (async () => { - try { - const element = await nextItem.value; - ret[i] = await mapper(element, i); - resolvingCount--; - next(); - } catch (error) { - if (stopOnError) { - isRejected = true; - reject(error); - } else { - errors.push(error); - resolvingCount--; - next(); - } - } - })(); - }; + const results = []; + let matches; - for (let i = 0; i < concurrency; i++) { - next(); + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; - if (isIterableDone) { - break; - } + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); } - }); -}; - - -/***/ }), -/* 672 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; + } -const indentString = __webpack_require__(673); -const cleanStack = __webpack_require__(674); + return results; +} -const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); +function buildStyle(chalk, styles) { + const enabled = {}; -class AggregateError extends Error { - constructor(errors) { - if (!Array.isArray(errors)) { - throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); } + } - errors = [...errors].map(error => { - if (error instanceof Error) { - return error; + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); } - if (error !== null && typeof error === 'object') { - // Handle plain error objects with message property and/or possibly other metadata - return Object.assign(new Error(error.message), error); + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; } + } + } - return new Error(error); - }); - - let message = errors - .map(error => { - // The `stack` property is not standardized, so we can't assume it exists - return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); - }) - .join('\n'); - message = '\n' + indentString(message, 4); - super(message); + return current; +} - this.name = 'AggregateError'; +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - Object.defineProperty(this, '_errors', {value: errors}); - } + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - * [Symbol.iterator]() { - for (const error of this._errors) { - yield error; + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); } + }); + + chunks.push(chunk.join('')); + + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); } -} -module.exports = AggregateError; + return chunks.join(''); +}; /***/ }), -/* 673 */ +/* 675 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const restoreCursor = __webpack_require__(676); -module.exports = (string, count = 1, options) => { - options = { - indent: ' ', - includeEmptyLines: false, - ...options - }; +let hidden = false; - if (typeof string !== 'string') { - throw new TypeError( - `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` - ); - } +exports.show = stream => { + const s = stream || process.stderr; - if (typeof count !== 'number') { - throw new TypeError( - `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` - ); + if (!s.isTTY) { + return; } - if (typeof options.indent !== 'string') { - throw new TypeError( - `Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\`` - ); - } + hidden = false; + s.write('\u001b[?25h'); +}; - if (count === 0) { - return string; +exports.hide = stream => { + const s = stream || process.stderr; + + if (!s.isTTY) { + return; } - const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + restoreCursor(); + hidden = true; + s.write('\u001b[?25l'); +}; - return string.replace(regex, options.indent.repeat(count)); +exports.toggle = (force, stream) => { + if (force !== undefined) { + hidden = force; + } + + if (hidden) { + exports.show(stream); + } else { + exports.hide(stream); + } }; /***/ }), -/* 674 */ +/* 676 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); - -const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; -const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; -const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir(); - -module.exports = (stack, options) => { - options = Object.assign({pretty: false}, options); - - return stack.replace(/\\/g, '/') - .split('\n') - .filter(line => { - const pathMatches = line.match(extractPathRegex); - if (pathMatches === null || !pathMatches[1]) { - return true; - } - - const match = pathMatches[1]; - - // Electron - if ( - match.includes('.app/Contents/Resources/electron.asar') || - match.includes('.app/Contents/Resources/default_app.asar') - ) { - return false; - } - - return !pathRegex.test(match); - }) - .filter(line => line.trim() !== '') - .map(line => { - if (options.pretty) { - return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); - } +const onetime = __webpack_require__(677); +const signalExit = __webpack_require__(370); - return line; - }) - .join('\n'); -}; +module.exports = onetime(() => { + signalExit(() => { + process.stderr.write('\u001b[?25h'); + }, {alwaysLast: true}); +}); /***/ }), -/* 675 */ +/* 677 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(676); -const cliCursor = __webpack_require__(680); -const cliSpinners = __webpack_require__(684); -const logSymbols = __webpack_require__(565); +const mimicFn = __webpack_require__(678); -class Ora { - constructor(options) { - if (typeof options === 'string') { - options = { - text: options - }; - } +module.exports = (fn, opts) => { + // TODO: Remove this in v3 + if (opts === true) { + throw new TypeError('The second argument is now an options object'); + } - this.options = Object.assign({ - text: '', - color: 'cyan', - stream: process.stderr - }, options); + if (typeof fn !== 'function') { + throw new TypeError('Expected a function'); + } - const sp = this.options.spinner; - this.spinner = typeof sp === 'object' ? sp : (process.platform === 'win32' ? cliSpinners.line : (cliSpinners[sp] || cliSpinners.dots)); // eslint-disable-line no-nested-ternary + opts = opts || {}; - if (this.spinner.frames === undefined) { - throw new Error('Spinner must define `frames`'); - } + let ret; + let called = false; + const fnName = fn.displayName || fn.name || ''; - this.text = this.options.text; - this.color = this.options.color; - this.interval = this.options.interval || this.spinner.interval || 100; - this.stream = this.options.stream; - this.id = null; - this.frameIndex = 0; - this.enabled = typeof this.options.enabled === 'boolean' ? this.options.enabled : ((this.stream && this.stream.isTTY) && !process.env.CI); - } - frame() { - const frames = this.spinner.frames; - let frame = frames[this.frameIndex]; + const onetime = function () { + if (called) { + if (opts.throw === true) { + throw new Error(`Function \`${fnName}\` can only be called once`); + } - if (this.color) { - frame = chalk[this.color](frame); + return ret; } - this.frameIndex = ++this.frameIndex % frames.length; + called = true; + ret = fn.apply(this, arguments); + fn = null; - return frame + ' ' + this.text; - } - clear() { - if (!this.enabled) { - return this; - } + return ret; + }; - this.stream.clearLine(); - this.stream.cursorTo(0); + mimicFn(onetime, fn); - return this; - } - render() { - this.clear(); - this.stream.write(this.frame()); + return onetime; +}; - return this; - } - start(text) { - if (text) { - this.text = text; - } - if (!this.enabled || this.id) { - return this; - } +/***/ }), +/* 678 */ +/***/ (function(module, exports, __webpack_require__) { - cliCursor.hide(this.stream); - this.render(); - this.id = setInterval(this.render.bind(this), this.interval); +"use strict"; - return this; +module.exports = (to, from) => { + // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 + for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { + Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); } - stop() { - if (!this.enabled) { - return this; - } - clearInterval(this.id); - this.id = null; - this.frameIndex = 0; - this.clear(); - cliCursor.show(this.stream); + return to; +}; - return this; - } - succeed(text) { - return this.stopAndPersist({symbol: logSymbols.success, text}); - } - fail(text) { - return this.stopAndPersist({symbol: logSymbols.error, text}); - } - warn(text) { - return this.stopAndPersist({symbol: logSymbols.warning, text}); - } - info(text) { - return this.stopAndPersist({symbol: logSymbols.info, text}); - } - stopAndPersist(options) { - if (!this.enabled) { - return this; - } - // Legacy argument - // TODO: Deprecate sometime in the future - if (typeof options === 'string') { - options = { - symbol: options - }; - } +/***/ }), +/* 679 */ +/***/ (function(module, exports, __webpack_require__) { - options = options || {}; +"use strict"; - this.stop(); - this.stream.write(`${options.symbol || ' '} ${options.text || this.text}\n`); +module.exports = __webpack_require__(680); - return this; - } -} -module.exports = function (opts) { - return new Ora(opts); -}; +/***/ }), +/* 680 */ +/***/ (function(module) { -module.exports.promise = (action, options) => { - if (typeof action.then !== 'function') { - throw new TypeError('Parameter `action` must be a Promise'); - } +module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); - const spinner = new Ora(options); - spinner.start(); +/***/ }), +/* 681 */ +/***/ (function(module, exports, __webpack_require__) { - action.then( - () => { - spinner.succeed(); - }, - () => { - spinner.fail(); - } - ); +"use strict"; - return spinner; +const chalk = __webpack_require__(682); + +const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; + +const main = { + info: chalk.blue('ℹ'), + success: chalk.green('✔'), + warning: chalk.yellow('⚠'), + error: chalk.red('✖') +}; + +const fallbacks = { + info: chalk.blue('i'), + success: chalk.green('√'), + warning: chalk.yellow('‼'), + error: chalk.red('×') }; +module.exports = isSupported ? main : fallbacks; + /***/ }), -/* 676 */ +/* 682 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(3); -const ansiStyles = __webpack_require__(677); -const stdoutColor = __webpack_require__(678).stdout; +const escapeStringRegexp = __webpack_require__(387); +const ansiStyles = __webpack_require__(683); +const stdoutColor = __webpack_require__(684).stdout; -const template = __webpack_require__(679); +const template = __webpack_require__(685); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -77658,12 +77850,12 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 677 */ +/* 683 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(6); +const colorConvert = __webpack_require__(389); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -77828,16 +78020,16 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(11)(module))) /***/ }), -/* 678 */ +/* 684 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const hasFlag = __webpack_require__(12); +const os = __webpack_require__(364); +const hasFlag = __webpack_require__(394); const env = process.env; @@ -77973,7 +78165,7 @@ module.exports = { /***/ }), -/* 679 */ +/* 685 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78107,145 +78299,6 @@ module.exports = (chalk, tmp) => { }; -/***/ }), -/* 680 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const restoreCursor = __webpack_require__(681); - -let hidden = false; - -exports.show = stream => { - const s = stream || process.stderr; - - if (!s.isTTY) { - return; - } - - hidden = false; - s.write('\u001b[?25h'); -}; - -exports.hide = stream => { - const s = stream || process.stderr; - - if (!s.isTTY) { - return; - } - - restoreCursor(); - hidden = true; - s.write('\u001b[?25l'); -}; - -exports.toggle = (force, stream) => { - if (force !== undefined) { - hidden = force; - } - - if (hidden) { - exports.show(stream); - } else { - exports.hide(stream); - } -}; - - -/***/ }), -/* 681 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const onetime = __webpack_require__(682); -const signalExit = __webpack_require__(397); - -module.exports = onetime(() => { - signalExit(() => { - process.stderr.write('\u001b[?25h'); - }, {alwaysLast: true}); -}); - - -/***/ }), -/* 682 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const mimicFn = __webpack_require__(683); - -module.exports = (fn, opts) => { - // TODO: Remove this in v3 - if (opts === true) { - throw new TypeError('The second argument is now an options object'); - } - - if (typeof fn !== 'function') { - throw new TypeError('Expected a function'); - } - - opts = opts || {}; - - let ret; - let called = false; - const fnName = fn.displayName || fn.name || ''; - - const onetime = function () { - if (called) { - if (opts.throw === true) { - throw new Error(`Function \`${fnName}\` can only be called once`); - } - - return ret; - } - - called = true; - ret = fn.apply(this, arguments); - fn = null; - - return ret; - }; - - mimicFn(onetime, fn); - - return onetime; -}; - - -/***/ }), -/* 683 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = (to, from) => { - // TODO: use `Reflect.ownKeys()` when targeting Node.js 6 - for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) { - Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); - } - - return to; -}; - - -/***/ }), -/* 684 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = __webpack_require__(685); - - -/***/ }), -/* 685 */ -/***/ (function(module) { - -module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); - /***/ }), /* 686 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -78253,9 +78306,8 @@ module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\" "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(516); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); /* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); /* @@ -78290,16 +78342,18 @@ const RunCommand = { const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_3__["topologicallyBatchProjects"])(projects, projectGraph); if (extraArgs.length === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red.bold('\nNo script specified')); - process.exit(1); + throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]('No script specified'); } const scriptName = extraArgs[0]; const scriptArgs = extraArgs.slice(1); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`\nRunning script [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(scriptName)}] in batched topological order\n`)); - await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { - if (pkg.hasScript(scriptName)) { - await pkg.runScriptStreaming(scriptName, scriptArgs); + await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async project => { + if (project.hasScript(scriptName)) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`[${project.name}] running "${scriptName}" script`); + await project.runScriptStreaming(scriptName, { + args: scriptArgs + }); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${project.name}] complete`); } }); } @@ -78313,9 +78367,8 @@ const RunCommand = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(516); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); /* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(501); /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); /* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(688); @@ -78378,12 +78431,11 @@ const WatchCommand = { } if (projectsToWatch.size === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`\nThere are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.\n`)); - return; + throw new _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"](`There are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.`); } const projectNames = Array.from(projectsToWatch.keys()); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`))); // Kibana should always be run the last, so we don't rely on automatic + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`); // Kibana should always be run the last, so we don't rely on automatic // topological batching and push it to the last one-entry batch manually. const shouldWatchKibanaProject = projectsToWatch.delete(kibanaProjectName); @@ -78394,8 +78446,10 @@ const WatchCommand = { } await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_2__["parallelizeBatches"])(batchedProjects, async pkg => { - const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName).stdout); - _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`[${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(pkg.name)}] Initial build completed (${completionHint}).`)); + const completionHint = await Object(_utils_watch__WEBPACK_IMPORTED_MODULE_4__["waitUntilWatchIsReady"])(pkg.runScriptStreaming(watchScriptName, { + debug: false + }).stdout); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].success(`[${pkg.name}] Initial build completed (${completionHint}).`); }); } @@ -78408,8 +78462,8 @@ const WatchCommand = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); -/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(169); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(270); +/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(140); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(241); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -78482,17 +78536,11 @@ function waitUntilWatchIsReady(stream, opts = {}) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(690); -/* harmony import */ var indent_string__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(indent_string__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(691); -/* harmony import */ var wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(wrap_ansi__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(516); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(34); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(502); -/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(698); -/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(699); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(516); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(500); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(502); +/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(690); +/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(691); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -78522,13 +78570,10 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope - - - async function runCommand(command, config) { try { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Running [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(command.name)}] command from [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.yellow(config.rootPath)}]:\n`)); - const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_7__["Kibana"].loadFrom(config.rootPath); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Running [${command.name}] command from [${config.rootPath}]`); + const kbn = await _utils_kibana__WEBPACK_IMPORTED_MODULE_4__["Kibana"].loadFrom(config.rootPath); const projects = kbn.getFilteredProjects({ skipKibanaPlugins: Boolean(config.options['skip-kibana-plugins']), ossOnly: Boolean(config.options.oss), @@ -78537,34 +78582,31 @@ async function runCommand(command, config) { }); if (projects.size === 0) { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.\n`)); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`There are no projects found. Double check project name(s) in '-i/--include' and '-e/--exclude' filters.`); return process.exit(1); } - const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_5__["buildProjectGraph"])(projects); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold(`Found [${chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green(projects.size.toString())}] projects:\n`)); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_6__["renderProjectsTree"])(config.rootPath, projects)); + const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_2__["buildProjectGraph"])(projects); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(`Found ${projects.size.toString()} projects`); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].debug(Object(_utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__["renderProjectsTree"])(config.rootPath, projects)); await command.run(projects, projectGraph, _objectSpread({}, config, { kbn })); - } catch (e) { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold.red(`\n[${command.name}] failed:\n`)); + } catch (error) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(`[${command.name}] failed:`); - if (e instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_3__["CliError"]) { - const msg = chalk__WEBPACK_IMPORTED_MODULE_0___default.a.red(`CliError: ${e.message}\n`); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(wrap_ansi__WEBPACK_IMPORTED_MODULE_2___default()(msg, 80)); - const keys = Object.keys(e.meta); + if (error instanceof _utils_errors__WEBPACK_IMPORTED_MODULE_0__["CliError"]) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error.message); + const metaOutput = Object.entries(error.meta).map(([key, value]) => `${key}: ${value}`).join('\n'); - if (keys.length > 0) { - const metaOutput = keys.map(key => { - const value = e.meta[key]; - return `${key}: ${value}`; - }); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write('Additional debugging info:\n'); - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(indent_string__WEBPACK_IMPORTED_MODULE_1___default()(metaOutput.join('\n'), 3)); + if (metaOutput) { + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info('Additional debugging info:\n'); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(2); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].info(metaOutput); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].indent(-2); } } else { - _utils_log__WEBPACK_IMPORTED_MODULE_4__["log"].write(e.stack); + _utils_log__WEBPACK_IMPORTED_MODULE_1__["log"].error(error); } process.exit(1); @@ -78581,400 +78623,14 @@ function toArray(value) { /***/ }), /* 690 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -module.exports = (str, count, opts) => { - // Support older versions: use the third parameter as options.indent - // TODO: Remove the workaround in the next major version - const options = typeof opts === 'object' ? Object.assign({indent: ' '}, opts) : {indent: opts || ' '}; - count = count === undefined ? 1 : count; - - if (typeof str !== 'string') { - throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof str}\``); - } - - if (typeof count !== 'number') { - throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof count}\``); - } - - if (typeof options.indent !== 'string') { - throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\``); - } - - if (count === 0) { - return str; - } - - const regex = options.includeEmptyLines ? /^/mg : /^(?!\s*$)/mg; - return str.replace(regex, options.indent.repeat(count)); -} -; - - -/***/ }), -/* 691 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const stringWidth = __webpack_require__(692); -const stripAnsi = __webpack_require__(696); - -const ESCAPES = new Set([ - '\u001B', - '\u009B' -]); - -const END_CODE = 39; - -const ESCAPE_CODES = new Map([ - [0, 0], - [1, 22], - [2, 22], - [3, 23], - [4, 24], - [7, 27], - [8, 28], - [9, 29], - [30, 39], - [31, 39], - [32, 39], - [33, 39], - [34, 39], - [35, 39], - [36, 39], - [37, 39], - [90, 39], - [40, 49], - [41, 49], - [42, 49], - [43, 49], - [44, 49], - [45, 49], - [46, 49], - [47, 49] -]); - -const wrapAnsi = code => `${ESCAPES.values().next().value}[${code}m`; - -// Calculate the length of words split on ' ', ignoring -// the extra characters added by ansi escape codes -const wordLengths = str => str.split(' ').map(s => stringWidth(s)); - -// Wrap a long word across multiple rows -// Ansi escape codes do not count towards length -const wrapWord = (rows, word, cols) => { - const arr = Array.from(word); - - let insideEscape = false; - let visible = stringWidth(stripAnsi(rows[rows.length - 1])); - - for (const item of arr.entries()) { - const i = item[0]; - const char = item[1]; - const charLength = stringWidth(char); - - if (visible + charLength <= cols) { - rows[rows.length - 1] += char; - } else { - rows.push(char); - visible = 0; - } - - if (ESCAPES.has(char)) { - insideEscape = true; - } else if (insideEscape && char === 'm') { - insideEscape = false; - continue; - } - - if (insideEscape) { - continue; - } - - visible += charLength; - - if (visible === cols && i < arr.length - 1) { - rows.push(''); - visible = 0; - } - } - - // It's possible that the last row we copy over is only - // ansi escape characters, handle this edge-case - if (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) { - rows[rows.length - 2] += rows.pop(); - } -}; - -// The wrap-ansi module can be invoked -// in either 'hard' or 'soft' wrap mode -// -// 'hard' will never allow a string to take up more -// than cols characters -// -// 'soft' allows long words to expand past the column length -const exec = (str, cols, opts) => { - const options = opts || {}; - - if (str.trim() === '') { - return options.trim === false ? str : str.trim(); - } - - let pre = ''; - let ret = ''; - let escapeCode; - - const lengths = wordLengths(str); - const words = str.split(' '); - const rows = ['']; - - for (const item of Array.from(words).entries()) { - const i = item[0]; - const word = item[1]; - - rows[rows.length - 1] = options.trim === false ? rows[rows.length - 1] : rows[rows.length - 1].trim(); - let rowLength = stringWidth(rows[rows.length - 1]); - - if (rowLength || word === '') { - if (rowLength === cols && options.wordWrap === false) { - // If we start with a new word but the current row length equals the length of the columns, add a new row - rows.push(''); - rowLength = 0; - } - - rows[rows.length - 1] += ' '; - rowLength++; - } - - // In 'hard' wrap mode, the length of a line is - // never allowed to extend past 'cols' - if (lengths[i] > cols && options.hard) { - if (rowLength) { - rows.push(''); - } - wrapWord(rows, word, cols); - continue; - } - - if (rowLength + lengths[i] > cols && rowLength > 0) { - if (options.wordWrap === false && rowLength < cols) { - wrapWord(rows, word, cols); - continue; - } - - rows.push(''); - } - - if (rowLength + lengths[i] > cols && options.wordWrap === false) { - wrapWord(rows, word, cols); - continue; - } - - rows[rows.length - 1] += word; - } - - pre = rows.map(r => options.trim === false ? r : r.trim()).join('\n'); - - for (const item of Array.from(pre).entries()) { - const i = item[0]; - const char = item[1]; - - ret += char; - - if (ESCAPES.has(char)) { - const code = parseFloat(/\d[^m]*/.exec(pre.slice(i, i + 4))); - escapeCode = code === END_CODE ? null : code; - } - - const code = ESCAPE_CODES.get(Number(escapeCode)); - - if (escapeCode && code) { - if (pre[i + 1] === '\n') { - ret += wrapAnsi(code); - } else if (char === '\n') { - ret += wrapAnsi(escapeCode); - } - } - } - - return ret; -}; - -// For each newline, invoke the method separately -module.exports = (str, cols, opts) => { - return String(str) - .normalize() - .split('\n') - .map(line => exec(line, cols, opts)) - .join('\n'); -}; - - -/***/ }), -/* 692 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const stripAnsi = __webpack_require__(693); -const isFullwidthCodePoint = __webpack_require__(695); - -module.exports = str => { - if (typeof str !== 'string' || str.length === 0) { - return 0; - } - - str = stripAnsi(str); - - let width = 0; - - for (let i = 0; i < str.length; i++) { - const code = str.codePointAt(i); - - // Ignore control characters - if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { - continue; - } - - // Ignore combining characters - if (code >= 0x300 && code <= 0x36F) { - continue; - } - - // Surrogates - if (code > 0xFFFF) { - i++; - } - - width += isFullwidthCodePoint(code) ? 2 : 1; - } - - return width; -}; - - -/***/ }), -/* 693 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const ansiRegex = __webpack_require__(694); - -module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; - - -/***/ }), -/* 694 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = () => { - const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' - ].join('|'); - - return new RegExp(pattern, 'g'); -}; - - -/***/ }), -/* 695 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -/* eslint-disable yoda */ -module.exports = x => { - if (Number.isNaN(x)) { - return false; - } - - // code points are derived from: - // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt - if ( - x >= 0x1100 && ( - x <= 0x115f || // Hangul Jamo - x === 0x2329 || // LEFT-POINTING ANGLE BRACKET - x === 0x232a || // RIGHT-POINTING ANGLE BRACKET - // CJK Radicals Supplement .. Enclosed CJK Letters and Months - (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) || - // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A - (0x3250 <= x && x <= 0x4dbf) || - // CJK Unified Ideographs .. Yi Radicals - (0x4e00 <= x && x <= 0xa4c6) || - // Hangul Jamo Extended-A - (0xa960 <= x && x <= 0xa97c) || - // Hangul Syllables - (0xac00 <= x && x <= 0xd7a3) || - // CJK Compatibility Ideographs - (0xf900 <= x && x <= 0xfaff) || - // Vertical Forms - (0xfe10 <= x && x <= 0xfe19) || - // CJK Compatibility Forms .. Small Form Variants - (0xfe30 <= x && x <= 0xfe6b) || - // Halfwidth and Fullwidth Forms - (0xff01 <= x && x <= 0xff60) || - (0xffe0 <= x && x <= 0xffe6) || - // Kana Supplement - (0x1b000 <= x && x <= 0x1b001) || - // Enclosed Ideographic Supplement - (0x1f200 <= x && x <= 0x1f251) || - // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane - (0x20000 <= x && x <= 0x3fffd) - ) - ) { - return true; - } - - return false; -}; - - -/***/ }), -/* 696 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const ansiRegex = __webpack_require__(697); - -module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input; - - -/***/ }), -/* 697 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = () => { - const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))' - ].join('|'); - - return new RegExp(pattern, 'g'); -}; - - -/***/ }), -/* 698 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(386); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -79119,20 +78775,20 @@ function addProjectToTree(tree, pathParts, project) { } /***/ }), -/* 699 */ +/* 691 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(700); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(692); /* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(704); +/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(696); /* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(is_path_inside__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(502); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(579); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(574); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -79273,15 +78929,15 @@ class Kibana { } /***/ }), -/* 700 */ +/* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const minimatch = __webpack_require__(506); -const arrayUnion = __webpack_require__(701); -const arrayDiffer = __webpack_require__(702); -const arrify = __webpack_require__(703); +const arrayUnion = __webpack_require__(693); +const arrayDiffer = __webpack_require__(694); +const arrify = __webpack_require__(695); module.exports = (list, patterns, options = {}) => { list = arrify(list); @@ -79305,7 +78961,7 @@ module.exports = (list, patterns, options = {}) => { /***/ }), -/* 701 */ +/* 693 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79317,7 +78973,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 702 */ +/* 694 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79332,7 +78988,7 @@ module.exports = arrayDiffer; /***/ }), -/* 703 */ +/* 695 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79362,12 +79018,12 @@ module.exports = arrify; /***/ }), -/* 704 */ +/* 696 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); +const path = __webpack_require__(4); module.exports = (childPath, parentPath) => { childPath = path.resolve(childPath); @@ -79390,15 +79046,15 @@ module.exports = (childPath, parentPath) => { /***/ }), -/* 705 */ +/* 697 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(706); +/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(698); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); -/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(941); +/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(933); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); /* @@ -79423,21 +79079,21 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 706 */ +/* 698 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(707); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(699); /* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(587); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(582); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(16); +/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(579); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(574); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(491); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(500); /* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(518); /* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(502); /* @@ -79475,7 +79131,7 @@ async function buildProductionProjects({ const projectGraph = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["buildProjectGraph"])(projects); const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_7__["topologicallyBatchProjects"])(projects, projectGraph); const projectNames = [...projects.values()].map(project => project.name); - _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].write(`Preparing production build for [${projectNames.join(', ')}]`); + _utils_log__WEBPACK_IMPORTED_MODULE_5__["log"].info(`Preparing production build for [${projectNames.join(', ')}]`); for (const batch of batchedProjects) { for (const project of batch) { @@ -79571,21 +79227,21 @@ async function copyToBuild(project, kibanaRoot, buildRoot) { } /***/ }), -/* 707 */ +/* 699 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(399); -const path = __webpack_require__(16); -const os = __webpack_require__(11); -const pAll = __webpack_require__(708); -const arrify = __webpack_require__(710); -const globby = __webpack_require__(711); -const isGlob = __webpack_require__(605); -const cpFile = __webpack_require__(926); -const junk = __webpack_require__(938); -const CpyError = __webpack_require__(939); +const EventEmitter = __webpack_require__(373); +const path = __webpack_require__(4); +const os = __webpack_require__(364); +const pAll = __webpack_require__(700); +const arrify = __webpack_require__(702); +const globby = __webpack_require__(703); +const isGlob = __webpack_require__(600); +const cpFile = __webpack_require__(918); +const junk = __webpack_require__(930); +const CpyError = __webpack_require__(931); const defaultOptions = { ignoreJunk: true @@ -79704,12 +79360,12 @@ module.exports = (source, destination, { /***/ }), -/* 708 */ +/* 700 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pMap = __webpack_require__(709); +const pMap = __webpack_require__(701); module.exports = (iterable, options) => pMap(iterable, element => element(), options); // TODO: Remove this for the next major release @@ -79717,7 +79373,7 @@ module.exports.default = module.exports; /***/ }), -/* 709 */ +/* 701 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79796,7 +79452,7 @@ module.exports.default = pMap; /***/ }), -/* 710 */ +/* 702 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79826,17 +79482,17 @@ module.exports = arrify; /***/ }), -/* 711 */ +/* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const arrayUnion = __webpack_require__(712); -const glob = __webpack_require__(714); -const fastGlob = __webpack_require__(719); -const dirGlob = __webpack_require__(919); -const gitignore = __webpack_require__(922); +const fs = __webpack_require__(349); +const arrayUnion = __webpack_require__(704); +const glob = __webpack_require__(706); +const fastGlob = __webpack_require__(711); +const dirGlob = __webpack_require__(911); +const gitignore = __webpack_require__(914); const DEFAULT_FILTER = () => false; @@ -79981,12 +79637,12 @@ module.exports.gitignore = gitignore; /***/ }), -/* 712 */ +/* 704 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var arrayUniq = __webpack_require__(713); +var arrayUniq = __webpack_require__(705); module.exports = function () { return arrayUniq([].concat.apply([], arguments)); @@ -79994,7 +79650,7 @@ module.exports = function () { /***/ }), -/* 713 */ +/* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80063,7 +79719,7 @@ if ('Set' in global) { /***/ }), -/* 714 */ +/* 706 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -80108,27 +79764,27 @@ if ('Set' in global) { module.exports = glob -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(715) -var EE = __webpack_require__(399).EventEmitter -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var inherits = __webpack_require__(707) +var EE = __webpack_require__(373).EventEmitter +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var globSync = __webpack_require__(717) -var common = __webpack_require__(718) +var globSync = __webpack_require__(709) +var common = __webpack_require__(710) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp var inflight = __webpack_require__(515) -var util = __webpack_require__(29) +var util = __webpack_require__(397) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(404) +var once = __webpack_require__(378) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -80859,22 +80515,22 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 715 */ +/* 707 */ /***/ (function(module, exports, __webpack_require__) { try { - var util = __webpack_require__(29); + var util = __webpack_require__(397); /* istanbul ignore next */ if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(716); + module.exports = __webpack_require__(708); } /***/ }), -/* 716 */ +/* 708 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -80907,22 +80563,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 717 */ +/* 709 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(23) +var fs = __webpack_require__(349) var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(714).Glob -var util = __webpack_require__(29) -var path = __webpack_require__(16) -var assert = __webpack_require__(30) +var Glob = __webpack_require__(706).Glob +var util = __webpack_require__(397) +var path = __webpack_require__(4) +var assert = __webpack_require__(371) var isAbsolute = __webpack_require__(512) -var common = __webpack_require__(718) +var common = __webpack_require__(710) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -81399,7 +81055,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 718 */ +/* 710 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -81416,7 +81072,7 @@ function ownProp (obj, field) { return Object.prototype.hasOwnProperty.call(obj, field) } -var path = __webpack_require__(16) +var path = __webpack_require__(4) var minimatch = __webpack_require__(506) var isAbsolute = __webpack_require__(512) var Minimatch = minimatch.Minimatch @@ -81645,10 +81301,10 @@ function childrenIgnored (self, path) { /***/ }), -/* 719 */ +/* 711 */ /***/ (function(module, exports, __webpack_require__) { -const pkg = __webpack_require__(720); +const pkg = __webpack_require__(712); module.exports = pkg.async; module.exports.default = pkg.async; @@ -81661,19 +81317,19 @@ module.exports.generateTasks = pkg.generateTasks; /***/ }), -/* 720 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var optionsManager = __webpack_require__(721); -var taskManager = __webpack_require__(722); -var reader_async_1 = __webpack_require__(890); -var reader_stream_1 = __webpack_require__(914); -var reader_sync_1 = __webpack_require__(915); -var arrayUtils = __webpack_require__(917); -var streamUtils = __webpack_require__(918); +var optionsManager = __webpack_require__(713); +var taskManager = __webpack_require__(714); +var reader_async_1 = __webpack_require__(882); +var reader_stream_1 = __webpack_require__(906); +var reader_sync_1 = __webpack_require__(907); +var arrayUtils = __webpack_require__(909); +var streamUtils = __webpack_require__(910); /** * Synchronous API. */ @@ -81739,7 +81395,7 @@ function isString(source) { /***/ }), -/* 721 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81777,13 +81433,13 @@ exports.prepare = prepare; /***/ }), -/* 722 */ +/* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var patternUtils = __webpack_require__(723); +var patternUtils = __webpack_require__(715); /** * Generate tasks based on parent directory of each pattern. */ @@ -81874,16 +81530,16 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 723 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); -var globParent = __webpack_require__(724); -var isGlob = __webpack_require__(727); -var micromatch = __webpack_require__(728); +var path = __webpack_require__(4); +var globParent = __webpack_require__(716); +var isGlob = __webpack_require__(719); +var micromatch = __webpack_require__(720); var GLOBSTAR = '**'; /** * Return true for static pattern. @@ -82029,16 +81685,16 @@ exports.matchAny = matchAny; /***/ }), -/* 724 */ +/* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var path = __webpack_require__(16); -var isglob = __webpack_require__(725); -var pathDirname = __webpack_require__(726); -var isWin32 = __webpack_require__(11).platform() === 'win32'; +var path = __webpack_require__(4); +var isglob = __webpack_require__(717); +var pathDirname = __webpack_require__(718); +var isWin32 = __webpack_require__(364).platform() === 'win32'; module.exports = function globParent(str) { // flip windows path separators @@ -82060,7 +81716,7 @@ module.exports = function globParent(str) { /***/ }), -/* 725 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -82070,7 +81726,7 @@ module.exports = function globParent(str) { * Licensed under the MIT License. */ -var isExtglob = __webpack_require__(606); +var isExtglob = __webpack_require__(601); module.exports = function isGlob(str) { if (typeof str !== 'string' || str === '') { @@ -82091,14 +81747,14 @@ module.exports = function isGlob(str) { /***/ }), -/* 726 */ +/* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var path = __webpack_require__(16); -var inspect = __webpack_require__(29).inspect; +var path = __webpack_require__(4); +var inspect = __webpack_require__(397).inspect; function assertPath(path) { if (typeof path !== 'string') { @@ -82241,7 +81897,7 @@ module.exports.win32 = win32; /***/ }), -/* 727 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -82251,7 +81907,7 @@ module.exports.win32 = win32; * Released under the MIT License. */ -var isExtglob = __webpack_require__(606); +var isExtglob = __webpack_require__(601); var chars = { '{': '}', '(': ')', '[': ']'}; module.exports = function isGlob(str, options) { @@ -82293,7 +81949,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 728 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82303,19 +81959,19 @@ module.exports = function isGlob(str, options) { * Module dependencies */ -var util = __webpack_require__(29); -var braces = __webpack_require__(729); -var toRegex = __webpack_require__(842); -var extend = __webpack_require__(850); +var util = __webpack_require__(397); +var braces = __webpack_require__(721); +var toRegex = __webpack_require__(834); +var extend = __webpack_require__(842); /** * Local dependencies */ -var compilers = __webpack_require__(853); -var parsers = __webpack_require__(886); -var cache = __webpack_require__(887); -var utils = __webpack_require__(888); +var compilers = __webpack_require__(845); +var parsers = __webpack_require__(878); +var cache = __webpack_require__(879); +var utils = __webpack_require__(880); var MAX_LENGTH = 1024 * 64; /** @@ -83177,7 +82833,7 @@ module.exports = micromatch; /***/ }), -/* 729 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83187,18 +82843,18 @@ module.exports = micromatch; * Module dependencies */ -var toRegex = __webpack_require__(730); -var unique = __webpack_require__(744); -var extend = __webpack_require__(739); +var toRegex = __webpack_require__(722); +var unique = __webpack_require__(736); +var extend = __webpack_require__(731); /** * Local dependencies */ -var compilers = __webpack_require__(745); -var parsers = __webpack_require__(762); -var Braces = __webpack_require__(772); -var utils = __webpack_require__(746); +var compilers = __webpack_require__(737); +var parsers = __webpack_require__(754); +var Braces = __webpack_require__(764); +var utils = __webpack_require__(738); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -83502,15 +83158,15 @@ module.exports = braces; /***/ }), -/* 730 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(731); -var extend = __webpack_require__(739); -var not = __webpack_require__(741); +var define = __webpack_require__(723); +var extend = __webpack_require__(731); +var not = __webpack_require__(733); var MAX_LENGTH = 1024 * 64; /** @@ -83657,7 +83313,7 @@ module.exports.makeRe = makeRe; /***/ }), -/* 731 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83670,7 +83326,7 @@ module.exports.makeRe = makeRe; -var isDescriptor = __webpack_require__(732); +var isDescriptor = __webpack_require__(724); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -83695,7 +83351,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 732 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83708,9 +83364,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(733); -var isAccessor = __webpack_require__(734); -var isData = __webpack_require__(737); +var typeOf = __webpack_require__(725); +var isAccessor = __webpack_require__(726); +var isData = __webpack_require__(729); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -83724,7 +83380,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 733 */ +/* 725 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -83877,7 +83533,7 @@ function isBuffer(val) { /***/ }), -/* 734 */ +/* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83890,7 +83546,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(735); +var typeOf = __webpack_require__(727); // accessor descriptor properties var accessor = { @@ -83953,10 +83609,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 735 */ +/* 727 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -84075,7 +83731,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 736 */ +/* 728 */ /***/ (function(module, exports) { /*! @@ -84102,7 +83758,7 @@ function isSlowBuffer (obj) { /***/ }), -/* 737 */ +/* 729 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84115,7 +83771,7 @@ function isSlowBuffer (obj) { -var typeOf = __webpack_require__(738); +var typeOf = __webpack_require__(730); // data descriptor properties var data = { @@ -84164,10 +83820,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 738 */ +/* 730 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -84286,13 +83942,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 739 */ +/* 731 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(740); +var isObject = __webpack_require__(732); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -84326,7 +83982,7 @@ function hasOwn(obj, key) { /***/ }), -/* 740 */ +/* 732 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84346,13 +84002,13 @@ module.exports = function isExtendable(val) { /***/ }), -/* 741 */ +/* 733 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(742); +var extend = __webpack_require__(734); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -84419,13 +84075,13 @@ module.exports = toRegex; /***/ }), -/* 742 */ +/* 734 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(743); +var isObject = __webpack_require__(735); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -84459,7 +84115,7 @@ function hasOwn(obj, key) { /***/ }), -/* 743 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84479,7 +84135,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 744 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84529,13 +84185,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 745 */ +/* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(746); +var utils = __webpack_require__(738); module.exports = function(braces, options) { braces.compiler @@ -84818,25 +84474,25 @@ function hasQueue(node) { /***/ }), -/* 746 */ +/* 738 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(747); +var splitString = __webpack_require__(739); var utils = module.exports; /** * Module dependencies */ -utils.extend = __webpack_require__(739); -utils.flatten = __webpack_require__(753); -utils.isObject = __webpack_require__(751); -utils.fillRange = __webpack_require__(754); -utils.repeat = __webpack_require__(761); -utils.unique = __webpack_require__(744); +utils.extend = __webpack_require__(731); +utils.flatten = __webpack_require__(745); +utils.isObject = __webpack_require__(743); +utils.fillRange = __webpack_require__(746); +utils.repeat = __webpack_require__(753); +utils.unique = __webpack_require__(736); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -85168,7 +84824,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 747 */ +/* 739 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85181,7 +84837,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(748); +var extend = __webpack_require__(740); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -85346,14 +85002,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 748 */ +/* 740 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(749); -var assignSymbols = __webpack_require__(752); +var isExtendable = __webpack_require__(741); +var assignSymbols = __webpack_require__(744); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -85413,7 +85069,7 @@ function isEnum(obj, key) { /***/ }), -/* 749 */ +/* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85426,7 +85082,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -85434,7 +85090,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 750 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85447,7 +85103,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(751); +var isObject = __webpack_require__(743); function isObjectObject(o) { return isObject(o) === true @@ -85478,7 +85134,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 751 */ +/* 743 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85497,7 +85153,7 @@ module.exports = function isObject(val) { /***/ }), -/* 752 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85544,7 +85200,7 @@ module.exports = function(receiver, objects) { /***/ }), -/* 753 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85573,7 +85229,7 @@ function flat(arr, res) { /***/ }), -/* 754 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85586,11 +85242,11 @@ function flat(arr, res) { -var util = __webpack_require__(29); -var isNumber = __webpack_require__(755); -var extend = __webpack_require__(757); -var repeat = __webpack_require__(759); -var toRegex = __webpack_require__(760); +var util = __webpack_require__(397); +var isNumber = __webpack_require__(747); +var extend = __webpack_require__(749); +var repeat = __webpack_require__(751); +var toRegex = __webpack_require__(752); /** * Return a range of numbers or letters. @@ -85788,7 +85444,7 @@ module.exports = fillRange; /***/ }), -/* 755 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85801,7 +85457,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(756); +var typeOf = __webpack_require__(748); module.exports = function isNumber(num) { var type = typeOf(num); @@ -85817,10 +85473,10 @@ module.exports = function isNumber(num) { /***/ }), -/* 756 */ +/* 748 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -85939,13 +85595,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 757 */ +/* 749 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(758); +var isObject = __webpack_require__(750); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -85979,7 +85635,7 @@ function hasOwn(obj, key) { /***/ }), -/* 758 */ +/* 750 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85999,7 +85655,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 759 */ +/* 751 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86076,7 +85732,7 @@ function repeat(str, num) { /***/ }), -/* 760 */ +/* 752 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86089,8 +85745,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(759); -var isNumber = __webpack_require__(755); +var repeat = __webpack_require__(751); +var isNumber = __webpack_require__(747); var cache = {}; function toRegexRange(min, max, options) { @@ -86377,7 +86033,7 @@ module.exports = toRegexRange; /***/ }), -/* 761 */ +/* 753 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86402,14 +86058,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 762 */ +/* 754 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(763); -var utils = __webpack_require__(746); +var Node = __webpack_require__(755); +var utils = __webpack_require__(738); /** * Braces parsers @@ -86769,15 +86425,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 763 */ +/* 755 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(751); -var define = __webpack_require__(764); -var utils = __webpack_require__(771); +var isObject = __webpack_require__(743); +var define = __webpack_require__(756); +var utils = __webpack_require__(763); var ownNames; /** @@ -87268,7 +86924,7 @@ exports = module.exports = Node; /***/ }), -/* 764 */ +/* 756 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87281,7 +86937,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(765); +var isDescriptor = __webpack_require__(757); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -87306,7 +86962,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 765 */ +/* 757 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87319,9 +86975,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(766); -var isAccessor = __webpack_require__(767); -var isData = __webpack_require__(769); +var typeOf = __webpack_require__(758); +var isAccessor = __webpack_require__(759); +var isData = __webpack_require__(761); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -87335,7 +86991,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 766 */ +/* 758 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87470,7 +87126,7 @@ function isBuffer(val) { /***/ }), -/* 767 */ +/* 759 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87483,7 +87139,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(768); +var typeOf = __webpack_require__(760); // accessor descriptor properties var accessor = { @@ -87546,7 +87202,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 768 */ +/* 760 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87681,7 +87337,7 @@ function isBuffer(val) { /***/ }), -/* 769 */ +/* 761 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87694,7 +87350,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(770); +var typeOf = __webpack_require__(762); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -87737,7 +87393,7 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 770 */ +/* 762 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87872,13 +87528,13 @@ function isBuffer(val) { /***/ }), -/* 771 */ +/* 763 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(756); +var typeOf = __webpack_require__(748); var utils = module.exports; /** @@ -88898,17 +88554,17 @@ function assert(val, message) { /***/ }), -/* 772 */ +/* 764 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(739); -var Snapdragon = __webpack_require__(773); -var compilers = __webpack_require__(745); -var parsers = __webpack_require__(762); -var utils = __webpack_require__(746); +var extend = __webpack_require__(731); +var Snapdragon = __webpack_require__(765); +var compilers = __webpack_require__(737); +var parsers = __webpack_require__(754); +var utils = __webpack_require__(738); /** * Customize Snapdragon parser and renderer @@ -89009,17 +88665,17 @@ module.exports = Braces; /***/ }), -/* 773 */ +/* 765 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(774); -var define = __webpack_require__(800); -var Compiler = __webpack_require__(810); -var Parser = __webpack_require__(839); -var utils = __webpack_require__(819); +var Base = __webpack_require__(766); +var define = __webpack_require__(792); +var Compiler = __webpack_require__(802); +var Parser = __webpack_require__(831); +var utils = __webpack_require__(811); var regexCache = {}; var cache = {}; @@ -89190,20 +88846,20 @@ module.exports.Parser = Parser; /***/ }), -/* 774 */ +/* 766 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var util = __webpack_require__(29); -var define = __webpack_require__(775); -var CacheBase = __webpack_require__(776); -var Emitter = __webpack_require__(777); -var isObject = __webpack_require__(751); -var merge = __webpack_require__(794); -var pascal = __webpack_require__(797); -var cu = __webpack_require__(798); +var util = __webpack_require__(397); +var define = __webpack_require__(767); +var CacheBase = __webpack_require__(768); +var Emitter = __webpack_require__(769); +var isObject = __webpack_require__(743); +var merge = __webpack_require__(786); +var pascal = __webpack_require__(789); +var cu = __webpack_require__(790); /** * Optionally define a custom `cache` namespace to use. @@ -89632,7 +89288,7 @@ module.exports.namespace = namespace; /***/ }), -/* 775 */ +/* 767 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89645,7 +89301,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(765); +var isDescriptor = __webpack_require__(757); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -89670,21 +89326,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 776 */ +/* 768 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(751); -var Emitter = __webpack_require__(777); -var visit = __webpack_require__(778); -var toPath = __webpack_require__(781); -var union = __webpack_require__(782); -var del = __webpack_require__(786); -var get = __webpack_require__(784); -var has = __webpack_require__(791); -var set = __webpack_require__(785); +var isObject = __webpack_require__(743); +var Emitter = __webpack_require__(769); +var visit = __webpack_require__(770); +var toPath = __webpack_require__(773); +var union = __webpack_require__(774); +var del = __webpack_require__(778); +var get = __webpack_require__(776); +var has = __webpack_require__(783); +var set = __webpack_require__(777); /** * Create a `Cache` constructor that when instantiated will @@ -89938,7 +89594,7 @@ module.exports.namespace = namespace; /***/ }), -/* 777 */ +/* 769 */ /***/ (function(module, exports, __webpack_require__) { @@ -90107,7 +89763,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 778 */ +/* 770 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90120,8 +89776,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(779); -var mapVisit = __webpack_require__(780); +var visit = __webpack_require__(771); +var mapVisit = __webpack_require__(772); module.exports = function(collection, method, val) { var result; @@ -90144,7 +89800,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 779 */ +/* 771 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90157,7 +89813,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(751); +var isObject = __webpack_require__(743); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -90184,14 +89840,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 780 */ +/* 772 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var util = __webpack_require__(29); -var visit = __webpack_require__(779); +var util = __webpack_require__(397); +var visit = __webpack_require__(771); /** * Map `visit` over an array of objects. @@ -90228,7 +89884,7 @@ function isObject(val) { /***/ }), -/* 781 */ +/* 773 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90241,7 +89897,7 @@ function isObject(val) { -var typeOf = __webpack_require__(756); +var typeOf = __webpack_require__(748); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -90268,16 +89924,16 @@ function filter(arr) { /***/ }), -/* 782 */ +/* 774 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(743); -var union = __webpack_require__(783); -var get = __webpack_require__(784); -var set = __webpack_require__(785); +var isObject = __webpack_require__(735); +var union = __webpack_require__(775); +var get = __webpack_require__(776); +var set = __webpack_require__(777); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -90305,7 +89961,7 @@ function arrayify(val) { /***/ }), -/* 783 */ +/* 775 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90341,7 +89997,7 @@ module.exports = function union(init) { /***/ }), -/* 784 */ +/* 776 */ /***/ (function(module, exports) { /*! @@ -90397,7 +90053,7 @@ function toString(val) { /***/ }), -/* 785 */ +/* 777 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90410,10 +90066,10 @@ function toString(val) { -var split = __webpack_require__(747); -var extend = __webpack_require__(742); -var isPlainObject = __webpack_require__(750); -var isObject = __webpack_require__(743); +var split = __webpack_require__(739); +var extend = __webpack_require__(734); +var isPlainObject = __webpack_require__(742); +var isObject = __webpack_require__(735); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -90459,7 +90115,7 @@ function isValidKey(key) { /***/ }), -/* 786 */ +/* 778 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90472,8 +90128,8 @@ function isValidKey(key) { -var isObject = __webpack_require__(751); -var has = __webpack_require__(787); +var isObject = __webpack_require__(743); +var has = __webpack_require__(779); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -90498,7 +90154,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 787 */ +/* 779 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90511,9 +90167,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(788); -var hasValues = __webpack_require__(790); -var get = __webpack_require__(784); +var isObject = __webpack_require__(780); +var hasValues = __webpack_require__(782); +var get = __webpack_require__(776); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -90524,7 +90180,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 788 */ +/* 780 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90537,7 +90193,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(789); +var isArray = __webpack_require__(781); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -90545,7 +90201,7 @@ module.exports = function isObject(val) { /***/ }), -/* 789 */ +/* 781 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -90556,7 +90212,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 790 */ +/* 782 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90599,7 +90255,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 791 */ +/* 783 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90612,9 +90268,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(751); -var hasValues = __webpack_require__(792); -var get = __webpack_require__(784); +var isObject = __webpack_require__(743); +var hasValues = __webpack_require__(784); +var get = __webpack_require__(776); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -90622,7 +90278,7 @@ module.exports = function(val, prop) { /***/ }), -/* 792 */ +/* 784 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90635,8 +90291,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(793); -var isNumber = __webpack_require__(755); +var typeOf = __webpack_require__(785); +var isNumber = __webpack_require__(747); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -90689,10 +90345,10 @@ module.exports = function hasValue(val) { /***/ }), -/* 793 */ +/* 785 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -90814,14 +90470,14 @@ module.exports = function kindOf(val) { /***/ }), -/* 794 */ +/* 786 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(795); -var forIn = __webpack_require__(796); +var isExtendable = __webpack_require__(787); +var forIn = __webpack_require__(788); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -90885,7 +90541,7 @@ module.exports = mixinDeep; /***/ }), -/* 795 */ +/* 787 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90898,7 +90554,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -90906,7 +90562,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 796 */ +/* 788 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90929,7 +90585,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 797 */ +/* 789 */ /***/ (function(module, exports) { /*! @@ -90956,14 +90612,14 @@ module.exports = pascalcase; /***/ }), -/* 798 */ +/* 790 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var util = __webpack_require__(29); -var utils = __webpack_require__(799); +var util = __webpack_require__(397); +var utils = __webpack_require__(791); /** * Expose class utils @@ -91328,7 +90984,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 799 */ +/* 791 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91342,10 +90998,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(783); -utils.define = __webpack_require__(800); -utils.isObj = __webpack_require__(751); -utils.staticExtend = __webpack_require__(807); +utils.union = __webpack_require__(775); +utils.define = __webpack_require__(792); +utils.isObj = __webpack_require__(743); +utils.staticExtend = __webpack_require__(799); /** @@ -91356,7 +91012,7 @@ module.exports = utils; /***/ }), -/* 800 */ +/* 792 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91369,7 +91025,7 @@ module.exports = utils; -var isDescriptor = __webpack_require__(801); +var isDescriptor = __webpack_require__(793); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -91394,7 +91050,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 801 */ +/* 793 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91407,9 +91063,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(802); -var isAccessor = __webpack_require__(803); -var isData = __webpack_require__(805); +var typeOf = __webpack_require__(794); +var isAccessor = __webpack_require__(795); +var isData = __webpack_require__(797); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -91423,7 +91079,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 802 */ +/* 794 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -91576,7 +91232,7 @@ function isBuffer(val) { /***/ }), -/* 803 */ +/* 795 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91589,7 +91245,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(804); +var typeOf = __webpack_require__(796); // accessor descriptor properties var accessor = { @@ -91652,10 +91308,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 804 */ +/* 796 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -91774,7 +91430,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 805 */ +/* 797 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91787,7 +91443,7 @@ module.exports = function kindOf(val) { -var typeOf = __webpack_require__(806); +var typeOf = __webpack_require__(798); // data descriptor properties var data = { @@ -91836,10 +91492,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 806 */ +/* 798 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(736); +var isBuffer = __webpack_require__(728); var toString = Object.prototype.toString; /** @@ -91958,7 +91614,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 807 */ +/* 799 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91971,9 +91627,9 @@ module.exports = function kindOf(val) { -var copy = __webpack_require__(808); -var define = __webpack_require__(800); -var util = __webpack_require__(29); +var copy = __webpack_require__(800); +var define = __webpack_require__(792); +var util = __webpack_require__(397); /** * Returns a function for extending the static properties, @@ -92055,15 +91711,15 @@ module.exports = extend; /***/ }), -/* 808 */ +/* 800 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(756); -var copyDescriptor = __webpack_require__(809); -var define = __webpack_require__(800); +var typeOf = __webpack_require__(748); +var copyDescriptor = __webpack_require__(801); +var define = __webpack_require__(792); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -92236,7 +91892,7 @@ module.exports.has = has; /***/ }), -/* 809 */ +/* 801 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92324,16 +91980,16 @@ function isObject(val) { /***/ }), -/* 810 */ +/* 802 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(811); -var define = __webpack_require__(800); -var debug = __webpack_require__(813)('snapdragon:compiler'); -var utils = __webpack_require__(819); +var use = __webpack_require__(803); +var define = __webpack_require__(792); +var debug = __webpack_require__(805)('snapdragon:compiler'); +var utils = __webpack_require__(811); /** * Create a new `Compiler` with the given `options`. @@ -92487,7 +92143,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(838); + var sourcemaps = __webpack_require__(830); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -92508,7 +92164,7 @@ module.exports = Compiler; /***/ }), -/* 811 */ +/* 803 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92521,7 +92177,7 @@ module.exports = Compiler; -var utils = __webpack_require__(812); +var utils = __webpack_require__(804); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -92636,7 +92292,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 812 */ +/* 804 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92650,8 +92306,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(800); -utils.isObject = __webpack_require__(751); +utils.define = __webpack_require__(792); +utils.isObject = __webpack_require__(743); utils.isString = function(val) { @@ -92666,7 +92322,7 @@ module.exports = utils; /***/ }), -/* 813 */ +/* 805 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -92675,14 +92331,14 @@ module.exports = utils; */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(814); + module.exports = __webpack_require__(806); } else { - module.exports = __webpack_require__(817); + module.exports = __webpack_require__(809); } /***/ }), -/* 814 */ +/* 806 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -92691,7 +92347,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(815); +exports = module.exports = __webpack_require__(807); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -92873,7 +92529,7 @@ function localstorage() { /***/ }), -/* 815 */ +/* 807 */ /***/ (function(module, exports, __webpack_require__) { @@ -92889,7 +92545,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(816); +exports.humanize = __webpack_require__(808); /** * The currently active debug mode names, and names to skip. @@ -93081,7 +92737,7 @@ function coerce(val) { /***/ }), -/* 816 */ +/* 808 */ /***/ (function(module, exports) { /** @@ -93239,15 +92895,15 @@ function plural(ms, n, name) { /***/ }), -/* 817 */ +/* 809 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(484); -var util = __webpack_require__(29); +var tty = __webpack_require__(471); +var util = __webpack_require__(397); /** * This is the Node.js implementation of `debug()`. @@ -93255,7 +92911,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(815); +exports = module.exports = __webpack_require__(807); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -93427,14 +93083,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(23); + var fs = __webpack_require__(349); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(818); + var net = __webpack_require__(810); stream = new net.Socket({ fd: fd, readable: false, @@ -93493,13 +93149,13 @@ exports.enable(load()); /***/ }), -/* 818 */ +/* 810 */ /***/ (function(module, exports) { module.exports = require("net"); /***/ }), -/* 819 */ +/* 811 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -93509,9 +93165,9 @@ module.exports = require("net"); * Module dependencies */ -exports.extend = __webpack_require__(742); -exports.SourceMap = __webpack_require__(820); -exports.sourceMapResolve = __webpack_require__(831); +exports.extend = __webpack_require__(734); +exports.SourceMap = __webpack_require__(812); +exports.sourceMapResolve = __webpack_require__(823); /** * Convert backslash in the given string to forward slashes @@ -93554,7 +93210,7 @@ exports.last = function(arr, n) { /***/ }), -/* 820 */ +/* 812 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -93562,13 +93218,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(821).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(827).SourceMapConsumer; -exports.SourceNode = __webpack_require__(830).SourceNode; +exports.SourceMapGenerator = __webpack_require__(813).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(819).SourceMapConsumer; +exports.SourceNode = __webpack_require__(822).SourceNode; /***/ }), -/* 821 */ +/* 813 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93578,10 +93234,10 @@ exports.SourceNode = __webpack_require__(830).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(822); -var util = __webpack_require__(824); -var ArraySet = __webpack_require__(825).ArraySet; -var MappingList = __webpack_require__(826).MappingList; +var base64VLQ = __webpack_require__(814); +var util = __webpack_require__(816); +var ArraySet = __webpack_require__(817).ArraySet; +var MappingList = __webpack_require__(818).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -93990,7 +93646,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 822 */ +/* 814 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94030,7 +93686,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(823); +var base64 = __webpack_require__(815); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -94136,7 +93792,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 823 */ +/* 815 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94209,7 +93865,7 @@ exports.decode = function (charCode) { /***/ }), -/* 824 */ +/* 816 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94632,7 +94288,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 825 */ +/* 817 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94642,7 +94298,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(824); +var util = __webpack_require__(816); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -94759,7 +94415,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 826 */ +/* 818 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94769,7 +94425,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(824); +var util = __webpack_require__(816); /** * Determine whether mappingB is after mappingA with respect to generated @@ -94844,7 +94500,7 @@ exports.MappingList = MappingList; /***/ }), -/* 827 */ +/* 819 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -94854,11 +94510,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(824); -var binarySearch = __webpack_require__(828); -var ArraySet = __webpack_require__(825).ArraySet; -var base64VLQ = __webpack_require__(822); -var quickSort = __webpack_require__(829).quickSort; +var util = __webpack_require__(816); +var binarySearch = __webpack_require__(820); +var ArraySet = __webpack_require__(817).ArraySet; +var base64VLQ = __webpack_require__(814); +var quickSort = __webpack_require__(821).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -95932,7 +95588,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 828 */ +/* 820 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -96049,7 +95705,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 829 */ +/* 821 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -96169,7 +95825,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 830 */ +/* 822 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -96179,8 +95835,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(821).SourceMapGenerator; -var util = __webpack_require__(824); +var SourceMapGenerator = __webpack_require__(813).SourceMapGenerator; +var util = __webpack_require__(816); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -96588,17 +96244,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 831 */ +/* 823 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(832) -var resolveUrl = __webpack_require__(833) -var decodeUriComponent = __webpack_require__(834) -var urix = __webpack_require__(836) -var atob = __webpack_require__(837) +var sourceMappingURL = __webpack_require__(824) +var resolveUrl = __webpack_require__(825) +var decodeUriComponent = __webpack_require__(826) +var urix = __webpack_require__(828) +var atob = __webpack_require__(829) @@ -96896,7 +96552,7 @@ module.exports = { /***/ }), -/* 832 */ +/* 824 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -96959,13 +96615,13 @@ void (function(root, factory) { /***/ }), -/* 833 */ +/* 825 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var url = __webpack_require__(452) +var url = __webpack_require__(439) function resolveUrl(/* ...urls */) { return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { @@ -96977,13 +96633,13 @@ module.exports = resolveUrl /***/ }), -/* 834 */ +/* 826 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(835) +var decodeUriComponent = __webpack_require__(827) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -96994,7 +96650,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 835 */ +/* 827 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97095,13 +96751,13 @@ module.exports = function (encodedURI) { /***/ }), -/* 836 */ +/* 828 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var path = __webpack_require__(16) +var path = __webpack_require__(4) "use strict" @@ -97118,7 +96774,7 @@ module.exports = urix /***/ }), -/* 837 */ +/* 829 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97132,16 +96788,16 @@ module.exports = atob.atob = atob; /***/ }), -/* 838 */ +/* 830 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var fs = __webpack_require__(23); -var path = __webpack_require__(16); -var define = __webpack_require__(800); -var utils = __webpack_require__(819); +var fs = __webpack_require__(349); +var path = __webpack_require__(4); +var define = __webpack_require__(792); +var utils = __webpack_require__(811); /** * Expose `mixin()`. @@ -97284,19 +96940,19 @@ exports.comment = function(node) { /***/ }), -/* 839 */ +/* 831 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(811); -var util = __webpack_require__(29); -var Cache = __webpack_require__(840); -var define = __webpack_require__(800); -var debug = __webpack_require__(813)('snapdragon:parser'); -var Position = __webpack_require__(841); -var utils = __webpack_require__(819); +var use = __webpack_require__(803); +var util = __webpack_require__(397); +var Cache = __webpack_require__(832); +var define = __webpack_require__(792); +var debug = __webpack_require__(805)('snapdragon:parser'); +var Position = __webpack_require__(833); +var utils = __webpack_require__(811); /** * Create a new `Parser` with the given `input` and `options`. @@ -97824,7 +97480,7 @@ module.exports = Parser; /***/ }), -/* 840 */ +/* 832 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97931,13 +97587,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 841 */ +/* 833 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(800); +var define = __webpack_require__(792); /** * Store position for a node @@ -97952,16 +97608,16 @@ module.exports = function Position(start, parser) { /***/ }), -/* 842 */ +/* 834 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(843); -var define = __webpack_require__(849); -var extend = __webpack_require__(850); -var not = __webpack_require__(852); +var safe = __webpack_require__(835); +var define = __webpack_require__(841); +var extend = __webpack_require__(842); +var not = __webpack_require__(844); var MAX_LENGTH = 1024 * 64; /** @@ -98114,10 +97770,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 843 */ +/* 835 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(844); +var parse = __webpack_require__(836); var types = parse.types; module.exports = function (re, opts) { @@ -98163,13 +97819,13 @@ function isRegExp (x) { /***/ }), -/* 844 */ +/* 836 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(845); -var types = __webpack_require__(846); -var sets = __webpack_require__(847); -var positions = __webpack_require__(848); +var util = __webpack_require__(837); +var types = __webpack_require__(838); +var sets = __webpack_require__(839); +var positions = __webpack_require__(840); module.exports = function(regexpStr) { @@ -98451,11 +98107,11 @@ module.exports.types = types; /***/ }), -/* 845 */ +/* 837 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(846); -var sets = __webpack_require__(847); +var types = __webpack_require__(838); +var sets = __webpack_require__(839); // All of these are private and only used by randexp. @@ -98568,7 +98224,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 846 */ +/* 838 */ /***/ (function(module, exports) { module.exports = { @@ -98584,10 +98240,10 @@ module.exports = { /***/ }), -/* 847 */ +/* 839 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(846); +var types = __webpack_require__(838); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -98672,10 +98328,10 @@ exports.anyChar = function() { /***/ }), -/* 848 */ +/* 840 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(846); +var types = __webpack_require__(838); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -98695,7 +98351,7 @@ exports.end = function() { /***/ }), -/* 849 */ +/* 841 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98708,8 +98364,8 @@ exports.end = function() { -var isobject = __webpack_require__(751); -var isDescriptor = __webpack_require__(765); +var isobject = __webpack_require__(743); +var isDescriptor = __webpack_require__(757); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -98740,14 +98396,14 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 850 */ +/* 842 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(851); -var assignSymbols = __webpack_require__(752); +var isExtendable = __webpack_require__(843); +var assignSymbols = __webpack_require__(744); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -98807,7 +98463,7 @@ function isEnum(obj, key) { /***/ }), -/* 851 */ +/* 843 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98820,7 +98476,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -98828,14 +98484,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 852 */ +/* 844 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(850); -var safe = __webpack_require__(843); +var extend = __webpack_require__(842); +var safe = __webpack_require__(835); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -98907,14 +98563,14 @@ module.exports = toRegex; /***/ }), -/* 853 */ +/* 845 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(854); -var extglob = __webpack_require__(870); +var nanomatch = __webpack_require__(846); +var extglob = __webpack_require__(862); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -98991,7 +98647,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 854 */ +/* 846 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99001,18 +98657,18 @@ function escapeExtglobs(compiler) { * Module dependencies */ -var util = __webpack_require__(29); -var toRegex = __webpack_require__(855); -var extend = __webpack_require__(856); +var util = __webpack_require__(397); +var toRegex = __webpack_require__(847); +var extend = __webpack_require__(848); /** * Local dependencies */ -var compilers = __webpack_require__(858); -var parsers = __webpack_require__(859); -var cache = __webpack_require__(862); -var utils = __webpack_require__(864); +var compilers = __webpack_require__(850); +var parsers = __webpack_require__(851); +var cache = __webpack_require__(854); +var utils = __webpack_require__(856); var MAX_LENGTH = 1024 * 64; /** @@ -99836,15 +99492,15 @@ module.exports = nanomatch; /***/ }), -/* 855 */ +/* 847 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(800); -var extend = __webpack_require__(742); -var not = __webpack_require__(741); +var define = __webpack_require__(792); +var extend = __webpack_require__(734); +var not = __webpack_require__(733); var MAX_LENGTH = 1024 * 64; /** @@ -99991,14 +99647,14 @@ module.exports.makeRe = makeRe; /***/ }), -/* 856 */ +/* 848 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(857); -var assignSymbols = __webpack_require__(752); +var isExtendable = __webpack_require__(849); +var assignSymbols = __webpack_require__(744); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -100058,7 +99714,7 @@ function isEnum(obj, key) { /***/ }), -/* 857 */ +/* 849 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100071,7 +99727,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(750); +var isPlainObject = __webpack_require__(742); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -100079,7 +99735,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 858 */ +/* 850 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100425,15 +100081,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 859 */ +/* 851 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regexNot = __webpack_require__(741); -var toRegex = __webpack_require__(855); -var isOdd = __webpack_require__(860); +var regexNot = __webpack_require__(733); +var toRegex = __webpack_require__(847); +var isOdd = __webpack_require__(852); /** * Characters to use in negation regex (we want to "not" match @@ -100819,7 +100475,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 860 */ +/* 852 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100832,7 +100488,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(861); +var isNumber = __webpack_require__(853); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -100846,7 +100502,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 861 */ +/* 853 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100874,14 +100530,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 862 */ +/* 854 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(863))(); +module.exports = new (__webpack_require__(855))(); /***/ }), -/* 863 */ +/* 855 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100894,7 +100550,7 @@ module.exports = new (__webpack_require__(863))(); -var MapCache = __webpack_require__(840); +var MapCache = __webpack_require__(832); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -101016,27 +100672,27 @@ exports = module.exports = FragmentCache; /***/ }), -/* 864 */ +/* 856 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = module.exports; -var path = __webpack_require__(16); +var path = __webpack_require__(4); /** * Module dependencies */ -var isWindows = __webpack_require__(865)(); -var Snapdragon = __webpack_require__(773); -utils.define = __webpack_require__(866); -utils.diff = __webpack_require__(867); -utils.extend = __webpack_require__(856); -utils.pick = __webpack_require__(868); -utils.typeOf = __webpack_require__(869); -utils.unique = __webpack_require__(744); +var isWindows = __webpack_require__(857)(); +var Snapdragon = __webpack_require__(765); +utils.define = __webpack_require__(858); +utils.diff = __webpack_require__(859); +utils.extend = __webpack_require__(848); +utils.pick = __webpack_require__(860); +utils.typeOf = __webpack_require__(861); +utils.unique = __webpack_require__(736); /** * Returns true if the given value is effectively an empty string @@ -101402,7 +101058,7 @@ utils.unixify = function(options) { /***/ }), -/* 865 */ +/* 857 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -101430,7 +101086,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 866 */ +/* 858 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101443,8 +101099,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(751); -var isDescriptor = __webpack_require__(765); +var isobject = __webpack_require__(743); +var isDescriptor = __webpack_require__(757); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -101475,7 +101131,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 867 */ +/* 859 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101529,7 +101185,7 @@ function diffArray(one, two) { /***/ }), -/* 868 */ +/* 860 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101542,7 +101198,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(751); +var isObject = __webpack_require__(743); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -101571,7 +101227,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 869 */ +/* 861 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -101706,7 +101362,7 @@ function isBuffer(val) { /***/ }), -/* 870 */ +/* 862 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101716,18 +101372,18 @@ function isBuffer(val) { * Module dependencies */ -var extend = __webpack_require__(742); -var unique = __webpack_require__(744); -var toRegex = __webpack_require__(855); +var extend = __webpack_require__(734); +var unique = __webpack_require__(736); +var toRegex = __webpack_require__(847); /** * Local dependencies */ -var compilers = __webpack_require__(871); -var parsers = __webpack_require__(882); -var Extglob = __webpack_require__(885); -var utils = __webpack_require__(884); +var compilers = __webpack_require__(863); +var parsers = __webpack_require__(874); +var Extglob = __webpack_require__(877); +var utils = __webpack_require__(876); var MAX_LENGTH = 1024 * 64; /** @@ -102044,13 +101700,13 @@ module.exports = extglob; /***/ }), -/* 871 */ +/* 863 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(872); +var brackets = __webpack_require__(864); /** * Extglob compilers @@ -102220,7 +101876,7 @@ module.exports = function(extglob) { /***/ }), -/* 872 */ +/* 864 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102230,17 +101886,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(873); -var parsers = __webpack_require__(875); +var compilers = __webpack_require__(865); +var parsers = __webpack_require__(867); /** * Module dependencies */ -var debug = __webpack_require__(877)('expand-brackets'); -var extend = __webpack_require__(742); -var Snapdragon = __webpack_require__(773); -var toRegex = __webpack_require__(855); +var debug = __webpack_require__(869)('expand-brackets'); +var extend = __webpack_require__(734); +var Snapdragon = __webpack_require__(765); +var toRegex = __webpack_require__(847); /** * Parses the given POSIX character class `pattern` and returns a @@ -102438,13 +102094,13 @@ module.exports = brackets; /***/ }), -/* 873 */ +/* 865 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(874); +var posix = __webpack_require__(866); module.exports = function(brackets) { brackets.compiler @@ -102532,7 +102188,7 @@ module.exports = function(brackets) { /***/ }), -/* 874 */ +/* 866 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102561,14 +102217,14 @@ module.exports = { /***/ }), -/* 875 */ +/* 867 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(876); -var define = __webpack_require__(800); +var utils = __webpack_require__(868); +var define = __webpack_require__(792); /** * Text regex @@ -102787,14 +102443,14 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 876 */ +/* 868 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(855); -var regexNot = __webpack_require__(741); +var toRegex = __webpack_require__(847); +var regexNot = __webpack_require__(733); var cached; /** @@ -102828,7 +102484,7 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 877 */ +/* 869 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -102837,14 +102493,14 @@ exports.createRegex = function(pattern, include) { */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(878); + module.exports = __webpack_require__(870); } else { - module.exports = __webpack_require__(881); + module.exports = __webpack_require__(873); } /***/ }), -/* 878 */ +/* 870 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -102853,7 +102509,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(879); +exports = module.exports = __webpack_require__(871); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -103035,7 +102691,7 @@ function localstorage() { /***/ }), -/* 879 */ +/* 871 */ /***/ (function(module, exports, __webpack_require__) { @@ -103051,7 +102707,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(880); +exports.humanize = __webpack_require__(872); /** * The currently active debug mode names, and names to skip. @@ -103243,7 +102899,7 @@ function coerce(val) { /***/ }), -/* 880 */ +/* 872 */ /***/ (function(module, exports) { /** @@ -103401,15 +103057,15 @@ function plural(ms, n, name) { /***/ }), -/* 881 */ +/* 873 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(484); -var util = __webpack_require__(29); +var tty = __webpack_require__(471); +var util = __webpack_require__(397); /** * This is the Node.js implementation of `debug()`. @@ -103417,7 +103073,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(879); +exports = module.exports = __webpack_require__(871); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -103589,14 +103245,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(23); + var fs = __webpack_require__(349); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(818); + var net = __webpack_require__(810); stream = new net.Socket({ fd: fd, readable: false, @@ -103655,15 +103311,15 @@ exports.enable(load()); /***/ }), -/* 882 */ +/* 874 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(872); -var define = __webpack_require__(883); -var utils = __webpack_require__(884); +var brackets = __webpack_require__(864); +var define = __webpack_require__(875); +var utils = __webpack_require__(876); /** * Characters to use in text regex (we want to "not" match @@ -103818,7 +103474,7 @@ module.exports = parsers; /***/ }), -/* 883 */ +/* 875 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103831,7 +103487,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(765); +var isDescriptor = __webpack_require__(757); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -103856,14 +103512,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 884 */ +/* 876 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regex = __webpack_require__(741); -var Cache = __webpack_require__(863); +var regex = __webpack_require__(733); +var Cache = __webpack_require__(855); /** * Utils @@ -103932,7 +103588,7 @@ utils.createRegex = function(str) { /***/ }), -/* 885 */ +/* 877 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103942,16 +103598,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(773); -var define = __webpack_require__(883); -var extend = __webpack_require__(742); +var Snapdragon = __webpack_require__(765); +var define = __webpack_require__(875); +var extend = __webpack_require__(734); /** * Local dependencies */ -var compilers = __webpack_require__(871); -var parsers = __webpack_require__(882); +var compilers = __webpack_require__(863); +var parsers = __webpack_require__(874); /** * Customize Snapdragon parser and renderer @@ -104017,16 +103673,16 @@ module.exports = Extglob; /***/ }), -/* 886 */ +/* 878 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(870); -var nanomatch = __webpack_require__(854); -var regexNot = __webpack_require__(741); -var toRegex = __webpack_require__(842); +var extglob = __webpack_require__(862); +var nanomatch = __webpack_require__(846); +var regexNot = __webpack_require__(733); +var toRegex = __webpack_require__(834); var not; /** @@ -104107,33 +103763,33 @@ function textRegex(pattern) { /***/ }), -/* 887 */ +/* 879 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(863))(); +module.exports = new (__webpack_require__(855))(); /***/ }), -/* 888 */ +/* 880 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var utils = module.exports; -var path = __webpack_require__(16); +var path = __webpack_require__(4); /** * Module dependencies */ -var Snapdragon = __webpack_require__(773); -utils.define = __webpack_require__(849); -utils.diff = __webpack_require__(867); -utils.extend = __webpack_require__(850); -utils.pick = __webpack_require__(868); -utils.typeOf = __webpack_require__(889); -utils.unique = __webpack_require__(744); +var Snapdragon = __webpack_require__(765); +utils.define = __webpack_require__(841); +utils.diff = __webpack_require__(859); +utils.extend = __webpack_require__(842); +utils.pick = __webpack_require__(860); +utils.typeOf = __webpack_require__(881); +utils.unique = __webpack_require__(736); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -104430,7 +104086,7 @@ utils.unixify = function(options) { /***/ }), -/* 889 */ +/* 881 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -104565,7 +104221,7 @@ function isBuffer(val) { /***/ }), -/* 890 */ +/* 882 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104584,9 +104240,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(891); -var reader_1 = __webpack_require__(904); -var fs_stream_1 = __webpack_require__(908); +var readdir = __webpack_require__(883); +var reader_1 = __webpack_require__(896); +var fs_stream_1 = __webpack_require__(900); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -104647,15 +104303,15 @@ exports.default = ReaderAsync; /***/ }), -/* 891 */ +/* 883 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(892); -const readdirAsync = __webpack_require__(900); -const readdirStream = __webpack_require__(903); +const readdirSync = __webpack_require__(884); +const readdirAsync = __webpack_require__(892); +const readdirStream = __webpack_require__(895); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -104739,7 +104395,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 892 */ +/* 884 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104747,11 +104403,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(893); +const DirectoryReader = __webpack_require__(885); let syncFacade = { - fs: __webpack_require__(898), - forEach: __webpack_require__(899), + fs: __webpack_require__(890), + forEach: __webpack_require__(891), sync: true }; @@ -104780,18 +104436,18 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 893 */ +/* 885 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const Readable = __webpack_require__(27).Readable; -const EventEmitter = __webpack_require__(399).EventEmitter; -const path = __webpack_require__(16); -const normalizeOptions = __webpack_require__(894); -const stat = __webpack_require__(896); -const call = __webpack_require__(897); +const Readable = __webpack_require__(382).Readable; +const EventEmitter = __webpack_require__(373).EventEmitter; +const path = __webpack_require__(4); +const normalizeOptions = __webpack_require__(886); +const stat = __webpack_require__(888); +const call = __webpack_require__(889); /** * Asynchronously reads the contents of a directory and streams the results @@ -105167,14 +104823,14 @@ module.exports = DirectoryReader; /***/ }), -/* 894 */ +/* 886 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const globToRegExp = __webpack_require__(895); +const path = __webpack_require__(4); +const globToRegExp = __webpack_require__(887); module.exports = normalizeOptions; @@ -105351,7 +105007,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 895 */ +/* 887 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -105488,13 +105144,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 896 */ +/* 888 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(897); +const call = __webpack_require__(889); module.exports = stat; @@ -105569,7 +105225,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 897 */ +/* 889 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105630,14 +105286,14 @@ function callOnce (fn) { /***/ }), -/* 898 */ +/* 890 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const call = __webpack_require__(897); +const fs = __webpack_require__(349); +const call = __webpack_require__(889); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -105701,7 +105357,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 899 */ +/* 891 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105730,7 +105386,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 900 */ +/* 892 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105738,12 +105394,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(901); -const DirectoryReader = __webpack_require__(893); +const maybe = __webpack_require__(893); +const DirectoryReader = __webpack_require__(885); let asyncFacade = { - fs: __webpack_require__(23), - forEach: __webpack_require__(902), + fs: __webpack_require__(349), + forEach: __webpack_require__(894), async: true }; @@ -105785,7 +105441,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 901 */ +/* 893 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105812,7 +105468,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 902 */ +/* 894 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105848,7 +105504,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 903 */ +/* 895 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105856,11 +105512,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(893); +const DirectoryReader = __webpack_require__(885); let streamFacade = { - fs: __webpack_require__(23), - forEach: __webpack_require__(902), + fs: __webpack_require__(349), + forEach: __webpack_require__(894), async: true }; @@ -105880,16 +105536,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 904 */ +/* 896 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); -var deep_1 = __webpack_require__(905); -var entry_1 = __webpack_require__(907); -var pathUtil = __webpack_require__(906); +var path = __webpack_require__(4); +var deep_1 = __webpack_require__(897); +var entry_1 = __webpack_require__(899); +var pathUtil = __webpack_require__(898); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -105955,14 +105611,14 @@ exports.default = Reader; /***/ }), -/* 905 */ +/* 897 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(906); -var patternUtils = __webpack_require__(723); +var pathUtils = __webpack_require__(898); +var patternUtils = __webpack_require__(715); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { this.options = options; @@ -106045,13 +105701,13 @@ exports.default = DeepFilter; /***/ }), -/* 906 */ +/* 898 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); +var path = __webpack_require__(4); /** * Returns «true» if the last partial of the path starting with a period. */ @@ -106076,14 +105732,14 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 907 */ +/* 899 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(906); -var patternUtils = __webpack_require__(723); +var pathUtils = __webpack_require__(898); +var patternUtils = __webpack_require__(715); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { this.options = options; @@ -106168,7 +105824,7 @@ exports.default = EntryFilter; /***/ }), -/* 908 */ +/* 900 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106187,9 +105843,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(27); -var fsStat = __webpack_require__(909); -var fs_1 = __webpack_require__(913); +var stream = __webpack_require__(382); +var fsStat = __webpack_require__(901); +var fs_1 = __webpack_require__(905); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -106239,14 +105895,14 @@ exports.default = FileSystemStream; /***/ }), -/* 909 */ +/* 901 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(910); -const statProvider = __webpack_require__(912); +const optionsManager = __webpack_require__(902); +const statProvider = __webpack_require__(904); /** * Asynchronous API. */ @@ -106277,13 +105933,13 @@ exports.statSync = statSync; /***/ }), -/* 910 */ +/* 902 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(911); +const fsAdapter = __webpack_require__(903); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -106296,13 +105952,13 @@ exports.prepare = prepare; /***/ }), -/* 911 */ +/* 903 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(23); +const fs = __webpack_require__(349); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -106319,7 +105975,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 912 */ +/* 904 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106371,13 +106027,13 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 913 */ +/* 905 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(16); +var path = __webpack_require__(4); var FileSystem = /** @class */ (function () { function FileSystem(options) { this.options = options; @@ -106402,7 +106058,7 @@ exports.default = FileSystem; /***/ }), -/* 914 */ +/* 906 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106421,10 +106077,10 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(27); -var readdir = __webpack_require__(891); -var reader_1 = __webpack_require__(904); -var fs_stream_1 = __webpack_require__(908); +var stream = __webpack_require__(382); +var readdir = __webpack_require__(883); +var reader_1 = __webpack_require__(896); +var fs_stream_1 = __webpack_require__(900); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -106492,7 +106148,7 @@ exports.default = ReaderStream; /***/ }), -/* 915 */ +/* 907 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106511,9 +106167,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(891); -var reader_1 = __webpack_require__(904); -var fs_sync_1 = __webpack_require__(916); +var readdir = __webpack_require__(883); +var reader_1 = __webpack_require__(896); +var fs_sync_1 = __webpack_require__(908); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -106573,7 +106229,7 @@ exports.default = ReaderSync; /***/ }), -/* 916 */ +/* 908 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106592,8 +106248,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(909); -var fs_1 = __webpack_require__(913); +var fsStat = __webpack_require__(901); +var fs_1 = __webpack_require__(905); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -106639,7 +106295,7 @@ exports.default = FileSystemSync; /***/ }), -/* 917 */ +/* 909 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106655,13 +106311,13 @@ exports.flatten = flatten; /***/ }), -/* 918 */ +/* 910 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var merge2 = __webpack_require__(590); +var merge2 = __webpack_require__(585); /** * Merge multiple streams and propagate their errors into one stream in parallel. */ @@ -106676,13 +106332,13 @@ exports.merge = merge; /***/ }), -/* 919 */ +/* 911 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const pathType = __webpack_require__(920); +const path = __webpack_require__(4); +const pathType = __webpack_require__(912); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -106748,13 +106404,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 920 */ +/* 912 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const pify = __webpack_require__(921); +const fs = __webpack_require__(349); +const pify = __webpack_require__(913); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -106797,7 +106453,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 921 */ +/* 913 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106888,17 +106544,17 @@ module.exports = (obj, opts) => { /***/ }), -/* 922 */ +/* 914 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const fastGlob = __webpack_require__(719); -const gitIgnore = __webpack_require__(923); -const pify = __webpack_require__(924); -const slash = __webpack_require__(925); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const fastGlob = __webpack_require__(711); +const gitIgnore = __webpack_require__(915); +const pify = __webpack_require__(916); +const slash = __webpack_require__(917); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -106996,7 +106652,7 @@ module.exports.sync = options => { /***/ }), -/* 923 */ +/* 915 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -107465,7 +107121,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 924 */ +/* 916 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107540,7 +107196,7 @@ module.exports = (input, options) => { /***/ }), -/* 925 */ +/* 917 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107558,17 +107214,17 @@ module.exports = input => { /***/ }), -/* 926 */ +/* 918 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(16); -const {constants: fsConstants} = __webpack_require__(23); -const pEvent = __webpack_require__(927); -const CpFileError = __webpack_require__(930); -const fs = __webpack_require__(934); -const ProgressEmitter = __webpack_require__(937); +const path = __webpack_require__(4); +const {constants: fsConstants} = __webpack_require__(349); +const pEvent = __webpack_require__(919); +const CpFileError = __webpack_require__(922); +const fs = __webpack_require__(926); +const ProgressEmitter = __webpack_require__(929); const cpFileAsync = async (source, destination, options, progressEmitter) => { let readError; @@ -107682,12 +107338,12 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 927 */ +/* 919 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pTimeout = __webpack_require__(928); +const pTimeout = __webpack_require__(920); const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator'; @@ -107978,12 +107634,12 @@ module.exports.iterator = (emitter, event, options) => { /***/ }), -/* 928 */ +/* 920 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pFinally = __webpack_require__(929); +const pFinally = __webpack_require__(921); class TimeoutError extends Error { constructor(message) { @@ -108029,7 +107685,7 @@ module.exports.TimeoutError = TimeoutError; /***/ }), -/* 929 */ +/* 921 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -108051,12 +107707,12 @@ module.exports = (promise, onFinally) => { /***/ }), -/* 930 */ +/* 922 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(931); +const NestedError = __webpack_require__(923); class CpFileError extends NestedError { constructor(message, nested) { @@ -108070,10 +107726,10 @@ module.exports = CpFileError; /***/ }), -/* 931 */ +/* 923 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(932); +var inherits = __webpack_require__(924); var NestedError = function (message, nested) { this.nested = nested; @@ -108124,20 +107780,20 @@ module.exports = NestedError; /***/ }), -/* 932 */ +/* 924 */ /***/ (function(module, exports, __webpack_require__) { try { - var util = __webpack_require__(29); + var util = __webpack_require__(397); if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { - module.exports = __webpack_require__(933); + module.exports = __webpack_require__(925); } /***/ }), -/* 933 */ +/* 925 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -108166,16 +107822,16 @@ if (typeof Object.create === 'function') { /***/ }), -/* 934 */ +/* 926 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {promisify} = __webpack_require__(29); -const fs = __webpack_require__(22); -const makeDir = __webpack_require__(935); -const pEvent = __webpack_require__(927); -const CpFileError = __webpack_require__(930); +const {promisify} = __webpack_require__(397); +const fs = __webpack_require__(493); +const makeDir = __webpack_require__(927); +const pEvent = __webpack_require__(919); +const CpFileError = __webpack_require__(922); const stat = promisify(fs.stat); const lstat = promisify(fs.lstat); @@ -108272,15 +107928,15 @@ exports.copyFileSync = (source, destination, flags) => { /***/ }), -/* 935 */ +/* 927 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(23); -const path = __webpack_require__(16); -const {promisify} = __webpack_require__(29); -const semver = __webpack_require__(936); +const fs = __webpack_require__(349); +const path = __webpack_require__(4); +const {promisify} = __webpack_require__(397); +const semver = __webpack_require__(928); const defaults = { mode: 0o777 & (~process.umask()), @@ -108429,7 +108085,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 936 */ +/* 928 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -110031,12 +109687,12 @@ function coerce (version, options) { /***/ }), -/* 937 */ +/* 929 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(399); +const EventEmitter = __webpack_require__(373); const written = new WeakMap(); @@ -110072,7 +109728,7 @@ module.exports = ProgressEmitter; /***/ }), -/* 938 */ +/* 930 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -110118,12 +109774,12 @@ exports.default = module.exports; /***/ }), -/* 939 */ +/* 931 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(940); +const NestedError = __webpack_require__(932); class CpyError extends NestedError { constructor(message, nested) { @@ -110137,10 +109793,10 @@ module.exports = CpyError; /***/ }), -/* 940 */ +/* 932 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(29).inherits; +var inherits = __webpack_require__(397).inherits; var NestedError = function (message, nested) { this.nested = nested; @@ -110193,7 +109849,7 @@ module.exports = NestedError; /***/ }), -/* 941 */ +/* 933 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; diff --git a/packages/kbn-pm/package.json b/packages/kbn-pm/package.json index 5938d15573d63..301d9653cda2b 100644 --- a/packages/kbn-pm/package.json +++ b/packages/kbn-pm/package.json @@ -22,7 +22,6 @@ "@types/glob": "^5.0.35", "@types/globby": "^6.1.0", "@types/has-ansi": "^3.0.0", - "@types/indent-string": "^3.0.0", "@types/lodash.clonedeepwith": "^4.5.3", "@types/log-symbols": "^2.0.0", "@types/ncp": "^2.0.1", @@ -32,7 +31,6 @@ "@types/strip-ansi": "^3.0.0", "@types/strong-log-transformer": "^1.0.0", "@types/tempy": "^0.2.0", - "@types/wrap-ansi": "^2.0.15", "@types/write-pkg": "^3.1.0", "@kbn/dev-utils": "1.0.0", "@yarnpkg/lockfile": "^1.1.0", @@ -47,7 +45,6 @@ "glob": "^7.1.2", "globby": "^8.0.1", "has-ansi": "^3.0.0", - "indent-string": "^3.2.0", "is-path-inside": "^3.0.2", "lodash.clonedeepwith": "^4.5.0", "log-symbols": "^2.2.0", @@ -66,7 +63,6 @@ "unlazy-loader": "^0.1.3", "webpack": "^4.41.5", "webpack-cli": "^3.3.10", - "wrap-ansi": "^3.0.1", "write-pkg": "^4.0.0" }, "dependencies": { diff --git a/packages/kbn-pm/src/cli.ts b/packages/kbn-pm/src/cli.ts index 94f348e1835ed..b72e9ae8690aa 100644 --- a/packages/kbn-pm/src/cli.ts +++ b/packages/kbn-pm/src/cli.ts @@ -17,46 +17,58 @@ * under the License. */ -import chalk from 'chalk'; import dedent from 'dedent'; import getopts from 'getopts'; import { resolve } from 'path'; +import { pickLevelFromFlags } from '@kbn/dev-utils'; import { commands } from './commands'; import { runCommand } from './run'; import { log } from './utils/log'; function help() { - const availableCommands = Object.keys(commands) - .map((commandName) => commands[commandName]) - .map((command) => `${command.name} - ${command.description}`); - - log.write(dedent` - usage: kbn [] - - By default commands are run for Kibana itself, all packages in the 'packages/' - folder and for all plugins in './plugins' and '../kibana-extra'. - - Available commands: - - ${availableCommands.join('\n ')} - - Global options: - - -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. - -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. - --oss Do not include the x-pack when running command. - --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. - --no-cache Disable the bootstrap cache - `); + log.info( + dedent` + usage: kbn [] + + By default commands are run for Kibana itself, all packages in the 'packages/' + folder and for all plugins in './plugins' and '../kibana-extra'. + + Available commands: + + ${Object.values(commands) + .map((command) => `${command.name} - ${command.description}`) + .join('\n ')} + + Global options: + + -e, --exclude Exclude specified project. Can be specified multiple times to exclude multiple projects, e.g. '-e kibana -e @kbn/pm'. + -i, --include Include only specified projects. If left unspecified, it defaults to including all projects. + --oss Do not include the x-pack when running command. + --skip-kibana-plugins Filter all plugins in ./plugins and ../kibana-extra when running command. + --no-cache Disable the bootstrap cache + --verbose Set log level to verbose + --debug Set log level to debug + --quiet Set log level to error + --silent Disable log output + ` + '\n' + ); } export async function run(argv: string[]) { + log.setLogLevel( + pickLevelFromFlags( + getopts(argv, { + boolean: ['verbose', 'debug', 'quiet', 'silent'], + }) + ) + ); + // We can simplify this setup (and remove this extra handling) once Yarn // starts forwarding the `--` directly to this script, see // https://github.com/yarnpkg/yarn/blob/b2d3e1a8fe45ef376b716d597cc79b38702a9320/src/cli/index.js#L174-L182 if (argv.includes('--')) { - log.write(chalk.red(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`)); + log.error(`Using "--" is not allowed, as it doesn't work with 'yarn kbn'.`); process.exit(1); } @@ -90,7 +102,7 @@ export async function run(argv: string[]) { const command = commands[commandName]; if (command === undefined) { - log.write(chalk.red(`[${commandName}] is not a valid command, see 'kbn --help'`)); + log.error(`[${commandName}] is not a valid command, see 'kbn --help'`); process.exit(1); } diff --git a/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap b/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap index c0505710f5670..be146d710c87a 100644 --- a/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap +++ b/packages/kbn-pm/src/commands/__snapshots__/bootstrap.test.ts.snap @@ -90,29 +90,32 @@ Array [ exports[`calls "kbn:bootstrap" scripts and links executables after installing deps: script 1`] = ` Array [ Array [ - "kbn:bootstrap", - Array [], - Project { - "allDependencies": Object {}, - "devDependencies": Object {}, - "isWorkspaceProject": false, - "isWorkspaceRoot": false, - "json": Object { - "name": "bar", + Object { + "args": Array [], + "debug": undefined, + "pkg": Project { + "allDependencies": Object {}, + "devDependencies": Object {}, + "isWorkspaceProject": false, + "isWorkspaceRoot": false, + "json": Object { + "name": "bar", + "scripts": Object { + "kbn:bootstrap": "node ./bar.js", + }, + "version": "1.0.0", + }, + "nodeModulesLocation": "/packages/kbn-pm/src/commands/packages/bar/node_modules", + "packageJsonLocation": "/packages/kbn-pm/src/commands/packages/bar/package.json", + "path": "/packages/kbn-pm/src/commands/packages/bar", + "productionDependencies": Object {}, "scripts": Object { "kbn:bootstrap": "node ./bar.js", }, + "targetLocation": "/packages/kbn-pm/src/commands/packages/bar/target", "version": "1.0.0", }, - "nodeModulesLocation": "/packages/kbn-pm/src/commands/packages/bar/node_modules", - "packageJsonLocation": "/packages/kbn-pm/src/commands/packages/bar/package.json", - "path": "/packages/kbn-pm/src/commands/packages/bar", - "productionDependencies": Object {}, - "scripts": Object { - "kbn:bootstrap": "node ./bar.js", - }, - "targetLocation": "/packages/kbn-pm/src/commands/packages/bar/target", - "version": "1.0.0", + "script": "kbn:bootstrap", }, ], ] @@ -127,36 +130,6 @@ Array [ ] `; -exports[`does not run installer if no deps in package: logs 1`] = ` -Array [ - Array [ - " -Running installs in topological order:", - ], - Array [ - " - -Installing dependencies in [kibana]: -", - ], - Array [ - " -Installs completed, linking package executables: -", - ], - Array [ - " -Linking executables completed, running \`kbn:bootstrap\` scripts -", - ], - Array [ - " -Bootstrapping completed! -", - ], -] -`; - exports[`handles "frozen-lockfile": install in dir 1`] = ` Array [ Array [ @@ -184,45 +157,3 @@ Array [ ], ] `; - -exports[`handles dependencies of dependencies: logs 1`] = ` -Array [ - Array [ - " -Running installs in topological order:", - ], - Array [ - " - -Installing dependencies in [kibana]: -", - ], - Array [ - " - -Installing dependencies in [bar]: -", - ], - Array [ - " - -Installing dependencies in [foo]: -", - ], - Array [ - " -Installs completed, linking package executables: -", - ], - Array [ - " -Linking executables completed, running \`kbn:bootstrap\` scripts -", - ], - Array [ - " -Bootstrapping completed! -", - ], -] -`; diff --git a/packages/kbn-pm/src/commands/bootstrap.test.ts b/packages/kbn-pm/src/commands/bootstrap.test.ts index 072f34611f8fc..d6a30f0ef33d6 100644 --- a/packages/kbn-pm/src/commands/bootstrap.test.ts +++ b/packages/kbn-pm/src/commands/bootstrap.test.ts @@ -22,6 +22,8 @@ jest.mock('../utils/link_project_executables'); import { resolve } from 'path'; +import { ToolingLogCollectingWriter } from '@kbn/dev-utils'; + import { absolutePathSnapshotSerializer, stripAnsiSnapshotSerializer } from '../test_helpers'; import { linkProjectExecutables } from '../utils/link_project_executables'; import { IPackageJson } from '../utils/package_json'; @@ -30,12 +32,20 @@ import { buildProjectGraph } from '../utils/projects'; import { installInDir, runScriptInPackageStreaming, yarnWorkspacesInfo } from '../utils/scripts'; import { BootstrapCommand } from './bootstrap'; import { Kibana } from '../utils/kibana'; +import { log } from '../utils/log'; const mockInstallInDir = installInDir as jest.Mock; const mockRunScriptInPackageStreaming = runScriptInPackageStreaming as jest.Mock; const mockLinkProjectExecutables = linkProjectExecutables as jest.Mock; const mockYarnWorkspacesInfo = yarnWorkspacesInfo as jest.Mock; +const logWriter = new ToolingLogCollectingWriter('debug'); +log.setLogLevel('silent'); +log.setWriters([logWriter]); +beforeEach(() => { + logWriter.messages.length = 0; +}); + const createProject = (packageJson: IPackageJson, path = '.') => { const project = new Project( { @@ -55,10 +65,6 @@ const createProject = (packageJson: IPackageJson, path = '.') => { expect.addSnapshotSerializer(absolutePathSnapshotSerializer); expect.addSnapshotSerializer(stripAnsiSnapshotSerializer); -const noop = () => { - // noop -}; - beforeEach(() => { mockYarnWorkspacesInfo.mockResolvedValue({}); }); @@ -111,8 +117,6 @@ test('handles dependencies of dependencies', async () => { const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - const logMock = jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: {}, @@ -121,7 +125,19 @@ test('handles dependencies of dependencies', async () => { }); expect(mockInstallInDir.mock.calls).toMatchSnapshot('install in dir'); - expect(logMock.mock.calls).toMatchSnapshot('logs'); + expect(logWriter.messages).toMatchInlineSnapshot(` + Array [ + " info [kibana] running yarn", + "", + "", + " info [bar] running yarn", + "", + "", + " info [foo] running yarn", + "", + "", + ] + `); }); test('does not run installer if no deps in package', async () => { @@ -148,8 +164,6 @@ test('does not run installer if no deps in package', async () => { const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - const logMock = jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: {}, @@ -158,7 +172,13 @@ test('does not run installer if no deps in package', async () => { }); expect(mockInstallInDir.mock.calls).toMatchSnapshot('install in dir'); - expect(logMock.mock.calls).toMatchSnapshot('logs'); + expect(logWriter.messages).toMatchInlineSnapshot(` + Array [ + " info [kibana] running yarn", + "", + "", + ] + `); }); test('handles "frozen-lockfile"', async () => { @@ -175,8 +195,6 @@ test('handles "frozen-lockfile"', async () => { const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: { @@ -215,8 +233,6 @@ test('calls "kbn:bootstrap" scripts and links executables after installing deps' const kbn = new Kibana(projects); const projectGraph = buildProjectGraph(projects); - jest.spyOn(console, 'log').mockImplementation(noop); - await BootstrapCommand.run(projects, projectGraph, { extraArgs: [], options: {}, diff --git a/packages/kbn-pm/src/commands/bootstrap.ts b/packages/kbn-pm/src/commands/bootstrap.ts index 6146aeab21db4..80ccc5daecc56 100644 --- a/packages/kbn-pm/src/commands/bootstrap.ts +++ b/packages/kbn-pm/src/commands/bootstrap.ts @@ -17,12 +17,11 @@ * under the License. */ -import chalk from 'chalk'; - import { linkProjectExecutables } from '../utils/link_project_executables'; import { log } from '../utils/log'; import { parallelizeBatches } from '../utils/parallelize'; import { topologicallyBatchProjects } from '../utils/projects'; +import { Project } from '../utils/project'; import { ICommand } from './'; import { getAllChecksums } from '../utils/project_checksums'; import { BootstrapCacheFile } from '../utils/bootstrap_cache_file'; @@ -42,12 +41,10 @@ export const BootstrapCommand: ICommand = { ...(options['prefer-offline'] === true ? ['--prefer-offline'] : []), ]; - log.write(chalk.bold('\nRunning installs in topological order:')); - for (const batch of batchedProjectsByWorkspace) { for (const project of batch) { if (project.isWorkspaceProject) { - log.write(`Skipping workspace project: ${project.name}`); + log.verbose(`Skipping workspace project: ${project.name}`); continue; } @@ -57,7 +54,6 @@ export const BootstrapCommand: ICommand = { } } - log.write(chalk.bold('\nInstalls completed, linking package executables:\n')); await linkProjectExecutables(projects, projectGraph); /** @@ -66,22 +62,38 @@ export const BootstrapCommand: ICommand = { * transpiled before they can be used. Ideally we shouldn't do this unless we * have to, as it will slow down the bootstrapping process. */ - log.write(chalk.bold('\nLinking executables completed, running `kbn:bootstrap` scripts\n')); - const checksums = options.cache ? await getAllChecksums(kbn, log) : false; - await parallelizeBatches(batchedProjects, async (project) => { + const checksums = await getAllChecksums(kbn, log); + const caches = new Map(); + let cachedProjectCount = 0; + + for (const project of projects.values()) { if (project.hasScript('kbn:bootstrap')) { - const cacheFile = new BootstrapCacheFile(kbn, project, checksums); - if (cacheFile.isValid()) { - log.success(`[${project.name}] cache up to date`); - } else { - cacheFile.delete(); - await project.runScriptStreaming('kbn:bootstrap'); - cacheFile.write(); + const file = new BootstrapCacheFile(kbn, project, checksums); + const valid = options.cache && file.isValid(); + + if (valid) { + log.debug(`[${project.name}] cache up to date`); } + + caches.set(project, { file, valid }); + cachedProjectCount += 1; } - }); + } + + if (cachedProjectCount > 0) { + log.success(`${cachedProjectCount} bootsrap builds are cached`); + } - log.write(chalk.green.bold('\nBootstrapping completed!\n')); + await parallelizeBatches(batchedProjects, async (project) => { + const cache = caches.get(project); + if (cache && !cache.valid) { + log.info(`[${project.name}] running [kbn:bootstrap] script`); + cache.file.delete(); + await project.runScriptStreaming('kbn:bootstrap'); + cache.file.write(); + log.success(`[${project.name}] bootstrap complete`); + } + }); }, }; diff --git a/packages/kbn-pm/src/commands/clean.ts b/packages/kbn-pm/src/commands/clean.ts index b3d433e22bd79..26d6897992501 100644 --- a/packages/kbn-pm/src/commands/clean.ts +++ b/packages/kbn-pm/src/commands/clean.ts @@ -17,7 +17,6 @@ * under the License. */ -import chalk from 'chalk'; import del from 'del'; import ora from 'ora'; import { join, relative } from 'path'; @@ -57,10 +56,8 @@ export const CleanCommand: ICommand = { } if (toDelete.length === 0) { - log.write(chalk.bold.green('\n\nNothing to delete')); + log.success('Nothing to delete'); } else { - log.write(chalk.bold.red('\n\nDeleting:\n')); - /** * In order to avoid patterns like `/build` in packages from accidentally * impacting files outside the package we use `process.chdir()` to change @@ -75,7 +72,11 @@ export const CleanCommand: ICommand = { for (const { pattern, cwd } of toDelete) { process.chdir(cwd); const promise = del(pattern); - ora.promise(promise, relative(originalCwd, join(cwd, String(pattern)))); + + if (log.wouldLogLevel('info')) { + ora.promise(promise, relative(originalCwd, join(cwd, String(pattern)))); + } + await promise; } } finally { diff --git a/packages/kbn-pm/src/commands/run.ts b/packages/kbn-pm/src/commands/run.ts index 989bfef19c380..1c6760ed6f3ee 100644 --- a/packages/kbn-pm/src/commands/run.ts +++ b/packages/kbn-pm/src/commands/run.ts @@ -17,8 +17,7 @@ * under the License. */ -import chalk from 'chalk'; - +import { CliError } from '../utils/errors'; import { log } from '../utils/log'; import { parallelizeBatches } from '../utils/parallelize'; import { topologicallyBatchProjects } from '../utils/projects'; @@ -32,20 +31,19 @@ export const RunCommand: ICommand = { const batchedProjects = topologicallyBatchProjects(projects, projectGraph); if (extraArgs.length === 0) { - log.write(chalk.red.bold('\nNo script specified')); - process.exit(1); + throw new CliError('No script specified'); } const scriptName = extraArgs[0]; const scriptArgs = extraArgs.slice(1); - log.write( - chalk.bold(`\nRunning script [${chalk.green(scriptName)}] in batched topological order\n`) - ); - - await parallelizeBatches(batchedProjects, async (pkg) => { - if (pkg.hasScript(scriptName)) { - await pkg.runScriptStreaming(scriptName, scriptArgs); + await parallelizeBatches(batchedProjects, async (project) => { + if (project.hasScript(scriptName)) { + log.info(`[${project.name}] running "${scriptName}" script`); + await project.runScriptStreaming(scriptName, { + args: scriptArgs, + }); + log.success(`[${project.name}] complete`); } }); }, diff --git a/packages/kbn-pm/src/commands/watch.ts b/packages/kbn-pm/src/commands/watch.ts index 2e18b02a1c860..6775f728c1494 100644 --- a/packages/kbn-pm/src/commands/watch.ts +++ b/packages/kbn-pm/src/commands/watch.ts @@ -17,7 +17,7 @@ * under the License. */ -import chalk from 'chalk'; +import { CliError } from '../utils/errors'; import { log } from '../utils/log'; import { parallelizeBatches } from '../utils/parallelize'; import { ProjectMap, topologicallyBatchProjects } from '../utils/projects'; @@ -58,20 +58,13 @@ export const WatchCommand: ICommand = { } if (projectsToWatch.size === 0) { - log.write( - chalk.red( - `\nThere are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.\n` - ) + throw new CliError( + `There are no projects to watch found. Make sure that projects define 'kbn:watch' script in 'package.json'.` ); - return; } const projectNames = Array.from(projectsToWatch.keys()); - log.write( - chalk.bold( - chalk.green(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`) - ) - ); + log.info(`Running ${watchScriptName} scripts for [${projectNames.join(', ')}].`); // Kibana should always be run the last, so we don't rely on automatic // topological batching and push it to the last one-entry batch manually. @@ -85,12 +78,12 @@ export const WatchCommand: ICommand = { await parallelizeBatches(batchedProjects, async (pkg) => { const completionHint = await waitUntilWatchIsReady( - pkg.runScriptStreaming(watchScriptName).stdout + pkg.runScriptStreaming(watchScriptName, { + debug: false, + }).stdout ); - log.write( - chalk.bold(`[${chalk.green(pkg.name)}] Initial build completed (${completionHint}).`) - ); + log.success(`[${pkg.name}] Initial build completed (${completionHint}).`); }); }, }; diff --git a/packages/kbn-pm/src/production/build_production_projects.ts b/packages/kbn-pm/src/production/build_production_projects.ts index 689bf51cd7bdf..f5c59fd582c59 100644 --- a/packages/kbn-pm/src/production/build_production_projects.ts +++ b/packages/kbn-pm/src/production/build_production_projects.ts @@ -47,7 +47,7 @@ export async function buildProductionProjects({ const batchedProjects = topologicallyBatchProjects(projects, projectGraph); const projectNames = [...projects.values()].map((project) => project.name); - log.write(`Preparing production build for [${projectNames.join(', ')}]`); + log.info(`Preparing production build for [${projectNames.join(', ')}]`); for (const batch of batchedProjects) { for (const project of batch) { diff --git a/packages/kbn-pm/src/run.test.ts b/packages/kbn-pm/src/run.test.ts index ff0dc2666afea..b2479af3809c4 100644 --- a/packages/kbn-pm/src/run.test.ts +++ b/packages/kbn-pm/src/run.test.ts @@ -18,9 +18,13 @@ */ import { resolve } from 'path'; + import { ICommand, ICommandConfig } from './commands'; import { runCommand } from './run'; import { Project } from './utils/project'; +import { log } from './utils/log'; + +log.setLogLevel('silent'); const rootPath = resolve(`${__dirname}/utils/__fixtures__/kibana`); @@ -51,11 +55,6 @@ beforeEach(() => { options: {}, rootPath, }; - - // Reduce the noise that comes from the run command. - jest.spyOn(console, 'log').mockImplementation(() => { - // noop - }); }); test('passes all found projects to the command if no filter is specified', async () => { diff --git a/packages/kbn-pm/src/run.ts b/packages/kbn-pm/src/run.ts index c3879c701d785..04286590bd821 100644 --- a/packages/kbn-pm/src/run.ts +++ b/packages/kbn-pm/src/run.ts @@ -17,10 +17,6 @@ * under the License. */ -import chalk from 'chalk'; -import indentString from 'indent-string'; -import wrapAnsi from 'wrap-ansi'; - import { ICommand, ICommandConfig } from './commands'; import { CliError } from './utils/errors'; import { log } from './utils/log'; @@ -30,11 +26,7 @@ import { Kibana } from './utils/kibana'; export async function runCommand(command: ICommand, config: Omit) { try { - log.write( - chalk.bold( - `Running [${chalk.green(command.name)}] command from [${chalk.yellow(config.rootPath)}]:\n` - ) - ); + log.debug(`Running [${command.name}] command from [${config.rootPath}]`); const kbn = await Kibana.loadFrom(config.rootPath); const projects = kbn.getFilteredProjects({ @@ -45,42 +37,39 @@ export async function runCommand(command: ICommand, config: Omit 0) { - const metaOutput = keys.map((key) => { - const value = e.meta[key]; - return `${key}: ${value}`; - }); + const metaOutput = Object.entries(error.meta) + .map(([key, value]) => `${key}: ${value}`) + .join('\n'); - log.write('Additional debugging info:\n'); - log.write(indentString(metaOutput.join('\n'), 3)); + if (metaOutput) { + log.info('Additional debugging info:\n'); + log.indent(2); + log.info(metaOutput); + log.indent(-2); } } else { - log.write(e.stack); + log.error(error); } process.exit(1); diff --git a/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap b/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap index 62091205b01a4..5bda7b544e201 100644 --- a/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap +++ b/packages/kbn-pm/src/utils/__snapshots__/link_project_executables.test.ts.snap @@ -68,14 +68,3 @@ Object { "unlink": Array [], } `; - -exports[`bin script points to a file creates a symlink in the project node_modules/.bin directory: logs 1`] = ` -Array [ - Array [ - "[foo] bar -> ../bar/bin/bar.js", - ], - Array [ - "[baz] bar -> ../bar/bin/bar.js", - ], -] -`; diff --git a/packages/kbn-pm/src/utils/child_process.ts b/packages/kbn-pm/src/utils/child_process.ts index 784446924a8dc..bafe2bf57adc2 100644 --- a/packages/kbn-pm/src/utils/child_process.ts +++ b/packages/kbn-pm/src/utils/child_process.ts @@ -17,19 +17,20 @@ * under the License. */ +import { Writable } from 'stream'; + import chalk from 'chalk'; import execa from 'execa'; -import logSymbols from 'log-symbols'; import logTransformer from 'strong-log-transformer'; -function generateColors() { - const colorWheel = [chalk.cyan, chalk.magenta, chalk.blue, chalk.yellow, chalk.green]; - - const count = colorWheel.length; - let children = 0; +import { log } from './log'; - return () => colorWheel[children++ % count]; -} +const colorWheel = [chalk.cyan, chalk.magenta, chalk.blue, chalk.yellow, chalk.green]; +const getColor = () => { + const color = colorWheel.shift()!; + colorWheel.push(color); + return color; +}; export function spawn(command: string, args: string[], opts: execa.Options) { return execa(command, args, { @@ -39,13 +40,26 @@ export function spawn(command: string, args: string[], opts: execa.Options) { }); } -const nextColor = generateColors(); +function streamToLog(debug: boolean = true) { + return new Writable({ + objectMode: true, + write(line, _, cb) { + if (line.endsWith('\n')) { + log[debug ? 'debug' : 'write'](line.slice(0, -1)); + } else { + log[debug ? 'debug' : 'write'](line); + } + + cb(); + }, + }); +} export function spawnStreaming( command: string, args: string[], opts: execa.Options, - { prefix }: { prefix: string } + { prefix, debug }: { prefix: string; debug?: boolean } ) { const spawned = execa(command, args, { stdio: ['ignore', 'pipe', 'pipe'], @@ -53,15 +67,12 @@ export function spawnStreaming( ...opts, }); - const color = nextColor(); - const prefixedStdout = logTransformer({ tag: `${color.bold(prefix)}:` }); - const prefixedStderr = logTransformer({ - mergeMultiline: true, - tag: `${logSymbols.error} ${color.bold(prefix)}:`, - }); + const color = getColor(); + const prefixedStdout = logTransformer({ tag: color.bold(prefix) }); + const prefixedStderr = logTransformer({ mergeMultiline: true, tag: color.bold(prefix) }); - spawned.stdout.pipe(prefixedStdout).pipe(process.stdout); - spawned.stderr.pipe(prefixedStderr).pipe(process.stderr); + spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); + spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); return spawned; } diff --git a/packages/kbn-pm/src/utils/link_project_executables.test.ts b/packages/kbn-pm/src/utils/link_project_executables.test.ts index a19e1fd66f334..887c474a12eca 100644 --- a/packages/kbn-pm/src/utils/link_project_executables.test.ts +++ b/packages/kbn-pm/src/utils/link_project_executables.test.ts @@ -23,10 +23,19 @@ jest.mock('./fs'); import { resolve } from 'path'; +import { ToolingLogCollectingWriter } from '@kbn/dev-utils'; + import { absolutePathSnapshotSerializer, stripAnsiSnapshotSerializer } from '../test_helpers'; import { linkProjectExecutables } from './link_project_executables'; import { Project } from './project'; import { buildProjectGraph } from './projects'; +import { log } from './log'; + +const logWriter = new ToolingLogCollectingWriter(); +log.setWriters([logWriter]); +beforeEach(() => { + logWriter.messages.length = 0; +}); const projectsByName = new Map([ [ @@ -101,12 +110,15 @@ describe('bin script points to a file', () => { const fs = require('./fs'); fs.isFile.mockReturnValue(true); - const logMock = jest.spyOn(console, 'log').mockImplementation(() => { - // noop - }); await linkProjectExecutables(projectsByName, projectGraph); expect(getFsMockCalls()).toMatchSnapshot('fs module calls'); - expect(logMock.mock.calls).toMatchSnapshot('logs'); + expect(logWriter.messages).toMatchInlineSnapshot(` + Array [ + " debg Linking package executables", + " debg [foo] bar -> ../bar/bin/bar.js", + " debg [baz] bar -> ../bar/bin/bar.js", + ] + `); }); }); diff --git a/packages/kbn-pm/src/utils/link_project_executables.ts b/packages/kbn-pm/src/utils/link_project_executables.ts index b403dfb2ecf2e..f7362788b417d 100644 --- a/packages/kbn-pm/src/utils/link_project_executables.ts +++ b/packages/kbn-pm/src/utils/link_project_executables.ts @@ -19,8 +19,6 @@ import { dirname, relative, resolve, sep } from 'path'; -import chalk from 'chalk'; - import { chmod, createSymlink, isFile, mkdirp } from './fs'; import { log } from './log'; import { ProjectGraph, ProjectMap } from './projects'; @@ -37,6 +35,7 @@ export async function linkProjectExecutables( projectsByName: ProjectMap, projectGraph: ProjectGraph ) { + log.debug(`Linking package executables`); for (const [projectName, projectDeps] of projectGraph) { const project = projectsByName.get(projectName)!; const binsDir = resolve(project.nodeModulesLocation, '.bin'); @@ -57,7 +56,7 @@ export async function linkProjectExecutables( // Get relative project path with normalized path separators. const projectRelativePath = relative(project.path, srcPath).split(sep).join('/'); - log.write(chalk`{dim [${project.name}]} ${name} -> {dim ${projectRelativePath}}`); + log.debug(`[${project.name}] ${name} -> ${projectRelativePath}`); await mkdirp(dirname(dest)); await createSymlink(srcPath, dest, 'exec'); diff --git a/packages/kbn-pm/src/utils/log.ts b/packages/kbn-pm/src/utils/log.ts index 9e5630be5bd19..786ff8b19ef4e 100644 --- a/packages/kbn-pm/src/utils/log.ts +++ b/packages/kbn-pm/src/utils/log.ts @@ -17,27 +17,36 @@ * under the License. */ -import { ToolingLog, ToolingLogCollectingWriter } from '@kbn/dev-utils'; +import { + ToolingLog, + ToolingLogTextWriter, + LogLevel, + parseLogLevel, + ParsedLogLevel, +} from '@kbn/dev-utils'; class Log extends ToolingLog { - testWriter?: ToolingLogCollectingWriter; + private logLevel!: ParsedLogLevel; constructor() { - super({ - level: 'info', - writeTo: process.stdout, - }); + super(); + this.setLogLevel('info'); } - /** - * Log something to the console. Ideally we would use a real logger in - * kbn-pm, but that's a pretty big change for now. - * @param ...args - */ - write(...args: any[]) { - // eslint-disable-next-line no-console - console.log(...args); + setLogLevel(level: LogLevel) { + this.logLevel = parseLogLevel(level); + this.setWriters([ + new ToolingLogTextWriter({ + level: this.logLevel.name, + writeTo: process.stdout, + }), + ]); + } + + wouldLogLevel(level: LogLevel) { + return this.logLevel.flags[level]; } } export const log = new Log(); +export { LogLevel, Log }; diff --git a/packages/kbn-pm/src/utils/project.ts b/packages/kbn-pm/src/utils/project.ts index 91a3a5365b60e..8f45df52c7a2f 100644 --- a/packages/kbn-pm/src/utils/project.ts +++ b/packages/kbn-pm/src/utils/project.ts @@ -17,7 +17,6 @@ * under the License. */ -import chalk from 'chalk'; import fs from 'fs'; import Path from 'path'; import { inspect } from 'util'; @@ -190,16 +189,20 @@ export class Project { } public async runScript(scriptName: string, args: string[] = []) { - log.write( - chalk.bold( - `\n\nRunning script [${chalk.green(scriptName)}] in [${chalk.green(this.name)}]:\n` - ) - ); + log.info(`Running script [${scriptName}] in [${this.name}]:`); return runScriptInPackage(scriptName, args, this); } - public runScriptStreaming(scriptName: string, args: string[] = []) { - return runScriptInPackageStreaming(scriptName, args, this); + public runScriptStreaming( + scriptName: string, + options: { args?: string[]; debug?: boolean } = {} + ) { + return runScriptInPackageStreaming({ + script: scriptName, + args: options.args || [], + pkg: this, + debug: options.debug, + }); } public hasDependencies() { @@ -207,8 +210,12 @@ export class Project { } public async installDependencies({ extraArgs }: { extraArgs: string[] }) { - log.write(chalk.bold(`\n\nInstalling dependencies in [${chalk.green(this.name)}]:\n`)); + log.info(`[${this.name}] running yarn`); + + log.write(''); await installInDir(this.path, extraArgs); + log.write(''); + await this.removeExtraneousNodeModules(); } @@ -239,7 +246,7 @@ export class Project { const isDevDependency = devDependencies && devDependencies.hasOwnProperty(name); if (!isDependency && !isDevDependency && fs.existsSync(nodeModulesPath)) { - log.write(`No dependency on ${name}, removing link in node_modules`); + log.debug(`No dependency on ${name}, removing link in node_modules`); fs.unlinkSync(nodeModulesPath); } }); diff --git a/packages/kbn-pm/src/utils/project_checksums.ts b/packages/kbn-pm/src/utils/project_checksums.ts index 46dde1b32c158..839c44f4f18c4 100644 --- a/packages/kbn-pm/src/utils/project_checksums.ts +++ b/packages/kbn-pm/src/utils/project_checksums.ts @@ -23,12 +23,12 @@ import Crypto from 'crypto'; import { promisify } from 'util'; import execa from 'execa'; -import { ToolingLog } from '@kbn/dev-utils'; import { readYarnLock, YarnLock } from './yarn_lock'; import { ProjectMap } from '../utils/projects'; import { Project } from '../utils/project'; import { Kibana } from '../utils/kibana'; +import { Log } from '../utils/log'; export type ChecksumMap = Map; /** map of [repo relative path to changed file, type of change] */ @@ -38,7 +38,7 @@ const statAsync = promisify(Fs.stat); const projectBySpecificitySorter = (a: Project, b: Project) => b.path.length - a.path.length; /** Get the changed files for a set of projects */ -async function getChangesForProjects(projects: ProjectMap, kbn: Kibana, log: ToolingLog) { +async function getChangesForProjects(projects: ProjectMap, kbn: Kibana, log: Log) { log.verbose('getting changed files'); const { stdout } = await execa( @@ -150,7 +150,7 @@ async function getLatestSha(project: Project, kbn: Kibana) { * in the yarn.lock file, does not include other projects in the workspace * or their dependencies */ -function resolveDepsForProject(project: Project, yarnLock: YarnLock, kbn: Kibana, log: ToolingLog) { +function resolveDepsForProject(project: Project, yarnLock: YarnLock, kbn: Kibana, log: Log) { /** map of [name@range, name@resolved] */ const resolved = new Map(); @@ -198,7 +198,7 @@ async function getChecksum( changes: Changes | undefined, yarnLock: YarnLock, kbn: Kibana, - log: ToolingLog + log: Log ) { const sha = await getLatestSha(project, kbn); if (sha) { @@ -256,7 +256,7 @@ async function getChecksum( * - un-committed changes * - resolved dependencies from yarn.lock referenced by project package.json */ -export async function getAllChecksums(kbn: Kibana, log: ToolingLog) { +export async function getAllChecksums(kbn: Kibana, log: Log) { const projects = kbn.getAllProjects(); const changesByProject = await getChangesForProjects(projects, kbn, log); const yarnLock = await readYarnLock(kbn); diff --git a/packages/kbn-pm/src/utils/scripts.ts b/packages/kbn-pm/src/utils/scripts.ts index 009efa1285c0c..728ac4287b1ce 100644 --- a/packages/kbn-pm/src/utils/scripts.ts +++ b/packages/kbn-pm/src/utils/scripts.ts @@ -56,13 +56,24 @@ export async function runScriptInPackage(script: string, args: string[], pkg: Pr /** * Run script in the given directory */ -export function runScriptInPackageStreaming(script: string, args: string[], pkg: Project) { +export function runScriptInPackageStreaming({ + script, + args, + pkg, + debug, +}: { + script: string; + args: string[]; + pkg: Project; + debug?: boolean; +}) { const execOpts = { cwd: pkg.path, }; return spawnStreaming('yarn', ['run', script, ...args], execOpts, { prefix: pkg.name, + debug, }); } diff --git a/renovate.json5 b/renovate.json5 index 674c4e0df7904..b4f1441a50d60 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -418,14 +418,6 @@ '@types/history', ], }, - { - groupSlug: 'indent-string', - groupName: 'indent-string related packages', - packageNames: [ - 'indent-string', - '@types/indent-string', - ], - }, { groupSlug: 'inquirer', groupName: 'inquirer related packages', @@ -1067,14 +1059,6 @@ '@types/chokidar', ], }, - { - groupSlug: 'wrap-ansi', - groupName: 'wrap-ansi related packages', - packageNames: [ - 'wrap-ansi', - '@types/wrap-ansi', - ], - }, { groupSlug: 'write-pkg', groupName: 'write-pkg related packages', diff --git a/yarn.lock b/yarn.lock index df478e79d2bf6..9f0d4c297fd25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4186,11 +4186,6 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== -"@types/indent-string@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/indent-string/-/indent-string-3.0.0.tgz#9ebb391ceda548926f5819ad16405349641b999f" - integrity sha1-nrs5HO2lSJJvWBmtFkBTSWQbmZ8= - "@types/inert@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/inert/-/inert-5.1.2.tgz#2bb8bef3b2462f904c960654c9edfa39285a85c6" @@ -5177,11 +5172,6 @@ "@types/webpack-sources" "*" source-map "^0.6.0" -"@types/wrap-ansi@^2.0.15": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-2.0.15.tgz#87affc11a46864cb6853b642e89363633d544aa7" - integrity sha512-kPagHsyqrq5Qg4dSbxFmcX8ea0JYs43PfBcuKK53LT4XTZxbvGnmnY6U6a5QgySb5lEGYiqpg0/HESvTYrlzyQ== - "@types/write-pkg@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/write-pkg/-/write-pkg-3.1.0.tgz#f58767f4fb9a6a3ad8e95d3e9cd1f2d026ceab26" From d1ed2079453d267b2fc5c3c3f2c5fa36811fb222 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 8 Jun 2020 17:56:06 -0500 Subject: [PATCH 29/65] APM TypeScript improvements (#68572) * Add `compilerOptions.noErrorTrunctation` to the tsconfig template * Remove unused parameters Not adding `noUnusedParamaters` to the tsconfig since we get too many hits from dependencies when running `tsc`. These do show up in the editor as warnings, though. --- .../app/ErrorGroupOverview/List/index.tsx | 2 +- .../SettingsPage/SettingsPage.tsx | 2 +- .../ErrorRateAlertTrigger/index.stories.tsx | 2 +- .../shared/StickyProperties/index.tsx | 1 - .../index.stories.tsx | 57 +++++++++---------- .../TransactionCharts/ChoroplethMap/index.tsx | 2 +- .../context/LoadingIndicatorContext.tsx | 2 +- .../public/context/UrlParamsContext/index.tsx | 2 +- x-pack/plugins/apm/public/services/rest/ml.ts | 4 +- .../scripts/optimize-tsconfig/tsconfig.json | 8 +-- .../generate-sample-documents.ts | 2 +- .../apm/server/lib/apm_telemetry/index.ts | 2 +- .../get_service_map_from_trace_ids.ts | 2 +- .../server/lib/services/annotations/index.ts | 2 +- .../settings/apm_indices/save_apm_indices.ts | 2 +- x-pack/plugins/apm/server/routes/errors.ts | 2 +- .../apm/server/routes/service_nodes.ts | 2 +- x-pack/plugins/apm/server/routes/services.ts | 2 +- .../routes/settings/agent_configuration.ts | 4 +- .../apm/server/routes/settings/apm_indices.ts | 4 +- .../apm/server/routes/settings/custom_link.ts | 4 +- 21 files changed, 53 insertions(+), 57 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx index ed683b8ecd11d..1096c0c77db30 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx @@ -103,7 +103,7 @@ const ErrorGroupList: React.FC = (props) => { }), field: 'type', sortable: false, - render: (type: string, item: ErrorGroupListAPIResponse[0]) => { + render: (type: string) => { return ( (obj: T): T { return Object.fromEntries( - Object.entries(obj).filter(([k, v]) => v != null && v !== '') + Object.entries(obj).filter(([_, v]) => v != null && v !== '') ); } diff --git a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx index ddfca94e567d9..8f7ed54f91bd0 100644 --- a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx @@ -8,7 +8,7 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { ErrorRateAlertTrigger } from '.'; -storiesOf('app/ErrorRateAlertTrigger', module).add('example', (props) => { +storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { const params = { threshold: 2, window: '5m', diff --git a/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx b/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx index 74c75e4585c3e..8bfea721c854d 100644 --- a/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx @@ -69,7 +69,6 @@ function getPropertyLabel({ fieldName, label }: Partial) { function getPropertyValue({ val, - fieldName, truncated = false, }: Partial) { if (truncated) { diff --git a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx index 7b22218bf23df..e2429d1225442 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx @@ -14,37 +14,34 @@ import { import { MockUrlParamsContextProvider } from '../../../context/UrlParamsContext/MockUrlParamsContextProvider'; import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; -storiesOf('app/TransactionDurationAlertTrigger', module).add( - 'example', - (context) => { - const params = { - threshold: 1500, - aggregationType: 'avg' as const, - window: '5m', - }; +storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => { + const params = { + threshold: 1500, + aggregationType: 'avg' as const, + window: '5m', + }; - const contextMock = (merge(cloneDeep(mockApmPluginContextValue), { - core: { - http: { - get: () => { - return Promise.resolve({ transactionTypes: ['request'] }); - }, + const contextMock = (merge(cloneDeep(mockApmPluginContextValue), { + core: { + http: { + get: () => { + return Promise.resolve({ transactionTypes: ['request'] }); }, }, - }) as unknown) as ApmPluginContextValue; + }, + }) as unknown) as ApmPluginContextValue; - return ( -
- - - undefined} - setAlertProperty={() => undefined} - /> - - -
- ); - } -); + return ( +
+ + + undefined} + setAlertProperty={() => undefined} + /> + + +
+ ); +}); diff --git a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx index 937c18807f80f..ebd6061831f4e 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx @@ -137,7 +137,7 @@ export const ChoroplethMap: React.FC = (props) => { }, [map, items, tooltipState]); const updateTooltipStateOnMousemoveRef = useRef( - (event: mapboxgl.MapMouseEvent & mapboxgl.EventData) => {} + (_event: mapboxgl.MapMouseEvent & mapboxgl.EventData) => {} ); // initialization side effect, only runs once diff --git a/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx b/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx index 32e52f8e396b5..a26653d3d5294 100644 --- a/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx +++ b/x-pack/plugins/apm/public/context/LoadingIndicatorContext.tsx @@ -10,7 +10,7 @@ import { useDelayedVisibility } from '../components/shared/useDelayedVisibility' export const LoadingIndicatorContext = React.createContext({ statuses: {}, - dispatchStatus: (action: Action) => {}, + dispatchStatus: (_action: Action) => {}, }); interface State { diff --git a/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx b/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx index bc8cabb6f6641..6083a216bbf95 100644 --- a/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx +++ b/x-pack/plugins/apm/public/context/UrlParamsContext/index.tsx @@ -40,7 +40,7 @@ function useUiFilters(params: IUrlParams): UIFilters { return useDeepObjectIdentity({ kuery, environment, ...localUiFilters }); } -const defaultRefresh = (time: TimeRange) => {}; +const defaultRefresh = (_time: TimeRange) => {}; const UrlParamsContext = createContext({ urlParams: {} as IUrlParams, diff --git a/x-pack/plugins/apm/public/services/rest/ml.ts b/x-pack/plugins/apm/public/services/rest/ml.ts index 7d1f386fa896c..99c162bde02da 100644 --- a/x-pack/plugins/apm/public/services/rest/ml.ts +++ b/x-pack/plugins/apm/public/services/rest/ml.ts @@ -36,7 +36,7 @@ interface StartedMLJobApiResponse { jobs: MlResponseItem[]; } -async function getTransactionIndices(http: HttpSetup) { +async function getTransactionIndices() { const indices = await callApmApi({ method: 'GET', pathname: `/api/apm/settings/apm-indices`, @@ -53,7 +53,7 @@ export async function startMLJob({ transactionType: string; http: HttpSetup; }) { - const transactionIndices = await getTransactionIndices(http); + const transactionIndices = await getTransactionIndices(); const groups = [ 'apm', encodeForMlApi(serviceName), diff --git a/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json b/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json index 34b67c834554d..5a810fa90259a 100644 --- a/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json +++ b/x-pack/plugins/apm/scripts/optimize-tsconfig/tsconfig.json @@ -4,8 +4,8 @@ "./plugins/observability/**/*", "./typings/**/*" ], - "exclude": [ - "**/__fixtures__/**/*", - "./plugins/apm/e2e/cypress/**/*" - ] + "exclude": ["**/__fixtures__/**/*", "./plugins/apm/e2e/cypress/**/*"], + "compilerOptions": { + "noErrorTruncation": true + } } diff --git a/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts b/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts index e9f1e99f1fc39..50de0d5b234d4 100644 --- a/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts +++ b/x-pack/plugins/apm/scripts/upload-telemetry-data/generate-sample-documents.ts @@ -78,7 +78,7 @@ export async function generateSampleDocuments( const dateOfScriptExecution = new Date(); return flatten( - range(0, opts.instances).map((instanceNo) => { + range(0, opts.instances).map(() => { const instanceId = uuid.v4(); const defaults = { cluster_uuid: instanceId, diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts index df82d44fb5041..632e653a2f6e9 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/index.ts @@ -120,7 +120,7 @@ export async function createApmTelemetry({ usageCollector.registerCollector(collector); - core.getStartServices().then(([coreStart, pluginsStart]) => { + core.getStartServices().then(([_coreStart, pluginsStart]) => { const { taskManager: taskManagerStart } = pluginsStart as { taskManager: TaskManagerStartContract; }; diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts index e34479e92a06c..01cbc1aa9b989 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts @@ -270,7 +270,7 @@ export async function getServiceMapFromTraceIds({ return conns; }, [] as Connection[]); }, [] as Connection[]), - (value, index, array) => { + (value, _index, array) => { return find(array, value); } ); diff --git a/x-pack/plugins/apm/server/lib/services/annotations/index.ts b/x-pack/plugins/apm/server/lib/services/annotations/index.ts index 4d3efc478a4fd..9365213a87f6e 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/index.ts +++ b/x-pack/plugins/apm/server/lib/services/annotations/index.ts @@ -41,7 +41,7 @@ export async function getServiceAnnotations({ : []; if (storedAnnotations.length) { - derivedAnnotationsPromise.catch((error) => { + derivedAnnotationsPromise.catch(() => { // handle error silently to prevent Kibana from crashing }); return { annotations: storedAnnotations }; diff --git a/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts b/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts index 9601bdd51824d..d4ef6e2f91051 100644 --- a/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts +++ b/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.ts @@ -28,6 +28,6 @@ export async function saveApmIndices( function removeEmpty(apmIndices: Partial) { return Object.entries(apmIndices) .map(([key, value]) => [key, value?.trim()]) - .filter(([key, value]) => !!value) + .filter(([_, value]) => !!value) .reduce((obj, [key, value]) => ({ ...obj, [key as string]: value }), {}); } diff --git a/x-pack/plugins/apm/server/routes/errors.ts b/x-pack/plugins/apm/server/routes/errors.ts index 7e45f412d4bdb..1615550027d3c 100644 --- a/x-pack/plugins/apm/server/routes/errors.ts +++ b/x-pack/plugins/apm/server/routes/errors.ts @@ -12,7 +12,7 @@ import { getErrorGroups } from '../lib/errors/get_error_groups'; import { setupRequest } from '../lib/helpers/setup_request'; import { uiFiltersRt, rangeRt } from './default_api_types'; -export const errorsRoute = createRoute((core) => ({ +export const errorsRoute = createRoute(() => ({ path: '/api/apm/services/{serviceName}/errors', params: { path: t.type({ diff --git a/x-pack/plugins/apm/server/routes/service_nodes.ts b/x-pack/plugins/apm/server/routes/service_nodes.ts index a6e9175fcb651..8721407671825 100644 --- a/x-pack/plugins/apm/server/routes/service_nodes.ts +++ b/x-pack/plugins/apm/server/routes/service_nodes.ts @@ -9,7 +9,7 @@ import { setupRequest } from '../lib/helpers/setup_request'; import { getServiceNodes } from '../lib/service_nodes'; import { rangeRt, uiFiltersRt } from './default_api_types'; -export const serviceNodesRoute = createRoute((core) => ({ +export const serviceNodesRoute = createRoute(() => ({ path: '/api/apm/services/{serviceName}/serviceNodes', params: { path: t.type({ diff --git a/x-pack/plugins/apm/server/routes/services.ts b/x-pack/plugins/apm/server/routes/services.ts index 996bfbd9184d1..8672c6c108c4c 100644 --- a/x-pack/plugins/apm/server/routes/services.ts +++ b/x-pack/plugins/apm/server/routes/services.ts @@ -17,7 +17,7 @@ import { uiFiltersRt, rangeRt } from './default_api_types'; import { getServiceAnnotations } from '../lib/services/annotations'; import { dateAsStringRt } from '../../common/runtime_types/date_as_string_rt'; -export const servicesRoute = createRoute((core) => ({ +export const servicesRoute = createRoute(() => ({ path: '/api/apm/services', params: { query: t.intersection([uiFiltersRt, rangeRt]), diff --git a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts index 6fd864a337165..f5c9cc2adf238 100644 --- a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts +++ b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts @@ -24,7 +24,7 @@ import { import { jsonRt } from '../../../common/runtime_types/json_rt'; // get list of configurations -export const agentConfigurationRoute = createRoute((core) => ({ +export const agentConfigurationRoute = createRoute(() => ({ path: '/api/apm/settings/agent-configuration', handler: async ({ context, request }) => { const setup = await setupRequest(context, request); @@ -137,7 +137,7 @@ export const createOrUpdateAgentConfigurationRoute = createRoute(() => ({ })); // Lookup single configuration (used by APM Server) -export const agentConfigurationSearchRoute = createRoute((core) => ({ +export const agentConfigurationSearchRoute = createRoute(() => ({ method: 'POST', path: '/api/apm/settings/agent-configuration/search', params: { diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices.ts index 2d5722744f93e..e52ce760e026a 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices.ts @@ -34,7 +34,7 @@ export const apmIndicesRoute = createRoute(() => ({ })); // save ui indices -export const saveApmIndicesRoute = createRoute((core) => ({ +export const saveApmIndicesRoute = createRoute(() => ({ method: 'POST', path: '/api/apm/settings/apm-indices/save', options: { @@ -50,7 +50,7 @@ export const saveApmIndicesRoute = createRoute((core) => ({ 'apm_oss.metricsIndices': t.string, }), }, - handler: async ({ context, request }) => { + handler: async ({ context }) => { const { body } = context.params; const savedObjectsClient = context.core.savedObjects.client; return await saveApmIndices(savedObjectsClient, body); diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link.ts b/x-pack/plugins/apm/server/routes/settings/custom_link.ts index f32840fe08b9c..83c23a75e999d 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link.ts +++ b/x-pack/plugins/apm/server/routes/settings/custom_link.ts @@ -17,7 +17,7 @@ import { getTransaction } from '../../lib/settings/custom_link/get_transaction'; import { listCustomLinks } from '../../lib/settings/custom_link/list_custom_links'; import { createRoute } from '../create_route'; -export const customLinkTransactionRoute = createRoute((core) => ({ +export const customLinkTransactionRoute = createRoute(() => ({ path: '/api/apm/settings/custom_links/transaction', params: { query: filterOptionsRt, @@ -31,7 +31,7 @@ export const customLinkTransactionRoute = createRoute((core) => ({ }, })); -export const listCustomLinksRoute = createRoute((core) => ({ +export const listCustomLinksRoute = createRoute(() => ({ path: '/api/apm/settings/custom_links', params: { query: filterOptionsRt, From 299a6026fd9d20a4a5b20e6443d79ea1f962a3fe Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 8 Jun 2020 17:16:30 -0700 Subject: [PATCH 30/65] [Ingest Manager] Copy fixes (#68325) * #68153 Change Elastic integrations to Integrations * Fix copy casing * #68152 Update create data source CTA copy * #68166 Remove icon next to top-level navigation when user is on new Kibana navigation style * Fix i18n Co-authored-by: Elastic Machine --- .../ingest_manager/components/settings_flyout.tsx | 4 ++-- .../applications/ingest_manager/layouts/default.tsx | 11 +++++++---- .../sections/agent_config/components/actions_menu.tsx | 2 +- .../components/datasources/datasources_table.tsx | 2 +- .../components/datasources/no_datasources.tsx | 2 +- .../epm/screens/detail/confirm_package_uninstall.tsx | 2 +- .../sections/epm/screens/detail/header.tsx | 5 ++++- .../sections/epm/screens/detail/settings_panel.tsx | 2 +- .../sections/epm/screens/home/header.tsx | 4 ++-- x-pack/plugins/translations/translations/ja-JP.json | 1 - x-pack/plugins/translations/translations/zh-CN.json | 1 - 11 files changed, 20 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx index 47d723dd9a1ac..c79077e68afb0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx @@ -167,7 +167,7 @@ export const SettingFlyout: React.FunctionComponent = ({ onClose }) => { 'xpack.ingestManager.settings.integrationUpgradeEnabledFieldLabel', { defaultMessage: - 'Automatically update Integrations to the latest version to receive the latest assets. Agent configurations may need to be updated in order to use new features.', + 'Automatically update integrations to the latest version to receive the latest assets. Agent configurations may need to be updated in order to use new features.', } ), }, @@ -190,7 +190,7 @@ export const SettingFlyout: React.FunctionComponent = ({ onClose }) => {

diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx index 978c74f72d7aa..5e0cba7383e9c 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx @@ -9,7 +9,7 @@ import { EuiTabs, EuiTab, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiButtonEmpty } f import { FormattedMessage } from '@kbn/i18n/react'; import { Section } from '../sections'; import { AlphaMessaging, SettingFlyout } from '../components'; -import { useLink, useConfig } from '../hooks'; +import { useLink, useConfig, useCore } from '../hooks'; interface Props { showSettings?: boolean; @@ -42,6 +42,7 @@ export const DefaultLayout: React.FunctionComponent = ({ }) => { const { getHref } = useLink(); const { epm, fleet } = useConfig(); + const { uiSettings } = useCore(); const [isSettingsFlyoutOpen, setIsSettingsFlyoutOpen] = React.useState(false); return ( @@ -57,9 +58,11 @@ export const DefaultLayout: React.FunctionComponent = ({
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx index a40fe98f93ddc..c378e5a47a9b9 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/home/header.tsx @@ -20,7 +20,7 @@ export const HeroCopy = memo(() => {

@@ -46,7 +46,7 @@ export const HeroImage = memo(() => { const Illustration = styled(EuiImage).attrs((props) => ({ alt: i18n.translate('xpack.ingestManager.epm.illustrationAltText', { - defaultMessage: 'Illustration of an Elastic integration', + defaultMessage: 'Illustration of an integration', }), url: IS_DARK_THEME ? toAssets('illustration_integrations_darkmode.svg') diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ba0e0ca532d90..5be46ce4bcd2d 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8362,7 +8362,6 @@ "xpack.ingestManager.enrollmentTokensList.newKeyButton": "新しい登録トークン", "xpack.ingestManager.enrollmentTokensList.pageDescription": "これは、エージェントを登録するために使用できる登録トークンのリストです。", "xpack.ingestManager.enrollmentTokensList.secretTitle": "シークレット", - "xpack.ingestManager.epm.addDatasourceButtonText": "データソースを作成", "xpack.ingestManager.epm.browseAllButtonText": "すべての統合を参照", "xpack.ingestManager.epm.illustrationAltText": "Elastic統合の例", "xpack.ingestManager.epm.pageSubtitle": "一般的なアプリやサービスの統合を参照する", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 6aaf592a87e78..dff26907b48ed 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8366,7 +8366,6 @@ "xpack.ingestManager.enrollmentTokensList.newKeyButton": "新建注册令牌", "xpack.ingestManager.enrollmentTokensList.pageDescription": "这是可用于注册代理的注册令牌列表。", "xpack.ingestManager.enrollmentTokensList.secretTitle": "密钥", - "xpack.ingestManager.epm.addDatasourceButtonText": "创建数据源", "xpack.ingestManager.epm.browseAllButtonText": "浏览所有集成", "xpack.ingestManager.epm.illustrationAltText": "Elastic 集成的图示", "xpack.ingestManager.epm.pageSubtitle": "浏览集成以了解热门应用和服务。", From e49888f2ec5c86207a85d35c08e6a1ba0bb3555c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 01:31:33 +0100 Subject: [PATCH 31/65] chore(NA): skip apis Endpoint plugin test metadata api POST /api/endpoint/metadata when index is not empty (#68586) --- x-pack/test/api_integration/apis/endpoint/metadata.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/endpoint/metadata.ts b/x-pack/test/api_integration/apis/endpoint/metadata.ts index 5c4bb52b8d9e2..e48db70fd0124 100644 --- a/x-pack/test/api_integration/apis/endpoint/metadata.ts +++ b/x-pack/test/api_integration/apis/endpoint/metadata.ts @@ -14,7 +14,8 @@ const numberOfHostsInFixture = 3; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('test metadata api', () => { + // SKIPPED as it is failing on ES PROMOTION: https://github.com/elastic/kibana/issues/68584 + describe.skip('test metadata api', () => { describe('POST /api/endpoint/metadata when index is empty', () => { it('metadata api should return empty result when index is empty', async () => { await esArchiver.unload('endpoint/metadata/api_feature'); From d99cf75814c4d11e5720a2837693642b2dfeb5df Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Mon, 8 Jun 2020 19:54:09 -0600 Subject: [PATCH 32/65] [SIEM][Detection Engine] Converts from joi to use io-ts and moves the types to common (#68127) ## Summary * https://github.com/elastic/siem-team/issues/646 * Converts the detection rules and REST to use io-ts * Removes their joi counterparts * Updates all tests to use it * Fixes a bug with the risk_score that was being sent in as a string from the UI instead of a number * Fixes a bug within the exactCheck validating where it can now accept null value types for optional body messages. * Fixes a bug in the FindRoute where it did not send down fields from REST * Changes the lists plugin to utilize the io-ts types from siem rather than having them duplicated. * Makes some stronger validations * Adds a lot of codecs **Things to look out for:** * Generic testing to ensure I didn't break something that was not part of the tests. * Fix for the risk_score from string to number is in: ``` x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx ``` * Fix for the exact check (unit tests are written and added) ``` x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx ``` * Within all the types I added are there any misspelled things or copy-pasta mistakes with strings: x-pack/plugins/security_solution/common/detection_engine/schemas/types * Fix for `find_rules_route.ts:58` ``` x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts ``` **Follow on things that this PR doesn't do we need to:** * Add linter rule to forbid NodeJS code within common section * The `[object Object]` formatter issues seen in the code such as: ``` // TODO: Fix/Change the formatErrors to be better able to handle objects 'Invalid value "[object Object]" supplied to "note"', ``` * Formatter issues such as: `'Invalid value "" supplied to ""'` * Remove the hapi server object from lists plugin ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios --- .../lists/common/schemas/common/schemas.ts | 2 +- .../create_exception_list_item_schema.ts | 3 +- .../request/create_exception_list_schema.ts | 2 +- .../request/import_list_item_schema.ts | 2 + .../lists/common/schemas/types/index.ts | 3 - .../plugins/lists/common/siem_common_deps.ts | 3 + .../schemas/common/schemas.ts | 182 +- .../add_prepackaged_rules_schema.mock.ts | 47 + .../request/add_prepackaged_rules_schema.ts | 134 ++ ..._prepackaged_rules_type_dependents.test.ts | 71 + .../add_prepackaged_rules_type_dependents.ts | 107 + .../add_prepackged_rules_schema.test.ts | 1389 +++++++++++++ .../request/create_rules_bulk_schema.test.ts | 281 +++ .../request/create_rules_bulk_schema.ts | 14 + .../request/create_rules_schema.mock.ts | 43 + .../request/create_rules_schema.test.ts | 1445 +++++++++++++ .../schemas/request/create_rules_schema.ts | 134 ++ .../create_rules_type_dependents.test.ts | 68 + .../request/create_rules_type_dependents.ts | 105 + .../request/export_rules_schema.test.ts | 159 ++ .../schemas/request/export_rules_schema.ts | 33 + .../request/find_rule_statuses_schema.ts | 17 + .../request/find_rule_type_dependents.test.ts | 45 + .../schemas/request/find_rules_schema.test.ts | 198 ++ .../schemas/request/find_rules_schema.ts | 30 + .../request/find_rules_type_dependents.ts | 23 + .../request/import_rules_schema.mock.ts | 44 + .../request/import_rules_schema.test.ts | 1579 ++++++++++++++ .../schemas/request/import_rules_schema.ts | 180 ++ .../import_rules_type_dependents.test.ts | 68 + .../request/import_rules_type_dependents.ts | 105 + .../patch_rule_type_dependents.test.ts | 81 + .../request/patch_rules_bulk_schema.test.ts | 101 + .../request/patch_rules_bulk_schema.ts | 14 + .../request/patch_rules_schema.mock.ts | 21 + .../request/patch_rules_schema.test.ts | 1153 +++++++++++ .../schemas/request/patch_rules_schema.ts | 90 + .../request/patch_rules_type_dependents.ts | 77 + .../request/query_rules_bulk_schema.test.ts | 103 + .../request/query_rules_bulk_schema.ts | 14 + .../request/query_rules_schema.test.ts | 23 + .../schemas/request}/query_rules_schema.ts | 17 +- .../query_rules_type_dependents.test.ts | 25 + .../request/query_rules_type_dependents.ts | 21 + .../query_signals_index_schema.test.ts | 94 + .../request/query_signals_index_schema.ts | 21 + .../request/set_signal_status_schema.test.ts | 82 + .../request/set_signal_status_schema.ts | 24 + .../set_signal_status_type_dependents.test.ts | 46 + .../set_signal_status_type_dependents.ts | 21 + .../request/update_rules_bulk_schema.test.ts | 277 +++ .../request/update_rules_bulk_schema.ts | 14 + .../request/update_rules_schema.mock.ts | 42 + .../request/update_rules_schema.test.ts | 1387 +++++++++++++ .../schemas/request/update_rules_schema.ts | 140 ++ .../update_rules_type_dependents.test.ts | 88 + .../request/update_rules_type_dependents.ts | 116 ++ .../types/deafult_boolean_true.test.ts | 48 + .../schemas/types/deafult_from_string.test.ts | 39 + .../types/default_actions_array.test.ts | 54 + .../schemas/types/default_actions_array.ts | 22 + .../types/default_boolean_false.test.ts | 48 + .../schemas/types/default_boolean_false.ts | 22 + .../schemas/types/default_boolean_true.ts | 21 + .../types/default_empty_string.test.ts | 39 + .../schemas/types/default_empty_string.ts | 21 + .../types/default_export_file_name.test.ts | 39 + .../schemas/types/default_export_file_name.ts | 22 + .../schemas/types/default_from_string.ts | 22 + .../types/default_interval_string.test.ts | 39 + .../schemas/types/default_interval_string.ts | 21 + .../types/default_language_string.test.ts | 40 + .../schemas/types/default_language_string.ts | 23 + .../types/default_max_signals_number.test.ts | 58 + .../types/default_max_signals_number.ts | 32 + .../schemas/types/default_page.test.ts | 75 + .../schemas/types/default_page.ts | 32 + .../schemas/types/default_per_page.test.ts | 75 + .../schemas/types/default_per_page.ts | 32 + .../types/default_string_array.test.ts | 48 + .../schemas/types/default_string_array.ts | 8 +- .../default_string_boolean_false.test.ts | 93 + .../types/default_string_boolean_false.ts | 32 + .../types/default_threat_array.test.ts | 62 + .../schemas/types/default_threat_array.ts | 22 + .../types/default_throttle_null.test.ts | 40 + .../schemas/types/default_throttle_null.ts | 23 + .../schemas/types/default_to_string.test.ts | 39 + .../schemas/types/default_to_string.ts | 21 + .../schemas/types/default_uuid.test.ts | 41 + .../schemas/types/default_uuid.ts | 6 +- .../types/default_version_number.test.ts | 57 + .../schemas/types/default_version_number.ts | 22 + .../schemas/types/iso_date_string.ts | 6 +- .../schemas/types/lists_default_array.ts | 5 +- .../schemas/types/non_empty_string.test.ts | 48 + .../schemas/types/non_empty_string.ts | 6 +- .../schemas/types/only_false_allowed.test.ts | 48 + .../schemas/types/only_false_allowed.ts | 33 + .../schemas/types/positive_integer.ts | 6 +- .../positive_integer_greater_than_zero.ts | 10 +- .../types/references_default_array.test.ts | 12 +- .../schemas/types/references_default_array.ts | 10 +- .../schemas/types/risk_score.ts | 6 +- .../detection_engine/schemas/types/uuid.ts | 6 +- .../common/exact_check.test.ts | 22 + .../security_solution/common/exact_check.ts | 11 +- .../rules/step_about_rule/index.test.tsx | 152 +- .../rules/step_about_rule/schema.tsx | 1 + .../routes/__mocks__/request_responses.ts | 62 +- .../rules/add_prepackaged_rules_route.test.ts | 16 +- .../rules/add_prepackaged_rules_route.ts | 2 +- .../rules/create_rules_bulk_route.test.ts | 2 +- .../routes/rules/create_rules_bulk_route.ts | 67 +- .../routes/rules/create_rules_route.test.ts | 2 +- .../routes/rules/create_rules_route.ts | 53 +- .../rules/delete_rules_bulk_route.test.ts | 30 +- .../routes/rules/delete_rules_bulk_route.ts | 27 +- .../routes/rules/delete_rules_route.test.ts | 11 +- .../routes/rules/delete_rules_route.ts | 18 +- .../routes/rules/export_rules_route.ts | 19 +- .../routes/rules/find_rules_route.test.ts | 2 +- .../routes/rules/find_rules_route.ts | 19 +- .../rules/find_rules_status_route.test.ts | 2 +- .../routes/rules/find_rules_status_route.ts | 23 +- .../get_prepackaged_rules_status_route.ts | 1 + .../routes/rules/import_rules_route.test.ts | 6 +- .../routes/rules/import_rules_route.ts | 64 +- .../rules/patch_rules_bulk_route.test.ts | 17 +- .../routes/rules/patch_rules_bulk_route.ts | 25 +- .../routes/rules/patch_rules_route.test.ts | 12 +- .../routes/rules/patch_rules_route.ts | 33 +- .../routes/rules/read_rules_route.ts | 21 +- .../rules/update_rules_bulk_route.test.ts | 16 +- .../routes/rules/update_rules_bulk_route.ts | 49 +- .../routes/rules/update_rules_route.test.ts | 17 +- .../routes/rules/update_rules_route.ts | 48 +- .../routes/rules/utils.test.ts | 10 +- .../detection_engine/routes/rules/utils.ts | 38 +- .../add_prepackaged_rules_schema.test.ts | 1658 --------------- .../schemas/add_prepackaged_rules_schema.ts | 115 - .../schemas/create_rules_bulk_schema.test.ts | 260 --- .../schemas/create_rules_bulk_schema.ts | 11 - .../schemas/create_rules_schema.test.ts | 1623 --------------- .../routes/schemas/create_rules_schema.ts | 102 - .../schemas/export_rules_schema.test.ts | 113 - .../routes/schemas/export_rules_schema.ts | 22 - .../routes/schemas/find_rules_schema.test.ts | 147 -- .../routes/schemas/find_rules_schema.ts | 24 - .../schemas/find_rules_statuses_schema.ts | 11 - .../schemas/import_rules_schema.test.ts | 1841 ----------------- .../routes/schemas/import_rules_schema.ts | 131 -- .../schemas/patch_rules_bulk_schema.test.ts | 100 - .../routes/schemas/patch_rules_bulk_schema.ts | 11 - .../routes/schemas/patch_rules_schema.test.ts | 1362 ------------ .../routes/schemas/patch_rules_schema.ts | 82 - .../schemas/query_rules_bulk_schema.test.ts | 97 - .../routes/schemas/query_rules_bulk_schema.ts | 10 - .../routes/schemas/query_rules_schema.test.ts | 42 - .../query_signals_index_schema.test.ts | 75 - .../schemas/query_signals_index_schema.ts | 15 - .../routes/schemas/schemas.ts | 125 -- .../schemas/set_signal_status_schema.test.ts | 75 - .../schemas/set_signal_status_schema.ts | 17 - .../schemas/update_rules_bulk_schema.test.ts | 91 - .../schemas/update_rules_bulk_schema.ts | 11 - .../schemas/update_rules_schema.test.ts | 1645 --------------- .../routes/schemas/update_rules_schema.ts | 111 - .../routes/signals/open_close_signals.test.ts | 17 +- .../signals/open_close_signals_route.ts | 18 +- .../signals/query_signals_route.test.ts | 9 +- .../routes/signals/query_signals_route.ts | 29 +- .../rules/create_rules.mock.ts | 78 + .../rules/create_rules.test.ts | 30 +- .../detection_engine/rules/create_rules.ts | 8 +- .../create_rules_stream_from_ndjson.test.ts | 31 +- .../rules/create_rules_stream_from_ndjson.ts | 34 +- .../rules/delete_rules.test.ts | 16 +- .../detection_engine/rules/delete_rules.ts | 4 +- .../lib/detection_engine/rules/find_rules.ts | 4 +- .../rules/get_existing_prepackaged_rules.ts | 2 + .../rules/get_export_by_object_ids.ts | 2 +- .../rules/get_prepackaged_rules.test.ts | 14 +- .../rules/get_prepackaged_rules.ts | 43 +- .../rules/get_rules_to_install.test.ts | 17 +- .../rules/get_rules_to_install.ts | 6 +- .../rules/get_rules_to_update.test.ts | 17 +- .../rules/get_rules_to_update.ts | 6 +- .../rules/install_prepacked_rules.ts | 17 +- .../rules/patch_rules.mock.ts | 183 ++ .../rules/patch_rules.test.ts | 143 +- .../lib/detection_engine/rules/patch_rules.ts | 17 +- .../detection_engine/rules/read_rules.test.ts | 27 +- .../lib/detection_engine/rules/read_rules.ts | 8 +- .../lib/detection_engine/rules/types.ts | 272 ++- .../rules/update_prepacked_rules.test.ts | 19 +- .../rules/update_prepacked_rules.ts | 24 +- .../rules/update_rules.mock.ts | 81 + .../rules/update_rules.test.ts | 97 +- .../detection_engine/rules/update_rules.ts | 11 +- .../create_ndjson_prepackaged_rules.sh | 17 + .../signals/__mocks__/es_results.ts | 2 +- .../signals/build_exceptions_query.ts | 2 +- .../detection_engine/signals/build_rule.ts | 2 +- .../signals/filter_events_with_list.ts | 2 +- .../detection_engine/signals/get_filter.ts | 4 +- .../signals/search_after_bulk_create.ts | 2 +- .../signals/signal_params_schema.ts | 2 +- .../signals/signal_rule_alert_type.ts | 2 +- .../lib/detection_engine/signals/types.ts | 14 - .../lib/detection_engine/tags/read_tags.ts | 2 + .../server/lib/detection_engine/types.ts | 22 +- .../create_stream_from_ndjson.test.ts | 6 +- .../read_stream/create_stream_from_ndjson.ts | 36 +- .../basic/tests/delete_rules.ts | 4 +- .../basic/tests/delete_rules_bulk.ts | 32 +- .../basic/tests/import_rules.ts | 10 - .../basic/tests/patch_rules.ts | 4 +- .../basic/tests/patch_rules_bulk.ts | 16 +- .../basic/tests/read_rules.ts | 4 +- .../basic/tests/update_rules.ts | 4 +- .../basic/tests/update_rules_bulk.ts | 16 +- .../security_and_spaces/tests/delete_rules.ts | 4 +- .../tests/delete_rules_bulk.ts | 32 +- .../security_and_spaces/tests/import_rules.ts | 10 - .../security_and_spaces/tests/patch_rules.ts | 4 +- .../tests/patch_rules_bulk.ts | 16 +- .../security_and_spaces/tests/read_rules.ts | 4 +- .../security_and_spaces/tests/update_rules.ts | 4 +- .../tests/update_rules_bulk.ts | 16 +- 230 files changed, 13701 insertions(+), 10845 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts rename x-pack/plugins/security_solution/{server/lib/detection_engine/routes/schemas => common/detection_engine/schemas/request}/query_rules_schema.ts (54%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts rename x-pack/plugins/{lists/common => security_solution/common/detection_engine}/schemas/types/default_string_array.ts (75%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts rename x-pack/plugins/{lists/common => security_solution/common/detection_engine}/schemas/types/default_uuid.ts (84%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts rename x-pack/plugins/{lists/common => security_solution/common/detection_engine}/schemas/types/non_empty_string.ts (81%) create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.test.ts create mode 100644 x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts delete mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts create mode 100755 x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh diff --git a/x-pack/plugins/lists/common/schemas/common/schemas.ts b/x-pack/plugins/lists/common/schemas/common/schemas.ts index 14ae030c63df3..7f086647bbc75 100644 --- a/x-pack/plugins/lists/common/schemas/common/schemas.ts +++ b/x-pack/plugins/lists/common/schemas/common/schemas.ts @@ -8,8 +8,8 @@ import * as t from 'io-ts'; -import { DefaultStringArray, NonEmptyString } from '../types'; import { DefaultNamespace } from '../types/default_namespace'; +import { DefaultStringArray, NonEmptyString } from '../../siem_common_deps'; export const name = t.string; export type Name = t.TypeOf; diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts index c10d441d93aa5..4322ff4c2801b 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts @@ -24,8 +24,9 @@ import { tags, } from '../common/schemas'; import { Identity, RequiredKeepUndefined } from '../../types'; -import { DefaultEntryArray, DefaultUuid } from '../types'; +import { DefaultEntryArray } from '../types'; import { EntriesArray } from '../types/entries'; +import { DefaultUuid } from '../../siem_common_deps'; export const createExceptionListItemSchema = t.intersection([ t.exact( diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts index 3da8bfca126ae..a0aaa91c81427 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts @@ -22,7 +22,7 @@ import { tags, } from '../common/schemas'; import { Identity, RequiredKeepUndefined } from '../../types'; -import { DefaultUuid } from '../types/default_uuid'; +import { DefaultUuid } from '../../siem_common_deps'; export const createExceptionListSchema = t.intersection([ t.exact( diff --git a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts index 94299c93b29d8..0a5e861d84483 100644 --- a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts @@ -6,6 +6,7 @@ /* eslint-disable @typescript-eslint/camelcase */ +// TODO: You cannot import a stream from common into the front end code! CHANGE THIS import { Readable } from 'stream'; import * as t from 'io-ts'; @@ -20,6 +21,7 @@ export const importListItemSchema = t.exact( export type ImportListItemSchema = t.TypeOf; +// TODO: You cannot import a stream from common into the front end code! CHANGE THIS export interface HapiReadableStream extends Readable { hapi: { filename: string; diff --git a/x-pack/plugins/lists/common/schemas/types/index.ts b/x-pack/plugins/lists/common/schemas/types/index.ts index 674d7c40c2970..2f38ff86d4fb2 100644 --- a/x-pack/plugins/lists/common/schemas/types/index.ts +++ b/x-pack/plugins/lists/common/schemas/types/index.ts @@ -4,7 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ export * from './default_entries_array'; -export * from './default_string_array'; -export * from './default_uuid'; export * from './entries'; -export * from './non_empty_string'; diff --git a/x-pack/plugins/lists/common/siem_common_deps.ts b/x-pack/plugins/lists/common/siem_common_deps.ts index 9de40e3f72932..3759305987f79 100644 --- a/x-pack/plugins/lists/common/siem_common_deps.ts +++ b/x-pack/plugins/lists/common/siem_common_deps.ts @@ -4,5 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +export { NonEmptyString } from '../../security_solution/common/detection_engine/schemas/types/non_empty_string'; +export { DefaultUuid } from '../../security_solution/common/detection_engine/schemas/types/default_uuid'; +export { DefaultStringArray } from '../../security_solution/common/detection_engine/schemas/types/default_string_array'; export { exactCheck } from '../../security_solution/common/exact_check'; export { getPaths, foldLeftRight } from '../../security_solution/common/test_utils'; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts index 9eb2d9abccbd3..7db8e57421d02 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts @@ -14,16 +14,35 @@ import { PositiveIntegerGreaterThanZero } from '../types/positive_integer_greate import { PositiveInteger } from '../types/positive_integer'; export const description = t.string; +export type Description = t.TypeOf; + +export const descriptionOrUndefined = t.union([description, t.undefined]); +export type DescriptionOrUndefined = t.TypeOf; + export const enabled = t.boolean; -export const exclude_export_details = t.boolean; +export type Enabled = t.TypeOf; + +export const enabledOrUndefined = t.union([enabled, t.undefined]); +export type EnabledOrUndefined = t.TypeOf; + export const false_positives = t.array(t.string); +export type FalsePositives = t.TypeOf; + +export const falsePositivesOrUndefined = t.union([false_positives, t.undefined]); +export type FalsePositivesOrUndefined = t.TypeOf; + export const file_name = t.string; +export type FileName = t.TypeOf; + +export const exclude_export_details = t.boolean; +export type ExcludeExportDetails = t.TypeOf; /** * TODO: Right now the filters is an "unknown", when it could more than likely * become the actual ESFilter as a type. */ export const filters = t.array(t.unknown); // Filters are not easily type-able yet +export type Filters = t.TypeOf; // Filters are not easily type-able yet /** * Params is an "object", since it is a type of AlertActionParams which is action templates. @@ -43,30 +62,98 @@ export const action = t.exact( ); export const actions = t.array(action); +export type Actions = t.TypeOf; // TODO: Create a regular expression type or custom date math part type here export const from = t.string; +export type From = t.TypeOf; + +export const fromOrUndefined = t.union([from, t.undefined]); +export type FromOrUndefined = t.TypeOf; export const immutable = t.boolean; +export type Immutable = t.TypeOf; // Note: Never make this a strict uuid, we allow the rule_id to be any string at the moment // in case we encounter 3rd party rule systems which might be using auto incrementing numbers // or other different things. export const rule_id = t.string; +export type RuleId = t.TypeOf; + +export const ruleIdOrUndefined = t.union([rule_id, t.undefined]); +export type RuleIdOrUndefined = t.TypeOf; export const id = UUID; +export const idOrUndefined = t.union([id, t.undefined]); +export type IdOrUndefined = t.TypeOf; + export const index = t.array(t.string); +export type Index = t.TypeOf; + +export const indexOrUndefined = t.union([index, t.undefined]); +export type IndexOrUndefined = t.TypeOf; + export const interval = t.string; +export type Interval = t.TypeOf; + +export const intervalOrUndefined = t.union([interval, t.undefined]); +export type IntervalOrUndefined = t.TypeOf; + export const query = t.string; +export type Query = t.TypeOf; + +export const queryOrUndefined = t.union([query, t.undefined]); +export type QueryOrUndefined = t.TypeOf; + export const language = t.keyof({ kuery: null, lucene: null }); +export type Language = t.TypeOf; + +export const languageOrUndefined = t.union([language, t.undefined]); +export type LanguageOrUndefined = t.TypeOf; + export const objects = t.array(t.type({ rule_id })); + export const output_index = t.string; +export type OutputIndex = t.TypeOf; + +export const outputIndexOrUndefined = t.union([output_index, t.undefined]); +export type OutputIndexOrUndefined = t.TypeOf; + export const saved_id = t.string; +export type SavedId = t.TypeOf; + +export const savedIdOrUndefined = t.union([saved_id, t.undefined]); +export type SavedIdOrUndefined = t.TypeOf; + export const timeline_id = t.string; +export type TimelineId = t.TypeOf; + +export const timelineIdOrUndefined = t.union([timeline_id, t.undefined]); +export type TimelineIdOrUndefined = t.TypeOf; + export const timeline_title = t.string; +export type TimelineTitle = t.TypeOf; + +export const timelineTitleOrUndefined = t.union([timeline_title, t.undefined]); +export type TimelineTitleOrUndefined = t.TypeOf; + export const throttle = t.string; +export type Throttle = t.TypeOf; + +export const throttleOrNull = t.union([throttle, t.null]); +export type ThrottleOrNull = t.TypeOf; + export const anomaly_threshold = PositiveInteger; +export type AnomalyThreshold = t.TypeOf; + +export const anomalyThresholdOrUndefined = t.union([anomaly_threshold, t.undefined]); +export type AnomalyThresholdOrUndefined = t.TypeOf; + export const machine_learning_job_id = t.string; +export type MachineLearningJobId = t.TypeOf; + +export const machineLearningJobIdOrUndefined = t.union([machine_learning_job_id, t.undefined]); +export type MachineLearningJobIdOrUndefined = t.TypeOf; /** * Note that this is a plain unknown object because we allow the UI @@ -76,30 +163,103 @@ export const machine_learning_job_id = t.string; * so we have tighter control over 3rd party data structures. */ export const meta = t.object; +export type Meta = t.TypeOf; +export const metaOrUndefined = t.union([meta, t.undefined]); +export type MetaOrUndefined = t.TypeOf; + export const max_signals = PositiveIntegerGreaterThanZero; +export type MaxSignals = t.TypeOf; + +export const maxSignalsOrUndefined = t.union([max_signals, t.undefined]); +export type MaxSignalsOrUndefined = t.TypeOf; + export const name = t.string; +export type Name = t.TypeOf; + +export const nameOrUndefined = t.union([name, t.undefined]); +export type NameOrUndefined = t.TypeOf; + export const risk_score = RiskScore; +export type RiskScore = t.TypeOf; + +export const riskScoreOrUndefined = t.union([risk_score, t.undefined]); +export type RiskScoreOrUndefined = t.TypeOf; + export const severity = t.keyof({ low: null, medium: null, high: null, critical: null }); +export type Severity = t.TypeOf; + +export const severityOrUndefined = t.union([severity, t.undefined]); +export type SeverityOrUndefined = t.TypeOf; + export const status = t.keyof({ open: null, closed: null }); + export const job_status = t.keyof({ succeeded: null, failed: null, 'going to run': null }); // TODO: Create a regular expression type or custom date math part type here export const to = t.string; +export type To = t.TypeOf; + +export const toOrUndefined = t.union([to, t.undefined]); +export type ToOrUndefined = t.TypeOf; export const type = t.keyof({ machine_learning: null, query: null, saved_query: null }); +export type Type = t.TypeOf; + +export const typeOrUndefined = t.union([type, t.undefined]); +export type TypeOrUndefined = t.TypeOf; + export const queryFilter = t.string; +export type QueryFilter = t.TypeOf; + +export const queryFilterOrUndefined = t.union([queryFilter, t.undefined]); +export type QueryFilterOrUndefined = t.TypeOf; + export const references = t.array(t.string); +export type References = t.TypeOf; + +export const referencesOrUndefined = t.union([references, t.undefined]); +export type ReferencesOrUndefined = t.TypeOf; + export const per_page = PositiveInteger; +export type PerPage = t.TypeOf; + +export const perPageOrUndefined = t.union([per_page, t.undefined]); +export type PerPageOrUndefined = t.TypeOf; + export const page = PositiveIntegerGreaterThanZero; +export type Page = t.TypeOf; + +export const pageOrUndefined = t.union([page, t.undefined]); +export type PageOrUndefined = t.TypeOf; + export const signal_ids = t.array(t.string); // TODO: Can this be more strict or is this is the set of all Elastic Queries? export const signal_status_query = t.object; export const sort_field = t.string; +export type SortField = t.TypeOf; + +export const sortFieldOrUndefined = t.union([sort_field, t.undefined]); +export type SortFieldOrUndefined = t.TypeOf; + export const sort_order = t.keyof({ asc: null, desc: null }); +export type sortOrder = t.TypeOf; + +export const sortOrderOrUndefined = t.union([sort_order, t.undefined]); +export type SortOrderOrUndefined = t.TypeOf; + export const tags = t.array(t.string); +export type Tags = t.TypeOf; + +export const tagsOrUndefined = t.union([tags, t.undefined]); +export type TagsOrUndefined = t.TypeOf; + export const fields = t.array(t.string); +export type Fields = t.TypeOf; +export const fieldsOrUndefined = t.union([fields, t.undefined]); +export type FieldsOrUndefined = t.TypeOf; + export const threat_framework = t.string; export const threat_tactic_id = t.string; export const threat_tactic_name = t.string; @@ -129,11 +289,23 @@ export const threat = t.array( }) ) ); + +export type Threat = t.TypeOf; + +export const threatOrUndefined = t.union([threat, t.undefined]); +export type ThreatOrUndefined = t.TypeOf; + export const created_at = IsoDateString; export const updated_at = IsoDateString; export const updated_by = t.string; export const created_by = t.string; + export const version = PositiveIntegerGreaterThanZero; +export type Version = t.TypeOf; + +export const versionOrUndefined = t.union([version, t.undefined]); +export type VersionOrUndefined = t.TypeOf; + export const last_success_at = IsoDateString; export const last_success_message = t.string; export const last_failure_at = IsoDateString; @@ -150,7 +322,12 @@ export const success_count = PositiveInteger; export const rules_custom_installed = PositiveInteger; export const rules_not_installed = PositiveInteger; export const rules_not_updated = PositiveInteger; + export const note = t.string; +export type Note = t.TypeOf; + +export const noteOrUndefined = t.union([note, t.undefined]); +export type NoteOrUndefined = t.TypeOf; // NOTE: Experimental list support not being shipped currently and behind a feature flag // TODO: Remove this comment once we lists have passed testing and is ready for the release @@ -185,3 +362,6 @@ export const list_and = t.intersection([ and: t.array(list), }), ]); + +export const listAndOrUndefined = t.union([t.array(list_and), t.undefined]); +export type ListAndOrUndefined = t.TypeOf; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts new file mode 100644 index 0000000000000..52a210f3a01aa --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + AddPrepackagedRulesSchema, + AddPrepackagedRulesSchemaDecoded, +} from './add_prepackaged_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getAddPrepackagedRulesSchemaMock = (): AddPrepackagedRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', + version: 1, +}); + +export const getAddPrepackagedRulesSchemaDecodedMock = (): AddPrepackagedRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: false, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + rule_id: 'rule-1', +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts new file mode 100644 index 0000000000000..3e7e7e5409c9c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_schema.ts @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, + rule_id, + version, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanFalse } from '../types/default_boolean_false'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; + +/** + * Big differences between this schema and the createRulesSchema + * - rule_id is required here + * - output_index is not allowed (and instead the space index must be used) + * - immutable is forbidden but defaults to true instead of to false and it can only ever be true (This is forced directly in the route and not here) + * - enabled defaults to false instead of true + * - version is a required field that must exist + * - index is a required field that must exist if type !== machine_learning (Checked within the runtime type dependent system) + */ +export const addPrepackagedRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + rule_id, + version, + }) + ), + t.exact( + t.partial({ + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanFalse, // defaults to false if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + index, // defaults to undefined if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + }) + ), +]); + +export type AddPrepackagedRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type AddPrepackagedRulesSchemaDecoded = Omit< + AddPrepackagedRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'exceptions_list' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + exceptions_list: ListsDefaultArraySchema; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..793d4b04ed0e5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.test.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AddPrepackagedRulesSchema } from './add_prepackaged_rules_schema'; +import { addPrepackagedRuleValidateTypeDependents } from './add_prepackaged_rules_type_dependents'; +import { getAddPrepackagedRulesSchemaMock } from './add_prepackaged_rules_schema.mock'; + +describe('create_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + type: 'saved_query', + }; + delete schema.saved_id; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = addPrepackagedRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts new file mode 100644 index 0000000000000..2788c331154d2 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackaged_rules_type_dependents.ts @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AddPrepackagedRulesSchema } from './add_prepackaged_rules_schema'; + +export const validateAnomalyThreshold = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: AddPrepackagedRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const addPrepackagedRuleValidateTypeDependents = ( + schema: AddPrepackagedRulesSchema +): string[] => { + return [ + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts new file mode 100644 index 0000000000000..5d170f5a78645 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts @@ -0,0 +1,1389 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + addPrepackagedRulesSchema, + AddPrepackagedRulesSchemaDecoded, + AddPrepackagedRulesSchema, +} from './add_prepackaged_rules_schema'; + +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { + getAddPrepackagedRulesSchemaMock, + getAddPrepackagedRulesSchemaDecodedMock, +} from './add_prepackaged_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('add prepackaged rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "rule_id"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: AddPrepackagedRulesSchema & { madeUp: string } = { + ...getAddPrepackagedRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval, version] does validate', () => { + const payload: AddPrepackagedRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + risk_score: 50, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, version] does validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + risk_score: 50, + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does not validate', () => { + const payload: Partial & { output_index: string } = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "version"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index, version] does not validate because output_index is not allowed', () => { + const payload: Partial & { output_index: string } = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "output_index"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, version] does validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + version: 1, + actions: [], + enabled: false, + exceptions_list: [], + false_positives: [], + max_signals: 100, + references: [], + tags: [], + threat: [], + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: AddPrepackagedRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getAddPrepackagedRulesSchemaMock(); + const decoded = addPrepackagedRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('immutable cannot be set in a pre-packaged rule', () => { + const payload: AddPrepackagedRulesSchema & { immutable: boolean } = { + ...getAddPrepackagedRulesSchemaMock(), + immutable: true, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('defaults enabled to false', () => { + const payload: AddPrepackagedRulesSchema = getAddPrepackagedRulesSchemaMock(); + delete payload.enabled; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(((message.schema as unknown) as AddPrepackagedRulesSchemaDecoded).enabled).toEqual( + false + ); + }); + + test('rule_id is required', () => { + const payload: AddPrepackagedRulesSchema = getAddPrepackagedRulesSchemaMock(); + delete payload.rule_id; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "rule_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getAddPrepackagedRulesSchemaMock(), + references: [5], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getAddPrepackagedRulesSchemaMock(), + index: [5], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noInterval, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + interval: expectedInterval, + ...expectedNoInterval + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noMaxSignals, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + filters: [], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getAddPrepackagedRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getAddPrepackagedRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getAddPrepackagedRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getAddPrepackagedRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { + false_positives: number[]; + } = { + ...getAddPrepackagedRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + test('You cannot set the risk_score to 101', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getAddPrepackagedRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noFrom, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noTo, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getAddPrepackagedRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noActions, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + actions: expectedActions, + ...expectedNoActions + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getAddPrepackagedRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getAddPrepackagedRulesSchemaMock(); + const payload: AddPrepackagedRulesSchema = { + ...noThrottle, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + throttle: expectedThrottle, + ...expectedNoThrottle + } = getAddPrepackagedRulesSchemaDecodedMock(); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaMock(), + note: '', + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchema = { + ...getAddPrepackagedRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create note as an object', () => { + const payload: Omit & { note: {} } = { + ...getAddPrepackagedRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: AddPrepackagedRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + version: 1, + }; + + const decoded = addPrepackagedRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: AddPrepackagedRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..e79dde41752a3 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.test.ts @@ -0,0 +1,281 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + createRulesBulkSchema, + CreateRulesBulkSchema, + CreateRulesBulkSchemaDecoded, +} from './create_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { + getCreateRulesSchemaMock, + getCreateRulesSchemaDecodedMock, +} from './create_rules_schema.mock'; +import { formatErrors } from '../../../format_errors'; +import { CreateRulesSchema } from './create_rules_schema'; + +// only the basics of testing are here. +// see: create_rules_schema.test.ts for the bulk of the validation tests +// this just wraps createRulesSchema in an array +describe('create_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: CreateRulesBulkSchema = []; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(output.errors).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('made up values do not validate for a single element', () => { + const payload: Array<{ madeUp: string }> = [{ madeUp: 'hi' }]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(output.schema).toEqual({}); + }); + + test('single array element does validate', () => { + const payload: CreateRulesBulkSchema = [getCreateRulesSchemaMock()]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([getCreateRulesSchemaDecodedMock()]); + }); + + test('two array elements do validate', () => { + const payload: CreateRulesBulkSchema = [getCreateRulesSchemaMock(), getCreateRulesSchemaMock()]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + getCreateRulesSchemaDecodedMock(), + getCreateRulesSchemaDecodedMock(), + ]); + }); + + test('single array element with a missing value (risk_score) will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is valid but the second is invalid (risk_score) will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + const secondItem = getCreateRulesSchemaMock(); + delete secondItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (risk_score) but the second is valid will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + const secondItem = getCreateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (risk_score) will not validate', () => { + const singleItem = getCreateRulesSchemaMock(); + const secondItem = getCreateRulesSchemaMock(); + delete singleItem.risk_score; + delete secondItem.risk_score; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (extra key and value) but the second is valid will not validate', () => { + const singleItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the second is invalid (extra key and value) but the first is valid will not validate', () => { + const singleItem: CreateRulesSchema = getCreateRulesSchemaMock(); + const secondItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (extra key and value) will not validate', () => { + const singleItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem: CreateRulesSchema & { madeUpValue: string } = { + ...getCreateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: CreateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue,madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...withoutFrom } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutFrom]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].from).toEqual('now-6m'); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...withoutTo } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutTo]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].to).toEqual('now'); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const badSeverity = { ...getCreateRulesSchemaMock(), severity: 'madeup' }; + const payload = [badSeverity]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['Invalid value "madeup" supplied to "severity"']); + expect(output.schema).toEqual({}); + }); + + test('You can set "note" to a string', () => { + const payload: CreateRulesBulkSchema = [ + { ...getCreateRulesSchemaMock(), note: '# test markdown' }, + ]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + { ...getCreateRulesSchemaDecodedMock(), note: '# test markdown' }, + ]); + }); + + test('You can set "note" to an empty string', () => { + const payload: CreateRulesBulkSchema = [{ ...getCreateRulesSchemaMock(), note: '' }]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([{ ...getCreateRulesSchemaDecodedMock(), note: '' }]); + }); + + test('You can set "note" to anything other than string', () => { + const payload = [ + { + ...getCreateRulesSchemaMock(), + note: { + something: 'some object', + }, + }, + ]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + // TODO: We should change the formatter used to better print objects + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(output.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...withoutActions } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutActions]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].actions).toEqual([]); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...withoutThrottle } = getCreateRulesSchemaMock(); + const payload: CreateRulesBulkSchema = [withoutThrottle]; + + const decoded = createRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as CreateRulesBulkSchemaDecoded)[0].throttle).toEqual(null); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts new file mode 100644 index 0000000000000..c6233cc63fa9f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { createRulesSchema, CreateRulesSchemaDecoded } from './create_rules_schema'; + +export const createRulesBulkSchema = t.array(createRulesSchema); +export type CreateRulesBulkSchema = t.TypeOf; + +export type CreateRulesBulkSchemaDecoded = CreateRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts new file mode 100644 index 0000000000000..a9ab6f8959e24 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.mock.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CreateRulesSchema, CreateRulesSchemaDecoded } from './create_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getCreateRulesSchemaMock = (): CreateRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getCreateRulesSchemaDecodedMock = (): CreateRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + rule_id: 'rule-1', +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts new file mode 100644 index 0000000000000..d672d38028902 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts @@ -0,0 +1,1445 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + createRulesSchema, + CreateRulesSchema, + CreateRulesSchemaDecoded, +} from './create_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { + getCreateRulesSchemaMock, + getCreateRulesSchemaDecodedMock, +} from './create_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('create rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: CreateRulesSchema & { madeUp: string } = { + ...getCreateRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + threat: [], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getCreateRulesSchemaMock(); + const decoded = createRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getCreateRulesSchemaMock(), + references: [5], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getCreateRulesSchemaMock(), + index: [5], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('saved_query type can have filters with it', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + filters: [], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getCreateRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getCreateRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getCreateRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getCreateRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getCreateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getCreateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { false_positives: number[] } = { + ...getCreateRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to a number when trying to create a rule', () => { + const payload: Omit & { immutable: number } = { + ...getCreateRulesSchemaMock(), + immutable: 5, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to 101', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getCreateRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getCreateRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getCreateRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + note: '', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + ...getCreateRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create note as an object', () => { + const payload: Omit & { note: {} } = { + ...getCreateRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: CreateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noInterval, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { interval: expectedInterval, ...expectedNoInterval } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noMaxSignals, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noFrom, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noTo, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noActions, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { actions: expectedActions, ...expectedNoActions } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getCreateRulesSchemaMock(); + const payload: CreateRulesSchema = { + ...noThrottle, + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { throttle: expectedThrottle, ...expectedNoThrottle } = getCreateRulesSchemaDecodedMock(); + const expected: CreateRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + test('machine_learning type does validate', () => { + const payload: CreateRulesSchema = { + type: 'machine_learning', + anomaly_threshold: 50, + machine_learning_job_id: 'linux_anomalous_network_activity_ecs', + false_positives: [], + references: [], + risk_score: 50, + threat: [], + name: 'ss', + description: 'ss', + severity: 'low', + tags: [], + interval: '5m', + from: 'now-360s', + to: 'now', + meta: { from: '1m' }, + actions: [], + enabled: true, + throttle: 'no_actions', + rule_id: 'rule-1', + }; + + const decoded = createRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: CreateRulesSchemaDecoded = { + type: 'machine_learning', + anomaly_threshold: 50, + machine_learning_job_id: 'linux_anomalous_network_activity_ecs', + false_positives: [], + references: [], + risk_score: 50, + threat: [], + name: 'ss', + description: 'ss', + severity: 'low', + tags: [], + interval: '5m', + from: 'now-360s', + to: 'now', + meta: { from: '1m' }, + actions: [], + enabled: true, + throttle: 'no_actions', + exceptions_list: [], + max_signals: DEFAULT_MAX_SIGNALS, + version: 1, + rule_id: 'rule-1', + }; + expect(message.schema).toEqual(expected); + }); + + test('it generates a uuid v4 whenever you omit the rule_id', () => { + const { rule_id, ...noRuleId } = getCreateRulesSchemaMock(); + const decoded = createRulesSchema.decode(noRuleId); + const checked = exactCheck(noRuleId, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as CreateRulesSchemaDecoded).rule_id).toMatch( + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i + ); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts new file mode 100644 index 0000000000000..4e60201b8030e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + RuleId, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + Version, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanTrue } from '../types/default_boolean_true'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { DefaultVersionNumber } from '../types/default_version_number'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; +import { DefaultUuid } from '../types/default_uuid'; + +export const createRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + }) + ), + t.exact( + t.partial({ + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanTrue, // defaults to true if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + rule_id: DefaultUuid, + index, // defaults to undefined if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + // TODO: output_index: This should be removed eventually + output_index, // defaults to "undefined" if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + version: DefaultVersionNumber, // defaults to 1 if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + }) + ), +]); + +export type CreateRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type CreateRulesSchemaDecoded = Omit< + CreateRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'version' + | 'exceptions_list' + | 'rule_id' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + version: Version; + exceptions_list: ListsDefaultArraySchema; + rule_id: RuleId; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..ebf0b2e591ca9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getCreateRulesSchemaMock } from './create_rules_schema.mock'; +import { CreateRulesSchema } from './create_rules_schema'; +import { createRuleValidateTypeDependents } from './create_rules_type_dependents'; + +describe('create_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: CreateRulesSchema = { ...getCreateRulesSchemaMock(), type: 'saved_query' }; + delete schema.saved_id; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: CreateRulesSchema = { + ...getCreateRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = createRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts new file mode 100644 index 0000000000000..aad2a2c4a9206 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_type_dependents.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CreateRulesSchema } from './create_rules_schema'; + +export const validateAnomalyThreshold = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: CreateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: CreateRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: CreateRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const createRuleValidateTypeDependents = (schema: CreateRulesSchema): string[] => { + return [ + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts new file mode 100644 index 0000000000000..3e9799a5ad2f9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.test.ts @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + exportRulesQuerySchema, + exportRulesSchema, + ExportRulesSchema, + ExportRulesQuerySchema, + ExportRulesQuerySchemaDecoded, +} from './export_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('create rules schema', () => { + describe('exportRulesSchema', () => { + test('null value or absent values validate', () => { + const payload: Partial = null; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('empty object does not validate', () => { + const payload = {}; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + // TODO: Change formatter to display a better value than [object Object] + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "objects"', + 'Invalid value "[object Object]" supplied to ""', + ]); + expect(message.schema).toEqual(payload); + }); + + test('empty object array does validate', () => { + const payload: ExportRulesSchema = { objects: [] }; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('array with rule_id validates', () => { + const payload: ExportRulesSchema = { objects: [{ rule_id: 'test-1' }] }; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('array with id does not validate as we do not allow that on purpose since we export rule_id', () => { + const payload: Omit & { objects: [{ id: string }] } = { + objects: [{ id: '4a7ff83d-3055-4bb2-ba68-587b9c6c15a4' }], + }; + + const decoded = exportRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + // TODO: Change formatter to display a better value than [object Object] + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "objects,rule_id"', + 'Invalid value "[object Object]" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + }); + + describe('exportRulesQuerySchema', () => { + test('default value for file_name is export.ndjson and default for exclude_export_details is false', () => { + const payload: Partial = {}; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ExportRulesQuerySchemaDecoded = { + file_name: 'export.ndjson', + exclude_export_details: false, + }; + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(expected); + }); + + test('file_name validates', () => { + const payload: ExportRulesQuerySchema = { + file_name: 'test.ndjson', + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ExportRulesQuerySchemaDecoded = { + file_name: 'test.ndjson', + exclude_export_details: false, + }; + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(expected); + }); + + test('file_name does not validate with a number', () => { + const payload: Omit & { file_name: number } = { + file_name: 10, + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "10" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('exclude_export_details validates with a boolean true', () => { + const payload: ExportRulesQuerySchema = { + exclude_export_details: true, + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ExportRulesQuerySchemaDecoded = { + exclude_export_details: true, + file_name: 'export.ndjson', + }; + expect(message.schema).toEqual(expected); + }); + + test('exclude_export_details does not validate with a string', () => { + const payload: Omit & { + exclude_export_details: string; + } = { + exclude_export_details: 'invalid string', + }; + + const decoded = exportRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "invalid string" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts new file mode 100644 index 0000000000000..75fa2da92b787 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { rule_id, FileName, ExcludeExportDetails } from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultExportFileName } from '../types/default_export_file_name'; +import { DefaultStringBooleanFalse } from '../types/default_string_boolean_false'; + +const objects = t.array(t.exact(t.type({ rule_id }))); +export const exportRulesSchema = t.union([t.exact(t.type({ objects })), t.null]); +export type ExportRulesSchema = t.TypeOf; +export type ExportRulesSchemaDecoded = ExportRulesSchema; + +export const exportRulesQuerySchema = t.exact( + t.partial({ file_name: DefaultExportFileName, exclude_export_details: DefaultStringBooleanFalse }) +); + +export type ExportRulesQuerySchema = t.TypeOf; + +export type ExportRulesQuerySchemaDecoded = Omit< + ExportRulesQuerySchema, + 'file_name' | 'exclude_export_details' +> & { + file_name: FileName; + exclude_export_details: ExcludeExportDetails; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts new file mode 100644 index 0000000000000..1969d9d798d23 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_statuses_schema.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +export const findRulesStatusesSchema = t.exact( + t.type({ + ids: t.array(t.string), + }) +); + +export type FindRulesStatusesSchema = t.TypeOf; + +export type FindRulesStatusesSchemaDecoded = FindRulesStatusesSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts new file mode 100644 index 0000000000000..e86e67e47e460 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rule_type_dependents.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FindRulesSchema } from './find_rules_schema'; +import { findRuleValidateTypeDependents } from './find_rules_type_dependents'; + +describe('find_rules_type_dependents', () => { + test('You can have an empty sort_field and empty sort_order', () => { + const schema: FindRulesSchema = {}; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You can have both a sort_field and and a sort_order', () => { + const schema: FindRulesSchema = { + sort_field: 'some field', + sort_order: 'asc', + }; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot have sort_field without sort_order', () => { + const schema: FindRulesSchema = { + sort_field: 'some field', + }; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([ + 'when "sort_order" and "sort_field" must exist together or not at all', + ]); + }); + + test('You cannot have sort_order without sort_field', () => { + const schema: FindRulesSchema = { + sort_order: 'asc', + }; + const errors = findRuleValidateTypeDependents(schema); + expect(errors).toEqual([ + 'when "sort_order" and "sort_field" must exist together or not at all', + ]); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts new file mode 100644 index 0000000000000..46e6ee82055a5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.test.ts @@ -0,0 +1,198 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { FindRulesSchema, findRulesSchema } from './find_rules_schema'; + +describe('find_rules_schema', () => { + test('empty objects do validate', () => { + const payload: FindRulesSchema = {}; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({ + page: 1, + per_page: 20, + }); + }); + + test('all values validate', () => { + const payload: FindRulesSchema = { + per_page: 5, + page: 1, + sort_field: 'some field', + fields: ['field 1', 'field 2'], + filter: 'some filter', + sort_order: 'asc', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('made up parameters do not validate', () => { + const payload: Partial & { madeUp: string } = { madeUp: 'invalid value' }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('per_page validates', () => { + const payload: FindRulesSchema = { + per_page: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).per_page).toEqual(payload.per_page); + }); + + test('page validates', () => { + const payload: FindRulesSchema = { + page: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).page).toEqual(payload.page); + }); + + test('sort_field validates', () => { + const payload: FindRulesSchema = { + sort_field: 'value', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).sort_field).toEqual('value'); + }); + + test('fields validates with a string', () => { + const payload: FindRulesSchema = { + fields: ['some value'], + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).fields).toEqual(payload.fields); + }); + + test('fields validates with multiple strings', () => { + const payload: FindRulesSchema = { + fields: ['some value 1', 'some value 2'], + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).fields).toEqual(payload.fields); + }); + + test('fields does not validate with a number', () => { + const payload: Omit & { fields: number } = { + fields: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "fields"']); + expect(message.schema).toEqual({}); + }); + + test('per_page has a default of 20', () => { + const payload: FindRulesSchema = {}; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).per_page).toEqual(20); + }); + + test('page has a default of 1', () => { + const payload: FindRulesSchema = {}; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).page).toEqual(1); + }); + + test('filter works with a string', () => { + const payload: FindRulesSchema = { + filter: 'some value 1', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).filter).toEqual(payload.filter); + }); + + test('filter does not work with a number', () => { + const payload: Omit & { filter: number } = { + filter: 5, + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "filter"']); + expect(message.schema).toEqual({}); + }); + + test('sort_order validates with desc and sort_field', () => { + const payload: FindRulesSchema = { + sort_order: 'desc', + sort_field: 'some field', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as FindRulesSchema).sort_order).toEqual(payload.sort_order); + expect((message.schema as FindRulesSchema).sort_field).toEqual(payload.sort_field); + }); + + test('sort_order does not validate with a string other than asc and desc', () => { + const payload: Omit & { sort_order: string } = { + sort_order: 'some other string', + sort_field: 'some field', + }; + + const decoded = findRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some other string" supplied to "sort_order"', + ]); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts new file mode 100644 index 0000000000000..87076803c9582 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { queryFilter, fields, sort_field, sort_order, PerPage, Page } from '../common/schemas'; +import { DefaultPerPage } from '../types/default_per_page'; +import { DefaultPage } from '../types/default_page'; +/* eslint-enable @typescript-eslint/camelcase */ + +export const findRulesSchema = t.exact( + t.partial({ + fields, + filter: queryFilter, + per_page: DefaultPerPage, // defaults to "20" if not sent in during decode + page: DefaultPage, // defaults to "1" if not sent in during decode + sort_field, + sort_order, + }) +); + +export type FindRulesSchema = t.TypeOf; +export type FindRulesSchemaDecoded = Omit & { + per_page: PerPage; + page: Page; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts new file mode 100644 index 0000000000000..6916f102e4f57 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_type_dependents.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FindRulesSchema } from './find_rules_schema'; + +export const validateSortOrder = (find: FindRulesSchema): string[] => { + if (find.sort_order != null || find.sort_field != null) { + if (find.sort_order == null || find.sort_field == null) { + return ['when "sort_order" and "sort_field" must exist together or not at all']; + } else { + return []; + } + } else { + return []; + } +}; + +export const findRuleValidateTypeDependents = (schema: FindRulesSchema): string[] => { + return [...validateSortOrder(schema)]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts new file mode 100644 index 0000000000000..92fab202c9ddc --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.mock.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ImportRulesSchema, ImportRulesSchemaDecoded } from './import_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getImportRulesSchemaMock = (): ImportRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getImportRulesSchemaDecodedMock = (): ImportRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + rule_id: 'rule-1', + immutable: false, +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts new file mode 100644 index 0000000000000..be2c3e046fe91 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts @@ -0,0 +1,1579 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; +import { + ImportRulesSchema, + importRulesSchema, + ImportRulesSchemaDecoded, + importRulesQuerySchema, + ImportRulesQuerySchema, + importRulesPayloadSchema, + ImportRulesPayloadSchema, +} from './import_rules_schema'; +import { + getImportRulesSchemaMock, + getImportRulesSchemaDecodedMock, +} from './import_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('import rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + 'Invalid value "undefined" supplied to "rule_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: ImportRulesSchema & { madeUp: string } = { + ...getImportRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + immutable: false, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + threat: [], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + immutable: false, + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getImportRulesSchemaMock(); + const decoded = importRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getImportRulesSchemaMock(), + references: [5], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getImportRulesSchemaMock(), + index: [5], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noInterval, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { interval: expectedInterval, ...expectedNoInterval } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noMaxSignals, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + filters: [], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getImportRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getImportRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getImportRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getImportRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getImportRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getImportRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { false_positives: number[] } = { + ...getImportRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to a number when trying to create a rule', () => { + const payload: Omit & { immutable: number } = { + ...getImportRulesSchemaMock(), + immutable: 5, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You can optionally set the immutable to be false', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + immutable: false, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(getImportRulesSchemaDecodedMock()); + }); + + test('You cannot set the immutable to be true', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + immutable: true, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "true" supplied to "immutable"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to be a number', () => { + const payload: Omit & { immutable: number } = { + ...getImportRulesSchemaMock(), + immutable: 5, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to 101', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getImportRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('rule_id is required and you cannot get by with just id', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + }; + delete payload.rule_id; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "rule_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it validates with created_at, updated_at, created_by, updated_by values', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + created_at: '2020-01-09T06:15:24.749Z', + updated_at: '2020-01-09T06:15:24.749Z', + created_by: 'Braden Hassanabad', + updated_by: 'Evan Hassanabad', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + created_at: '2020-01-09T06:15:24.749Z', + updated_at: '2020-01-09T06:15:24.749Z', + created_by: 'Braden Hassanabad', + updated_by: 'Evan Hassanabad', + }; + expect(message.schema).toEqual(expected); + }); + + test('it does not validate with epoch strings for created_at', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + created_at: '1578550728650', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "1578550728650" supplied to "created_at"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it does not validate with epoch strings for updated_at', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + updated_at: '1578550728650', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "1578550728650" supplied to "updated_at"', + ]); + expect(message.schema).toEqual({}); + }); + + describe('importRulesQuerySchema', () => { + test('overwrite gets a default value of false', () => { + const payload: ImportRulesQuerySchema = {}; + + const decoded = importRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({ + overwrite: false, + }); + }); + + test('overwrite validates with a boolean true', () => { + const payload: ImportRulesQuerySchema = { overwrite: true }; + + const decoded = importRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({ + overwrite: true, + }); + }); + + test('overwrite does not validate with a weird string', () => { + const payload: Omit & { overwrite: string } = { + overwrite: 'invalid-string', + }; + + const decoded = importRulesQuerySchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "invalid-string" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + }); + + describe('importRulesPayloadSchema', () => { + test('does not validate with an empty object', () => { + const payload = {}; + + const decoded = importRulesPayloadSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "file"', + ]); + expect(message.schema).toEqual({}); + }); + + test('does not validate with a made string', () => { + const payload: Omit & { madeUpKey: string } = { + madeUpKey: 'madeupstring', + }; + + const decoded = importRulesPayloadSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "file"', + ]); + expect(message.schema).toEqual({}); + }); + + test('does validate with a file object', () => { + const payload: ImportRulesPayloadSchema = { file: {} }; + + const decoded = importRulesPayloadSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noFrom, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noTo, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getImportRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noActions, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { actions: expectedActions, ...expectedNoActions } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getImportRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getImportRulesSchemaMock(); + const payload: ImportRulesSchema = { + ...noThrottle, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { throttle: expectedThrottle, ...expectedNoThrottle } = getImportRulesSchemaDecodedMock(); + const expected: ImportRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + note: '', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + ...getImportRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot create note as an object', () => { + const payload: Omit & { note: {} } = { + ...getImportRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: ImportRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + }; + + const decoded = importRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: ImportRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: true, + false_positives: [], + immutable: false, + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + version: 1, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts new file mode 100644 index 0000000000000..a2110263e8e51 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts @@ -0,0 +1,180 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + RuleId, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + Version, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, + rule_id, + id, + created_at, + updated_at, + created_by, + updated_by, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanTrue } from '../types/default_boolean_true'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { DefaultVersionNumber } from '../types/default_version_number'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; +import { OnlyFalseAllowed } from '../types/only_false_allowed'; +import { DefaultStringBooleanFalse } from '../types/default_string_boolean_false'; + +/** + * Differences from this and the createRulesSchema are + * - rule_id is required + * - id is optional (but ignored in the import code - rule_id is exclusively used for imports) + * - immutable is optional but if it is any value other than false it will be rejected + * - created_at is optional (but ignored in the import code) + * - updated_at is optional (but ignored in the import code) + * - created_by is optional (but ignored in the import code) + * - updated_by is optional (but ignored in the import code) + */ +export const importRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + rule_id, + }) + ), + t.exact( + t.partial({ + id, // defaults to undefined if not set during decode + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanTrue, // defaults to true if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + index, // defaults to undefined if not set during decode + immutable: OnlyFalseAllowed, // defaults to "false" if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + // TODO: output_index: This should be removed eventually + output_index, // defaults to "undefined" if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + version: DefaultVersionNumber, // defaults to 1 if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + created_at, // defaults "undefined" if not set during decode + updated_at, // defaults "undefined" if not set during decode + created_by, // defaults "undefined" if not set during decode + updated_by, // defaults "undefined" if not set during decode + }) + ), +]); + +export type ImportRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type ImportRulesSchemaDecoded = Omit< + ImportRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'version' + | 'exceptions_list' + | 'rule_id' + | 'immutable' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + version: Version; + exceptions_list: ListsDefaultArraySchema; + rule_id: RuleId; + immutable: false; +}; + +export const importRulesQuerySchema = t.exact( + t.partial({ + overwrite: DefaultStringBooleanFalse, + }) +); + +export type ImportRulesQuerySchema = t.TypeOf; +export type ImportRulesQuerySchemaDecoded = Omit & { + overwrite: boolean; +}; + +export const importRulesPayloadSchema = t.exact( + t.type({ + file: t.object, + }) +); + +export type ImportRulesPayloadSchema = t.TypeOf; + +export type ImportRulesPayloadSchemaDecoded = ImportRulesPayloadSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..f9b989c81e533 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getImportRulesSchemaMock } from './import_rules_schema.mock'; +import { ImportRulesSchema } from './import_rules_schema'; +import { importRuleValidateTypeDependents } from './import_rules_type_dependents'; + +describe('import_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: ImportRulesSchema = { ...getImportRulesSchemaMock(), type: 'saved_query' }; + delete schema.saved_id; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: ImportRulesSchema = { + ...getImportRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = importRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts new file mode 100644 index 0000000000000..59191a4fe3121 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_type_dependents.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ImportRulesSchema } from './import_rules_schema'; + +export const validateAnomalyThreshold = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: ImportRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: ImportRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: ImportRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const importRuleValidateTypeDependents = (schema: ImportRulesSchema): string[] => { + return [ + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts new file mode 100644 index 0000000000000..a388e69332072 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rule_type_dependents.test.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getPatchRulesSchemaMock } from './patch_rules_schema.mock'; +import { PatchRulesSchema } from './patch_rules_schema'; +import { patchRuleValidateTypeDependents } from './patch_rules_type_dependents'; + +describe('patch_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); + + test('You cannot have both an id and a rule_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + id: 'some-id', + rule_id: 'some-rule-id', + }; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['both "id" and "rule_id" cannot exist, choose one or the other']); + }); + + test('You must set either an id or a rule_id', () => { + const schema: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + }; + delete schema.id; + delete schema.rule_id; + const errors = patchRuleValidateTypeDependents(schema); + expect(errors).toEqual(['either "id" or "rule_id" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..7b86c02e5c475 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.test.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { patchRulesBulkSchema, PatchRulesBulkSchema } from './patch_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { formatErrors } from '../../../format_errors'; +import { PatchRulesSchema } from './patch_rules_schema'; + +// only the basics of testing are here. +// see: patch_rules_schema.test.ts for the bulk of the validation tests +// this just wraps patchRulesSchema in an array +describe('patch_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: PatchRulesBulkSchema = []; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(output.errors).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('made up values do not validate for a single element', () => { + const payload: Array<{ madeUp: string }> = [{ madeUp: 'hi' }]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUp"']); + expect(output.schema).toEqual({}); + }); + + test('single array of [id] does validate', () => { + const payload: PatchRulesBulkSchema = [{ id: '4125761e-51da-4de9-a0c8-42824f532ddb' }]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('two arrays of [id] validate', () => { + const payload: PatchRulesBulkSchema = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { id: '192f403d-b285-4251-9e8b-785fcfcf22e8' }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('can set "note" to be a string', () => { + const payload: PatchRulesBulkSchema = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { note: 'hi' }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('can set "note" to be an empty string', () => { + const payload: PatchRulesBulkSchema = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { note: '' }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('cannot set "note" to be anything other than a string', () => { + const payload: Array & { note?: object }> = [ + { id: '4125761e-51da-4de9-a0c8-42824f532ddb' }, + { note: { someprop: 'some value here' } }, + ]; + + const decoded = patchRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + // TODO: Fix the formatter to give something better than [object Object] + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(output.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts new file mode 100644 index 0000000000000..272e36751e37b --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { patchRulesSchema, PatchRulesSchemaDecoded } from './patch_rules_schema'; + +export const patchRulesBulkSchema = t.array(patchRulesSchema); +export type PatchRulesBulkSchema = t.TypeOf; + +export type PatchRulesBulkSchemaDecoded = PatchRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts new file mode 100644 index 0000000000000..7b4f632cdebf0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.mock.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PatchRulesSchema, PatchRulesSchemaDecoded } from './patch_rules_schema'; + +export const getPatchRulesSchemaMock = (): PatchRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getPatchRulesSchemaDecodedMock = (): PatchRulesSchemaDecoded => + getPatchRulesSchemaMock(); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts new file mode 100644 index 0000000000000..921e07a29609c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts @@ -0,0 +1,1153 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { patchRulesSchema, PatchRulesSchema, PatchRulesSchemaDecoded } from './patch_rules_schema'; +import { getPatchRulesSchemaMock, getPatchRulesSchemaDecodedMock } from './patch_rules_schema.mock'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('patch_rules_schema', () => { + test('made up values do not validate', () => { + const payload: PatchRulesSchema & { madeUp: string } = { + ...getPatchRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[id] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, risk_score] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + risk_score: 10, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + risk_score: 10, + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name, severity] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name, severity] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name, severity, type] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name, severity, type] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, name, severity, type, interval] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + expect(message.schema).toEqual(expected); + }); + + test('[id, description, from, to, index, name, severity, type, filters] does validate', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, type, filters] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as a valid value to patch with', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: ['index-1'], + query: 'some query', + language: 'kuery', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: ['index-1'], + query: 'some query', + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('does not default references to an array', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).references).toEqual(undefined); + }); + + test('does not default interval', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).interval).toEqual(undefined); + }); + + test('does not default max_signals', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).max_signals).toEqual(undefined); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + references: [5], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "references"']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + index: [5], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('saved_id is not required when type is saved_query and will validate without it', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + type: 'saved_query', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + type: 'saved_query', + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_id validates with type:saved_query', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + type: 'saved_query', + saved_id: 'some id', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + type: 'saved_query', + saved_id: 'some id', + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + saved_id: 'some id', + filters: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + saved_id: 'some id', + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with kuery', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + language: 'kuery', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + query: 'some query', + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + language: 'lucene', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + query: 'some query', + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getPatchRulesSchemaMock(), + query: 'some query', + language: 'something-made-up', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + max_signals: -1, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "-1" supplied to "max_signals"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + max_signals: 0, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to "max_signals"']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + query: 'some query', + max_signals: 1, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + query: 'some query', + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('meta can be patched', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + meta: { whateverYouWant: 'anything_at_all' }, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + meta: { whateverYouWant: 'anything_at_all' }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot patch meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getPatchRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getPatchRulesSchemaMock(), + filters: 'should not work', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('threat is not defaulted to empty array on patch', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).threat).toEqual(undefined); + }); + + test('threat is not defaulted to undefined on patch with empty array', () => { + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat: [], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect((message.schema as PatchRulesSchemaDecoded).threat).toEqual([]); + }); + + test('threat is valid when updated with all sub-objects', () => { + const threat: PatchRulesSchema['threat'] = [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ]; + const payload: PatchRulesSchema = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('threat is invalid when updated with missing property framework', () => { + const threat: Omit = [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ]; + const payload: Omit = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "threat,framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('threat is invalid when updated with missing tactic sub-object', () => { + const threat: Omit = [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ]; + + const payload: Omit = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "threat,tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('threat is invalid when updated with missing technique', () => { + const threat: Omit = [ + { + framework: 'fake', + tactic: { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + }, + ]; + + const payload: Omit = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + threat, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "threat,technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: PatchRulesSchema = { + ...getPatchRulesSchemaMock(), + timeline_id: 'some-id', + timeline_title: 'some-title', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + ...getPatchRulesSchemaDecodedMock(), + timeline_id: 'some-id', + timeline_title: 'some-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + severity: 'junk', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + describe('note', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, note] does validate', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + note: '# some documentation markdown', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + note: '# some documentation markdown', + }; + expect(message.schema).toEqual(expected); + }); + + test('note can be patched', () => { + const payload: PatchRulesSchema = { + rule_id: 'rule-1', + note: '# new documentation markdown', + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: PatchRulesSchemaDecoded = { + rule_id: 'rule-1', + note: '# new documentation markdown', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot patch note as an object', () => { + const payload: Omit & { note: object } = { + id: 'b8f95e17-681f-407f-8a5e-b832a77d3831', + note: { + someProperty: 'something else here', + }, + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + // TODO: Change the formatter to output something more readable than [object Object] + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getPatchRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = patchRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "actions,action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts new file mode 100644 index 0000000000000..605e0272bbb4c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + rule_id, + name, + severity, + type, + note, + version, + actions, + false_positives, + interval, + max_signals, + from, + enabled, + tags, + threat, + throttle, + references, + to, + language, + listAndOrUndefined, + query, + id, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +/** + * All of the patch elements should default to undefined if not set + */ +export const patchRulesSchema = t.exact( + t.partial({ + description, + risk_score, + name, + severity, + type, + id, + actions, + anomaly_threshold, + enabled, + false_positives, + filters, + from, + rule_id, + index, + interval, + query, + language, + // TODO: output_index: This should be removed eventually + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + max_signals, + tags, + to, + threat, + throttle, + references, + note, + version, + exceptions_list: listAndOrUndefined, + }) +); + +export type PatchRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type PatchRulesSchemaDecoded = PatchRulesSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts new file mode 100644 index 0000000000000..554cdb822762f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_type_dependents.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PatchRulesSchema } from './patch_rules_schema'; + +export const validateQuery = (rule: PatchRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: PatchRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: PatchRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: PatchRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateId = (rule: PatchRulesSchema): string[] => { + if (rule.id != null && rule.rule_id != null) { + return ['both "id" and "rule_id" cannot exist, choose one or the other']; + } else if (rule.id == null && rule.rule_id == null) { + return ['either "id" or "rule_id" must be set']; + } else { + return []; + } +}; + +export const patchRuleValidateTypeDependents = (schema: PatchRulesSchema): string[] => { + return [ + ...validateId(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..4728f7dd84cbd --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.test.ts @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { queryRulesBulkSchema, QueryRulesBulkSchema } from './query_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { formatErrors } from '../../../format_errors'; + +// only the basics of testing are here. +// see: query_rules_schema.test.ts for the bulk of the validation tests +// this just wraps queryRulesSchema in an array +describe('query_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: QueryRulesBulkSchema = []; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('non uuid being supplied to id does not validate', () => { + const payload: QueryRulesBulkSchema = [ + { + id: '1', + }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['Invalid value "1" supplied to "id"']); + expect(output.schema).toEqual({}); + }); + + test('both rule_id and id being supplied do validate', () => { + const payload: QueryRulesBulkSchema = [ + { + rule_id: '1', + id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f', + }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('only id validates with two elements', () => { + const payload: QueryRulesBulkSchema = [ + { id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + { id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('only rule_id validates', () => { + const payload: QueryRulesBulkSchema = [{ rule_id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('only rule_id validates with two elements', () => { + const payload: QueryRulesBulkSchema = [ + { rule_id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + { rule_id: '2' }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); + + test('both id and rule_id validates with two separate elements', () => { + const payload: QueryRulesBulkSchema = [ + { id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f' }, + { rule_id: '2' }, + ]; + + const decoded = queryRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual(payload); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts new file mode 100644 index 0000000000000..a5611bdc2f12f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { queryRulesSchema, QueryRulesSchemaDecoded } from './query_rules_schema'; + +export const queryRulesBulkSchema = t.array(queryRulesSchema); +export type QueryRulesBulkSchema = t.TypeOf; + +export type QueryRulesBulkSchemaDecoded = QueryRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts new file mode 100644 index 0000000000000..c9cb6f310961a --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { queryRulesSchema, QueryRulesSchema } from './query_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('query_rules_schema', () => { + test('empty objects do validate', () => { + const payload: Partial = {}; + + const decoded = queryRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts similarity index 54% rename from x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts index 86a731699d1ea..cb8f21128b052 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts @@ -4,13 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import Joi from 'joi'; +import * as t from 'io-ts'; /* eslint-disable @typescript-eslint/camelcase */ -import { rule_id, id } from './schemas'; +import { rule_id, id } from '../common/schemas'; /* eslint-enable @typescript-eslint/camelcase */ -export const queryRulesSchema = Joi.object({ - rule_id, - id, -}).xor('id', 'rule_id'); +export const queryRulesSchema = t.exact( + t.partial({ + rule_id, + id, + }) +); + +export type QueryRulesSchema = t.TypeOf; +export type QueryRulesSchemaDecoded = QueryRulesSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..ad7f368d4eede --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.test.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { QueryRulesSchema } from './query_rules_schema'; +import { queryRuleValidateTypeDependents } from './query_rules_type_dependents'; + +describe('query_rules_type_dependents', () => { + test('You cannot have both an id and a rule_id', () => { + const schema: QueryRulesSchema = { + id: 'some-id', + rule_id: 'some-rule-id', + }; + const errors = queryRuleValidateTypeDependents(schema); + expect(errors).toEqual(['both "id" and "rule_id" cannot exist, choose one or the other']); + }); + + test('You must set either an id or a rule_id', () => { + const schema: QueryRulesSchema = {}; + const errors = queryRuleValidateTypeDependents(schema); + expect(errors).toEqual(['either "id" or "rule_id" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts new file mode 100644 index 0000000000000..f3e602dff0f06 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_type_dependents.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { QueryRulesSchema } from './query_rules_schema'; + +export const validateId = (rule: QueryRulesSchema): string[] => { + if (rule.id != null && rule.rule_id != null) { + return ['both "id" and "rule_id" cannot exist, choose one or the other']; + } else if (rule.id == null && rule.rule_id == null) { + return ['either "id" or "rule_id" must be set']; + } else { + return []; + } +}; + +export const queryRuleValidateTypeDependents = (schema: QueryRulesSchema): string[] => { + return [...validateId(schema)]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts new file mode 100644 index 0000000000000..23e5fa7e721b0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { QuerySignalsSchema, querySignalsSchema } from './query_signals_index_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('query, aggs, size, _source and track_total_hits on signals index', () => { + test('query, aggs, size, _source and track_total_hits simultaneously', () => { + const payload: QuerySignalsSchema = { + query: {}, + aggs: {}, + size: 1, + track_total_hits: true, + _source: ['field'], + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('query, only', () => { + const payload: QuerySignalsSchema = { + query: {}, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('aggs only', () => { + const payload: QuerySignalsSchema = { + aggs: {}, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('size only', () => { + const payload: QuerySignalsSchema = { + size: 1, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('track_total_hits only', () => { + const payload: QuerySignalsSchema = { + track_total_hits: true, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('_source only', () => { + const payload: QuerySignalsSchema = { + _source: ['field'], + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts new file mode 100644 index 0000000000000..3a050c9208f77 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { PositiveIntegerGreaterThanZero } from '../types/positive_integer_greater_than_zero'; + +export const querySignalsSchema = t.exact( + t.partial({ + query: t.object, + aggs: t.object, + size: PositiveIntegerGreaterThanZero, + track_total_hits: t.boolean, + _source: t.array(t.string), + }) +); + +export type QuerySignalsSchema = t.TypeOf; +export type QuerySignalsSchemaDecoded = QuerySignalsSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts new file mode 100644 index 0000000000000..dc889892ba83e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.test.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setSignalsStatusSchema, SetSignalsStatusSchema } from './set_signal_status_schema'; +import { exactCheck } from '../../../exact_check'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { left } from 'fp-ts/lib/Either'; + +describe('set signal status schema', () => { + test('signal_ids and status is valid', () => { + const payload: SetSignalsStatusSchema = { + signal_ids: ['somefakeid'], + status: 'open', + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('query and status is valid', () => { + const payload: SetSignalsStatusSchema = { + query: {}, + status: 'open', + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('signal_ids and missing status is invalid', () => { + const payload: Omit = { + signal_ids: ['somefakeid'], + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "status"', + ]); + expect(message.schema).toEqual({}); + }); + + test('query and missing status is invalid', () => { + const payload: Omit = { + query: {}, + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "status"', + ]); + expect(message.schema).toEqual({}); + }); + + test('signal_ids is present but status has wrong value', () => { + const payload: Omit & { status: 'fakeVal' } = { + query: {}, + status: 'fakeVal', + }; + + const decoded = setSignalsStatusSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "fakeVal" supplied to "status"', + ]); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts new file mode 100644 index 0000000000000..0e922aeaf8cdf --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { signal_ids, signal_status_query, status } from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +export const setSignalsStatusSchema = t.intersection([ + t.type({ + status, + }), + t.partial({ + signal_ids, + query: signal_status_query, + }), +]); + +export type SetSignalsStatusSchema = t.TypeOf; +export type SetSignalsStatusSchemaDecoded = SetSignalsStatusSchema; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts new file mode 100644 index 0000000000000..b79af2fef5c97 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.test.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setSignalStatusValidateTypeDependents } from './set_signal_status_type_dependents'; +import { SetSignalsStatusSchema } from './set_signal_status_schema'; + +describe('update_rules_type_dependents', () => { + test('You can have just a "signals_id"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + signal_ids: ['some-id'], + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You can have just a "query"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + query: {}, + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot have both a "signals_id" and a "query"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + query: {}, + signal_ids: ['some-id'], + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual(['both "signal_ids" and "query" cannot exist, choose one or the other']); + }); + + test('You must set either an "signals_id" and a "query"', () => { + const schema: SetSignalsStatusSchema = { + status: 'open', + }; + const errors = setSignalStatusValidateTypeDependents(schema); + expect(errors).toEqual(['either "signal_ids" or "query" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts new file mode 100644 index 0000000000000..c495860fa72bf --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_type_dependents.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SetSignalsStatusSchema } from './set_signal_status_schema'; + +export const validateId = (signalStatus: SetSignalsStatusSchema): string[] => { + if (signalStatus.signal_ids != null && signalStatus.query != null) { + return ['both "signal_ids" and "query" cannot exist, choose one or the other']; + } else if (signalStatus.signal_ids == null && signalStatus.query == null) { + return ['either "signal_ids" or "query" must be set']; + } else { + return []; + } +}; + +export const setSignalStatusValidateTypeDependents = (schema: SetSignalsStatusSchema): string[] => { + return [...validateId(schema)]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts new file mode 100644 index 0000000000000..edc652ce3b3f4 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.test.ts @@ -0,0 +1,277 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { updateRulesBulkSchema, UpdateRulesBulkSchema } from './update_rules_bulk_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight } from '../../../test_utils'; +import { formatErrors } from '../../../format_errors'; +import { + getUpdateRulesSchemaMock, + getUpdateRulesSchemaDecodedMock, +} from './update_rules_schema.mock'; +import { UpdateRulesSchema } from './update_rules_schema'; + +// only the basics of testing are here. +// see: update_rules_schema.test.ts for the bulk of the validation tests +// this just wraps updateRulesSchema in an array +describe('update_rules_bulk_schema', () => { + test('can take an empty array and validate it', () => { + const payload: UpdateRulesBulkSchema = []; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(output.errors).toEqual([]); + expect(output.schema).toEqual([]); + }); + + test('made up values do not validate for a single element', () => { + const payload: Array<{ madeUp: string }> = [{ madeUp: 'hi' }]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(output.schema).toEqual({}); + }); + + test('single array element does validate', () => { + const payload: UpdateRulesBulkSchema = [getUpdateRulesSchemaMock()]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([getUpdateRulesSchemaDecodedMock()]); + }); + + test('two array elements do validate', () => { + const payload: UpdateRulesBulkSchema = [getUpdateRulesSchemaMock(), getUpdateRulesSchemaMock()]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + getUpdateRulesSchemaDecodedMock(), + getUpdateRulesSchemaDecodedMock(), + ]); + }); + + test('single array element with a missing value (risk_score) will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is valid but the second is invalid (risk_score) will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + const secondItem = getUpdateRulesSchemaMock(); + delete secondItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (risk_score) but the second is valid will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + const secondItem = getUpdateRulesSchemaMock(); + delete singleItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (risk_score) will not validate', () => { + const singleItem = getUpdateRulesSchemaMock(); + const secondItem = getUpdateRulesSchemaMock(); + delete singleItem.risk_score; + delete secondItem.risk_score; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the first is invalid (extra key and value) but the second is valid will not validate', () => { + const singleItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where the second is invalid (extra key and value) but the first is valid will not validate', () => { + const singleItem: UpdateRulesSchema = getUpdateRulesSchemaMock(); + const secondItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('two array elements where both are invalid (extra key and value) will not validate', () => { + const singleItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const secondItem: UpdateRulesSchema & { madeUpValue: string } = { + ...getUpdateRulesSchemaMock(), + madeUpValue: 'something', + }; + const payload: UpdateRulesBulkSchema = [singleItem, secondItem]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['invalid keys "madeUpValue,madeUpValue"']); + expect(output.schema).toEqual({}); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...withoutFrom } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutFrom]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].from).toEqual('now-6m'); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...withoutTo } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutTo]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].to).toEqual('now'); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const badSeverity = { ...getUpdateRulesSchemaMock(), severity: 'madeup' }; + const payload = [badSeverity]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual(['Invalid value "madeup" supplied to "severity"']); + expect(output.schema).toEqual({}); + }); + + test('You can set "note" to a string', () => { + const payload: UpdateRulesBulkSchema = [ + { ...getUpdateRulesSchemaMock(), note: '# test markdown' }, + ]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([ + { ...getUpdateRulesSchemaDecodedMock(), note: '# test markdown' }, + ]); + }); + + test('You can set "note" to an empty string', () => { + const payload: UpdateRulesBulkSchema = [{ ...getUpdateRulesSchemaMock(), note: '' }]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect(output.schema).toEqual([{ ...getUpdateRulesSchemaDecodedMock(), note: '' }]); + }); + + test('You can set "note" to anything other than string', () => { + const payload = [ + { + ...getUpdateRulesSchemaMock(), + note: { + something: 'some object', + }, + }, + ]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + // TODO: We should change the formatter used to better print objects + expect(formatErrors(output.errors)).toEqual([ + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(output.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...withoutActions } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutActions]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].actions).toEqual([]); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...withoutThrottle } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesBulkSchema = [withoutThrottle]; + + const decoded = updateRulesBulkSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const output = foldLeftRight(checked); + expect(formatErrors(output.errors)).toEqual([]); + expect((output.schema as UpdateRulesBulkSchema)[0].throttle).toEqual(null); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts new file mode 100644 index 0000000000000..429103c7df13e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_bulk_schema.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +import { updateRulesSchema, UpdateRulesSchemaDecoded } from './update_rules_schema'; + +export const updateRulesBulkSchema = t.array(updateRulesSchema); +export type UpdateRulesBulkSchema = t.TypeOf; + +export type UpdateRulesBulkSchemaDecoded = UpdateRulesSchemaDecoded[]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts new file mode 100644 index 0000000000000..b8a99115ba7d5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.mock.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UpdateRulesSchema, UpdateRulesSchemaDecoded } from './update_rules_schema'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +export const getUpdateRulesSchemaMock = (): UpdateRulesSchema => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', +}); + +export const getUpdateRulesSchemaDecodedMock = (): UpdateRulesSchemaDecoded => ({ + description: 'some description', + name: 'Query with a rule id', + query: 'user.name: root or user.name: admin', + severity: 'high', + type: 'query', + risk_score: 55, + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + from: 'now-6m', + interval: '5m', + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + to: 'now', + threat: [], + throttle: null, + exceptions_list: [], + rule_id: 'rule-1', +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts new file mode 100644 index 0000000000000..e60522e1964f4 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts @@ -0,0 +1,1387 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + updateRulesSchema, + UpdateRulesSchema, + UpdateRulesSchemaDecoded, +} from './update_rules_schema'; +import { exactCheck } from '../../../exact_check'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { + getUpdateRulesSchemaMock, + getUpdateRulesSchemaDecodedMock, +} from './update_rules_schema.mock'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('update rules schema', () => { + test('empty objects do not validate', () => { + const payload: Partial = {}; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('made up values do not validate', () => { + const payload: UpdateRulesSchema & { madeUp: string } = { + ...getUpdateRulesSchemaMock(), + madeUp: 'hi', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "madeUp"']); + expect(message.schema).toEqual({}); + }); + + test('[rule_id] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "description"', + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "name"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "severity"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + 'Invalid value "undefined" supplied to "type"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + interval: '5m', + index: ['index-1'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + name: 'some-name', + severity: 'low', + type: 'query', + query: 'some query', + index: ['index-1'], + interval: '5m', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { + const payload: Partial = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + query: 'some query', + language: 'kuery', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You can send in an empty array to threat', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + threat: [], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + threat: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + threat: [ + { + framework: 'someFramework', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('allows references to be sent as valid', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + references: ['index-1'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + references: ['index-1'], + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults references to an array if it is not sent in', () => { + const { references, ...noReferences } = getUpdateRulesSchemaMock(); + const decoded = updateRulesSchema.decode(noReferences); + const checked = exactCheck(noReferences, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + references: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('references cannot be numbers', () => { + const payload: Omit & { references: number[] } = { + ...getUpdateRulesSchemaMock(), + references: [5], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('indexes cannot be numbers', () => { + const payload: Omit & { index: number[] } = { + ...getUpdateRulesSchemaMock(), + index: [5], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to "index"']); + expect(message.schema).toEqual({}); + }); + + test('defaults interval to 5 min', () => { + const { interval, ...noInterval } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noInterval, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { interval: expectedInterval, ...expectedNoInterval } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoInterval, + interval: '5m', + }; + expect(message.schema).toEqual(expected); + }); + + test('defaults max signals to 100', () => { + const { max_signals, ...noMaxSignals } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noMaxSignals, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { + max_signals: expectedMaxSignals, + ...expectedNoMaxSignals + } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoMaxSignals, + max_signals: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('saved_query type can have filters with it', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + filters: [], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('filters cannot be a string', () => { + const payload: Omit & { filters: string } = { + ...getUpdateRulesSchemaMock(), + filters: 'some string', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "some string" supplied to "filters"', + ]); + expect(message.schema).toEqual({}); + }); + + test('language validates with kuery', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + language: 'kuery', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + language: 'kuery', + }; + expect(message.schema).toEqual(expected); + }); + + test('language validates with lucene', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + language: 'lucene', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + language: 'lucene', + }; + expect(message.schema).toEqual(expected); + }); + + test('language does not validate with something made up', () => { + const payload: Omit & { language: string } = { + ...getUpdateRulesSchemaMock(), + language: 'something-made-up', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "something-made-up" supplied to "language"', + ]); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be negative', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + max_signals: -1, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals cannot be zero', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + max_signals: 0, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('max_signals can be 1', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + max_signals: 1, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + max_signals: 1, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can optionally send in an array of tags', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + tags: ['tag_1', 'tag_2'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + tags: ['tag_1', 'tag_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of tags that are numbers', () => { + const payload: Omit & { tags: number[] } = { + ...getUpdateRulesSchemaMock(), + tags: [0, 1, 2], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "0" supplied to ""', + 'Invalid value "1" supplied to ""', + 'Invalid value "2" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "framework"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getUpdateRulesSchemaMock(), + threat: [ + { + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "framework"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "tactic"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getUpdateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + technique: [ + { + id: 'techniqueId', + name: 'techniqueName', + reference: 'techniqueRef', + }, + ], + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "tactic"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of threat that are missing "technique"', () => { + const payload: Omit & { + threat: Array>>; + } = { + ...getUpdateRulesSchemaMock(), + threat: [ + { + framework: 'fake', + tactic: { + id: 'fakeId', + name: 'fakeName', + reference: 'fakeRef', + }, + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "technique"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can optionally send in an array of false positives', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + false_positives: ['false_1', 'false_2'], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + false_positives: ['false_1', 'false_2'], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of false positives that are numbers', () => { + const payload: Omit & { false_positives: number[] } = { + ...getUpdateRulesSchemaMock(), + false_positives: [5, 4], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "5" supplied to ""', + 'Invalid value "4" supplied to ""', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the immutable to a number when trying to update a rule', () => { + const payload: Omit & { immutable: number } = { + ...getUpdateRulesSchemaMock(), + immutable: 5, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "immutable"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to 101', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: 101, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "101" supplied to "risk_score"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot set the risk_score to -1', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: -1, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to "risk_score"']); + expect(message.schema).toEqual({}); + }); + + test('You can set the risk_score to 0', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: 0, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + risk_score: 0, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set the risk_score to 100', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + risk_score: 100, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + risk_score: 100, + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set meta to any object you want', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + meta: { + somethingMadeUp: { somethingElse: true }, + }, + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot update meta as a string', () => { + const payload: Omit & { meta: string } = { + ...getUpdateRulesSchemaMock(), + meta: 'should not work', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "should not work" supplied to "meta"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You can omit the query string when filters are present', () => { + const { query, ...noQuery } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noQuery, + filters: [], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { query: expectedQuery, ...expectedNoQuery } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoQuery, + filters: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('validates with timeline_id and timeline_title', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + timeline_id: 'timeline-id', + timeline_title: 'timeline-title', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "from" will be "now-6m"', () => { + const { from, ...noFrom } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noFrom, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { from: expectedFrom, ...expectedNoFrom } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoFrom, + from: 'now-6m', + }; + expect(message.schema).toEqual(expected); + }); + + test('The default for "to" will be "now"', () => { + const { to, ...noTo } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noTo, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { to: expectedTo, ...expectedNoTo } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoTo, + to: 'now', + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot set the severity to a value other than low, medium, high, or critical', () => { + const payload: Omit & { severity: string } = { + ...getUpdateRulesSchemaMock(), + severity: 'junk', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to "severity"']); + expect(message.schema).toEqual({}); + }); + + test('The default for "actions" will be an empty array', () => { + const { actions, ...noActions } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noActions, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { actions: expectedActions, ...expectedNoActions } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoActions, + actions: [], + }; + expect(message.schema).toEqual(expected); + }); + + test('You cannot send in an array of actions that are missing "group"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "group"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "id"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "undefined" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "action_type_id"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', params: {} }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are missing "params"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "params"', + ]); + expect(message.schema).toEqual({}); + }); + + test('You cannot send in an array of actions that are including "actionTypeId"', () => { + const payload: Omit = { + ...getUpdateRulesSchemaMock(), + actions: [ + { + group: 'group', + id: 'id', + actionTypeId: 'actionTypeId', + params: {}, + }, + ], + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "action_type_id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('The default for "throttle" will be null', () => { + const { throttle, ...noThrottle } = getUpdateRulesSchemaMock(); + const payload: UpdateRulesSchema = { + ...noThrottle, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + + const { throttle: expectedThrottle, ...expectedNoThrottle } = getUpdateRulesSchemaDecodedMock(); + const expected: UpdateRulesSchemaDecoded = { + ...expectedNoThrottle, + throttle: null, + }; + expect(message.schema).toEqual(expected); + }); + + describe('note', () => { + test('You can set note to a string', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + note: '# documentation markdown here', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + note: '# documentation markdown here', + }; + expect(message.schema).toEqual(expected); + }); + + test('You can set note to an empty string', () => { + const payload: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + note: '', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + ...getUpdateRulesSchemaDecodedMock(), + note: '', + }; + expect(message.schema).toEqual(expected); + }); + + // Note: If you're looking to remove `note`, omit `note` entirely + test('You cannot set note to null', () => { + const payload: Omit & { note: null } = { + ...getUpdateRulesSchemaMock(), + note: null, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['Invalid value "null" supplied to "note"']); + expect(message.schema).toEqual({}); + }); + + test('You cannot set note as an object', () => { + const payload: Omit & { note: {} } = { + ...getUpdateRulesSchemaMock(), + note: { + somethingHere: 'something else', + }, + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([ + // TODO: Fix/Change the formatErrors to be better able to handle objects + 'Invalid value "[object Object]" supplied to "note"', + ]); + expect(message.schema).toEqual({}); + }); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { + const payload: UpdateRulesSchema = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + }; + + const decoded = updateRulesSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + const expected: UpdateRulesSchemaDecoded = { + rule_id: 'rule-1', + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', + risk_score: 50, + note: '# some markdown', + references: [], + actions: [], + enabled: true, + false_positives: [], + max_signals: DEFAULT_MAX_SIGNALS, + tags: [], + threat: [], + throttle: null, + exceptions_list: [], + }; + expect(message.schema).toEqual(expected); + }); + }); + + // TODO: The exception_list tests are skipped and empty until we re-integrate it from the lists plugin + describe.skip('exception_list', () => { + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => {}); + + test('rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => {}); + + test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => {}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts new file mode 100644 index 0000000000000..504233f95986f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; + +/* eslint-disable @typescript-eslint/camelcase */ +import { + description, + anomaly_threshold, + filters, + RuleId, + index, + output_index, + saved_id, + timeline_id, + timeline_title, + meta, + machine_learning_job_id, + risk_score, + rule_id, + MaxSignals, + name, + severity, + Tags, + To, + type, + Threat, + ThrottleOrNull, + note, + version, + References, + Actions, + Enabled, + FalsePositives, + From, + Interval, + language, + query, + id, +} from '../common/schemas'; +/* eslint-enable @typescript-eslint/camelcase */ + +import { DefaultStringArray } from '../types/default_string_array'; +import { DefaultActionsArray } from '../types/default_actions_array'; +import { DefaultBooleanTrue } from '../types/default_boolean_true'; +import { DefaultFromString } from '../types/default_from_string'; +import { DefaultIntervalString } from '../types/default_interval_string'; +import { DefaultMaxSignalsNumber } from '../types/default_max_signals_number'; +import { DefaultToString } from '../types/default_to_string'; +import { DefaultThreatArray } from '../types/default_threat_array'; +import { DefaultThrottleNull } from '../types/default_throttle_null'; +import { ListsDefaultArray, ListsDefaultArraySchema } from '../types/lists_default_array'; + +/** + * This almost identical to the create_rules_schema except for a few details. + * - The version will not be defaulted to a 1. If it is not given then its default will become the previous version auto-incremented + * This does break idempotency slightly as calls repeatedly without it will increment the number. If the version number is passed in + * this will update the rule's version number. + * - id is on here because you can pass in an id to update using it instead of rule_id. + */ +export const updateRulesSchema = t.intersection([ + t.exact( + t.type({ + description, + risk_score, + name, + severity, + type, + }) + ), + t.exact( + t.partial({ + id, // defaults to "undefined" if not set during decode + actions: DefaultActionsArray, // defaults to empty actions array if not set during decode + anomaly_threshold, // defaults to undefined if not set during decode + enabled: DefaultBooleanTrue, // defaults to true if not set during decode + false_positives: DefaultStringArray, // defaults to empty string array if not set during decode + filters, // defaults to undefined if not set during decode + from: DefaultFromString, // defaults to "now-6m" if not set during decode + rule_id, // defaults to "undefined" if not set during decode + index, // defaults to undefined if not set during decode + interval: DefaultIntervalString, // defaults to "5m" if not set during decode + query, // defaults to undefined if not set during decode + language, // defaults to undefined if not set during decode + // TODO: output_index: This should be removed eventually + output_index, // defaults to "undefined" if not set during decode + saved_id, // defaults to "undefined" if not set during decode + timeline_id, // defaults to "undefined" if not set during decode + timeline_title, // defaults to "undefined" if not set during decode + meta, // defaults to "undefined" if not set during decode + machine_learning_job_id, // defaults to "undefined" if not set during decode + max_signals: DefaultMaxSignalsNumber, // defaults to DEFAULT_MAX_SIGNALS (100) if not set during decode + tags: DefaultStringArray, // defaults to empty string array if not set during decode + to: DefaultToString, // defaults to "now" if not set during decode + threat: DefaultThreatArray, // defaults to empty array if not set during decode + throttle: DefaultThrottleNull, // defaults to "null" if not set during decode + references: DefaultStringArray, // defaults to empty array of strings if not set during decode + note, // defaults to "undefined" if not set during decode + version, // defaults to "undefined" if not set during decode + exceptions_list: ListsDefaultArray, // defaults to empty array if not set during decode + }) + ), +]); + +export type UpdateRulesSchema = t.TypeOf; + +// This type is used after a decode since some things are defaults after a decode. +export type UpdateRulesSchemaDecoded = Omit< + UpdateRulesSchema, + | 'references' + | 'actions' + | 'enabled' + | 'false_positives' + | 'from' + | 'interval' + | 'max_signals' + | 'tags' + | 'to' + | 'threat' + | 'throttle' + | 'exceptions_list' + | 'rule_id' +> & { + references: References; + actions: Actions; + enabled: Enabled; + false_positives: FalsePositives; + from: From; + interval: Interval; + max_signals: MaxSignals; + tags: Tags; + to: To; + threat: Threat; + throttle: ThrottleOrNull; + exceptions_list: ListsDefaultArraySchema; + rule_id: RuleId; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts new file mode 100644 index 0000000000000..a63c8243cb5f1 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.test.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getUpdateRulesSchemaMock } from './update_rules_schema.mock'; +import { UpdateRulesSchema } from './update_rules_schema'; +import { updateRuleValidateTypeDependents } from './update_rules_type_dependents'; + +describe('update_rules_type_dependents', () => { + test('saved_id is required when type is saved_query and will not validate without out', () => { + const schema: UpdateRulesSchema = { ...getUpdateRulesSchemaMock(), type: 'saved_query' }; + delete schema.saved_id; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "type" is "saved_query", "saved_id" is required']); + }); + + test('saved_id is required when type is saved_query and validates with it', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + type: 'saved_query', + saved_id: '123', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual([]); + }); + + test('You cannot omit timeline_title when timeline_id is present', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: '123', + }; + delete schema.timeline_title; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_id" exists, "timeline_title" must also exist']); + }); + + test('You cannot have empty string for timeline_title when timeline_id is present', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: '123', + timeline_title: '', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_title" cannot be an empty string']); + }); + + test('You cannot have timeline_title with an empty timeline_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_id: '', + timeline_title: 'some-title', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['"timeline_id" cannot be an empty string']); + }); + + test('You cannot have timeline_title without timeline_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + timeline_title: 'some-title', + }; + delete schema.timeline_id; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['when "timeline_title" exists, "timeline_id" must also exist']); + }); + + test('You cannot have both an id and a rule_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + id: 'some-id', + rule_id: 'some-rule-id', + }; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['both "id" and "rule_id" cannot exist, choose one or the other']); + }); + + test('You must set either an id or a rule_id', () => { + const schema: UpdateRulesSchema = { + ...getUpdateRulesSchemaMock(), + }; + delete schema.id; + delete schema.rule_id; + const errors = updateRuleValidateTypeDependents(schema); + expect(errors).toEqual(['either "id" or "rule_id" must be set']); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts new file mode 100644 index 0000000000000..9204f727b2660 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_type_dependents.ts @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UpdateRulesSchema } from './update_rules_schema'; + +export const validateAnomalyThreshold = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.anomaly_threshold == null) { + return ['when "type" is "machine_learning" anomaly_threshold is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateQuery = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.query != null) { + return ['when "type" is "machine_learning", "query" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateLanguage = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.language != null) { + return ['when "type" is "machine_learning", "language" cannot be set']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateSavedId = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'saved_query') { + if (rule.saved_id == null) { + return ['when "type" is "saved_query", "saved_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateMachineLearningJobId = (rule: UpdateRulesSchema): string[] => { + if (rule.type === 'machine_learning') { + if (rule.machine_learning_job_id == null) { + return ['when "type" is "machine_learning", "machine_learning_job_id" is required']; + } else { + return []; + } + } else { + return []; + } +}; + +export const validateTimelineId = (rule: UpdateRulesSchema): string[] => { + if (rule.timeline_id != null) { + if (rule.timeline_title == null) { + return ['when "timeline_id" exists, "timeline_title" must also exist']; + } else if (rule.timeline_id === '') { + return ['"timeline_id" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateTimelineTitle = (rule: UpdateRulesSchema): string[] => { + if (rule.timeline_title != null) { + if (rule.timeline_id == null) { + return ['when "timeline_title" exists, "timeline_id" must also exist']; + } else if (rule.timeline_title === '') { + return ['"timeline_title" cannot be an empty string']; + } else { + return []; + } + } + return []; +}; + +export const validateId = (rule: UpdateRulesSchema): string[] => { + if (rule.id != null && rule.rule_id != null) { + return ['both "id" and "rule_id" cannot exist, choose one or the other']; + } else if (rule.id == null && rule.rule_id == null) { + return ['either "id" or "rule_id" must be set']; + } else { + return []; + } +}; + +export const updateRuleValidateTypeDependents = (schema: UpdateRulesSchema): string[] => { + return [ + ...validateId(schema), + ...validateAnomalyThreshold(schema), + ...validateQuery(schema), + ...validateLanguage(schema), + ...validateSavedId(schema), + ...validateMachineLearningJobId(schema), + ...validateTimelineId(schema), + ...validateTimelineTitle(schema), + ]; +}; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts new file mode 100644 index 0000000000000..a2deaf626624f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_boolean_true.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultBooleanTrue } from './default_boolean_true'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_boolean_true', () => { + test('it should validate a boolean false', () => { + const payload = false; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a boolean true', () => { + const payload = true; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default true', () => { + const payload = null; + const decoded = DefaultBooleanTrue.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(true); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts new file mode 100644 index 0000000000000..d68d447ca4454 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/deafult_from_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultFromString } from './default_from_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_from_string', () => { + test('it should validate a from string', () => { + const payload = 'now-20m'; + const decoded = DefaultFromString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultFromString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "now-6m"', () => { + const payload = null; + const decoded = DefaultFromString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('now-6m'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts new file mode 100644 index 0000000000000..645eade71916f --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultActionsArray } from './default_actions_array'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Actions } from '../common/schemas'; + +describe('default_actions_array', () => { + test('it should validate an empty array', () => { + const payload: string[] = []; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate an array of actions', () => { + const payload: Actions = [ + { id: '123', group: 'group', action_type_id: 'action_type_id', params: {} }, + ]; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = [ + { id: '123', group: 'group', action_type_id: 'action_type_id', params: {} }, + 5, + ]; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default array entry', () => { + const payload = null; + const decoded = DefaultActionsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual([]); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts new file mode 100644 index 0000000000000..ce3eb7fa7da83 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_actions_array.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { actions, Actions } from '../common/schemas'; + +/** + * Types the DefaultStringArray as: + * - If null or undefined, then a default action array will be set + */ +export const DefaultActionsArray = new t.Type( + 'DefaultActionsArray', + actions.is, + (input): Either => (input == null ? t.success([]) : actions.decode(input)), + t.identity +); + +export type DefaultActionsArrayC = typeof DefaultActionsArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts new file mode 100644 index 0000000000000..1697928b17e0c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultBooleanFalse } from './default_boolean_false'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_boolean_false', () => { + test('it should validate a boolean false', () => { + const payload = false; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a boolean true', () => { + const payload = true; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default false', () => { + const payload = null; + const decoded = DefaultBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts new file mode 100644 index 0000000000000..624b9802f680c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_false.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultBooleanFalse as: + * - If null or undefined, then a default false will be set + */ +export const DefaultBooleanFalse = new t.Type( + 'DefaultBooleanFalse', + t.boolean.is, + (input): Either => + input == null ? t.success(false) : t.boolean.decode(input), + t.identity +); + +export type DefaultBooleanFalseC = typeof DefaultBooleanFalse; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts new file mode 100644 index 0000000000000..58c912a0a8650 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_boolean_true.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultBooleanTrue as: + * - If null or undefined, then a default true will be set + */ +export const DefaultBooleanTrue = new t.Type( + 'DefaultBooleanTrue', + t.boolean.is, + (input): Either => (input == null ? t.success(true) : t.boolean.decode(input)), + t.identity +); + +export type DefaultBooleanTrueC = typeof DefaultBooleanTrue; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts new file mode 100644 index 0000000000000..386d4c55905cd --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultEmptyString } from './default_empty_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_empty_string', () => { + test('it should validate a regular string', () => { + const payload = 'some string'; + const decoded = DefaultEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of ""', () => { + const payload = null; + const decoded = DefaultEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(''); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts new file mode 100644 index 0000000000000..6216d0c1111b0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_empty_string.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultEmptyString as: + * - If null or undefined, then a default of an empty string "" will be used + */ +export const DefaultEmptyString = new t.Type( + 'DefaultEmptyString', + t.string.is, + (input): Either => (input == null ? t.success('') : t.string.decode(input)), + t.identity +); + +export type DefaultEmptyStringC = typeof DefaultEmptyString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts new file mode 100644 index 0000000000000..328cd738d7de0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultExportFileName } from './default_export_file_name'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_export_file_name', () => { + test('it should validate a regular string', () => { + const payload = 'some string'; + const decoded = DefaultExportFileName.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultExportFileName.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "export.ndjson"', () => { + const payload = null; + const decoded = DefaultExportFileName.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('export.ndjson'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts new file mode 100644 index 0000000000000..41dfdee1e0da0 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_export_file_name.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultExportFileName as: + * - If null or undefined, then a default of "export.ndjson" will be used + */ +export const DefaultExportFileName = new t.Type( + 'DefaultExportFileName', + t.string.is, + (input): Either => + input == null ? t.success('export.ndjson') : t.string.decode(input), + t.identity +); + +export type DefaultExportFileNameC = typeof DefaultExportFileName; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts new file mode 100644 index 0000000000000..4217532de954e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_from_string.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultFromString as: + * - If null or undefined, then a default of the string "now-6m" will be used + */ +export const DefaultFromString = new t.Type( + 'DefaultFromString', + t.string.is, + (input): Either => + input == null ? t.success('now-6m') : t.string.decode(input), + t.identity +); + +export type DefaultFromStringC = typeof DefaultFromString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts new file mode 100644 index 0000000000000..9720178a4ae9b --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultIntervalString } from './default_interval_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_interval_string', () => { + test('it should validate a interval string', () => { + const payload = '20m'; + const decoded = DefaultIntervalString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultIntervalString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "5m"', () => { + const payload = null; + const decoded = DefaultIntervalString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('5m'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts new file mode 100644 index 0000000000000..579e7591fdb03 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_interval_string.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultIntervalString as: + * - If null or undefined, then a default of the string "5m" will be used + */ +export const DefaultIntervalString = new t.Type( + 'DefaultIntervalString', + t.string.is, + (input): Either => (input == null ? t.success('5m') : t.string.decode(input)), + t.identity +); + +export type DefaultIntervalStringC = typeof DefaultIntervalString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts new file mode 100644 index 0000000000000..e3da8dbd280ab --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultLanguageString } from './default_language_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Language } from '../common/schemas'; + +describe('default_language_string', () => { + test('it should validate a string', () => { + const payload: Language = 'lucene'; + const decoded = DefaultLanguageString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultLanguageString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "kuery"', () => { + const payload = null; + const decoded = DefaultLanguageString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('kuery'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts new file mode 100644 index 0000000000000..248e15d56dfd7 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_language_string.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { language } from '../common/schemas'; + +/** + * Types the DefaultLanguageString as: + * - If null or undefined, then a default of the string "kuery" will be used + */ +export const DefaultLanguageString = new t.Type( + 'DefaultLanguageString', + t.string.is, + (input): Either => + input == null ? t.success('kuery') : language.decode(input), + t.identity +); + +export type DefaultLanguageStringC = typeof DefaultLanguageString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts new file mode 100644 index 0000000000000..a6f137c3f2113 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.test.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultMaxSignalsNumber } from './default_max_signals_number'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +describe('default_from_string', () => { + test('it should validate a max signal number', () => { + const payload = 5; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a string', () => { + const payload = '5'; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a zero', () => { + const payload = 0; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a negative number', () => { + const payload = -1; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of DEFAULT_MAX_SIGNALS', () => { + const payload = null; + const decoded = DefaultMaxSignalsNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(DEFAULT_MAX_SIGNALS); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts new file mode 100644 index 0000000000000..6f0c32c5466f3 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +// eslint-disable-next-line @typescript-eslint/camelcase +import { max_signals } from '../common/schemas'; +import { DEFAULT_MAX_SIGNALS } from '../../../constants'; + +/** + * Types the default max signal: + * - Natural Number (positive integer and not a float), + * - greater than 1 + * - If undefined then it will use DEFAULT_MAX_SIGNALS (100) as the default + */ +export const DefaultMaxSignalsNumber: DefaultMaxSignalsNumberC = new t.Type< + number, + number, + unknown +>( + 'DefaultMaxSignals', + t.number.is, + (input): Either => { + return input == null ? t.success(DEFAULT_MAX_SIGNALS) : max_signals.decode(input); + }, + t.identity +); + +export type DefaultMaxSignalsNumberC = t.Type; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts new file mode 100644 index 0000000000000..1d1d43667c710 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.test.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultPage } from './default_page'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_page', () => { + test('it should validate a regular number greater than zero', () => { + const payload = 5; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a string of a number', () => { + const payload = '5'; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(5); + }); + + test('it should not validate a junk string', () => { + const payload = 'invalid-string'; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an empty string', () => { + const payload = ''; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a zero', () => { + const payload = 0; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a negative number', () => { + const payload = -1; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of 20', () => { + const payload = null; + const decoded = DefaultPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(1); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts new file mode 100644 index 0000000000000..95e3b42f3e138 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_page.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { PositiveIntegerGreaterThanZero } from './positive_integer_greater_than_zero'; + +/** + * Types the DefaultPerPage as: + * - If a string this will convert the string to a number + * - If null or undefined, then a default of 1 will be used + * - If the number is 0 or less this will not validate as it has to be a positive number greater than zero + */ +export const DefaultPage = new t.Type( + 'DefaultPerPage', + t.number.is, + (input): Either => { + if (input == null) { + return t.success(1); + } else if (typeof input === 'string') { + return PositiveIntegerGreaterThanZero.decode(parseInt(input, 10)); + } else { + return PositiveIntegerGreaterThanZero.decode(input); + } + }, + t.identity +); + +export type DefaultPageC = typeof DefaultPage; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts new file mode 100644 index 0000000000000..3ecbae6ed43f5 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.test.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultPerPage } from './default_per_page'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_per_page', () => { + test('it should validate a regular number greater than zero', () => { + const payload = 5; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a string of a number', () => { + const payload = '5'; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(5); + }); + + test('it should not validate a junk string', () => { + const payload = 'invalid-string'; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an empty string', () => { + const payload = ''; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "NaN" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a zero', () => { + const payload = 0; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a negative number', () => { + const payload = -1; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of 20', () => { + const payload = null; + const decoded = DefaultPerPage.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(20); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts new file mode 100644 index 0000000000000..f96f280f6af11 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_per_page.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { PositiveIntegerGreaterThanZero } from './positive_integer_greater_than_zero'; + +/** + * Types the DefaultPerPage as: + * - If a string this will convert the string to a number + * - If null or undefined, then a default of 20 will be used + * - If the number is 0 or less this will not validate as it has to be a positive number greater than zero + */ +export const DefaultPerPage = new t.Type( + 'DefaultPerPage', + t.number.is, + (input): Either => { + if (input == null) { + return t.success(20); + } else if (typeof input === 'string') { + return PositiveIntegerGreaterThanZero.decode(parseInt(input, 10)); + } else { + return PositiveIntegerGreaterThanZero.decode(input); + } + }, + t.identity +); + +export type DefaultPerPageC = typeof DefaultPerPage; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts new file mode 100644 index 0000000000000..83142c8d65777 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultStringArray } from './default_string_array'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_string_array', () => { + test('it should validate an empty array', () => { + const payload: string[] = []; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate an array of strings', () => { + const payload = ['value 1', 'value 2']; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = ['value 1', 5]; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default array entry', () => { + const payload = null; + const decoded = DefaultStringArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual([]); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/types/default_string_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.ts similarity index 75% rename from x-pack/plugins/lists/common/schemas/types/default_string_array.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.ts index c6ebffa379903..1f043cfd1b8e5 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_string_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_array.ts @@ -7,16 +7,16 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type DefaultStringArrayC = t.Type; - /** * Types the DefaultStringArray as: * - If null or undefined, then a default array will be set */ -export const DefaultStringArray: DefaultStringArrayC = new t.Type( - 'DefaultArray', +export const DefaultStringArray = new t.Type( + 'DefaultStringArray', t.array(t.string).is, (input): Either => input == null ? t.success([]) : t.array(t.string).decode(input), t.identity ); + +export type DefaultStringArrayC = typeof DefaultStringArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts new file mode 100644 index 0000000000000..1941a642e8baf --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.test.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { DefaultStringBooleanFalse } from './default_string_boolean_false'; + +describe('default_string_boolean_false', () => { + test('it should validate a boolean false', () => { + const payload = false; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate a boolean true', () => { + const payload = true; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default false', () => { + const payload = null; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); + + test('it should return a default false when given a string of "false"', () => { + const payload = 'false'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); + + test('it should return a default true when given a string of "true"', () => { + const payload = 'true'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(true); + }); + + test('it should return a default true when given a string of "TruE"', () => { + const payload = 'TruE'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(true); + }); + + test('it should not work with a strong of junk "junk"', () => { + const payload = 'junk'; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "junk" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not work with an empty string', () => { + const payload = ''; + const decoded = DefaultStringBooleanFalse.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to ""']); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts new file mode 100644 index 0000000000000..48a40d4b9ceec --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_string_boolean_false.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultStringBooleanFalse as: + * - If a string this will convert the string to a boolean + * - If null or undefined, then a default false will be set + */ +export const DefaultStringBooleanFalse = new t.Type( + 'DefaultStringBooleanFalse', + t.boolean.is, + (input): Either => { + if (input == null) { + return t.success(false); + } else if (typeof input === 'string' && input.toLowerCase() === 'true') { + return t.success(true); + } else if (typeof input === 'string' && input.toLowerCase() === 'false') { + return t.success(false); + } else { + return t.boolean.decode(input); + } + }, + t.identity +); + +export type DefaultStringBooleanFalseC = typeof DefaultStringBooleanFalse; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts new file mode 100644 index 0000000000000..9819da0b8d463 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.test.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultThreatArray } from './default_threat_array'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Threat } from '../common/schemas'; + +describe('default_threat_null', () => { + test('it should validate an empty array', () => { + const payload: Threat = []; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate an array of threats', () => { + const payload: Threat = [ + { + framework: 'MITRE ATTACK', + technique: [{ reference: 'https://test.com', name: 'Audio Capture', id: 'T1123' }], + tactic: { reference: 'https://test.com', name: 'Collection', id: 'TA000999' }, + }, + ]; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = [ + { + framework: 'MITRE ATTACK', + technique: [{ reference: 'https://test.com', name: 'Audio Capture', id: 'T1123' }], + tactic: { reference: 'https://test.com', name: 'Collection', id: 'TA000999' }, + }, + 5, + ]; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default empty array if not provided a value', () => { + const payload = null; + const decoded = DefaultThreatArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual([]); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts new file mode 100644 index 0000000000000..da0611e24bc7e --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_threat_array.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { Threat, threat } from '../common/schemas'; + +/** + * Types the DefaultThreatArray as: + * - If null or undefined, then an empty array will be set + */ +export const DefaultThreatArray = new t.Type( + 'DefaultThreatArray', + threat.is, + (input): Either => (input == null ? t.success([]) : threat.decode(input)), + t.identity +); + +export type DefaultThreatArrayC = typeof DefaultThreatArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts new file mode 100644 index 0000000000000..304fd65647c3c --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultThrottleNull } from './default_throttle_null'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; +import { Throttle } from '../common/schemas'; + +describe('default_throttle_null', () => { + test('it should validate a throttle string', () => { + const payload: Throttle = 'some string'; + const decoded = DefaultThrottleNull.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array with a number', () => { + const payload = 5; + const decoded = DefaultThrottleNull.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default "null" if not provided a value', () => { + const payload = undefined; + const decoded = DefaultThrottleNull.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(null); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts new file mode 100644 index 0000000000000..fd31594323f4d --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_throttle_null.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { ThrottleOrNull, throttle } from '../common/schemas'; + +/** + * Types the DefaultThrottleNull as: + * - If null or undefined, then a null will be set + */ +export const DefaultThrottleNull = new t.Type( + 'DefaultThreatNull', + throttle.is, + (input): Either => + input == null ? t.success(null) : throttle.decode(input), + t.identity +); + +export type DefaultThrottleNullC = typeof DefaultThrottleNull; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts new file mode 100644 index 0000000000000..3e22d57cedf99 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultToString } from './default_to_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_to_string', () => { + test('it should validate a to string', () => { + const payload = 'now-5m'; + const decoded = DefaultToString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultToString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of "now"', () => { + const payload = null; + const decoded = DefaultToString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual('now'); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts new file mode 100644 index 0000000000000..163bcf8c4e5b2 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_to_string.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the DefaultToString as: + * - If null or undefined, then a default of the string "now" will be used + */ +export const DefaultToString = new t.Type( + 'DefaultFromString', + t.string.is, + (input): Either => (input == null ? t.success('now') : t.string.decode(input)), + t.identity +); + +export type DefaultToStringC = typeof DefaultToString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts new file mode 100644 index 0000000000000..7dab8869d5d87 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.test.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultUuid } from './default_uuid'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_uuid', () => { + test('it should validate a regular string', () => { + const payload = '1'; + const decoded = DefaultUuid.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = DefaultUuid.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of a uuid', () => { + const payload = null; + const decoded = DefaultUuid.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toMatch( + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i + ); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/types/default_uuid.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.ts similarity index 84% rename from x-pack/plugins/lists/common/schemas/types/default_uuid.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.ts index 4fb4133d7353f..b0c328a93ff03 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_uuid.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_uuid.ts @@ -10,17 +10,17 @@ import uuid from 'uuid'; import { NonEmptyString } from './non_empty_string'; -export type DefaultUuidC = t.Type; - /** * Types the DefaultUuid as: * - If null or undefined, then a default string uuid.v4() will be * created otherwise it will be checked just against an empty string */ -export const DefaultUuid: DefaultUuidC = new t.Type( +export const DefaultUuid = new t.Type( 'DefaultUuid', t.string.is, (input): Either => input == null ? t.success(uuid.v4()) : NonEmptyString.decode(input), t.identity ); + +export type DefaultUuidC = typeof DefaultUuid; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts new file mode 100644 index 0000000000000..65697d8830b66 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.test.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DefaultVersionNumber } from './default_version_number'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('default_version_number', () => { + test('it should validate a version number', () => { + const payload = 5; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a 0', () => { + const payload = 0; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "0" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a -1', () => { + const payload = -1; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "-1" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a string', () => { + const payload = '5'; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default of 1', () => { + const payload = null; + const decoded = DefaultVersionNumber.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(1); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts new file mode 100644 index 0000000000000..4a310329660df --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_version_number.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; +import { version, Version } from '../common/schemas'; + +/** + * Types the DefaultVersionNumber as: + * - If null or undefined, then a default of the number 1 will be used + */ +export const DefaultVersionNumber = new t.Type( + 'DefaultVersionNumber', + version.is, + (input): Either => (input == null ? t.success(1) : version.decode(input)), + t.identity +); + +export type DefaultVersionNumberC = typeof DefaultVersionNumber; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts index d63c18154c5d4..4e12a45f21d0b 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/iso_date_string.ts @@ -7,13 +7,11 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type IsoDateStringC = t.Type; - /** * Types the IsoDateString as: * - A string that is an ISOString */ -export const IsoDateString: IsoDateStringC = new t.Type( +export const IsoDateString = new t.Type( 'IsoDateString', t.string.is, (input, context): Either => { @@ -34,3 +32,5 @@ export const IsoDateString: IsoDateStringC = new t.Type }, t.identity ); + +export type IsoDateStringC = typeof IsoDateString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts index 8244f4a29e193..8cdd865469112 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists_default_array.ts @@ -13,7 +13,6 @@ import { list_values_operator as listOperator, } from '../common/schemas'; -export type ListsDefaultArrayC = t.Type; export type List = t.TypeOf; export type ListValues = t.TypeOf; export type ListOperator = t.TypeOf; @@ -22,7 +21,7 @@ export type ListOperator = t.TypeOf; * Types the ListsDefaultArray as: * - If null or undefined, then a default array will be set for the list */ -export const ListsDefaultArray: ListsDefaultArrayC = new t.Type( +export const ListsDefaultArray = new t.Type( 'listsWithDefaultArray', t.array(listAnd).is, (input): Either => @@ -30,4 +29,6 @@ export const ListsDefaultArray: ListsDefaultArrayC = new t.Type; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts new file mode 100644 index 0000000000000..0a88b87421e70 --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { NonEmptyString } from './non_empty_string'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { foldLeftRight, getPaths } from '../../../test_utils'; + +describe('non_empty_string', () => { + test('it should validate a regular string', () => { + const payload = '1'; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an empty string', () => { + const payload = ''; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate empty spaces', () => { + const payload = ' '; + const decoded = NonEmptyString.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value " " supplied to ""']); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/types/non_empty_string.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.ts similarity index 81% rename from x-pack/plugins/lists/common/schemas/types/non_empty_string.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.ts index d1e2094bbcad3..b3fad548932d5 100644 --- a/x-pack/plugins/lists/common/schemas/types/non_empty_string.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/non_empty_string.ts @@ -7,13 +7,11 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type NonEmptyStringC = t.Type; - /** * Types the NonEmptyString as: * - A string that is not empty */ -export const NonEmptyString: NonEmptyStringC = new t.Type( +export const NonEmptyString = new t.Type( 'NonEmptyString', t.string.is, (input, context): Either => { @@ -25,3 +23,5 @@ export const NonEmptyString: NonEmptyStringC = new t.Type { + test('it should validate a boolean false as false', () => { + const payload = false; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate a boolean true', () => { + const payload = true; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "true" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a number', () => { + const payload = 5; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); + expect(message.schema).toEqual({}); + }); + + test('it should return a default false', () => { + const payload = null; + const decoded = OnlyFalseAllowed.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts new file mode 100644 index 0000000000000..b22562e2ab9dc --- /dev/null +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/only_false_allowed.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +/** + * Types the OnlyFalseAllowed as: + * - If null or undefined, then a default false will be set + * - If true is sent in then this will return an error + * - If false is sent in then this will allow it only false + */ +export const OnlyFalseAllowed = new t.Type( + 'DefaultBooleanTrue', + t.boolean.is, + (input, context): Either => { + if (input == null) { + return t.success(false); + } else { + if (typeof input === 'boolean' && input === false) { + return t.success(false); + } else { + return t.failure(input, context); + } + } + }, + t.identity +); + +export type OnlyFalseAllowedC = typeof OnlyFalseAllowed; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts index ac98dd6f5d85c..298487a3fae98 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/positive_integer.ts @@ -7,14 +7,12 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type PositiveIntegerC = t.Type; - /** * Types the positive integer are: * - Natural Number (positive integer and not a float), * - zero or greater */ -export const PositiveInteger: PositiveIntegerC = new t.Type( +export const PositiveInteger = new t.Type( 'PositiveInteger', t.number.is, (input, context): Either => { @@ -24,3 +22,5 @@ export const PositiveInteger: PositiveIntegerC = new t.Type; - /** * Types the positive integer greater than zero is: * - Natural Number (positive integer and not a float), * - 1 or greater */ -export const PositiveIntegerGreaterThanZero: PositiveIntegerGreaterThanZeroC = new t.Type< - number, - number, - unknown ->( +export const PositiveIntegerGreaterThanZero = new t.Type( 'PositiveIntegerGreaterThanZero', t.number.is, (input, context): Either => { @@ -28,3 +22,5 @@ export const PositiveIntegerGreaterThanZero: PositiveIntegerGreaterThanZeroC = n }, t.identity ); + +export type PositiveIntegerGreaterThanZeroC = typeof PositiveIntegerGreaterThanZero; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts index 43e2dbdac1fe1..83142c8d65777 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.test.ts @@ -4,15 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ReferencesDefaultArray } from './references_default_array'; +import { DefaultStringArray } from './default_string_array'; import { pipe } from 'fp-ts/lib/pipeable'; import { left } from 'fp-ts/lib/Either'; import { foldLeftRight, getPaths } from '../../../test_utils'; -describe('references_default_array', () => { +describe('default_string_array', () => { test('it should validate an empty array', () => { const payload: string[] = []; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); @@ -21,7 +21,7 @@ describe('references_default_array', () => { test('it should validate an array of strings', () => { const payload = ['value 1', 'value 2']; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); @@ -30,7 +30,7 @@ describe('references_default_array', () => { test('it should not validate an array with a number', () => { const payload = ['value 1', 5]; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual(['Invalid value "5" supplied to ""']); @@ -39,7 +39,7 @@ describe('references_default_array', () => { test('it should return a default array entry', () => { const payload = null; - const decoded = ReferencesDefaultArray.decode(payload); + const decoded = DefaultStringArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts index 57a7ed4e4d456..b809181ce8c32 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/references_default_array.ts @@ -7,20 +7,16 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type ReferencesDefaultArrayC = t.Type; - /** * Types the ReferencesDefaultArray as: * - If null or undefined, then a default array will be set */ -export const ReferencesDefaultArray: ReferencesDefaultArrayC = new t.Type< - string[], - string[], - unknown ->( +export const ReferencesDefaultArray = new t.Type( 'referencesWithDefaultArray', t.array(t.string).is, (input): Either => input == null ? t.success([]) : t.array(t.string).decode(input), t.identity ); + +export type ReferencesDefaultArrayC = typeof ReferencesDefaultArray; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts index c44fae3c6f3e7..7f057a6d178e1 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/risk_score.ts @@ -7,14 +7,12 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type RiskScoreC = t.Type; - /** * Types the risk score as: * - Natural Number (positive integer and not a float), * - Between the values [0 and 100] inclusive. */ -export const RiskScore: RiskScoreC = new t.Type( +export const RiskScore = new t.Type( 'RiskScore', t.number.is, (input, context): Either => { @@ -24,3 +22,5 @@ export const RiskScore: RiskScoreC = new t.Type( }, t.identity ); + +export type RiskScoreC = typeof RiskScore; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts index 88e9db5964198..3676aa5686cd6 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/uuid.ts @@ -7,8 +7,6 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -export type UUIDC = t.Type; - const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; /** @@ -16,7 +14,7 @@ const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; * - Natural Number (positive integer and not a float), * - Between the values [0 and 100] inclusive. */ -export const UUID: UUIDC = new t.Type( +export const UUID = new t.Type( 'UUID', t.string.is, (input, context): Either => { @@ -26,3 +24,5 @@ export const UUID: UUIDC = new t.Type( }, t.identity ); + +export type UUIDC = typeof UUID; diff --git a/x-pack/plugins/security_solution/common/exact_check.test.ts b/x-pack/plugins/security_solution/common/exact_check.test.ts index a5701603de0d6..96a1b1266ea9a 100644 --- a/x-pack/plugins/security_solution/common/exact_check.test.ts +++ b/x-pack/plugins/security_solution/common/exact_check.test.ts @@ -86,6 +86,23 @@ describe('exact_check', () => { expect(message.schema).toEqual({ a: 'test' }); }); + test('it will work with decoding a null payload when the schema expects a null', () => { + const someType = t.union([ + t.exact( + t.type({ + a: t.string, + }) + ), + t.null, + ]); + const payload = null; + const decoded = someType.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(null); + }); + test('it should find no differences recursively with two empty objects', () => { const difference = findDifferencesRecursive({}, {}); expect(difference).toEqual([]); @@ -151,4 +168,9 @@ describe('exact_check', () => { ); expect(difference).toEqual(['d']); }); + + test('it should not find any differences when the original and decoded are both null', () => { + const difference = findDifferencesRecursive(null, null); + expect(difference).toEqual([]); + }); }); diff --git a/x-pack/plugins/security_solution/common/exact_check.ts b/x-pack/plugins/security_solution/common/exact_check.ts index 30c5b585a3480..48afc35b56ba1 100644 --- a/x-pack/plugins/security_solution/common/exact_check.ts +++ b/x-pack/plugins/security_solution/common/exact_check.ts @@ -25,7 +25,10 @@ import { isObject, get } from 'lodash/fp'; * @param decoded The decoded either which has either an existing error or the * decoded object which could have additional keys stripped from it. */ -export const exactCheck = (original: T, decoded: Either): Either => { +export const exactCheck = ( + original: unknown, + decoded: Either +): Either => { const onLeft = (errors: t.Errors): Either => left(errors); const onRight = (decodedValue: T): Either => { const differences = findDifferencesRecursive(original, decodedValue); @@ -45,7 +48,11 @@ export const exactCheck = (original: T, decoded: Either): Either }; export const findDifferencesRecursive = (original: T, decodedValue: T): string[] => { - if (decodedValue == null) { + if (decodedValue === null && original === null) { + // both the decodedValue and the original are null which indicates that they are equal + // so do not report differences + return []; + } else if (decodedValue == null) { try { // It is null and painful when the original contains an object or an array // the the decoded value does not have. diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx index 3eedbcc97bbd1..5a08b0a20d1fc 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/index.test.tsx @@ -13,6 +13,8 @@ import { StepAboutRule } from '.'; import { mockAboutStepRule } from '../../../pages/detection_engine/rules/all/__mocks__/mock'; import { StepRuleDescription } from '../description_step'; import { stepAboutDefaultValue } from './default_value'; +import { wait } from '@testing-library/react'; +import { AboutStepRule } from '../../../pages/detection_engine/rules/types'; const theme = () => ({ eui: euiDarkVars, darkMode: true }); @@ -57,31 +59,31 @@ describe('StepAboutRuleComponent', () => { ); - const nameInput = wrapper - .find('input[aria-describedby="detectionEngineStepAboutRuleName"]') - .at(0); - nameInput.simulate('change', { target: { value: 'Test name text' } }); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first() + .simulate('change', { target: { value: 'Test name text' } }); const descriptionInput = wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0); - const nextButton = wrapper.find('button[data-test-subj="about-continue"]').at(0); - nextButton.simulate('click'); + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first(); + wrapper.find('button[data-test-subj="about-continue"]').first().simulate('click'); expect( - wrapper.find('input[aria-describedby="detectionEngineStepAboutRuleName"]').at(0).props().value + wrapper.find('[data-test-subj="detectionEngineStepAboutRuleName"] input').first().props() + .value ).toEqual('Test name text'); expect(descriptionInput.props().value).toEqual(''); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleDescription"] label') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] label') + .first() .hasClass('euiFormLabel-isInvalid') ).toBeTruthy(); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleDescription"] EuiTextArea') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] EuiTextArea') + .first() .prop('isInvalid') ).toBeTruthy(); }); @@ -101,39 +103,40 @@ describe('StepAboutRuleComponent', () => { ); - const descriptionInput = wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0); - descriptionInput.simulate('change', { target: { value: 'Test description text' } }); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() + .simulate('change', { target: { value: 'Test description text' } }); const nameInput = wrapper - .find('input[aria-describedby="detectionEngineStepAboutRuleName"]') - .at(0); - const nextButton = wrapper.find('button[data-test-subj="about-continue"]').at(0); - nextButton.simulate('click'); + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first(); + + wrapper.find('button[data-test-subj="about-continue"]').first().simulate('click'); expect( wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() .props().value ).toEqual('Test description text'); expect(nameInput.props().value).toEqual(''); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleName"] label') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleName"] label') + .first() .hasClass('euiFormLabel-isInvalid') ).toBeTruthy(); expect( wrapper - .find('EuiFormRow[data-test-subj="detectionEngineStepAboutRuleName"] EuiFieldText') - .at(0) + .find('[data-test-subj="detectionEngineStepAboutRuleName"] EuiFieldText') + .first() .prop('isInvalid') ).toBeTruthy(); }); - test('it allows user to click continue if "name" and "description" are defined', () => { + test('it allows user to click continue if "name" and "description" are defined', async () => { + const stepDataMock = jest.fn(); const wrapper = mount( { isReadOnlyView={false} isLoading={false} setForm={jest.fn()} - setStepData={jest.fn()} + setStepData={stepDataMock} /> ); - const descriptionInput = wrapper - .find('textarea[aria-describedby="detectionEngineStepAboutRuleDescription"]') - .at(0); - descriptionInput.simulate('change', { target: { value: 'Test description text' } }); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() + .simulate('change', { target: { value: 'Test description text' } }); + + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first() + .simulate('change', { target: { value: 'Test name text' } }); + + wrapper.find('button[data-test-subj="about-continue"]').first().simulate('click').update(); + await wait(); + const expected: Omit = { + description: 'Test description text', + falsePositives: [''], + name: 'Test name text', + note: '', + references: [''], + riskScore: 50, + severity: 'low', + tags: [], + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { id: 'none', name: 'none', reference: 'none' }, + technique: [], + }, + ], + }; + expect(stepDataMock.mock.calls[1][1]).toEqual(expected); + }); - const nameInput = wrapper - .find('input[aria-describedby="detectionEngineStepAboutRuleName"]') - .at(0); - nameInput.simulate('change', { target: { value: 'Test name text' } }); + test('it allows user to set the risk score as a number (and not a string)', async () => { + const stepDataMock = jest.fn(); + const wrapper = mount( + + + + ); - const nextButton = wrapper.find('button[data-test-subj="about-continue"]').at(0); - nextButton.simulate('click'); + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleName"] input') + .first() + .simulate('change', { target: { value: 'Test name text' } }); + + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleDescription"] textarea') + .first() + .simulate('change', { target: { value: 'Test description text' } }); + + wrapper + .find('[data-test-subj="detectionEngineStepAboutRuleRiskScore"] input') + .first() + .simulate('change', { target: { value: '80' } }); + + wrapper.find('[data-test-subj="about-continue"]').first().simulate('click').update(); + await wait(); + const expected: Omit = { + description: 'Test description text', + falsePositives: [''], + name: 'Test name text', + note: '', + references: [''], + riskScore: 80, + severity: 'low', + tags: [], + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { id: 'none', name: 'none', reference: 'none' }, + technique: [], + }, + ], + }; + expect(stepDataMock.mock.calls[1][1]).toEqual(expected); }); }); diff --git a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx index 42ffab10ff469..59ecebaeb9e4e 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/rules/step_about_rule/schema.tsx @@ -87,6 +87,7 @@ export const schema: FormSchema = { }, riskScore: { type: FIELD_TYPES.RANGE, + serializer: (input: string) => Number(input), label: i18n.translate( 'xpack.securitySolution.detectionEngine.createRule.stepAboutRule.fieldRiskScoreLabel', { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts index 9246d8cb3519b..23d5d7eb8d385 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts @@ -6,11 +6,7 @@ import { SavedObjectsFindResponse } from 'kibana/server'; import { ActionResult } from '../../../../../../actions/server'; -import { - SignalsStatusRestParams, - SignalsQueryRestParams, - SignalSearchResponse, -} from '../../signals/types'; +import { SignalSearchResponse } from '../../signals/types'; import { DETECTION_ENGINE_RULES_URL, DETECTION_ENGINE_SIGNALS_STATUS_URL, @@ -26,45 +22,11 @@ import { IRuleSavedAttributesSavedObjectAttributes, HapiReadableStream, } from '../../rules/types'; -import { RuleAlertParamsRest, PrepackagedRules } from '../../types'; +import { RuleAlertParamsRest } from '../../types'; import { requestMock } from './request'; import { RuleNotificationAlertType } from '../../notifications/types'; - -export const mockPrepackagedRule = (): PrepackagedRules => ({ - rule_id: 'rule-1', - description: 'Detecting root and admin users', - index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], - interval: '5m', - name: 'Detect Root/Admin Users', - output_index: '.siem-signals', - risk_score: 50, - type: 'query', - from: 'now-6m', - to: 'now', - severity: 'high', - query: 'user.name: root or user.name: admin', - language: 'kuery', - threat: [ - { - framework: 'fake', - tactic: { id: 'fakeId', name: 'fakeName', reference: 'fakeRef' }, - technique: [{ id: 'techniqueId', name: 'techniqueName', reference: 'techniqueRef' }], - }, - ], - throttle: null, - enabled: true, - filters: [], - immutable: false, - references: [], - meta: {}, - tags: [], - version: 1, - false_positives: [], - max_signals: 100, - note: '', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', -}); +import { QuerySignalsSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/query_signals_index_schema'; +import { SetSignalsStatusSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/set_signal_status_schema'; export const typicalPayload = (): Partial => ({ rule_id: 'rule-1', @@ -89,25 +51,25 @@ export const typicalPayload = (): Partial => ({ ], }); -export const typicalSetStatusSignalByIdsPayload = (): Partial => ({ +export const typicalSetStatusSignalByIdsPayload = (): SetSignalsStatusSchemaDecoded => ({ signal_ids: ['somefakeid1', 'somefakeid2'], status: 'closed', }); -export const typicalSetStatusSignalByQueryPayload = (): Partial => ({ +export const typicalSetStatusSignalByQueryPayload = (): SetSignalsStatusSchemaDecoded => ({ query: { bool: { filter: { range: { '@timestamp': { gte: 'now-2M', lte: 'now/M' } } } } }, status: 'closed', }); -export const typicalSignalsQuery = (): Partial => ({ +export const typicalSignalsQuery = (): QuerySignalsSchemaDecoded => ({ query: { match_all: {} }, }); -export const typicalSignalsQueryAggs = (): Partial => ({ +export const typicalSignalsQueryAggs = (): QuerySignalsSchemaDecoded => ({ aggs: { statuses: { terms: { field: 'signal.status', size: 10 } } }, }); -export const setStatusSignalMissingIdsAndQueryPayload = (): Partial => ({ +export const setStatusSignalMissingIdsAndQueryPayload = (): SetSignalsStatusSchemaDecoded => ({ status: 'closed', }); @@ -170,14 +132,14 @@ export const getDeleteBulkRequestById = () => requestMock.create({ method: 'delete', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, - body: [{ id: 'rule-04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], + body: [{ id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], }); export const getDeleteAsPostBulkRequestById = () => requestMock.create({ method: 'post', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, - body: [{ id: 'rule-04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], + body: [{ id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd' }], }); export const getDeleteAsPostBulkRequest = () => @@ -448,7 +410,7 @@ export const getResult = (): RuleAlertType => ({ references: ['http://www.example.com', 'https://ww.example.com'], note: '# Investigative notes', version: 1, - exceptions_list: [ + exceptionsList: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts index 241d362753d53..4b65ee5efdff0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts @@ -13,18 +13,16 @@ import { } from '../__mocks__/request_responses'; import { requestContextMock, serverMock } from '../__mocks__'; import { addPrepackedRulesRoute } from './add_prepackaged_rules_route'; -import { PrepackagedRules } from '../../types'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; jest.mock('../../rules/get_prepackaged_rules', () => { return { - getPrepackagedRules: (): PrepackagedRules[] => { + getPrepackagedRules: (): AddPrepackagedRulesSchemaDecoded[] => { return [ { tags: [], - immutable: true, rule_id: 'rule-1', - output_index: '.siem-signals', risk_score: 50, description: 'some description', from: 'now-5m', @@ -34,6 +32,16 @@ jest.mock('../../rules/get_prepackaged_rules', () => { severity: 'low', interval: '5m', type: 'query', + query: 'user.name: root or user.name: admin', + language: 'kuery', + references: [], + actions: [], + enabled: false, + false_positives: [], + max_signals: 100, + threat: [], + throttle: null, + exceptions_list: [], version: 2, // set one higher than the mocks which is set to 1 to trigger updates }, ]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index d5628877ee16e..39eea16c6290a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -29,7 +29,7 @@ export const addPrepackedRulesRoute = (router: IRouter) => { tags: ['access:securitySolution'], }, }, - async (context, request, response) => { + async (context, _, response) => { const siemResponse = buildSiemResponse(response); try { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index 6875b0fc76ecc..1df6070bc33a6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -180,7 +180,7 @@ describe('create_rules_bulk', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because [child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]]' + 'Invalid value "unexpected_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index dc0b65cef61d0..7af58adca7529 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -4,8 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import uuid from 'uuid'; - +import { createRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/create_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { + CreateRulesBulkSchemaDecoded, + createRulesBulkSchema, +} from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; @@ -13,26 +17,24 @@ import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; -import { RuleAlertParamsRest } from '../../types'; import { readRules } from '../../rules/read_rules'; import { getDuplicates } from './utils'; import { transformValidateBulkError, validate } from './validate'; import { getIndexExists } from '../../index/get_index_exists'; -import { - transformBulkError, - createBulkErrorObject, - buildRouteValidation, - buildSiemResponse, -} from '../utils'; -import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; + +import { transformBulkError, createBulkErrorObject, buildSiemResponse } from '../utils'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { PartialFilter } from '../../types'; export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, validate: { - body: buildRouteValidation(createRulesBulkSchema), + body: buildRouteValidation( + createRulesBulkSchema + ), }, options: { tags: ['access:securitySolution'], @@ -59,19 +61,19 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => .filter((rule) => rule.rule_id == null || !dupes.includes(rule.rule_id)) .map(async (payloadRule) => { const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, meta, - filters, + filters: filtersRest, rule_id: ruleId, index, interval, @@ -89,23 +91,42 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => timeline_id: timelineId, timeline_title: timelineTitle, version, - exceptions_list, + exceptions_list: exceptionsList, } = payloadRule; - const ruleIdOrUuid = ruleId ?? uuid.v4(); try { + const validationErrors = createRuleValidateTypeDependents(payloadRule); + if (validationErrors.length) { + return createBulkErrorObject({ + ruleId, + statusCode: 400, + message: validationErrors.join(), + }); + } + + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; throwHttpError(await mlAuthz.validateRuleType(type)); const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return createBulkErrorObject({ - ruleId: ruleIdOrUuid, + ruleId, statusCode: 400, message: `To create a rule, the index must exist first. Index ${finalIndex} does not exist`, }); } if (ruleId != null) { - const rule = await readRules({ alertsClient, ruleId }); + const rule = await readRules({ alertsClient, ruleId, id: undefined }); if (rule != null) { return createBulkErrorObject({ ruleId, @@ -131,7 +152,7 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => timelineTitle, meta, filters, - ruleId: ruleIdOrUuid, + ruleId, index, interval, maxSignals, @@ -145,7 +166,7 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => references, note, version, - exceptions_list, + exceptionsList, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is set to rule, otherwise we are a notification and should not enable it, }); @@ -159,9 +180,9 @@ export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => name, }); - return transformValidateBulkError(ruleIdOrUuid, createdRule, ruleActions); + return transformValidateBulkError(ruleId, createdRule, ruleActions); } catch (err) { - return transformBulkError(ruleIdOrUuid, err); + return transformBulkError(ruleId, err); } }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index 7984b84729821..5abd7b1e76a76 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -170,7 +170,7 @@ describe('create_rules', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]' + 'Invalid value "unexpected_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts index 6138db4dcb0ff..78d67e0e9366c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -4,8 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import uuid from 'uuid'; - +import { createRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/create_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + createRulesSchema, + CreateRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/create_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; @@ -13,42 +18,48 @@ import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; import { readRules } from '../../rules/read_rules'; -import { RuleAlertParamsRest } from '../../types'; import { transformValidate } from './validate'; import { getIndexExists } from '../../index/get_index_exists'; -import { createRulesSchema } from '../schemas/create_rules_schema'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { PartialFilter } from '../../types'; export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void => { router.post( { path: DETECTION_ENGINE_RULES_URL, validate: { - body: buildRouteValidation(createRulesSchema), + body: buildRouteValidation( + createRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const validationErrors = createRuleValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, output_index: outputIndex, saved_id: savedId, timeline_id: timelineId, timeline_title: timelineTitle, meta, machine_learning_job_id: machineLearningJobId, - filters, + filters: filtersRest, rule_id: ruleId, index, interval, @@ -63,11 +74,21 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void type, references, note, - exceptions_list, + exceptions_list: exceptionsList, } = request.body; - const siemResponse = buildSiemResponse(response); - try { + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + const alertsClient = context.alerting?.getAlertsClient(); const clusterClient = context.core.elasticsearch.legacy.client; const savedObjectsClient = context.core.savedObjects.client; @@ -89,7 +110,7 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void }); } if (ruleId != null) { - const rule = await readRules({ alertsClient, ruleId }); + const rule = await readRules({ alertsClient, ruleId, id: undefined }); if (rule != null) { return siemResponse.error({ statusCode: 409, @@ -114,7 +135,7 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void meta, machineLearningJobId, filters, - ruleId: ruleId ?? uuid.v4(), + ruleId, index, interval, maxSignals, @@ -128,7 +149,7 @@ export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void references, note, version: 1, - exceptions_list, + exceptionsList, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is rule, otherwise we are a notification and should not enable it, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts index f2da3ab4be8f6..4c1c1046a9fcd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts @@ -105,11 +105,33 @@ describe('delete_rules', () => { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, body: [{}], }); - const result = server.validate(request); + const response = await server.inject(request, context); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + error: { message: 'either "id" or "rule_id" must be set', status_code: 400 }, + rule_id: '(unknown id)', + }, + ]); + }); - expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because ["value" must contain at least one of [id, rule_id]]' - ); + test('rejects requests with both id and rule_id', async () => { + const request = requestMock.create({ + method: 'post', + path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, + body: [{ id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f', rule_id: 'rule_1' }], + }); + const response = await server.inject(request, context); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + error: { + message: 'both "id" and "rule_id" cannot exist, choose one or the other', + status_code: 400, + }, + rule_id: 'c1e1b359-7ac1-4e96-bc81-c683c092436f', + }, + ]); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index c1e359b36caa1..12f908ce7e8b5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -4,26 +4,32 @@ * you may not use this file except in compliance with the Elastic License. */ +import { queryRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/query_rules_type_dependents'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + queryRulesBulkSchema, + QueryRulesBulkSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_rules_bulk_schema'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter, RouteConfig, RequestHandler } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { queryRulesBulkSchema } from '../schemas/query_rules_bulk_schema'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; -import { transformBulkError, buildRouteValidation, buildSiemResponse } from '../utils'; -import { DeleteRulesRequestParams } from '../../rules/types'; +import { transformBulkError, buildSiemResponse, createBulkErrorObject } from '../utils'; import { deleteRules } from '../../rules/delete_rules'; import { deleteNotifications } from '../../notifications/delete_notifications'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; -type Config = RouteConfig; -type Handler = RequestHandler; +type Config = RouteConfig; +type Handler = RequestHandler; export const deleteRulesBulkRoute = (router: IRouter) => { const config: Config = { validate: { - body: buildRouteValidation(queryRulesBulkSchema), + body: buildRouteValidation( + queryRulesBulkSchema + ), }, path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, options: { @@ -46,6 +52,15 @@ export const deleteRulesBulkRoute = (router: IRouter) => { request.body.map(async (payloadRule) => { const { id, rule_id: ruleId } = payloadRule; const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; + const validationErrors = queryRuleValidateTypeDependents(payloadRule); + if (validationErrors.length) { + return createBulkErrorObject({ + ruleId: idOrRuleIdOrUnknown, + statusCode: 400, + message: validationErrors.join(), + }); + } + try { const rule = await deleteRules({ alertsClient, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts index e30f332ecd1ca..8530b845e9bb9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts @@ -92,11 +92,12 @@ describe('delete_rules', () => { path: DETECTION_ENGINE_RULES_URL, query: {}, }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [id, rule_id]' - ); + const response = await server.inject(request, context); + expect(response.status).toEqual(400); + expect(response.body).toEqual({ + message: ['either "id" or "rule_id" must be set'], + status_code: 400, + }); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts index a2256b8338d2f..f4aa51c6dcfc3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -4,14 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ +import { queryRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/query_rules_type_dependents'; +import { + queryRulesSchema, + QueryRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_rules_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; -import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; -import { DeleteRuleRequestParams } from '../../rules/types'; +import { transformError, buildSiemResponse } from '../utils'; import { deleteNotifications } from '../../notifications/delete_notifications'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; @@ -21,7 +25,9 @@ export const deleteRulesRoute = (router: IRouter) => { { path: DETECTION_ENGINE_RULES_URL, validate: { - query: buildRouteValidation(queryRulesSchema), + query: buildRouteValidation( + queryRulesSchema + ), }, options: { tags: ['access:securitySolution'], @@ -29,6 +35,10 @@ export const deleteRulesRoute = (router: IRouter) => { }, async (context, request, response) => { const siemResponse = buildSiemResponse(response); + const validationErrors = queryRuleValidateTypeDependents(request.query); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } try { const { id, rule_id: ruleId } = request.query; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts index ad0b3c87ff145..8df9f114559a8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -4,23 +4,32 @@ * you may not use this file except in compliance with the Elastic License. */ +import { + exportRulesQuerySchema, + ExportRulesQuerySchemaDecoded, + exportRulesSchema, + ExportRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/export_rules_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { ConfigType } from '../../../../config'; -import { ExportRulesRequestParams } from '../../rules/types'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; -import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; import { getExportByObjectIds } from '../../rules/get_export_by_object_ids'; import { getExportAll } from '../../rules/get_export_all'; -import { transformError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; export const exportRulesRoute = (router: IRouter, config: ConfigType) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_export`, validate: { - query: buildRouteValidation(exportRulesQuerySchema), - body: buildRouteValidation(exportRulesSchema), + query: buildRouteValidation( + exportRulesQuerySchema + ), + body: buildRouteValidation( + exportRulesSchema + ), }, options: { tags: ['access:securitySolution'], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts index b4591a8141f7b..892b7a2dd7315 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.test.ts @@ -91,7 +91,7 @@ describe('find_rules', () => { }); const result = server.validate(request); - expect(result.badRequest).toHaveBeenCalledWith('"invalid_value" is not allowed'); + expect(result.badRequest).toHaveBeenCalledWith('invalid keys "invalid_value"'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts index 7d99be908d064..eceb953762090 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -4,22 +4,28 @@ * you may not use this file except in compliance with the Elastic License. */ +import { findRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/find_rules_type_dependents'; +import { + findRulesSchema, + FindRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/find_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { findRules } from '../../rules/find_rules'; -import { FindRulesRequestParams } from '../../rules/types'; -import { findRulesSchema } from '../schemas/find_rules_schema'; import { transformValidateFindAlerts } from './validate'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; export const findRulesRoute = (router: IRouter) => { router.get( { path: `${DETECTION_ENGINE_RULES_URL}/_find`, validate: { - query: buildRouteValidation(findRulesSchema), + query: buildRouteValidation( + findRulesSchema + ), }, options: { tags: ['access'], @@ -27,6 +33,10 @@ export const findRulesRoute = (router: IRouter) => { }, async (context, request, response) => { const siemResponse = buildSiemResponse(response); + const validationErrors = findRuleValidateTypeDependents(request.query); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } try { const { query } = request; @@ -45,6 +55,7 @@ export const findRulesRoute = (router: IRouter) => { sortField: query.sort_field, sortOrder: query.sort_order, filter: query.filter, + fields: query.fields, }); const ruleStatuses = await Promise.all( rules.data.map(async (rule) => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts index d7c6d317227fa..c2f396c874a7c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.test.ts @@ -66,7 +66,7 @@ describe('find_statuses', () => { }); const result = server.validate(request); - expect(result.badRequest).toHaveBeenCalledWith('"id" is not allowed'); + expect(result.badRequest).toHaveBeenCalledWith('Invalid value "undefined" supplied to "ids"'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index a923c1bb49200..c02e28456111a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -4,28 +4,25 @@ * you may not use this file except in compliance with the Elastic License. */ +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; -import { - FindRulesStatusesRequestParams, - RuleStatusResponse, - IRuleStatusAttributes, -} from '../../rules/types'; -import { - buildRouteValidation, - transformError, - convertToSnakeCase, - buildSiemResponse, -} from '../utils'; +import { RuleStatusResponse, IRuleStatusAttributes } from '../../rules/types'; +import { transformError, convertToSnakeCase, buildSiemResponse } from '../utils'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { + findRulesStatusesSchema, + FindRulesStatusesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/find_rule_statuses_schema'; export const findRulesStatusesRoute = (router: IRouter) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_find_statuses`, validate: { - body: buildRouteValidation(findRulesStatusesSchema), + body: buildRouteValidation( + findRulesStatusesSchema + ), }, options: { tags: ['access:securitySolution'], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index 31aad769d5a3d..c3f4695a20461 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -44,6 +44,7 @@ export const getPrepackagedRulesStatusRoute = (router: IRouter) => { sortField: 'enabled', sortOrder: 'desc', filter: 'alert.attributes.tags:"__internal_immutable:false"', + fields: undefined, }); const prepackagedRules = await getExistingPrepackagedRules({ alertsClient }); const rulesToInstall = getRulesToInstall(rulesFromFileSystem, prepackagedRules); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index a7d5e579b074d..0762fbc7dd6e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -250,14 +250,16 @@ describe('import_rules_route', () => { errors: [ { error: { - message: 'child "rule_id" fails because ["rule_id" is required]', + // TODO: Change the formatter to do better than output [object Object] + message: '[object Object],[object Object]', status_code: 400, }, rule_id: '(unknown id)', }, { error: { - message: 'child "rule_id" fails because ["rule_id" is required]', + // TODO: Change the formatter to do better than output [object Object] + message: '[object Object],[object Object]', status_code: 400, }, rule_id: '(unknown id)', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts index cbe583a11d1c1..c8b61414608a9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -8,8 +8,15 @@ import { chunk } from 'lodash/fp'; import { extname } from 'path'; import { - ImportRulesSchema, - importRulesSchema, + importRulesQuerySchema, + ImportRulesQuerySchemaDecoded, + importRulesPayloadSchema, + ImportRulesPayloadSchemaDecoded, + ImportRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; +import { + ImportRulesSchema as ImportRulesResponseSchema, + importRulesSchema as importRulesResponseSchema, } from '../../../../../common/detection_engine/schemas/response/import_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; @@ -19,11 +26,9 @@ import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; -import { ImportRulesRequestParams } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; import { getIndexExists } from '../../index/get_index_exists'; import { - buildRouteValidation, createBulkErrorObject, ImportRuleResponse, BulkError, @@ -32,14 +37,15 @@ import { transformError, buildSiemResponse, } from '../utils'; -import { ImportRuleAlertRest } from '../../types'; import { patchRules } from '../../rules/patch_rules'; -import { importRulesQuerySchema, importRulesPayloadSchema } from '../schemas/import_rules_schema'; import { getTupleDuplicateErrorsAndUniqueRules } from './utils'; import { validate } from './validate'; import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { HapiReadableStream } from '../../rules/types'; +import { PartialFilter } from '../../types'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; const CHUNK_PARSED_OBJECT_SIZE = 10; @@ -48,8 +54,13 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP { path: `${DETECTION_ENGINE_RULES_URL}/_import`, validate: { - query: buildRouteValidation(importRulesQuerySchema), - body: buildRouteValidation(importRulesPayloadSchema), + query: buildRouteValidation( + importRulesQuerySchema + ), + body: buildRouteValidation< + typeof importRulesPayloadSchema, + ImportRulesPayloadSchemaDecoded + >(importRulesPayloadSchema), }, options: { tags: ['access:securitySolution'], @@ -74,7 +85,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); - const { filename } = request.body.file.hapi; + const { filename } = (request.body.file as HapiReadableStream).hapi; const fileExtension = extname(filename).toLowerCase(); if (fileExtension !== '.ndjson') { return siemResponse.error({ @@ -94,7 +105,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP const objectLimit = config.maxRuleImportExportSize; const readStream = createRulesStreamFromNdJson(objectLimit); const parsedObjects = await createPromiseFromStreams([ - request.body.file, + request.body.file as HapiReadableStream, ...readStream, ]); const [duplicateIdErrors, uniqueParsedObjects] = getTupleDuplicateErrorsAndUniqueRules( @@ -128,13 +139,13 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP false_positives: falsePositives, from, immutable, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, meta, - filters, + filters: filtersRest, rule_id: ruleId, index, interval, @@ -151,13 +162,24 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP timeline_id: timelineId, timeline_title: timelineTitle, version, - exceptions_list, + exceptions_list: exceptionsList, } = parsedRule; try { + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + throwHttpError(await mlAuthz.validateRuleType(type)); - const rule = await readRules({ alertsClient, ruleId }); + const rule = await readRules({ alertsClient, ruleId, id: undefined }); if (rule == null) { await createRules({ alertsClient, @@ -190,7 +212,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP references, note, version, - exceptions_list, + exceptionsList, actions: [], // Actions are not imported nor exported at this time }); resolve({ rule_id: ruleId, status_code: 200 }); @@ -202,7 +224,6 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP enabled, falsePositives, from, - immutable, query, language, outputIndex, @@ -225,9 +246,10 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP references, note, version, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, + actions: undefined, }); resolve({ rule_id: ruleId, status_code: 200 }); } else if (rule != null) { @@ -267,12 +289,12 @@ export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupP return false; } }); - const importRules: ImportRulesSchema = { + const importRules: ImportRulesResponseSchema = { success: errorsResp.length === 0, success_count: successes.length, errors: errorsResp, }; - const [validated, errors] = validate(importRules, importRulesSchema); + const [validated, errors] = validate(importRules, importRulesResponseSchema); if (errors != null) { return siemResponse.error({ statusCode: 500, body: errors }); } else { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts index 24b2d5631b3a7..d5145e1dceae0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts @@ -155,11 +155,18 @@ describe('patch_rules_bulk', () => { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, body: [{ ...typicalPayload(), rule_id: undefined }], }); - const result = server.validate(request); + const response = await server.inject(request, context); - expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because ["value" must contain at least one of [id, rule_id]]' - ); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + error: { + message: 'id or rule_id should have been defined', + status_code: 404, + }, + rule_id: '(unknown id)', + }, + ]); }); test('allows query rule type', async () => { @@ -182,7 +189,7 @@ describe('patch_rules_bulk', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because [child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]]' + 'Invalid value "unknown_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts index d1347786ddc1b..16f491547a9e6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts @@ -4,28 +4,35 @@ * you may not use this file except in compliance with the Elastic License. */ +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { + patchRulesBulkSchema, + PatchRulesBulkSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/patch_rules_bulk_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { transformBulkError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformBulkError, buildSiemResponse } from '../utils'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; -import { patchRulesBulkSchema } from '../schemas/patch_rules_bulk_schema'; import { patchRules } from '../../rules/patch_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; import { readRules } from '../../rules/read_rules'; +import { PartialFilter } from '../../types'; export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.patch( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, validate: { - body: buildRouteValidation(patchRulesBulkSchema), + body: buildRouteValidation( + patchRulesBulkSchema + ), }, options: { tags: ['access:securitySolution'], @@ -46,7 +53,7 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => const rules = await Promise.all( request.body.map(async (payloadRule) => { const { - actions, + actions: actionsRest, description, enabled, false_positives: falsePositives, @@ -58,7 +65,7 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -77,8 +84,13 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => version, anomaly_threshold: anomalyThreshold, machine_learning_job_id: machineLearningJobId, + exceptions_list: exceptionsList, } = payloadRule; const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + try { if (type) { // reject an unauthorized "promotion" to ML @@ -123,6 +135,7 @@ export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => anomalyThreshold, machineLearningJobId, actions, + exceptionsList, }); if (rule != null && rule.enabled != null && rule.name != null) { const ruleActions = await updateRulesNotifications({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts index 9ae7e83ef7989..09230d45ee785 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts @@ -167,11 +167,11 @@ describe('patch_rules', () => { path: DETECTION_ENGINE_RULES_URL, body: { ...typicalPayload(), rule_id: undefined }, }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [id, rule_id]' - ); + const response = await server.inject(request, context); + expect(response.body).toEqual({ + message: ['either "id" or "rule_id" must be set'], + status_code: 400, + }); }); test('allows query rule type', async () => { @@ -194,7 +194,7 @@ describe('patch_rules', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]' + 'Invalid value "unknown_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts index 8f0d222ebaa64..385eec0fe1180 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/patch_rules_route.ts @@ -4,35 +4,48 @@ * you may not use this file except in compliance with the Elastic License. */ +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { patchRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/patch_rules_type_dependents'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + PatchRulesSchemaDecoded, + patchRulesSchema, +} from '../../../../../common/detection_engine/schemas/request/patch_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; import { patchRules } from '../../rules/patch_rules'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { patchRulesSchema } from '../schemas/patch_rules_schema'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; import { readRules } from '../../rules/read_rules'; +import { PartialFilter } from '../../types'; export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.patch( { path: DETECTION_ENGINE_RULES_URL, validate: { - body: buildRouteValidation(patchRulesSchema), + body: buildRouteValidation( + patchRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const validationErrors = patchRuleValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } const { - actions, + actions: actionsRest, description, enabled, false_positives: falsePositives, @@ -44,7 +57,7 @@ export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -63,10 +76,13 @@ export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { version, anomaly_threshold: anomalyThreshold, machine_learning_job_id: machineLearningJobId, + exceptions_list: exceptionsList, } = request.body; - const siemResponse = buildSiemResponse(response); - try { + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; @@ -119,6 +135,7 @@ export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { anomalyThreshold, machineLearningJobId, actions, + exceptionsList, }); if (rule != null && rule.enabled != null && rule.name != null) { const ruleActions = await updateRulesNotifications({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts index c9b218a3f0898..4a568643ccc2e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -4,14 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ +import { queryRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/query_rules_type_dependents'; +import { + queryRulesSchema, + QueryRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_rules_schema'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { readRules } from '../../rules/read_rules'; -import { queryRulesSchema } from '../schemas/query_rules_schema'; -import { ReadRuleRequestParams } from '../../rules/types'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; @@ -20,15 +24,22 @@ export const readRulesRoute = (router: IRouter) => { { path: DETECTION_ENGINE_RULES_URL, validate: { - query: buildRouteValidation(queryRulesSchema), + query: buildRouteValidation( + queryRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { - const { id, rule_id: ruleId } = request.query; const siemResponse = buildSiemResponse(response); + const validationErrors = queryRuleValidateTypeDependents(request.query); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } + + const { id, rule_id: ruleId } = request.query; const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts index 74b135bcb4d8c..2f331938e3ca8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts @@ -126,16 +126,18 @@ describe('update_rules_bulk', () => { describe('request validation', () => { test('rejects payloads with no ID', async () => { - const request = requestMock.create({ + const noIdRequest = requestMock.create({ method: 'put', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, body: [{ ...typicalPayload(), rule_id: undefined }], }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because ["value" must contain at least one of [id, rule_id]]' - ); + const response = await server.inject(noIdRequest, context); + expect(response.body).toEqual([ + { + error: { message: 'either "id" or "rule_id" must be set', status_code: 400 }, + rule_id: '(unknown id)', + }, + ]); }); test('allows query rule type', async () => { @@ -158,7 +160,7 @@ describe('update_rules_bulk', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - '"value" at position 0 fails because [child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]]' + 'Invalid value "unknown_type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index ec2b0168c18bf..3ca4a28dd93ee 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -4,27 +4,35 @@ * you may not use this file except in compliance with the Elastic License. */ +import { updateRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/update_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + updateRulesBulkSchema, + UpdateRulesBulkSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/update_rules_bulk_schema'; import { rulesBulkSchema } from '../../../../../common/detection_engine/schemas/response/rules_bulk_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; -import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; -import { buildRouteValidation, transformBulkError, buildSiemResponse } from '../utils'; -import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; +import { transformBulkError, buildSiemResponse, createBulkErrorObject } from '../utils'; import { updateRules } from '../../rules/update_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { PartialFilter } from '../../types'; export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.put( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, validate: { - body: buildRouteValidation(updateRulesBulkSchema), + body: buildRouteValidation( + updateRulesBulkSchema + ), }, options: { tags: ['access:securitySolution'], @@ -46,21 +54,21 @@ export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => const rules = await Promise.all( request.body.map(async (payloadRule) => { const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -77,11 +85,32 @@ export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => references, note, version, - exceptions_list, + exceptions_list: exceptionsList, } = payloadRule; const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; try { + const validationErrors = updateRuleValidateTypeDependents(payloadRule); + if (validationErrors.length) { + return createBulkErrorObject({ + ruleId, + statusCode: 400, + message: validationErrors.join(), + }); + } + + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + throwHttpError(await mlAuthz.validateRuleType(type)); const rule = await updateRules({ @@ -116,7 +145,7 @@ export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => references, note, version, - exceptions_list, + exceptionsList, actions, }); if (rule != null) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts index 25556d8d10fd4..f8b7636080b1b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.test.ts @@ -138,13 +138,16 @@ describe('update_rules', () => { const noIdRequest = requestMock.create({ method: 'put', path: DETECTION_ENGINE_RULES_URL, - body: { ...typicalPayload(), rule_id: undefined }, + body: { + ...typicalPayload(), + rule_id: undefined, + }, + }); + const response = await server.inject(noIdRequest, context); + expect(response.body).toEqual({ + message: ['either "id" or "rule_id" must be set'], + status_code: 400, }); - const result = await server.validate(noIdRequest); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [id, rule_id]' - ); }); test('allows query rule type', async () => { @@ -167,7 +170,7 @@ describe('update_rules', () => { const result = await server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "type" fails because ["type" must be one of [query, saved_query, machine_learning]]' + 'Invalid value "unknown type" supplied to "type"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts index 2680db8abdd4d..f2b47f195ca5c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -4,48 +4,62 @@ * you may not use this file except in compliance with the Elastic License. */ +import { updateRuleValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/update_rules_type_dependents'; +import { RuleAlertAction } from '../../../../../common/detection_engine/types'; +import { + updateRulesSchema, + UpdateRulesSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/update_rules_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { SetupPlugins } from '../../../../plugin'; import { buildMlAuthz } from '../../../machine_learning/authz'; import { throwHttpError } from '../../../machine_learning/validation'; -import { UpdateRuleAlertParamsRest } from '../../rules/types'; -import { updateRulesSchema } from '../schemas/update_rules_schema'; -import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { updateRules } from '../../rules/update_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { PartialFilter } from '../../types'; export const updateRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.put( { path: DETECTION_ENGINE_RULES_URL, validate: { - body: buildRouteValidation(updateRulesSchema), + body: buildRouteValidation( + updateRulesSchema + ), }, options: { tags: ['access:securitySolution'], }, }, async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + const validationErrors = updateRuleValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } + const { - actions, + actions: actionsRest, anomaly_threshold: anomalyThreshold, description, enabled, false_positives: falsePositives, from, - query, - language, + query: queryOrUndefined, + language: languageOrUndefined, machine_learning_job_id: machineLearningJobId, output_index: outputIndex, saved_id: savedId, timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersRest, rule_id: ruleId, id, index, @@ -62,11 +76,21 @@ export const updateRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { references, note, version, - exceptions_list, + exceptions_list: exceptionsList, } = request.body; - const siemResponse = buildSiemResponse(response); - try { + const query = + type !== 'machine_learning' && queryOrUndefined == null ? '' : queryOrUndefined; + + const language = + type !== 'machine_learning' && languageOrUndefined == null + ? 'kuery' + : languageOrUndefined; + + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const actions: RuleAlertAction[] = actionsRest as RuleAlertAction[]; + const filters: PartialFilter[] | undefined = filtersRest as PartialFilter[]; + const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; const siemClient = context.securitySolution?.getAppClient(); @@ -112,7 +136,7 @@ export const updateRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { references, note, version, - exceptions_list, + exceptionsList, actions: throttle === 'rule' ? actions : [], // Only enable actions if throttle is rule, otherwise we are a notification and should not enable it }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts index df158d23c0e24..3b2750bbbf664 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts @@ -19,7 +19,7 @@ import { } from './utils'; import { getResult } from '../__mocks__/request_responses'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; -import { ImportRuleAlertRest, RuleAlertParamsRest, RuleTypeParams } from '../../types'; +import { RuleTypeParams } from '../../types'; import { BulkError, ImportSuccessError } from '../utils'; import { getSimpleRule, getOutputRuleAlertForRest } from '../__mocks__/utils'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; @@ -28,8 +28,10 @@ import { SanitizedAlert } from '../../../../../../alerts/server/types'; import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; import { RuleAlertType } from '../../rules/types'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { CreateRulesBulkSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; +import { ImportRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; describe('utils', () => { beforeAll(() => { @@ -485,7 +487,7 @@ describe('utils', () => { { rule_id: 'value3' }, {}, {}, - ] as RuleAlertParamsRest[], + ] as CreateRulesBulkSchemaDecoded, 'rule_id' ); const expected = ['value2', 'value3']; @@ -499,7 +501,7 @@ describe('utils', () => { { rule_id: 'value3' }, {}, {}, - ] as RuleAlertParamsRest[], + ] as CreateRulesBulkSchemaDecoded, 'rule_id' ); const expected: string[] = []; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts index 5329ff04435ca..3ed45bd8367fc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts @@ -8,6 +8,8 @@ import { pickBy, countBy } from 'lodash/fp'; import { SavedObject, SavedObjectsFindResponse } from 'kibana/server'; import uuid from 'uuid'; +import { ImportRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; +import { CreateRulesBulkSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; import { PartialAlert, FindResult } from '../../../../../../alerts/server'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; import { @@ -19,7 +21,7 @@ import { isRuleStatusFindTypes, isRuleStatusSavedObjectType, } from '../../rules/types'; -import { OutputRuleAlertRest, ImportRuleAlertRest, RuleAlertParamsRest } from '../../types'; +import { OutputRuleAlertRest } from '../../types'; import { createBulkErrorObject, BulkError, @@ -29,10 +31,9 @@ import { OutputError, } from '../utils'; import { hasListsFeature } from '../../feature_flags'; -// import { transformAlertToRuleAction } from '../../../../../common/detection_engine/transform_actions'; import { RuleActions } from '../../rule_actions/types'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; export const getIdError = ({ id, @@ -148,7 +149,7 @@ export const transformAlertToRule = ( last_failure_message: ruleStatus?.attributes.lastFailureMessage, last_success_message: ruleStatus?.attributes.lastSuccessMessage, // TODO: (LIST-FEATURE) Remove hasListsFeature() check once we have lists available for a release - exceptions_list: hasListsFeature() ? alert.params.exceptions_list : null, + exceptions_list: hasListsFeature() ? alert.params.exceptionsList : null, }); }; @@ -243,7 +244,10 @@ export const transformOrImportError = ( } }; -export const getDuplicates = (ruleDefinitions: RuleAlertParamsRest[], by: 'rule_id'): string[] => { +export const getDuplicates = ( + ruleDefinitions: CreateRulesBulkSchemaDecoded, + by: 'rule_id' +): string[] => { const mappedDuplicates = countBy( by, ruleDefinitions.filter((r) => r[by] != null) @@ -265,21 +269,17 @@ export const getTupleDuplicateErrorsAndUniqueRules = ( acc.rulesAcc.set(uuid.v4(), parsedRule); } else { const { rule_id: ruleId } = parsedRule; - if (ruleId != null) { - if (acc.rulesAcc.has(ruleId) && !isOverwrite) { - acc.errors.set( - uuid.v4(), - createBulkErrorObject({ - ruleId, - statusCode: 400, - message: `More than one rule with rule-id: "${ruleId}" found`, - }) - ); - } - acc.rulesAcc.set(ruleId, parsedRule); - } else { - acc.rulesAcc.set(uuid.v4(), parsedRule); + if (acc.rulesAcc.has(ruleId) && !isOverwrite) { + acc.errors.set( + uuid.v4(), + createBulkErrorObject({ + ruleId, + statusCode: 400, + message: `More than one rule with rule-id: "${ruleId}" found`, + }) + ); } + acc.rulesAcc.set(ruleId, parsedRule); } return acc; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts deleted file mode 100644 index 66356a1d65352..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.test.ts +++ /dev/null @@ -1,1658 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, PrepackagedRules } from '../../types'; -import { addPrepackagedRulesSchema } from './add_prepackaged_rules_schema'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('add prepackaged rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate', () => { - expect(addPrepackagedRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval, version] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, version] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does not validate because output_index is not allowed', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual('"output_index" is not allowed'); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, version] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - version: 1, - }).error - ).toBeFalsy(); - }); - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, version, s] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).value.references - ).toEqual([]); - }); - - test('defaults immutable to true', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).value.immutable - ).toEqual(true); - }); - - test('immutable cannot be set in a pre-packaged rule', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - immutable: true, - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual('child "immutable" fails because ["immutable" is not allowed]'); - }); - - test('defaults enabled to false', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).value.enabled - ).toEqual(false); - }); - - test('rule_id is required', () => { - expect( - addPrepackagedRulesSchema.validate>({ - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual('child "rule_id" fails because ["rule_id" is required]'); - }); - - test('references cannot be numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - version: 1, - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { index: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - version: 1, - }).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - version: 1, - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - version: 1, - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - version: 1, - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - version: 1, - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - version: 1, - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - version: 1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - version: 1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { tags: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - version: 1, - }).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - version: 1, - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - version: 1, - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - version: 1, - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial & { meta: string }> - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - version: 1, - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - version: 1, - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: 'timeline-id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: 'timeline-id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: 'timeline-id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - version: 1, - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - id: 'id', - action_type_id: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - group: 'group', - action_type_id: 'action_type_id', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - group: 'group', - id: 'id', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: Array>; - } - >({ - actions: [ - { - group: 'group', - id: 'id', - action_type_id: 'action_type_id', - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial> & { - actions: AlertAction[]; - } - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - index: ['auditbeat-*'], - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to any string you want', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: '# test header', - version: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot create note as anything other than a string', () => { - expect( - addPrepackagedRulesSchema.validate< - Partial & { note: object }> - >({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: { - somethingMadeUp: { somethingElse: true }, - }, - version: 1, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - version: 1, - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - addPrepackagedRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - version: 1, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - addPrepackagedRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - version: 1, - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - addPrepackagedRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - version: 1, - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts deleted file mode 100644 index f1bffdaf83522..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/add_prepackaged_rules_schema.ts +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - enabled, - description, - false_positives, - filters, - from, - immutable, - index, - rule_id, - interval, - query, - language, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -/** - * Big differences between this schema and the createRulesSchema - * - rule_id is required here - * - output_index is not allowed (and instead the space index must be used) - * - immutable is forbidden but defaults to true instead of to false and it can only ever be true - * - enabled defaults to false instead of true - * - version is a required field that must exist - * - index is a required field that must exist if type !== machine_learning - */ -export const addPrepackagedRulesSchema = Joi.object({ - actions: actions.default([]), - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - description: description.required(), - enabled: enabled.default(false), - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id: rule_id.required(), - immutable: immutable.forbidden().default(true).valid(true), - index: index.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: Joi.required(), - }), - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version: version.required(), - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts deleted file mode 100644 index 0bf59759a6db6..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.test.ts +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { createRulesBulkSchema } from './create_rules_bulk_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: create_rules_schema.test.ts for the bulk of the validation tests -// this just wraps createRulesSchema in an array -describe('create_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - createRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('made up values do not validate', () => { - expect( - createRulesBulkSchema.validate<[{ madeUp: string }]>([ - { - madeUp: 'hi', - }, - ]).error - ).toBeTruthy(); - }); - - test('single array of [id] does validate', () => { - expect( - createRulesBulkSchema.validate>>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); - - test('two values of [id] does validate', () => { - expect( - createRulesBulkSchema.validate>>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - { - rule_id: 'rule-2', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because [child "severity" fails because ["severity" must be one of [low, medium, high, critical]]]' - ); - }); - - test('You can set "note" to a string', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '# test markdown', - version: 1, - }, - ]).error - ).toBeFalsy(); - }); - - test('You can set "note" to an empty string', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '', - version: 1, - }, - ]).error - ).toBeFalsy(); - }); - - test('You cannot set "note" to anything other than string', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: { - something: 'some object', - }, - version: 1, - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because [child "note" fails because ["note" must be a string]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].actions - ).toEqual([]); - }); - - test('The default for "throttle" will be null', () => { - expect( - createRulesBulkSchema.validate>([ - { - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }, - ]).value[0].throttle - ).toEqual(null); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts deleted file mode 100644 index bcc4475f2d9f0..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_bulk_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -import { createRulesSchema } from './create_rules_schema'; - -export const createRulesBulkSchema = Joi.array().items(createRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts deleted file mode 100644 index 013db2020a146..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.test.ts +++ /dev/null @@ -1,1623 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { createRulesSchema } from './create_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, RuleAlertParamsRest } from '../../types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('create rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate', () => { - expect(createRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - createRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual([]); - }); - - test('references cannot be numbers', () => { - expect( - createRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - createRulesSchema.validate> & { index: number[] }>( - { - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - } - ).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - createRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - createRulesSchema.validate< - Partial & { language: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - createRulesSchema.validate> & { tags: number[] }>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - }).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - createRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - createRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - createRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - createRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot set the immutable when trying to create a rule', () => { - expect( - createRulesSchema.validate< - Partial> & { immutable: number } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: 5, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('"immutable" is not allowed'); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - createRulesSchema.validate & { meta: string }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId"', () => { - expect( - createRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to a string', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '# documentation markdown here', - }).error - ).toBeFalsy(); - }); - - test('You can set note to an emtpy string', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '', - }).error - ).toBeFalsy(); - }); - - test('You cannot create note as an object', () => { - expect( - createRulesSchema.validate & { note: object }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: { - somethingHere: 'something else', - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).error - ).toBeFalsy(); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - createRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - createRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - createRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts deleted file mode 100644 index dec8b5ccbc790..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/create_rules_schema.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - anomaly_threshold, - enabled, - description, - false_positives, - filters, - from, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - version, - lists, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -export const createRulesSchema = Joi.object({ - actions: actions.default([]), - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - description: description.required(), - enabled: enabled.default(true), - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id, - index, - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - output_index, - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version: version.default(1), - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts deleted file mode 100644 index 0e71237f75232..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { exportRulesSchema, exportRulesQuerySchema } from './export_rules_schema'; -import { ExportRulesRequestParams } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('create rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - describe('exportRulesSchema', () => { - test('null value or absent values validate', () => { - expect(exportRulesSchema.validate(null).error).toBeFalsy(); - }); - - test('empty object does not validate', () => { - expect( - exportRulesSchema.validate>({}).error - ).toBeTruthy(); - }); - - test('empty object array does validate', () => { - expect( - exportRulesSchema.validate>({ objects: [] }).error - ).toBeTruthy(); - }); - - test('array with rule_id validates', () => { - expect( - exportRulesSchema.validate>({ - objects: [{ rule_id: 'test-1' }], - }).error - ).toBeFalsy(); - }); - - test('array with id does not validate as we do not allow that on purpose since we export rule_id', () => { - expect( - exportRulesSchema.validate>({ - objects: [{ id: 'test-1' }], - }).error.message - ).toEqual( - 'child "objects" fails because ["objects" at position 0 fails because ["id" is not allowed]]' - ); - }); - }); - - describe('exportRulesQuerySchema', () => { - test('default value for file_name is export.ndjson', () => { - expect( - exportRulesQuerySchema.validate>({}).value - .file_name - ).toEqual('export.ndjson'); - }); - - test('default value for exclude_export_details is false', () => { - expect( - exportRulesQuerySchema.validate>({}).value - .exclude_export_details - ).toEqual(false); - }); - - test('file_name validates', () => { - expect( - exportRulesQuerySchema.validate>({ - file_name: 'test.ndjson', - }).error - ).toBeFalsy(); - }); - - test('file_name does not validate with a number', () => { - expect( - exportRulesQuerySchema.validate< - Partial & { file_name: number }> - >({ - file_name: 5, - }).error.message - ).toEqual('child "file_name" fails because ["file_name" must be a string]'); - }); - - test('exclude_export_details validates with a boolean true', () => { - expect( - exportRulesQuerySchema.validate>({ - exclude_export_details: true, - }).error - ).toBeFalsy(); - }); - - test('exclude_export_details does not validate with a weird string', () => { - expect( - exportRulesQuerySchema.validate< - Partial< - Omit & { - exclude_export_details: string; - } - > - >({ - exclude_export_details: 'blah', - }).error.message - ).toEqual( - 'child "exclude_export_details" fails because ["exclude_export_details" must be a boolean]' - ); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts deleted file mode 100644 index a14d81604d9f8..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/export_rules_schema.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { objects, exclude_export_details, file_name } from './schemas'; -/* eslint-disable @typescript-eslint/camelcase */ - -export const exportRulesSchema = Joi.object({ - objects, -}) - .min(1) - .allow(null); - -export const exportRulesQuerySchema = Joi.object({ - file_name: file_name.default('export.ndjson'), - exclude_export_details: exclude_export_details.default(false), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts deleted file mode 100644 index ffbfd193873a8..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { findRulesSchema } from './find_rules_schema'; -import { FindParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('find rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do validate', () => { - expect(findRulesSchema.validate>({}).error).toBeFalsy(); - }); - - test('all values validate', () => { - expect( - findRulesSchema.validate>({ - per_page: 5, - page: 1, - sort_field: 'some field', - fields: ['field 1', 'field 2'], - filter: 'some filter', - sort_order: 'asc', - }).error - ).toBeFalsy(); - }); - - test('made up parameters do not validate', () => { - expect( - findRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('per_page validates', () => { - expect( - findRulesSchema.validate>({ per_page: 5 }).error - ).toBeFalsy(); - }); - - test('page validates', () => { - expect( - findRulesSchema.validate>({ page: 5 }).error - ).toBeFalsy(); - }); - - test('sort_field validates', () => { - expect( - findRulesSchema.validate>({ sort_field: 'some value' }).error - ).toBeFalsy(); - }); - - test('fields validates with a string', () => { - expect( - findRulesSchema.validate>({ fields: ['some value'] }).error - ).toBeFalsy(); - }); - - test('fields validates with multiple strings', () => { - expect( - findRulesSchema.validate>({ - fields: ['some value 1', 'some value 2'], - }).error - ).toBeFalsy(); - }); - - test('fields does not validate with a number', () => { - expect( - findRulesSchema.validate> & { fields: number[] }>({ - fields: [5], - }).error.message - ).toEqual( - 'child "fields" fails because ["fields" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('per page has a default of 20', () => { - expect(findRulesSchema.validate>({}).value.per_page).toEqual(20); - }); - - test('page has a default of 1', () => { - expect(findRulesSchema.validate>({}).value.page).toEqual(1); - }); - - test('filter works with a string', () => { - expect( - findRulesSchema.validate>({ - filter: 'some value 1', - }).error - ).toBeFalsy(); - }); - - test('filter does not work with a number', () => { - expect( - findRulesSchema.validate> & { filter: number }>({ - filter: 5, - }).error.message - ).toEqual('child "filter" fails because ["filter" must be a string]'); - }); - - test('sort_order requires sort_field to work', () => { - expect( - findRulesSchema.validate>({ - sort_order: 'asc', - }).error.message - ).toEqual('child "sort_field" fails because ["sort_field" is required]'); - }); - - test('sort_order and sort_field validate together', () => { - expect( - findRulesSchema.validate>({ - sort_order: 'asc', - sort_field: 'some field', - }).error - ).toBeFalsy(); - }); - - test('sort_order validates with desc and sort_field', () => { - expect( - findRulesSchema.validate>({ - sort_order: 'desc', - sort_field: 'some field', - }).error - ).toBeFalsy(); - }); - - test('sort_order does not validate with a string other than asc and desc', () => { - expect( - findRulesSchema.validate< - Partial> & { sort_order: string } - >({ - sort_order: 'some other string', - sort_field: 'some field', - }).error.message - ).toEqual('child "sort_order" fails because ["sort_order" must be one of [asc, desc]]'); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts deleted file mode 100644 index 3cc5b9ca44530..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { queryFilter, fields, per_page, page, sort_field, sort_order } from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -export const findRulesSchema = Joi.object({ - fields, - filter: queryFilter, - per_page, - page, - sort_field: Joi.when(Joi.ref('sort_order'), { - is: Joi.exist(), - then: sort_field.required(), - otherwise: sort_field.optional(), - }), - sort_order, -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts deleted file mode 100644 index 5b8661e69e206..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/find_rules_statuses_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -export const findRulesStatusesSchema = Joi.object({ - ids: Joi.array().items(Joi.string()), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts deleted file mode 100644 index cb03c4781cb6c..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.test.ts +++ /dev/null @@ -1,1841 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { - importRulesSchema, - importRulesQuerySchema, - importRulesPayloadSchema, -} from './import_rules_schema'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, ImportRuleAlertRest } from '../../types'; -import { ImportRulesRequestParams } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('import rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - describe('importRulesSchema', () => { - test('empty objects do not validate', () => { - expect(importRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - importRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual([]); - }); - - test('references cannot be numbers', () => { - expect( - importRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - importRulesSchema.validate< - Partial> & { index: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - importRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - importRulesSchema.validate> & { tags: number[] }>( - { - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - } - ).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - importRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - importRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - importRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - importRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You can optionally set the immutable to be false', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannnot set immutable to be true', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: true, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "immutable" fails because ["immutable" must be one of [false]]'); - }); - - test('You cannot set the immutable to be a number', () => { - expect( - importRulesSchema.validate< - Partial> & { immutable: number } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: 5, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "immutable" fails because ["immutable" must be a boolean]'); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - importRulesSchema.validate & { meta: string }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: '', - }).error.message - ).toEqual( - 'child "timeline_title" fails because ["timeline_title" is not allowed to be empty]' - ); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('rule_id is required and you cannot get by with just id', () => { - expect( - importRulesSchema.validate>({ - id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error.message - ).toEqual('child "rule_id" fails because ["rule_id" is required]'); - }); - - test('it validates with created_at, updated_at, created_by, updated_by values', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - created_at: '2020-01-09T06:15:24.749Z', - updated_at: '2020-01-09T06:15:24.749Z', - created_by: 'Braden Hassanabad', - updated_by: 'Evan Hassanabad', - }).error - ).toBeFalsy(); - }); - - test('it does not validate with epoch strings for created_at', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - created_at: '1578550728650', - updated_at: '2020-01-09T06:15:24.749Z', - created_by: 'Braden Hassanabad', - updated_by: 'Evan Hassanabad', - }).error.message - ).toEqual('child "created_at" fails because ["created_at" must be a valid ISO 8601 date]'); - }); - - test('it does not validate with epoch strings for updated_at', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - created_at: '2020-01-09T06:15:24.749Z', - updated_at: '1578550728650', - created_by: 'Braden Hassanabad', - updated_by: 'Evan Hassanabad', - }).error.message - ).toEqual('child "updated_at" fails because ["updated_at" must be a valid ISO 8601 date]'); - }); - }); - - describe('importRulesQuerySchema', () => { - test('overwrite gets a default value of false', () => { - expect( - importRulesQuerySchema.validate>({}).value - .overwrite - ).toEqual(false); - }); - - test('overwrite validates with a boolean true', () => { - expect( - importRulesQuerySchema.validate>({ - overwrite: true, - }).error - ).toBeFalsy(); - }); - - test('overwrite does not validate with a weird string', () => { - expect( - importRulesQuerySchema.validate< - Partial< - Omit & { - overwrite: string; - } - > - >({ - overwrite: 'blah', - }).error - ).toBeTruthy(); - }); - }); - - describe('importRulesPayloadSchema', () => { - test('does not validate with an empty object', () => { - expect(importRulesPayloadSchema.validate({}).error).toBeTruthy(); - }); - - test('does validate with a file object', () => { - expect(importRulesPayloadSchema.validate({ file: {} }).error).toBeFalsy(); - }); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId', () => { - expect( - importRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to a string', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: '# test header', - }).error - ).toBeFalsy(); - }); - - test('You can set note to an empty string', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: '', - }).error - ).toBeFalsy(); - }); - - test('You cannot create note set to null', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: null, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - - test('You cannot create note as something other than a string', () => { - expect( - importRulesSchema.validate & { note: object }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: false, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - note: { - somethingMadeUp: { somethingElse: true }, - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - importRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate and exceptions_list is empty', () => { - expect( - importRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate', () => { - expect( - importRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts deleted file mode 100644 index d3c728ebac1a9..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/import_rules_schema.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - id, - actions, - created_at, - updated_at, - created_by, - updated_by, - enabled, - description, - false_positives, - filters, - from, - immutable, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -/** - * Differences from this and the createRulesSchema are - * - rule_id is required - * - id is optional (but ignored in the import code - rule_id is exclusively used for imports) - * - created_at is optional (but ignored in the import code) - * - updated_at is optional (but ignored in the import code) - * - created_by is optional (but ignored in the import code) - * - updated_by is optional (but ignored in the import code) - */ -export const importRulesSchema = Joi.object({ - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - id, - actions: actions.default([]), - description: description.required(), - enabled: enabled.default(true), - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id: rule_id.required(), - immutable: immutable.default(false).valid(false), - index, - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - output_index, - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version: version.default(1), - created_at, - updated_at, - created_by, - updated_by, - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}); - -export const importRulesQuerySchema = Joi.object({ - overwrite: Joi.boolean().default(false), -}); - -export const importRulesPayloadSchema = Joi.object({ - file: Joi.object().required(), -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts deleted file mode 100644 index e87c732e8a2f7..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { patchRulesBulkSchema } from './patch_rules_bulk_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: patch_rules_schema.test.ts for the bulk of the validation tests -// this just wraps patchRulesSchema in an array -describe('patch_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - patchRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('made up values do not validate', () => { - expect( - patchRulesBulkSchema.validate<[{ madeUp: string }]>([ - { - madeUp: 'hi', - }, - ]).error - ).toBeTruthy(); - }); - - test('single array of [id] does validate', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - }, - ]).error - ).toBeFalsy(); - }); - - test('two values of [id] does validate', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - }, - { - id: 'rule-2', - }, - ]).error - ).toBeFalsy(); - }); - - test('can set "note" to be a string', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - note: 'hi', - }, - ]).error - ).toBeFalsy(); - }); - - test('can set "note" to be an empty string', () => { - expect( - patchRulesBulkSchema.validate>>([ - { - id: 'rule-1', - note: '', - }, - ]).error - ).toBeFalsy(); - }); - - test('cannot set "note" to be anything other than a string', () => { - expect( - patchRulesBulkSchema.validate< - Array & { note: object }>> - >([ - { - id: 'rule-1', - note: { - someprop: 'some value here', - }, - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because [child "note" fails because ["note" must be a string]]' - ); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts deleted file mode 100644 index ff813bce84add..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_bulk_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -import { patchRulesSchema } from './patch_rules_schema'; - -export const patchRulesBulkSchema = Joi.array().items(patchRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts deleted file mode 100644 index 218cae68db036..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.test.ts +++ /dev/null @@ -1,1362 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { patchRulesSchema } from './patch_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams } from '../../types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('patch rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate as they require at least id or rule_id', () => { - expect(patchRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - patchRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[id] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - }).error - ).toBeFalsy(); - }); - - test('[rule_id] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeFalsy(); - }); - - test('[id] and [rule_id] does not validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'id-1', - rule_id: 'rule-1', - }).error.message - ).toEqual('"value" contains a conflict between exclusive peers [id, rule_id]'); - }); - - test('[rule_id, description] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeFalsy(); - }); - - test('[id, description] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - }).error - ).toBeFalsy(); - }); - - test('[id, risk_score] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - risk_score: 10, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name, severity] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name, severity] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name, severity, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, name, severity, type, interval] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, interval, type] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, interval, type, query] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, interval, type, query, language] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, type, filter] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('[id, description, from, to, index, name, severity, type, filter] does validate', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as a valid value to patch with', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('does not default references to an array', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual(undefined); - }); - - test('does not default interval', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual(undefined); - }); - - test('does not default max signal', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(undefined); - }); - - test('references cannot be numbers', () => { - expect( - patchRulesSchema.validate< - Partial> & { references: number[] } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - patchRulesSchema.validate< - Partial> & { index: number[] } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('saved_id is not required when type is saved_query and will validate without it', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error - ).toBeFalsy(); - }); - - test('saved_id validates with saved_query', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('language validates with kuery', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - patchRulesSchema.validate< - Partial & { language: string }> - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('meta can be patched', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - meta: { whateverYouWant: 'anything_at_all' }, - }).error - ).toBeFalsy(); - }); - - test('You cannot patch meta as a string', () => { - expect( - patchRulesSchema.validate & { meta: string }>>( - { - id: 'rule-1', - meta: 'should not work', - } - ).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('filters cannot be a string', () => { - expect( - patchRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - type: 'query', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('threat is not defaulted to empty array on patch', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).value.threat - ).toBe(undefined); - }); - - test('threat is not defaulted to undefined on patch with empty array', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).value.threat - ).toMatchObject([]); - }); - - test('threat is valid when updated with all sub-objects', () => { - const expected: ThreatParams[] = [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ]; - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).value.threat - ).toMatchObject(expected); - }); - - test('threat is invalid when updated with missing property framework', () => { - expect( - patchRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('threat is invalid when updated with missing tactic sub-object', () => { - expect( - patchRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('threat is invalid when updated with missing technique', () => { - expect( - patchRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'some-id', - timeline_title: 'some-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'some-id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'timeline-id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: 'some-id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - describe('note', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, note] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - note: '# some documentation markdown', - }).error - ).toBeFalsy(); - }); - - test('note can be patched', () => { - expect( - patchRulesSchema.validate>({ - id: 'rule-1', - note: '# new documentation markdown', - }).error - ).toBeFalsy(); - }); - - test('You cannot patch note as an object', () => { - expect( - patchRulesSchema.validate< - Partial & { note: object }> - >({ - id: 'rule-1', - note: { - someProperty: 'something else here', - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId', () => { - expect( - patchRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - { - name: '678', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('exceptions_list can be patched', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'some id', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - patchRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - patchRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - patchRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts deleted file mode 100644 index 503bc64df237c..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/patch_rules_schema.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - enabled, - description, - false_positives, - filters, - from, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note, - id, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -import { hasListsFeature } from '../../feature_flags'; -/* eslint-enable @typescript-eslint/camelcase */ - -export const patchRulesSchema = Joi.object({ - actions, - anomaly_threshold, - description, - enabled, - false_positives, - filters, - from, - rule_id, - id, - index, - interval, - query: query.allow(''), - language, - machine_learning_job_id, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - note: note.allow(''), - version, - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}).xor('id', 'rule_id'); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts deleted file mode 100644 index 389c5ff7ea617..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { queryRulesBulkSchema } from './query_rules_bulk_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: query_rules_bulk_schema.test.ts for the bulk of the validation tests -// this just wraps queryRulesSchema in an array -describe('query_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - queryRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('both rule_id and id being supplied do not validate', () => { - expect( - queryRulesBulkSchema.validate>>([ - { - rule_id: '1', - id: '1', - }, - ]).error.message - ).toEqual( - '"value" at position 0 fails because ["value" contains a conflict between exclusive peers [id, rule_id]]' - ); - }); - - test('both rule_id and id being supplied do not validate if one array element works but the second does not', () => { - expect( - queryRulesBulkSchema.validate>>([ - { - id: '1', - }, - { - rule_id: '1', - id: '1', - }, - ]).error.message - ).toEqual( - '"value" at position 1 fails because ["value" contains a conflict between exclusive peers [id, rule_id]]' - ); - }); - - test('only id validates', () => { - expect( - queryRulesBulkSchema.validate>>([{ id: '1' }]).error - ).toBeFalsy(); - }); - - test('only id validates with two elements', () => { - expect( - queryRulesBulkSchema.validate>>([ - { id: '1' }, - { id: '2' }, - ]).error - ).toBeFalsy(); - }); - - test('only rule_id validates', () => { - expect( - queryRulesBulkSchema.validate>>([{ rule_id: '1' }]) - .error - ).toBeFalsy(); - }); - - test('only rule_id validates with two elements', () => { - expect( - queryRulesBulkSchema.validate>>([ - { rule_id: '1' }, - { rule_id: '2' }, - ]).error - ).toBeFalsy(); - }); - - test('both id and rule_id validates with two separate elements', () => { - expect( - queryRulesBulkSchema.validate>>([ - { id: '1' }, - { rule_id: '2' }, - ]).error - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts deleted file mode 100644 index 13ccac282281d..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_bulk_schema.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import Joi from 'joi'; - -import { queryRulesSchema } from './query_rules_schema'; - -export const queryRulesBulkSchema = Joi.array().items(queryRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts deleted file mode 100644 index 68be4c627780c..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_rules_schema.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { queryRulesSchema } from './query_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('queryRulesSchema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate', () => { - expect(queryRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('both rule_id and id being supplied do not validate', () => { - expect( - queryRulesSchema.validate>({ rule_id: '1', id: '1' }).error - .message - ).toEqual('"value" contains a conflict between exclusive peers [id, rule_id]'); - }); - - test('only id validates', () => { - expect( - queryRulesSchema.validate>({ id: '1' }).error - ).toBeFalsy(); - }); - - test('only rule_id validates', () => { - expect( - queryRulesSchema.validate>({ rule_id: '1' }).error - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts deleted file mode 100644 index 4752d1794ff28..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { querySignalsSchema } from './query_signals_index_schema'; -import { SignalsQueryRestParams } from '../../signals/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('query, aggs, size, _source and track_total_hits on signals index', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('query, aggs, size, _source and track_total_hits simultaneously', () => { - expect( - querySignalsSchema.validate>({ - query: {}, - aggs: {}, - size: 1, - track_total_hits: true, - _source: ['field'], - }).error - ).toBeFalsy(); - }); - - test('query only', () => { - expect( - querySignalsSchema.validate>({ - query: {}, - }).error - ).toBeFalsy(); - }); - - test('aggs only', () => { - expect( - querySignalsSchema.validate>({ - aggs: {}, - }).error - ).toBeFalsy(); - }); - - test('size only', () => { - expect( - querySignalsSchema.validate>({ - size: 1, - }).error - ).toBeFalsy(); - }); - - test('track_total_hits only', () => { - expect( - querySignalsSchema.validate>({ - track_total_hits: true, - }).error - ).toBeFalsy(); - }); - - test('_source only', () => { - expect( - querySignalsSchema.validate>({ - _source: ['field'], - }).error - ).toBeFalsy(); - }); - - test('missing query, aggs, size, _source and track_total_hits is invalid', () => { - expect(querySignalsSchema.validate>({}).error).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts deleted file mode 100644 index 26a32d2e4980b..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/query_signals_index_schema.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -export const querySignalsSchema = Joi.object({ - query: Joi.object(), - aggs: Joi.object(), - size: Joi.number().integer(), - track_total_hits: Joi.boolean(), - _source: Joi.array().items(Joi.string()), -}).min(1); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts deleted file mode 100644 index ae951ea5e33d2..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/schemas.ts +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -export const anomaly_threshold = Joi.number().integer().greater(-1).less(101); -export const description = Joi.string(); -export const enabled = Joi.boolean(); -export const exclude_export_details = Joi.boolean(); -export const false_positives = Joi.array().items(Joi.string()); -export const file_name = Joi.string(); -export const filters = Joi.array(); -export const from = Joi.string(); -export const immutable = Joi.boolean(); -export const rule_id = Joi.string(); -export const id = Joi.string(); -export const index = Joi.array().items(Joi.string()).single(); -export const interval = Joi.string(); -export const query = Joi.string(); -export const language = Joi.string().valid('kuery', 'lucene'); -export const objects = Joi.array().items( - Joi.object({ - rule_id, - }).required() -); -export const output_index = Joi.string(); -export const saved_id = Joi.string(); -export const timeline_id = Joi.string(); -export const timeline_title = Joi.string().when('timeline_id', { - is: Joi.exist(), - then: Joi.required(), - otherwise: Joi.forbidden(), -}); -export const meta = Joi.object(); -export const max_signals = Joi.number().integer().greater(0); -export const name = Joi.string(); -export const risk_score = Joi.number().integer().greater(-1).less(101); -export const severity = Joi.string().valid('low', 'medium', 'high', 'critical'); -export const status = Joi.string().valid('open', 'closed'); -export const to = Joi.string(); -export const type = Joi.string().valid('query', 'saved_query', 'machine_learning'); -export const machine_learning_job_id = Joi.string(); -export const queryFilter = Joi.string(); -export const references = Joi.array().items(Joi.string()).single(); -export const per_page = Joi.number().integer().min(0).default(20); -export const page = Joi.number().integer().min(1).default(1); -export const signal_ids = Joi.array().items(Joi.string()); -export const signal_status_query = Joi.object(); -export const sort_field = Joi.string(); -export const sort_order = Joi.string().valid('asc', 'desc'); -export const tags = Joi.array().items(Joi.string()); -export const fields = Joi.array().items(Joi.string()).single(); -export const threat_framework = Joi.string(); -export const threat_tactic_id = Joi.string(); -export const threat_tactic_name = Joi.string(); -export const threat_tactic_reference = Joi.string(); -export const threat_tactic = Joi.object({ - id: threat_tactic_id.required(), - name: threat_tactic_name.required(), - reference: threat_tactic_reference.required(), -}); -export const threat_technique_id = Joi.string(); -export const threat_technique_name = Joi.string(); -export const threat_technique_reference = Joi.string(); -export const threat_technique = Joi.object({ - id: threat_technique_id.required(), - name: threat_technique_name.required(), - reference: threat_technique_reference.required(), -}); -export const threat_techniques = Joi.array().items(threat_technique.required()); -export const threat = Joi.array().items( - Joi.object({ - framework: threat_framework.required(), - tactic: threat_tactic.required(), - technique: threat_techniques.required(), - }) -); -export const created_at = Joi.string().isoDate().strict(); -export const updated_at = Joi.string().isoDate().strict(); -export const created_by = Joi.string(); -export const updated_by = Joi.string(); -export const version = Joi.number().integer().min(1); -export const action_group = Joi.string(); -export const action_id = Joi.string(); -export const action_action_type_id = Joi.string(); -export const action_params = Joi.object(); -export const action = Joi.object({ - group: action_group.required(), - id: action_id.required(), - action_type_id: action_action_type_id.required(), - params: action_params.required(), -}); -export const actions = Joi.array().items(action); -export const throttle = Joi.string().allow(null); -export const note = Joi.string(); - -// NOTE: Experimental list support not being shipped currently and behind a feature flag -// TODO: (LIST-FEATURE) Remove this comment once we lists have passed testing and is ready for the release -export const list_field = Joi.string(); -export const list_values_operator = Joi.string().valid(['included', 'excluded']); -export const list_values_types = Joi.string().valid(['match', 'match_all', 'list', 'exists']); -export const list_values = Joi.object({ - name: Joi.string().required(), - id: Joi.string(), - description: Joi.string(), - created_at, -}); -export const list = Joi.object({ - field: list_field.required(), - values_operator: list_values_operator.required(), - values_type: list_values_types.required(), - values: Joi.when('values_type', { - is: 'exists', - then: Joi.forbidden(), - otherwise: Joi.array().items(list_values).required(), - }), -}); -export const list_and = Joi.object({ - and: Joi.array().items(list), -}); -export const lists = Joi.array().items(list.concat(list_and)); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts deleted file mode 100644 index 953532a6e1c26..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { setSignalsStatusSchema } from './set_signal_status_schema'; -import { SignalsStatusRestParams } from '../../signals/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('set signal status schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('signal_ids and status is valid', () => { - expect( - setSignalsStatusSchema.validate>({ - signal_ids: ['somefakeid'], - status: 'open', - }).error - ).toBeFalsy(); - }); - - test('query and status is valid', () => { - expect( - setSignalsStatusSchema.validate>({ - query: {}, - status: 'open', - }).error - ).toBeFalsy(); - }); - - test('signal_ids and missing status is invalid', () => { - expect( - setSignalsStatusSchema.validate>({ - signal_ids: ['somefakeid'], - }).error.message - ).toEqual('child "status" fails because ["status" is required]'); - }); - - test('query and missing status is invalid', () => { - expect( - setSignalsStatusSchema.validate>({ - query: {}, - }).error.message - ).toEqual('child "status" fails because ["status" is required]'); - }); - - test('status is present but query or signal_ids is missing is invalid', () => { - expect( - setSignalsStatusSchema.validate>({ - status: 'closed', - }).error.message - ).toEqual('"value" must contain at least one of [signal_ids, query]'); - }); - - test('signal_ids is present but status has wrong value', () => { - expect( - setSignalsStatusSchema.validate< - Partial< - Omit & { - status: string; - } - > - >({ - status: 'fakeVal', - }).error.message - ).toEqual('child "status" fails because ["status" must be one of [open, closed]]'); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts deleted file mode 100644 index c8a06619287df..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/set_signal_status_schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { signal_ids, signal_status_query, status } from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -export const setSignalsStatusSchema = Joi.object({ - signal_ids, - query: signal_status_query, - status: status.required(), -}).xor('signal_ids', 'query'); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts deleted file mode 100644 index d329070eaaa0a..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { updateRulesBulkSchema } from './update_rules_bulk_schema'; -import { UpdateRuleAlertParamsRest } from '../../rules/types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -// only the basics of testing are here. -// see: update_rules_schema.test.ts for the bulk of the validation tests -// this just wraps updateRulesSchema in an array -describe('update_rules_bulk_schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('can take an empty array and validate it', () => { - expect( - updateRulesBulkSchema.validate>>([]).error - ).toBeFalsy(); - }); - - test('made up values do not validate', () => { - expect( - updateRulesBulkSchema.validate<[{ madeUp: string }]>([ - { - madeUp: 'hi', - }, - ]).error - ).toBeTruthy(); - }); - - test('single array of [id] does validate', () => { - expect( - updateRulesBulkSchema.validate>>([ - { - id: 'id-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); - - test('two values of [id] does validate', () => { - expect( - updateRulesBulkSchema.validate>>([ - { - id: 'id-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - { - id: 'id-2', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }, - ]).error - ).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts deleted file mode 100644 index 123ec2d5b7e15..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_bulk_schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -import { updateRulesSchema } from './update_rules_schema'; - -export const updateRulesBulkSchema = Joi.array().items(updateRulesSchema); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts deleted file mode 100644 index 8bda16de97775..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.test.ts +++ /dev/null @@ -1,1645 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { AlertAction } from '../../../../../../alerts/common'; -import { updateRulesSchema } from './update_rules_schema'; -import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { RuleAlertAction } from '../../../../../common/detection_engine/types'; -import { ThreatParams, RuleAlertParamsRest } from '../../types'; -import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; - -describe('create rules schema', () => { - beforeAll(() => { - setFeatureFlagsForTestsOnly(); - }); - - afterAll(() => { - unSetFeatureFlagsForTestsOnly(); - }); - - test('empty objects do not validate as they require at least id or rule_id', () => { - expect(updateRulesSchema.validate>({}).error).toBeTruthy(); - }); - - test('made up values do not validate', () => { - expect( - updateRulesSchema.validate>({ - madeUp: 'hi', - }).error - ).toBeTruthy(); - }); - - test('[rule_id] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - }).error - ).toBeTruthy(); - }); - - test('[id] and [rule_id] does not validate', () => { - expect( - updateRulesSchema.validate>({ - id: 'id-1', - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error.message - ).toEqual('"value" contains a conflict between exclusive peers [id, rule_id]'); - }); - - test('[rule_id, description] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, interval, index] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - interval: '5m', - index: ['index-1'], - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, name, severity, type, query, index, interval] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - name: 'some-name', - severity: 'low', - type: 'query', - query: 'some query', - index: ['index-1'], - interval: '5m', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language] does not validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeTruthy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, query, language, risk_score, output_index] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).error - ).toBeFalsy(); - }); - - test('You can send in an empty array to threat', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, output_index, threat] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - threat: [ - { - framework: 'someFramework', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('allows references to be sent as valid', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('defaults references to an array', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - }).value.references - ).toEqual([]); - }); - - test('references cannot be numbers', () => { - expect( - updateRulesSchema.validate< - Partial> & { references: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - references: [5], - }).error.message - ).toEqual( - 'child "references" fails because ["references" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('indexes cannot be numbers', () => { - expect( - updateRulesSchema.validate> & { index: number[] }>( - { - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: [5], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - query: 'some-query', - language: 'kuery', - } - ).error.message - ).toEqual( - 'child "index" fails because ["index" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('defaults interval to 5 min', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - type: 'query', - }).value.interval - ).toEqual('5m'); - }); - - test('defaults max signals to 100', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - }).value.max_signals - ).toEqual(100); - }); - - test('saved_id is required when type is saved_query and will not validate without out', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - }).error.message - ).toEqual('child "saved_id" fails because ["saved_id" is required]'); - }); - - test('saved_id is required when type is saved_query and validates with it', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - }).error - ).toBeFalsy(); - }); - - test('saved_query type can have filters with it', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: [], - }).error - ).toBeFalsy(); - }); - - test('filters cannot be a string', () => { - expect( - updateRulesSchema.validate< - Partial & { filters: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'saved_query', - saved_id: 'some id', - filters: 'some string', - }).error.message - ).toEqual('child "filters" fails because ["filters" must be an array]'); - }); - - test('language validates with kuery', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - }).error - ).toBeFalsy(); - }); - - test('language validates with lucene', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - output_index: '.siem-signals', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'lucene', - }).error - ).toBeFalsy(); - }); - - test('language does not validate with something made up', () => { - expect( - updateRulesSchema.validate< - Partial & { language: string }> - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'something-made-up', - }).error.message - ).toEqual('child "language" fails because ["language" must be one of [kuery, lucene]]'); - }); - - test('max_signals cannot be negative', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: -1, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals cannot be zero', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 0, - }).error.message - ).toEqual('child "max_signals" fails because ["max_signals" must be greater than 0]'); - }); - - test('max_signals can be 1', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can optionally send in an array of tags', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: ['tag_1', 'tag_2'], - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of tags that are numbers', () => { - expect( - updateRulesSchema.validate> & { tags: number[] }>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - tags: [0, 1, 2], - }).error.message - ).toEqual( - 'child "tags" fails because ["tags" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot send in an array of threat that are missing "framework"', () => { - expect( - updateRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "framework" fails because ["framework" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "tactic"', () => { - expect( - updateRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - technique: [ - { - id: 'techniqueId', - name: 'techniqueName', - reference: 'techniqueRef', - }, - ], - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "tactic" fails because ["tactic" is required]]]' - ); - }); - - test('You cannot send in an array of threat that are missing "technique"', () => { - expect( - updateRulesSchema.validate< - Partial> & { - threat: Array>>; - } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - threat: [ - { - framework: 'fake', - tactic: { - id: 'fakeId', - name: 'fakeName', - reference: 'fakeRef', - }, - }, - ], - }).error.message - ).toEqual( - 'child "threat" fails because ["threat" at position 0 fails because [child "technique" fails because ["technique" is required]]]' - ); - }); - - test('You can optionally send in an array of false positives', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: ['false_1', 'false_2'], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You cannot send in an array of false positives that are numbers', () => { - expect( - updateRulesSchema.validate< - Partial> & { false_positives: number[] } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - false_positives: [5, 4], - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual( - 'child "false_positives" fails because ["false_positives" at position 0 fails because ["0" must be a string]]' - ); - }); - - test('You cannot set the immutable when trying to create a rule', () => { - expect( - updateRulesSchema.validate< - Partial> & { immutable: number } - >({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - immutable: 5, - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('"immutable" is not allowed'); - }); - - test('You cannot set the risk_score to 101', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 101, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be less than 101]'); - }); - - test('You cannot set the risk_score to -1', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: -1, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error.message - ).toEqual('child "risk_score" fails because ["risk_score" must be greater than -1]'); - }); - - test('You can set the risk_score to 0', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 0, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set the risk_score to 100', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 100, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('You can set meta to any object you want', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: { - somethingMadeUp: { somethingElse: true }, - }, - }).error - ).toBeFalsy(); - }); - - test('You cannot create meta as a string', () => { - expect( - updateRulesSchema.validate & { meta: string }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - meta: 'should not work', - }).error.message - ).toEqual('child "meta" fails because ["meta" must be an object]'); - }); - - test('You can omit the query string when filters are present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - language: 'kuery', - filters: [], - max_signals: 1, - }).error - ).toBeFalsy(); - }); - - test('validates with timeline_id and timeline_title', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'timeline-id', - timeline_title: 'timeline-title', - }).error - ).toBeFalsy(); - }); - - test('You cannot omit timeline_title when timeline_id is present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is required]'); - }); - - test('You cannot have a null value for timeline_title when timeline_id is present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: null, - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" must be a string]'); - }); - - test('You cannot have empty string for timeline_title when timeline_id is present', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: 'some_id', - timeline_title: '', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title with an empty timeline_id', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_id: '', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_id" fails because ["timeline_id" is not allowed to be empty]'); - }); - - test('You cannot have timeline_title without timeline_id', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - timeline_title: 'some-title', - }).error.message - ).toEqual('child "timeline_title" fails because ["timeline_title" is not allowed]'); - }); - - test('The default for "from" will be "now-6m"', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.from - ).toEqual('now-6m'); - }); - - test('The default for "to" will be "now"', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.to - ).toEqual('now'); - }); - - test('You cannot set the severity to a value other than low, medium, high, or critical', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'junk', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "severity" fails because ["severity" must be one of [low, medium, high, critical]]' - ); - }); - - test('The default for "actions" will be an empty array', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.actions - ).toEqual([]); - }); - - test('You cannot send in an array of actions that are missing "group"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "group" fails because ["group" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "id" fails because ["id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', params: {} }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: Array>; - } - > - >({ - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "params" fails because ["params" is required]]]' - ); - }); - - test('You cannot send in an array of actions that are including "actionTypeId"', () => { - expect( - updateRulesSchema.validate< - Partial< - Omit & { - actions: AlertAction[]; - } - > - >({ - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).error.message - ).toEqual( - 'child "actions" fails because ["actions" at position 0 fails because [child "action_type_id" fails because ["action_type_id" is required]]]' - ); - }); - - test('The default for "throttle" will be null', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - risk_score: 50, - description: 'some description', - name: 'some-name', - severity: 'low', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - version: 1, - }).value.throttle - ).toEqual(null); - }); - - describe('note', () => { - test('You can set note to a string', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '# some documentation title', - }).error - ).toBeFalsy(); - }); - - test('You can set note to an empty string', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: '', - }).error - ).toBeFalsy(); - }); - - // Note: If you're looking to remove `note`, omit `note` entirely - test('You cannot set note to null', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: null, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - - test('You cannot set note as an object', () => { - expect( - updateRulesSchema.validate & { note: object }>>({ - rule_id: 'rule-1', - output_index: '.siem-signals', - risk_score: 50, - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - references: ['index-1'], - query: 'some query', - language: 'kuery', - max_signals: 1, - note: { - somethingMadeUp: { somethingElse: true }, - }, - }).error.message - ).toEqual('child "note" fails because ["note" must be a string]'); - }); - }); - - // TODO: (LIST-FEATURE) We can enable this once we change the schema's to not be global per module but rather functions that can create the schema - // on demand. Since they are per module, we have a an issue where the ENV variables do not take effect. It is better we change all the - // schema's to be function calls to avoid global side effects or just wait until the feature is available. If you want to test this early, - // you can remove the .skip and set your env variable of export ELASTIC_XPACK_SIEM_LISTS_FEATURE=true locally - describe.skip('exceptions_list', () => { - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and exceptions_list] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [ - { - field: 'source.ip', - values_operator: 'included', - values_type: 'exists', - }, - { - field: 'host.name', - values_operator: 'excluded', - values_type: 'match', - values: [ - { - name: 'rock01', - }, - ], - and: [ - { - field: 'host.id', - values_operator: 'included', - values_type: 'match_all', - values: [ - { - name: '123', - }, - ], - }, - ], - }, - ], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and empty exceptions_list] does validate', () => { - expect( - updateRulesSchema.validate>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [], - }).error - ).toBeFalsy(); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and invalid exceptions_list] does NOT validate', () => { - expect( - updateRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - exceptions_list: [{ invalid_value: 'invalid value' }], - }).error.message - ).toEqual( - 'child "exceptions_list" fails because ["exceptions_list" at position 0 fails because [child "field" fails because ["field" is required]]]' - ); - }); - - test('[rule_id, description, from, to, index, name, severity, interval, type, filter, risk_score, note, and non-existent exceptions_list] does validate with empty exceptions_list', () => { - expect( - updateRulesSchema.validate>>({ - rule_id: 'rule-1', - description: 'some description', - from: 'now-5m', - to: 'now', - index: ['index-1'], - name: 'some-name', - severity: 'low', - interval: '5m', - type: 'query', - risk_score: 50, - note: '# some markdown', - }).value.exceptions_list - ).toEqual([]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts deleted file mode 100644 index b1b37801b644f..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/schemas/update_rules_schema.ts +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import Joi from 'joi'; - -/* eslint-disable @typescript-eslint/camelcase */ -import { - actions, - enabled, - description, - false_positives, - filters, - from, - index, - rule_id, - interval, - query, - language, - output_index, - saved_id, - timeline_id, - timeline_title, - meta, - risk_score, - max_signals, - name, - severity, - tags, - to, - type, - threat, - throttle, - references, - id, - note, - version, - lists, - anomaly_threshold, - machine_learning_job_id, -} from './schemas'; -/* eslint-enable @typescript-eslint/camelcase */ - -import { DEFAULT_MAX_SIGNALS } from '../../../../../common/constants'; -import { hasListsFeature } from '../../feature_flags'; - -/** - * This almost identical to the create_rules_schema except for a few details. - * - The version will not be defaulted to a 1. If it is not given then its default will become the previous version auto-incremented - * This does break idempotency slightly as calls repeatedly without it will increment the number. If the version number is passed in - * this will update the rule's version number. - * - id is on here because you can pass in an id to update using it instead of rule_id. - */ -export const updateRulesSchema = Joi.object({ - actions: actions.default([]), - anomaly_threshold: anomaly_threshold.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - description: description.required(), - enabled: enabled.default(true), - id, - false_positives: false_positives.default([]), - filters, - from: from.default('now-6m'), - rule_id, - index, - interval: interval.default('5m'), - query: query.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: query.allow('').default(''), - }), - language: language.when('type', { - is: 'machine_learning', - then: Joi.forbidden(), - otherwise: language.default('kuery'), - }), - machine_learning_job_id: machine_learning_job_id.when('type', { - is: 'machine_learning', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - output_index, - saved_id: saved_id.when('type', { - is: 'saved_query', - then: Joi.required(), - otherwise: Joi.forbidden(), - }), - timeline_id, - timeline_title, - meta, - risk_score: risk_score.required(), - max_signals: max_signals.default(DEFAULT_MAX_SIGNALS), - name: name.required(), - severity: severity.required(), - tags: tags.default([]), - to: to.default('now'), - type: type.required(), - threat: threat.default([]), - throttle: throttle.default(null), - references: references.default([]), - note: note.allow(''), - version, - - // TODO: (LIST-FEATURE) Remove the hasListsFeatures once this is ready for release - exceptions_list: hasListsFeature() ? lists.default([]) : lists.forbidden().default([]), -}).xor('id', 'rule_id'); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts index a8819bbd7432c..f3109a911203d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts @@ -101,11 +101,12 @@ describe('set signal status', () => { path: DETECTION_ENGINE_SIGNALS_STATUS_URL, body: setStatusSignalMissingIdsAndQueryPayload(), }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith( - '"value" must contain at least one of [signal_ids, query]' - ); + const response = await server.inject(request, context); + expect(response.status).toEqual(400); + expect(response.body).toEqual({ + message: ['either "signal_ids" or "query" must be set'], + status_code: 400, + }); }); test('rejects if signal_ids but no status', async () => { @@ -118,7 +119,7 @@ describe('set signal status', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "status" fails because ["status" is required]' + 'Invalid value "undefined" supplied to "status"' ); }); @@ -132,7 +133,7 @@ describe('set signal status', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "status" fails because ["status" is required]' + 'Invalid value "undefined" supplied to "status"' ); }); @@ -150,7 +151,7 @@ describe('set signal status', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "status" fails because ["status" is required]' + 'Invalid value "undefined" supplied to "status"' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index e3e19d83d8f0d..18c3440ab93e1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -4,18 +4,24 @@ * you may not use this file except in compliance with the Elastic License. */ +import { setSignalStatusValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/set_signal_status_type_dependents'; +import { + SetSignalsStatusSchemaDecoded, + setSignalsStatusSchema, +} from '../../../../../common/detection_engine/schemas/request/set_signal_status_schema'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; -import { SignalsStatusRestParams } from '../../signals/types'; -import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; -import { transformError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; export const setSignalsStatusRoute = (router: IRouter) => { router.post( { path: DETECTION_ENGINE_SIGNALS_STATUS_URL, validate: { - body: buildRouteValidation(setSignalsStatusSchema), + body: buildRouteValidation( + setSignalsStatusSchema + ), }, options: { tags: ['access:securitySolution'], @@ -26,6 +32,10 @@ export const setSignalsStatusRoute = (router: IRouter) => { const clusterClient = context.core.elasticsearch.legacy.client; const siemClient = context.securitySolution?.getAppClient(); const siemResponse = buildSiemResponse(response); + const validationErrors = setSignalStatusValidateTypeDependents(request.body); + if (validationErrors.length) { + return siemResponse.error({ statusCode: 400, body: validationErrors }); + } if (!siemClient) { return siemResponse.error({ statusCode: 404 }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts index 8d7b171a8537b..f0863164a3f23 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts @@ -128,9 +128,12 @@ describe('query for signal', () => { path: DETECTION_ENGINE_QUERY_SIGNALS_URL, body: {}, }); - const result = server.validate(request); - - expect(result.badRequest).toHaveBeenCalledWith('"value" must have at least 1 children'); + const response = await server.inject(request, context); + expect(response.status).toEqual(400); + expect(response.body).toEqual({ + message: '"value" must have at least 1 children', + status_code: 400, + }); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts index a93f4ebff58d4..5f62ff426ecd0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -6,16 +6,22 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; -import { SignalsQueryRestParams } from '../../signals/types'; -import { querySignalsSchema } from '../schemas/query_signals_index_schema'; -import { transformError, buildRouteValidation, buildSiemResponse } from '../utils'; +import { transformError, buildSiemResponse } from '../utils'; +import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; + +import { + querySignalsSchema, + QuerySignalsSchemaDecoded, +} from '../../../../../common/detection_engine/schemas/request/query_signals_index_schema'; export const querySignalsRoute = (router: IRouter) => { router.post( { path: DETECTION_ENGINE_QUERY_SIGNALS_URL, validate: { - body: buildRouteValidation(querySignalsSchema), + body: buildRouteValidation( + querySignalsSchema + ), }, options: { tags: ['access:securitySolution'], @@ -23,9 +29,22 @@ export const querySignalsRoute = (router: IRouter) => { }, async (context, request, response) => { const { query, aggs, _source, track_total_hits, size } = request.body; + const siemResponse = buildSiemResponse(response); + if ( + query == null && + aggs == null && + _source == null && + // eslint-disable-next-line @typescript-eslint/camelcase + track_total_hits == null && + size == null + ) { + return siemResponse.error({ + statusCode: 400, + body: '"value" must have at least 1 children', + }); + } const clusterClient = context.core.elasticsearch.legacy.client; const siemClient = context.securitySolution!.getAppClient(); - const siemResponse = buildSiemResponse(response); try { const result = await clusterClient.callAsCurrentUser('search', { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts new file mode 100644 index 0000000000000..d00bffb96ad05 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.mock.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CreateRulesOptions } from './types'; +import { alertsClientMock } from '../../../../../alerts/server/mocks'; + +export const getCreateRulesOptionsMock = (): CreateRulesOptions => ({ + alertsClient: alertsClientMock.create(), + anomalyThreshold: undefined, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: 'user.name: root or user.name: admin', + language: 'kuery', + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: undefined, + filters: [], + ruleId: 'rule-1', + immutable: false, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Query with a rule id', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'query', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); + +export const getCreateMlRulesOptionsMock = (): CreateRulesOptions => ({ + alertsClient: alertsClientMock.create(), + anomalyThreshold: 55, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: undefined, + language: undefined, + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: 'new_job_id', + filters: [], + ruleId: 'rule-1', + immutable: false, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Machine Learning Job', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'machine_learning', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts index f086166d0685e..b58d64c86142d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.test.ts @@ -4,36 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { alertsClientMock } from '../../../../../alerts/server/mocks'; -import { getMlResult } from '../routes/__mocks__/request_responses'; import { createRules } from './create_rules'; +import { getCreateMlRulesOptionsMock } from './create_rules.mock'; describe('createRules', () => { - let alertsClient: ReturnType; - - beforeEach(() => { - alertsClient = alertsClientMock.create(); - }); - it('calls the alertsClient with ML params', async () => { - const params = { - ...getMlResult().params, - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', - }; - - await createRules({ - alertsClient, - ...params, - ruleId: 'new-rule-id', - enabled: true, - interval: '', - name: '', - tags: [], - actions: [], - }); - - expect(alertsClient.create).toHaveBeenCalledWith( + const ruleOptions = getCreateMlRulesOptionsMock(); + await createRules(ruleOptions); + expect(ruleOptions.alertsClient.create).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ params: expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts index 67e066c6670fb..83e9b0de16f06 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules.ts @@ -7,7 +7,7 @@ import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { Alert } from '../../../../../alerts/common'; import { APP_ID, SIGNALS_ID } from '../../../../common/constants'; -import { CreateRuleParams } from './types'; +import { CreateRulesOptions } from './types'; import { addTags } from './add_tags'; import { hasListsFeature } from '../feature_flags'; @@ -42,11 +42,11 @@ export const createRules = async ({ references, note, version, - exceptions_list, + exceptionsList, actions, -}: CreateRuleParams): Promise => { +}: CreateRulesOptions): Promise => { // TODO: Remove this and use regular exceptions_list once the feature is stable for a release - const exceptionsListParam = hasListsFeature() ? { exceptions_list } : {}; + const exceptionsListParam = hasListsFeature() ? { exceptionsList } : {}; return alertsClient.create({ data: { name, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts index 8044692ab90b1..73d3c65774b3d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.test.ts @@ -6,12 +6,12 @@ import { Readable } from 'stream'; import { createRulesStreamFromNdJson } from './create_rules_stream_from_ndjson'; import { createPromiseFromStreams } from 'src/legacy/utils/streams'; -import { ImportRuleAlertRest } from '../types'; import { BadRequestError } from '../errors/bad_request_error'; +import { ImportRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/import_rules_schema'; -type PromiseFromStreams = ImportRuleAlertRest | Error; +type PromiseFromStreams = ImportRulesSchemaDecoded | Error; -export const getOutputSample = (): Partial => ({ +export const getOutputSample = (): Partial => ({ rule_id: 'rule-1', output_index: '.siem-signals', risk_score: 50, @@ -25,7 +25,7 @@ export const getOutputSample = (): Partial => ({ type: 'query', }); -export const getSampleAsNdjson = (sample: Partial): string => { +export const getSampleAsNdjson = (sample: Partial): string => { return `${JSON.stringify(sample)}\n`; }; @@ -64,8 +64,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', exceptions_list: [], max_signals: 100, tags: [], @@ -90,8 +88,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', exceptions_list: [], max_signals: 100, tags: [], @@ -154,8 +150,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, tags: [], exceptions_list: [], @@ -180,8 +174,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -227,8 +219,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -253,8 +243,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -300,8 +288,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -327,8 +313,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -373,8 +357,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], @@ -383,8 +365,9 @@ describe('create_rules_stream_from_ndjson', () => { references: [], version: 1, }); + // TODO: Change the formatter to output something better than [object Object] expect(resultOrError[1].message).toEqual( - 'child "description" fails because ["description" is required]' + '[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]' ); expect(resultOrError[2]).toEqual({ actions: [], @@ -402,8 +385,6 @@ describe('create_rules_stream_from_ndjson', () => { enabled: true, false_positives: [], immutable: false, - query: '', - language: 'kuery', max_signals: 100, exceptions_list: [], tags: [], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts index 034813b8d100d..932a4ef9eed92 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts @@ -4,13 +4,21 @@ * you may not use this file except in compliance with the Elastic License. */ import { Transform } from 'stream'; -import { ImportRuleAlertRest } from '../types'; +import * as t from 'io-ts'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { importRuleValidateTypeDependents } from '../../../../common/detection_engine/schemas/request/import_rules_type_dependents'; +import { exactCheck } from '../../../../common/exact_check'; +import { + importRulesSchema, + ImportRulesSchema, + ImportRulesSchemaDecoded, +} from '../../../../common/detection_engine/schemas/request/import_rules_schema'; import { createSplitStream, createMapStream, createConcatStream, } from '../../../../../../../src/legacy/utils/streams'; -import { importRulesSchema } from '../routes/schemas/import_rules_schema'; import { BadRequestError } from '../errors/bad_request_error'; import { parseNdjsonStrings, @@ -19,14 +27,22 @@ import { } from '../../../utils/read_stream/create_stream_from_ndjson'; export const validateRules = (): Transform => { - return createMapStream((obj: ImportRuleAlertRest) => { + return createMapStream((obj: ImportRulesSchema) => { if (!(obj instanceof Error)) { - const validated = importRulesSchema.validate(obj); - if (validated.error != null) { - return new BadRequestError(validated.error.message); - } else { - return validated.value; - } + const decoded = importRulesSchema.decode(obj); + const checked = exactCheck(obj, decoded); + const onLeft = (errors: t.Errors): BadRequestError | ImportRulesSchemaDecoded => { + return new BadRequestError(errors.join()); + }; + const onRight = (schema: ImportRulesSchema): BadRequestError | ImportRulesSchemaDecoded => { + const validationErrors = importRuleValidateTypeDependents(schema); + if (validationErrors.length) { + return new BadRequestError(validationErrors.join()); + } else { + return schema as ImportRulesSchemaDecoded; + } + }; + return pipe(checked, fold(onLeft, onRight)); } else { return obj; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts index f96a9e38d6a6c..ddc1b509eaf02 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.test.ts @@ -49,7 +49,7 @@ describe('deleteRules', () => { expect(result).toEqual({ id: notificationId }); }); - it('should call alertsClient.delete if ruleId was null', async () => { + it('should call alertsClient.delete if ruleId was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -57,7 +57,7 @@ describe('deleteRules', () => { const result = await deleteRules({ alertsClient, id: notificationId, - ruleId: null, + ruleId: undefined, }); expect(alertsClient.delete).toHaveBeenCalledWith( @@ -68,7 +68,7 @@ describe('deleteRules', () => { expect(result).toEqual({ id: null }); }); - it('should return null if alertsClient.delete rejects with 404 if ruleId was null', async () => { + it('should return null if alertsClient.delete rejects with 404 if ruleId was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -82,7 +82,7 @@ describe('deleteRules', () => { const result = await deleteRules({ alertsClient, id: notificationId, - ruleId: null, + ruleId: undefined, }); expect(alertsClient.delete).toHaveBeenCalledWith( @@ -93,7 +93,7 @@ describe('deleteRules', () => { expect(result).toEqual(null); }); - it('should return error object if alertsClient.delete rejects with status different than 404 and if ruleId was null', async () => { + it('should return error object if alertsClient.delete rejects with status different than 404 and if ruleId was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -111,7 +111,7 @@ describe('deleteRules', () => { await deleteRules({ alertsClient, id: notificationId, - ruleId: null, + ruleId: undefined, }); } catch (error) { errorResult = error; @@ -125,7 +125,7 @@ describe('deleteRules', () => { expect(errorResult).toEqual(errorObject); }); - it('should return null if ruleId and id was null', async () => { + it('should return null if ruleId and id was undefined', async () => { (readRules as jest.Mock).mockResolvedValue({ id: null, }); @@ -133,7 +133,7 @@ describe('deleteRules', () => { const result = await deleteRules({ alertsClient, id: undefined, - ruleId: null, + ruleId: undefined, }); expect(result).toEqual(null); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts index 92a80bc50afc6..cde95a4967d86 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/delete_rules.ts @@ -5,9 +5,9 @@ */ import { readRules } from './read_rules'; -import { DeleteRuleParams } from './types'; +import { DeleteRuleOptions } from './types'; -export const deleteRules = async ({ alertsClient, id, ruleId }: DeleteRuleParams) => { +export const deleteRules = async ({ alertsClient, id, ruleId }: DeleteRuleOptions) => { const rule = await readRules({ alertsClient, id, ruleId }); if (rule == null) { return null; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts index c634f07387825..18b851c440e20 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/find_rules.ts @@ -6,7 +6,7 @@ import { FindResult } from '../../../../../alerts/server'; import { SIGNALS_ID } from '../../../../common/constants'; -import { FindRuleParams } from './types'; +import { FindRuleOptions } from './types'; export const getFilter = (filter: string | null | undefined) => { if (filter == null) { @@ -24,7 +24,7 @@ export const findRules = async ({ filter, sortField, sortOrder, -}: FindRuleParams): Promise => { +}: FindRuleOptions): Promise => { return alertsClient.find({ options: { fields, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts index a3119131a0037..b7ff1cb698e17 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_existing_prepackaged_rules.ts @@ -34,6 +34,7 @@ export const getRulesCount = async ({ page: 1, sortField: 'createdAt', sortOrder: 'desc', + fields: undefined, }); return firstRule.total; }; @@ -53,6 +54,7 @@ export const getRules = async ({ page: 1, sortField: 'createdAt', sortOrder: 'desc', + fields: undefined, }); if (isAlertTypes(rules.data)) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts index 38cf8008f65c8..1a965842348ac 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_export_by_object_ids.ts @@ -51,7 +51,7 @@ export const getRulesFromObjects = async ( objects.reduce>>((accumPromise, object) => { const exportWorkerPromise = new Promise(async (resolve) => { try { - const rule = await readRules({ alertsClient, ruleId: object.rule_id }); + const rule = await readRules({ alertsClient, ruleId: object.rule_id, id: undefined }); if (rule != null && isAlertType(rule) && rule.params.immutable !== true) { const transformedRule = transformAlertToRule(rule); resolve({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts index b2e1ed794043a..597a74f6efbbd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.test.ts @@ -5,8 +5,8 @@ */ import { getPrepackagedRules } from './get_prepackaged_rules'; -import { PrepackagedRules } from '../types'; import { isEmpty } from 'lodash/fp'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; describe('get_existing_prepackaged_rules', () => { test('should not throw any errors with the existing checked in pre-packaged rules', () => { @@ -14,9 +14,9 @@ describe('get_existing_prepackaged_rules', () => { }); test('no rule should have the same rule_id as another rule_id', () => { - const prePacakgedRules = getPrepackagedRules(); - let existingRuleIds: PrepackagedRules[] = []; - prePacakgedRules.forEach((rule) => { + const prePackagedRules = getPrepackagedRules(); + let existingRuleIds: AddPrepackagedRulesSchemaDecoded[] = []; + prePackagedRules.forEach((rule) => { const foundDuplicate = existingRuleIds.reduce((accum, existingRule) => { if (existingRule.rule_id === rule.rule_id) { return `Found duplicate rule_id of ${rule.rule_id} between these two rule names of "${rule.name}" and "${existingRule.name}"`; @@ -33,14 +33,16 @@ describe('get_existing_prepackaged_rules', () => { }); test('should throw an exception if a pre-packaged rule is not valid', () => { + // TODO: Improve the error formatter around [object Object] expect(() => getPrepackagedRules([{ not_valid_made_up_key: true }])).toThrow( - 'name: "(rule name unknown)", rule_id: "(rule rule_id unknown)" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: child "description" fails because ["description" is required], Full rule contents are:\n{\n "not_valid_made_up_key": true\n}' + 'name: "(rule name unknown)", rule_id: "(rule rule_id unknown)" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object], Full rule contents are:\n{\n "not_valid_made_up_key": true\n}' ); }); test('should throw an exception with a message having rule_id and name in it', () => { + // TODO: Improve the error formatter around [object Object] expect(() => getPrepackagedRules([{ name: 'rule name', rule_id: 'id-123' }])).toThrow( - 'name: "rule name", rule_id: "id-123" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: child "description" fails because ["description" is required]' + 'name: "rule name", rule_id: "id-123" within the folder rules/prepackaged_rules is not a valid detection engine rule. Expect the system to not work with pre-packaged rules until this rule is fixed or the file is removed. Error is: [object Object],[object Object],[object Object],[object Object],[object Object], Full rule contents are:\n{\n "name": "rule name",\n "rule_id": "id-123"\n}' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts index d150db1875065..d2af93c329636 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_prepackaged_rules.ts @@ -4,8 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PrepackagedRules } from '../types'; -import { addPrepackagedRulesSchema } from '../routes/schemas/add_prepackaged_rules_schema'; +import * as t from 'io-ts'; +import { fold } from 'fp-ts/lib/Either'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { exactCheck } from '../../../../common/exact_check'; +import { + addPrepackagedRulesSchema, + AddPrepackagedRulesSchema, + AddPrepackagedRulesSchemaDecoded, +} from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { BadRequestError } from '../errors/bad_request_error'; import { rawRules } from './prepackaged_rules'; @@ -14,26 +21,34 @@ import { rawRules } from './prepackaged_rules'; * that they are adding incorrect schema rules. Also this will auto-flush in all the default * aspects such as default interval of 5 minutes, default arrays, etc... */ -export const validateAllPrepackagedRules = (rules: PrepackagedRules[]): PrepackagedRules[] => { +export const validateAllPrepackagedRules = ( + rules: AddPrepackagedRulesSchema[] +): AddPrepackagedRulesSchemaDecoded[] => { return rules.map((rule) => { - const validatedRule = addPrepackagedRulesSchema.validate(rule); - if (validatedRule.error != null) { + const decoded = addPrepackagedRulesSchema.decode(rule); + const checked = exactCheck(rule, decoded); + + const onLeft = (errors: t.Errors): AddPrepackagedRulesSchemaDecoded => { const ruleName = rule.name ? rule.name : '(rule name unknown)'; const ruleId = rule.rule_id ? rule.rule_id : '(rule rule_id unknown)'; throw new BadRequestError( `name: "${ruleName}", rule_id: "${ruleId}" within the folder rules/prepackaged_rules ` + `is not a valid detection engine rule. Expect the system ` + `to not work with pre-packaged rules until this rule is fixed ` + - `or the file is removed. Error is: ${ - validatedRule.error.message - }, Full rule contents are:\n${JSON.stringify(rule, null, 2)}` + `or the file is removed. Error is: ${errors.join()}, Full rule contents are:\n${JSON.stringify( + rule, + null, + 2 + )}` ); - } else { - return validatedRule.value; - } + }; + + const onRight = (schema: AddPrepackagedRulesSchema): AddPrepackagedRulesSchemaDecoded => { + return schema as AddPrepackagedRulesSchemaDecoded; + }; + return pipe(checked, fold(onLeft, onRight)); }); }; -export const getPrepackagedRules = (rules = rawRules): PrepackagedRules[] => { - return validateAllPrepackagedRules(rules); -}; +export const getPrepackagedRules = (rules = rawRules): AddPrepackagedRulesSchemaDecoded[] => + validateAllPrepackagedRules(rules); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts index ee76bf2ef15b8..04e3ecc4e0ac0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.test.ts @@ -5,7 +5,8 @@ */ import { getRulesToInstall } from './get_rules_to_install'; -import { getResult, mockPrepackagedRule } from '../routes/__mocks__/request_responses'; +import { getResult } from '../routes/__mocks__/request_responses'; +import { getAddPrepackagedRulesSchemaDecodedMock } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock'; describe('get_rules_to_install', () => { test('should return empty array if both rule sets are empty', () => { @@ -14,7 +15,7 @@ describe('get_rules_to_install', () => { }); test('should return empty array if the two rule ids match', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; const installedRule = getResult(); @@ -24,7 +25,7 @@ describe('get_rules_to_install', () => { }); test('should return the rule to install if the id of the two rules do not match', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; const installedRule = getResult(); @@ -34,10 +35,10 @@ describe('get_rules_to_install', () => { }); test('should return two rules to install if both the ids of the two rules do not match', () => { - const ruleFromFileSystem1 = mockPrepackagedRule(); + const ruleFromFileSystem1 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem1.rule_id = 'rule-1'; - const ruleFromFileSystem2 = mockPrepackagedRule(); + const ruleFromFileSystem2 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem2.rule_id = 'rule-2'; const installedRule = getResult(); @@ -47,13 +48,13 @@ describe('get_rules_to_install', () => { }); test('should return two rules of three to install if both the ids of the two rules do not match but the third does', () => { - const ruleFromFileSystem1 = mockPrepackagedRule(); + const ruleFromFileSystem1 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem1.rule_id = 'rule-1'; - const ruleFromFileSystem2 = mockPrepackagedRule(); + const ruleFromFileSystem2 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem2.rule_id = 'rule-2'; - const ruleFromFileSystem3 = mockPrepackagedRule(); + const ruleFromFileSystem3 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem3.rule_id = 'rule-3'; const installedRule = getResult(); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts index 4b56bc104b817..69e0255e9b55b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_install.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PrepackagedRules } from '../types'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { RuleAlertType } from './types'; export const getRulesToInstall = ( - rulesFromFileSystem: PrepackagedRules[], + rulesFromFileSystem: AddPrepackagedRulesSchemaDecoded[], installedRules: RuleAlertType[] -): PrepackagedRules[] => { +): AddPrepackagedRulesSchemaDecoded[] => { return rulesFromFileSystem.filter( (rule) => !installedRules.some((installedRule) => installedRule.params.ruleId === rule.rule_id) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts index 40e303bddac1a..5b2eb24bcdcd2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.test.ts @@ -5,7 +5,8 @@ */ import { getRulesToUpdate } from './get_rules_to_update'; -import { getResult, mockPrepackagedRule } from '../routes/__mocks__/request_responses'; +import { getResult } from '../routes/__mocks__/request_responses'; +import { getAddPrepackagedRulesSchemaDecodedMock } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock'; describe('get_rules_to_update', () => { test('should return empty array if both rule sets are empty', () => { @@ -14,7 +15,7 @@ describe('get_rules_to_update', () => { }); test('should return empty array if the id of the two rules do not match', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 2; @@ -26,7 +27,7 @@ describe('get_rules_to_update', () => { }); test('should return empty array if the id of file system rule is less than the installed version', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 1; @@ -38,7 +39,7 @@ describe('get_rules_to_update', () => { }); test('should return empty array if the id of file system rule is the same as the installed version', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 1; @@ -50,7 +51,7 @@ describe('get_rules_to_update', () => { }); test('should return the rule to update if the id of file system rule is greater than the installed version', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 2; @@ -62,7 +63,7 @@ describe('get_rules_to_update', () => { }); test('should return 1 rule out of 2 to update if the id of file system rule is greater than the installed version of just one', () => { - const ruleFromFileSystem = mockPrepackagedRule(); + const ruleFromFileSystem = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem.rule_id = 'rule-1'; ruleFromFileSystem.version = 2; @@ -79,11 +80,11 @@ describe('get_rules_to_update', () => { }); test('should return 2 rules out of 2 to update if the id of file system rule is greater than the installed version of both', () => { - const ruleFromFileSystem1 = mockPrepackagedRule(); + const ruleFromFileSystem1 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem1.rule_id = 'rule-1'; ruleFromFileSystem1.version = 2; - const ruleFromFileSystem2 = mockPrepackagedRule(); + const ruleFromFileSystem2 = getAddPrepackagedRulesSchemaDecodedMock(); ruleFromFileSystem2.rule_id = 'rule-2'; ruleFromFileSystem2.version = 2; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts index 4deb01eff8b63..577ad44789bdc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/get_rules_to_update.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PrepackagedRules } from '../types'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { RuleAlertType } from './types'; export const getRulesToUpdate = ( - rulesFromFileSystem: PrepackagedRules[], + rulesFromFileSystem: AddPrepackagedRulesSchemaDecoded[], installedRules: RuleAlertType[] -): PrepackagedRules[] => { +): AddPrepackagedRulesSchemaDecoded[] => { return rulesFromFileSystem.filter((rule) => installedRules.some((installedRule) => { return ( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts index 7b2cef9060f8c..a51acf99b570c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/install_prepacked_rules.ts @@ -4,14 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { Alert } from '../../../../../alerts/common'; import { AlertsClient } from '../../../../../alerts/server'; import { createRules } from './create_rules'; -import { PrepackagedRules } from '../types'; +import { PartialFilter } from '../types'; export const installPrepackagedRules = ( alertsClient: AlertsClient, - rules: PrepackagedRules[], + rules: AddPrepackagedRulesSchemaDecoded[], outputIndex: string ): Array> => rules.reduce>>((acc, rule) => { @@ -21,7 +22,6 @@ export const installPrepackagedRules = ( enabled, false_positives: falsePositives, from, - immutable, query, language, machine_learning_job_id: machineLearningJobId, @@ -29,7 +29,7 @@ export const installPrepackagedRules = ( timeline_id: timelineId, timeline_title: timelineTitle, meta, - filters, + filters: filtersObject, rule_id: ruleId, index, interval, @@ -44,8 +44,11 @@ export const installPrepackagedRules = ( references, note, version, - exceptions_list, + exceptions_list: exceptionsList, } = rule; + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const filters: PartialFilter[] | undefined = filtersObject as PartialFilter[]; + return [ ...acc, createRules({ @@ -55,7 +58,7 @@ export const installPrepackagedRules = ( enabled, falsePositives, from, - immutable, + immutable: true, // At the moment we force all prepackaged rules to be immutable query, language, machineLearningJobId, @@ -79,7 +82,7 @@ export const installPrepackagedRules = ( references, note, version, - exceptions_list, + exceptionsList, actions: [], // At this time there is no pre-packaged actions }), ]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts new file mode 100644 index 0000000000000..e711d8d2ac287 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.mock.ts @@ -0,0 +1,183 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PatchRulesOptions } from './types'; +import { alertsClientMock } from '../../../../../alerts/server/mocks'; +import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; +import { INTERNAL_RULE_ID_KEY, INTERNAL_IMMUTABLE_KEY } from '../../../../common/constants'; +import { SanitizedAlert } from '../../../../../alerts/common'; + +const rule: SanitizedAlert = { + id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + name: 'Detect Root/Admin Users', + tags: [`${INTERNAL_RULE_ID_KEY}:rule-1`, `${INTERNAL_IMMUTABLE_KEY}:false`], + alertTypeId: 'siem.signals', + consumer: 'siem', + params: { + anomalyThreshold: undefined, + description: 'Detecting root and admin users', + ruleId: 'rule-1', + index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + falsePositives: [], + from: 'now-6m', + immutable: false, + query: 'user.name: root or user.name: admin', + language: 'kuery', + machineLearningJobId: undefined, + outputIndex: '.siem-signals', + timelineId: 'some-timeline-id', + timelineTitle: 'some-timeline-title', + meta: { someMeta: 'someField' }, + filters: [ + { + query: { + match_phrase: { + 'host.name': 'some-host', + }, + }, + }, + ], + riskScore: 50, + maxSignals: 100, + severity: 'high', + to: 'now', + type: 'query', + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { + id: 'TA0040', + name: 'impact', + reference: 'https://attack.mitre.org/tactics/TA0040/', + }, + technique: [ + { + id: 'T1499', + name: 'endpoint denial of service', + reference: 'https://attack.mitre.org/techniques/T1499/', + }, + ], + }, + ], + references: ['http://www.example.com', 'https://ww.example.com'], + note: '# Investigative notes', + version: 1, + exceptionsList: [ + { + field: 'source.ip', + values_operator: 'included', + values_type: 'exists', + }, + { + field: 'host.name', + values_operator: 'excluded', + values_type: 'match', + values: [ + { + name: 'rock01', + }, + ], + and: [ + { + field: 'host.id', + values_operator: 'included', + values_type: 'match_all', + values: [ + { + name: '123', + }, + { + name: '678', + }, + ], + }, + ], + }, + ], + }, + createdAt: new Date('2019-12-13T16:40:33.400Z'), + updatedAt: new Date('2019-12-13T16:40:33.400Z'), + schedule: { interval: '5m' }, + enabled: true, + actions: [], + throttle: null, + createdBy: 'elastic', + updatedBy: 'elastic', + apiKeyOwner: 'elastic', + muteAll: false, + mutedInstanceIds: [], + scheduledTaskId: '2dabe330-0702-11ea-8b50-773b89126888', +}; + +export const getPatchRulesOptionsMock = (): PatchRulesOptions => ({ + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: undefined, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: 'user.name: root or user.name: admin', + language: 'kuery', + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: undefined, + filters: [], + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Query with a rule id', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'query', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], + rule, +}); + +export const getPatchMlRulesOptionsMock = (): PatchRulesOptions => ({ + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: 55, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: undefined, + language: undefined, + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: 'new_job_id', + filters: [], + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Machine Learning Job', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'machine_learning', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], + rule, +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts index 0dffa665f780b..1ca10d9067bd9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.test.ts @@ -4,83 +4,53 @@ * you may not use this file except in compliance with the Elastic License. */ -import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; -import { alertsClientMock } from '../../../../../alerts/server/mocks'; -import { getResult, getMlResult } from '../routes/__mocks__/request_responses'; import { patchRules } from './patch_rules'; +import { getPatchRulesOptionsMock, getPatchMlRulesOptionsMock } from './patch_rules.mock'; +import { PatchRulesOptions } from './types'; describe('patchRules', () => { - let alertsClient: ReturnType; - let savedObjectsClient: ReturnType; - - beforeEach(() => { - alertsClient = alertsClientMock.create(); - savedObjectsClient = savedObjectsClientMock.create(); - }); - - it('should call alertsClient.disable is the rule was enabled and enabled is false', async () => { - const existingRule = getResult(); - const params = getResult().params; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - ...params, + it('should call alertsClient.disable if the rule was enabled and enabled is false', async () => { + const rulesOptionsMock = getPatchRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, enabled: false, - interval: '', - name: '', - tags: [], - }); - - expect(alertsClient.disable).toHaveBeenCalledWith( + }; + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.disable).toHaveBeenCalledWith( expect.objectContaining({ - id: existingRule.id, + id: ruleOptions.rule?.id, }) ); }); - it('should call alertsClient.enable is the rule was disabled and enabled is true', async () => { - const existingRule = { - ...getResult(), - enabled: false, - }; - const params = getResult().params; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - ...params, + it('should call alertsClient.enable if the rule was disabled and enabled is true', async () => { + const rulesOptionsMock = getPatchRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, enabled: true, - interval: '', - name: '', - tags: [], - }); - - expect(alertsClient.enable).toHaveBeenCalledWith( + }; + if (ruleOptions.rule != null) { + ruleOptions.rule.enabled = false; + } + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.enable).toHaveBeenCalledWith( expect.objectContaining({ - id: existingRule.id, + id: ruleOptions.rule?.id, }) ); }); it('calls the alertsClient with ML params', async () => { - const existingRule = getMlResult(); - const params = { - ...getMlResult().params, - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', + const rulesOptionsMock = getPatchMlRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, + enabled: true, }; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - ...params, - }); - - expect(alertsClient.update).toHaveBeenCalledWith( + if (ruleOptions.rule != null) { + ruleOptions.rule.enabled = false; + } + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ params: expect.objectContaining({ @@ -94,25 +64,22 @@ describe('patchRules', () => { describe('regression tests', () => { it("updates the rule's actions if provided", async () => { - const existingRule = getResult(); - - const action = { - action_type_id: '.slack', - id: '2933e581-d81c-4fe3-88fe-c57c6b8a5bfd', - params: { - message: 'Rule {{context.rule.name}} generated {{state.signals_count}} signals', - }, - group: 'default', + const rulesOptionsMock = getPatchRulesOptionsMock(); + const ruleOptions: PatchRulesOptions = { + ...rulesOptionsMock, + actions: [ + { + action_type_id: '.slack', + id: '2933e581-d81c-4fe3-88fe-c57c6b8a5bfd', + params: { + message: 'Rule {{context.rule.name}} generated {{state.signals_count}} signals', + }, + group: 'default', + }, + ], }; - - await patchRules({ - alertsClient, - savedObjectsClient, - actions: [action], - rule: existingRule, - }); - - expect(alertsClient.update).toHaveBeenCalledWith( + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ actions: [ @@ -131,9 +98,10 @@ describe('patchRules', () => { }); it('does not update actions if none are specified', async () => { - const existingRule = { - ...getResult(), - actions: [ + const ruleOptions = getPatchRulesOptionsMock(); + delete ruleOptions.actions; + if (ruleOptions.rule != null) { + ruleOptions.rule.actions = [ { actionTypeId: '.slack', id: '2933e581-d81c-4fe3-88fe-c57c6b8a5bfd', @@ -142,16 +110,11 @@ describe('patchRules', () => { }, group: 'default', }, - ], - }; - - await patchRules({ - alertsClient, - savedObjectsClient, - rule: existingRule, - }); + ]; + } - expect(alertsClient.update).toHaveBeenCalledWith( + await patchRules(ruleOptions); + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ actions: [ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts index 950a3e90fb70c..3796df353abb8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts @@ -7,10 +7,11 @@ import { defaults } from 'lodash/fp'; import { PartialAlert } from '../../../../../alerts/server'; import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; -import { PatchRuleParams } from './types'; +import { PatchRulesOptions } from './types'; import { addTags } from './add_tags'; import { calculateVersion, calculateName, calculateInterval } from './utils'; import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; +import { Meta } from '../types'; export const patchRules = async ({ alertsClient, @@ -27,7 +28,6 @@ export const patchRules = async ({ meta, filters, from, - immutable, index, interval, maxSignals, @@ -42,11 +42,11 @@ export const patchRules = async ({ references, note, version, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, actions, -}: PatchRuleParams): Promise => { +}: PatchRulesOptions): Promise => { if (rule == null) { return null; } @@ -60,7 +60,7 @@ export const patchRules = async ({ savedId, timelineId, timelineTitle, - meta, + meta: meta as Meta | undefined, // TODO: Remove this cast once we fix the types for calculate version and patch, filters, from, index, @@ -76,7 +76,7 @@ export const patchRules = async ({ references, version, note, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, }); @@ -89,7 +89,6 @@ export const patchRules = async ({ description, falsePositives, from, - immutable, query, language, outputIndex, @@ -108,7 +107,7 @@ export const patchRules = async ({ references, note, version: calculatedVersion, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, } @@ -117,7 +116,7 @@ export const patchRules = async ({ const update = await alertsClient.update({ id: rule.id, data: { - tags: addTags(tags ?? rule.tags, rule.params.ruleId, immutable ?? rule.params.immutable), + tags: addTags(tags ?? rule.tags, rule.params.ruleId, rule.params.immutable), throttle: null, name: calculateName({ updatedName: name, originalName: rule.name }), schedule: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts index ef8e70c78422c..b17a7358cfa52 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.test.ts @@ -81,18 +81,6 @@ describe('read_rules', () => { } }); - test('should return the output from alertsClient if id is set but ruleId is null', async () => { - const alertsClient = alertsClientMock.create(); - alertsClient.get.mockResolvedValue(getResult()); - - const rule = await readRules({ - alertsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ruleId: null, - }); - expect(rule).toEqual(getResult()); - }); - test('should return the output from alertsClient if id is undefined but ruleId is set', async () => { const alertsClient = alertsClientMock.create(); alertsClient.get.mockResolvedValue(getResult()); @@ -126,25 +114,12 @@ describe('read_rules', () => { const rule = await readRules({ alertsClient, - id: null, + id: undefined, ruleId: 'rule-1', }); expect(rule).toEqual(getResult()); }); - test('should return null if id and ruleId are null', async () => { - const alertsClient = alertsClientMock.create(); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - - const rule = await readRules({ - alertsClient, - id: null, - ruleId: null, - }); - expect(rule).toEqual(null); - }); - test('should return null if id and ruleId are undefined', async () => { const alertsClient = alertsClientMock.create(); alertsClient.get.mockResolvedValue(getResult()); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts index a8b76aeb8c453..e4bb65a907e2d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/read_rules.ts @@ -7,7 +7,7 @@ import { SanitizedAlert } from '../../../../../alerts/common'; import { INTERNAL_RULE_ID_KEY } from '../../../../common/constants'; import { findRules } from './find_rules'; -import { ReadRuleParams, isAlertType } from './types'; +import { isAlertType, ReadRuleOptions } from './types'; /** * This reads the rules through a cascade try of what is fastest to what is slowest. @@ -21,7 +21,7 @@ export const readRules = async ({ alertsClient, id, ruleId, -}: ReadRuleParams): Promise => { +}: ReadRuleOptions): Promise => { if (id != null) { try { const rule = await alertsClient.get({ id }); @@ -43,6 +43,10 @@ export const readRules = async ({ alertsClient, filter: `alert.attributes.tags: "${INTERNAL_RULE_ID_KEY}:${ruleId}"`, page: 1, + fields: undefined, + perPage: undefined, + sortField: undefined, + sortOrder: undefined, }); if (ruleFromFind.data.length === 0 || !isAlertType(ruleFromFind.data[0])) { return null; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts index 70d53090f81cc..8bdb1287c6df2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts @@ -13,29 +13,67 @@ import { SavedObjectsFindResponse, SavedObjectsClientContract, } from 'kibana/server'; +import { RuleAlertAction } from '../../../../common/detection_engine/types'; +import { ListsDefaultArraySchema } from '../../../../common/detection_engine/schemas/types/lists_default_array'; +import { + FalsePositives, + From, + RuleId, + Immutable, + DescriptionOrUndefined, + Interval, + MaxSignals, + RiskScore, + OutputIndex, + Name, + Severity, + Tags, + Threat, + To, + Type, + References, + Version, + AnomalyThresholdOrUndefined, + QueryOrUndefined, + LanguageOrUndefined, + SavedIdOrUndefined, + TimelineIdOrUndefined, + TimelineTitleOrUndefined, + MachineLearningJobIdOrUndefined, + IndexOrUndefined, + NoteOrUndefined, + MetaOrUndefined, + Description, + Enabled, + VersionOrUndefined, + IdOrUndefined, + RuleIdOrUndefined, + EnabledOrUndefined, + FalsePositivesOrUndefined, + FromOrUndefined, + OutputIndexOrUndefined, + IntervalOrUndefined, + MaxSignalsOrUndefined, + RiskScoreOrUndefined, + NameOrUndefined, + SeverityOrUndefined, + TagsOrUndefined, + ToOrUndefined, + ThreatOrUndefined, + TypeOrUndefined, + ReferencesOrUndefined, + ListAndOrUndefined, + PerPageOrUndefined, + PageOrUndefined, + SortFieldOrUndefined, + QueryFilterOrUndefined, + FieldsOrUndefined, + SortOrderOrUndefined, +} from '../../../../common/detection_engine/schemas/common/schemas'; import { AlertsClient, PartialAlert } from '../../../../../alerts/server'; import { Alert, SanitizedAlert } from '../../../../../alerts/common'; import { SIGNALS_ID } from '../../../../common/constants'; -import { RuleAlertParams, RuleTypeParams, RuleAlertParamsRest } from '../types'; - -export type PatchRuleAlertParamsRest = Partial & { - id: string | undefined; - rule_id: RuleAlertParams['ruleId'] | undefined; -}; - -export type UpdateRuleAlertParamsRest = RuleAlertParamsRest & { - id: string | undefined; - rule_id: RuleAlertParams['ruleId'] | undefined; -}; - -export interface FindParamsRest { - per_page: number; - page: number; - sort_field: string; - sort_order: 'asc' | 'desc'; - fields: string[]; - filter: string; -} +import { RuleAlertParams, RuleTypeParams, PartialFilter } from '../types'; export interface RuleAlertType extends Alert { params: RuleTypeParams; @@ -90,81 +128,17 @@ export interface HapiReadableStream extends Readable { filename: string; }; } -export interface ImportRulesRequestParams { - query: { overwrite: boolean }; - body: { file: HapiReadableStream }; -} - -export interface ExportRulesRequestParams { - body: { objects: Array<{ rule_id: string }> | null | undefined }; - query: { - file_name: string; - exclude_export_details: boolean; - }; -} - -export interface RuleRequestParams { - id: string | undefined; - rule_id: string | undefined; -} - -export type ReadRuleRequestParams = RuleRequestParams; -export type DeleteRuleRequestParams = RuleRequestParams; -export type DeleteRulesRequestParams = RuleRequestParams[]; - -export interface FindRuleParams { - alertsClient: AlertsClient; - perPage?: number; - page?: number; - sortField?: string; - filter?: string; - fields?: string[]; - sortOrder?: 'asc' | 'desc'; -} - -export interface FindRulesRequestParams { - per_page: number; - page: number; - search?: string; - sort_field?: string; - filter?: string; - fields?: string[]; - sort_order?: 'asc' | 'desc'; -} - -export interface FindRulesStatusesRequestParams { - ids: string[]; -} export interface Clients { alertsClient: AlertsClient; } +// TODO: Try and remove this patch export type PatchRuleParams = Partial> & { rule: SanitizedAlert | null; savedObjectsClient: SavedObjectsClientContract; } & Clients; -export type UpdateRuleParams = Omit & { - id: string | undefined | null; - savedObjectsClient: SavedObjectsClientContract; -} & Clients; - -export type DeleteRuleParams = Clients & { - id: string | undefined; - ruleId: string | undefined | null; -}; - -export type CreateRuleParams = Omit & { - ruleId: string; -} & Clients; - -export interface ReadRuleParams { - alertsClient: AlertsClient; - id?: string | undefined | null; - ruleId?: string | undefined | null; -} - export const isAlertTypes = (partialAlert: PartialAlert[]): partialAlert is RuleAlertType[] => { return partialAlert.every((rule) => isAlertType(rule)); }; @@ -190,3 +164,131 @@ export const isRuleStatusFindTypes = ( ): obj is Array> => { return obj ? obj.every((ruleStatus) => isRuleStatusFindType(ruleStatus)) : false; }; + +export interface CreateRulesOptions { + alertsClient: AlertsClient; + anomalyThreshold: AnomalyThresholdOrUndefined; + description: Description; + enabled: Enabled; + falsePositives: FalsePositives; + from: From; + query: QueryOrUndefined; + language: LanguageOrUndefined; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + filters: PartialFilter[]; + ruleId: RuleId; + immutable: Immutable; + index: IndexOrUndefined; + interval: Interval; + maxSignals: MaxSignals; + riskScore: RiskScore; + outputIndex: OutputIndex; + name: Name; + severity: Severity; + tags: Tags; + threat: Threat; + to: To; + type: Type; + references: References; + note: NoteOrUndefined; + version: Version; + exceptionsList: ListsDefaultArraySchema; + actions: RuleAlertAction[]; +} + +export interface UpdateRulesOptions { + id: IdOrUndefined; + savedObjectsClient: SavedObjectsClientContract; + alertsClient: AlertsClient; + anomalyThreshold: AnomalyThresholdOrUndefined; + description: Description; + enabled: Enabled; + falsePositives: FalsePositives; + from: From; + query: QueryOrUndefined; + language: LanguageOrUndefined; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + filters: PartialFilter[]; + ruleId: RuleIdOrUndefined; + index: IndexOrUndefined; + interval: Interval; + maxSignals: MaxSignals; + riskScore: RiskScore; + outputIndex: OutputIndex; + name: Name; + severity: Severity; + tags: Tags; + threat: Threat; + to: To; + type: Type; + references: References; + note: NoteOrUndefined; + version: VersionOrUndefined; + exceptionsList: ListsDefaultArraySchema; + actions: RuleAlertAction[]; +} + +export interface PatchRulesOptions { + savedObjectsClient: SavedObjectsClientContract; + alertsClient: AlertsClient; + anomalyThreshold: AnomalyThresholdOrUndefined; + description: DescriptionOrUndefined; + enabled: EnabledOrUndefined; + falsePositives: FalsePositivesOrUndefined; + from: FromOrUndefined; + query: QueryOrUndefined; + language: LanguageOrUndefined; + savedId: SavedIdOrUndefined; + timelineId: TimelineIdOrUndefined; + timelineTitle: TimelineTitleOrUndefined; + meta: MetaOrUndefined; + machineLearningJobId: MachineLearningJobIdOrUndefined; + filters: PartialFilter[]; + index: IndexOrUndefined; + interval: IntervalOrUndefined; + maxSignals: MaxSignalsOrUndefined; + riskScore: RiskScoreOrUndefined; + outputIndex: OutputIndexOrUndefined; + name: NameOrUndefined; + severity: SeverityOrUndefined; + tags: TagsOrUndefined; + threat: ThreatOrUndefined; + to: ToOrUndefined; + type: TypeOrUndefined; + references: ReferencesOrUndefined; + note: NoteOrUndefined; + version: VersionOrUndefined; + exceptionsList: ListAndOrUndefined; + actions: RuleAlertAction[] | undefined; + rule: SanitizedAlert | null; +} + +export interface ReadRuleOptions { + alertsClient: AlertsClient; + id: IdOrUndefined; + ruleId: RuleIdOrUndefined; +} + +export interface DeleteRuleOptions { + alertsClient: AlertsClient; + id: IdOrUndefined; + ruleId: RuleIdOrUndefined; +} + +export interface FindRuleOptions { + alertsClient: AlertsClient; + perPage: PerPageOrUndefined; + page: PageOrUndefined; + sortField: SortFieldOrUndefined; + filter: QueryFilterOrUndefined; + fields: FieldsOrUndefined; + sortOrder: SortOrderOrUndefined; +} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts index ede5c51d1e5e7..1945d00c75c88 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.test.ts @@ -6,12 +6,10 @@ import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; import { alertsClientMock } from '../../../../../alerts/server/mocks'; -import { - mockPrepackagedRule, - getFindResultWithSingleHit, -} from '../routes/__mocks__/request_responses'; +import { getFindResultWithSingleHit } from '../routes/__mocks__/request_responses'; import { updatePrepackagedRules } from './update_prepacked_rules'; import { patchRules } from './patch_rules'; +import { getAddPrepackagedRulesSchemaDecodedMock } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema.mock'; jest.mock('./patch_rules'); describe('updatePrepackagedRules', () => { @@ -33,7 +31,7 @@ describe('updatePrepackagedRules', () => { }, ]; const outputIndex = 'outputIndex'; - const prepackagedRule = mockPrepackagedRule(); + const prepackagedRule = getAddPrepackagedRulesSchemaDecodedMock(); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); await updatePrepackagedRules( @@ -44,9 +42,14 @@ describe('updatePrepackagedRules', () => { ); expect(patchRules).toHaveBeenCalledWith( - expect.not.objectContaining({ - enabled: true, - actions, + expect.objectContaining({ + actions: undefined, + }) + ); + + expect(patchRules).toHaveBeenCalledWith( + expect.objectContaining({ + enabled: undefined, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts index c793d7eb9b6dc..c4792eaa97ee1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_prepacked_rules.ts @@ -5,15 +5,16 @@ */ import { SavedObjectsClientContract } from 'kibana/server'; +import { AddPrepackagedRulesSchemaDecoded } from '../../../../common/detection_engine/schemas/request/add_prepackaged_rules_schema'; import { AlertsClient } from '../../../../../alerts/server'; import { patchRules } from './patch_rules'; -import { PrepackagedRules } from '../types'; import { readRules } from './read_rules'; +import { PartialFilter } from '../types'; export const updatePrepackagedRules = async ( alertsClient: AlertsClient, savedObjectsClient: SavedObjectsClientContract, - rules: PrepackagedRules[], + rules: AddPrepackagedRulesSchemaDecoded[], outputIndex: string ): Promise => { await Promise.all( @@ -22,12 +23,11 @@ export const updatePrepackagedRules = async ( description, false_positives: falsePositives, from, - immutable, query, language, saved_id: savedId, meta, - filters, + filters: filtersObject, rule_id: ruleId, index, interval, @@ -42,10 +42,18 @@ export const updatePrepackagedRules = async ( references, version, note, + anomaly_threshold: anomalyThreshold, + timeline_id: timelineId, + timeline_title: timelineTitle, + machine_learning_job_id: machineLearningJobId, + exceptions_list: exceptionsList, } = rule; const existingRule = await readRules({ alertsClient, ruleId, id: undefined }); + // TODO: Fix these either with an is conversion or by better typing them within io-ts + const filters: PartialFilter[] | undefined = filtersObject as PartialFilter[]; + // Note: we do not pass down enabled as we do not want to suddenly disable // or enable rules on the user when they were not expecting it if a rule updates return patchRules({ @@ -53,7 +61,6 @@ export const updatePrepackagedRules = async ( description, falsePositives, from, - immutable, query, language, outputIndex, @@ -75,6 +82,13 @@ export const updatePrepackagedRules = async ( references, version, note, + anomalyThreshold, + enabled: undefined, + timelineId, + timelineTitle, + machineLearningJobId, + exceptionsList, + actions: undefined, }); }) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts new file mode 100644 index 0000000000000..7812c66a74d1f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UpdateRulesOptions } from './types'; +import { alertsClientMock } from '../../../../../alerts/server/mocks'; +import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; + +export const getUpdateRulesOptionsMock = (): UpdateRulesOptions => ({ + id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: undefined, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: 'user.name: root or user.name: admin', + language: 'kuery', + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: undefined, + filters: [], + ruleId: undefined, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Query with a rule id', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'query', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); + +export const getUpdateMlRulesOptionsMock = (): UpdateRulesOptions => ({ + id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + alertsClient: alertsClientMock.create(), + savedObjectsClient: savedObjectsClientMock.create(), + anomalyThreshold: 55, + description: 'some description', + enabled: true, + falsePositives: ['false positive 1', 'false positive 2'], + from: 'now-6m', + query: undefined, + language: undefined, + savedId: 'savedId-123', + timelineId: 'timelineid-123', + timelineTitle: 'timeline-title-123', + meta: {}, + machineLearningJobId: 'new_job_id', + filters: [], + ruleId: undefined, + index: ['index-123'], + interval: '5m', + maxSignals: 100, + riskScore: 80, + outputIndex: 'output-1', + name: 'Machine Learning Job', + severity: 'high', + tags: [], + threat: [], + to: 'now', + type: 'machine_learning', + references: ['http://www.example.com'], + note: '# sample markdown', + version: 1, + exceptionsList: [], + actions: [], +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts index 222411deb37ab..cf59d2bb5e8c4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts @@ -4,96 +4,69 @@ * you may not use this file except in compliance with the Elastic License. */ -import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; -import { alertsClientMock } from '../../../../../alerts/server/mocks'; import { getResult, getMlResult } from '../routes/__mocks__/request_responses'; import { updateRules } from './update_rules'; +import { getUpdateRulesOptionsMock, getUpdateMlRulesOptionsMock } from './update_rules.mock'; +import { AlertsClientMock } from '../../../../../alerts/server/alerts_client.mock'; describe('updateRules', () => { - let alertsClient: ReturnType; - let savedObjectsClient: ReturnType; - - beforeEach(() => { - alertsClient = alertsClientMock.create(); - savedObjectsClient = savedObjectsClientMock.create(); - }); - - it('should call alertsClient.disable is the rule was enabled and enabled is false', async () => { - const rule = getResult(); - alertsClient.get.mockResolvedValue(getResult()); - - await updateRules({ - alertsClient, - savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...rule.params, + it('should call alertsClient.disable if the rule was enabled and enabled is false', async () => { + const rulesOptionsMock = getUpdateRulesOptionsMock(); + const ruleOptions = { + ...rulesOptionsMock, enabled: false, - interval: '', - name: '', - tags: [], - actions: [], - }); + }; + ((ruleOptions.alertsClient as unknown) as AlertsClientMock).get.mockResolvedValue(getResult()); + + await updateRules(ruleOptions); - expect(alertsClient.disable).toHaveBeenCalledWith( + expect(ruleOptions.alertsClient.disable).toHaveBeenCalledWith( expect.objectContaining({ - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + id: rulesOptionsMock.id, }) ); }); - it('should call alertsClient.enable is the rule was disabled and enabled is true', async () => { - const rule = getResult(); - alertsClient.get.mockResolvedValue({ + it('should call alertsClient.enable if the rule was disabled and enabled is true', async () => { + const rulesOptionsMock = getUpdateRulesOptionsMock(); + const ruleOptions = { + ...rulesOptionsMock, + enabled: true, + }; + + ((ruleOptions.alertsClient as unknown) as AlertsClientMock).get.mockResolvedValue({ ...getResult(), enabled: false, }); - await updateRules({ - alertsClient, - savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...rule.params, - enabled: true, - interval: '', - name: '', - tags: [], - actions: [], - }); + await updateRules(ruleOptions); - expect(alertsClient.enable).toHaveBeenCalledWith( + expect(ruleOptions.alertsClient.enable).toHaveBeenCalledWith( expect.objectContaining({ - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + id: rulesOptionsMock.id, }) ); }); it('calls the alertsClient with ML params', async () => { - alertsClient.get.mockResolvedValue(getMlResult()); - - const params = { - ...getMlResult().params, - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', + const rulesOptionsMock = getUpdateMlRulesOptionsMock(); + const ruleOptions = { + ...rulesOptionsMock, + enabled: true, }; - await updateRules({ - alertsClient, - savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...params, - enabled: true, - interval: '', - name: '', - tags: [], - actions: [], - }); + ((ruleOptions.alertsClient as unknown) as AlertsClientMock).get.mockResolvedValue( + getMlResult() + ); + + await updateRules(ruleOptions); - expect(alertsClient.update).toHaveBeenCalledWith( + expect(ruleOptions.alertsClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ params: expect.objectContaining({ - anomalyThreshold: 55, - machineLearningJobId: 'new_job_id', + anomalyThreshold: rulesOptionsMock.anomalyThreshold, + machineLearningJobId: rulesOptionsMock.machineLearningJobId, }), }), }) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts index 54031b6e35bf1..0236c357988d5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts @@ -7,11 +7,12 @@ import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { PartialAlert } from '../../../../../alerts/server'; import { readRules } from './read_rules'; -import { UpdateRuleParams } from './types'; +import { UpdateRulesOptions } from './types'; import { addTags } from './add_tags'; import { calculateVersion } from './utils'; import { hasListsFeature } from '../feature_flags'; import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; +import { Meta } from '../types'; export const updateRules = async ({ alertsClient, @@ -43,11 +44,11 @@ export const updateRules = async ({ references, version, note, - exceptions_list, + exceptionsList, anomalyThreshold, machineLearningJobId, actions, -}: UpdateRuleParams): Promise => { +}: UpdateRulesOptions): Promise => { const rule = await readRules({ alertsClient, ruleId, id }); if (rule == null) { return null; @@ -62,7 +63,7 @@ export const updateRules = async ({ savedId, timelineId, timelineTitle, - meta, + meta: meta as Meta, // TODO: Remove this cast once we fix the types for calculate version and patch filters, from, index, @@ -83,7 +84,7 @@ export const updateRules = async ({ }); // TODO: Remove this and use regular exceptions_list once the feature is stable for a release - const exceptionsListParam = hasListsFeature() ? { exceptions_list } : {}; + const exceptionsListParam = hasListsFeature() ? { exceptionsList } : {}; const update = await alertsClient.update({ id: rule.id, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh new file mode 100755 index 0000000000000..29c69ae857f3e --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/create_ndjson_prepackaged_rules.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# +# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +# or more contributor license agreements. Licensed under the Elastic License; +# you may not use this file except in compliance with the Elastic License. +# + +i=0; +for f in ../rules/prepackaged_rules/*.json ; do + ((i++)); + echo "converting $f" + cat ../rules/prepackaged_rules/windows_msxsl_network.json | tr -d '\n' | tr -d ' ' >> pre_packaged_rules.ndjson + echo "" >> pre_packaged_rules.ndjson +done +echo "{\"exported_count\":$i,\"missing_rules\":[],\"missing_rules_count\":0}" >> pre_packaged_rules.ndjson + diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts index 2d75ba4f42d12..46a16e7dca153 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/es_results.ts @@ -44,7 +44,7 @@ export const sampleRuleAlertParams = ( meta: undefined, threat: undefined, version: 1, - exceptions_list: [ + exceptionsList: [ { field: 'source.ip', values_operator: 'included', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts index b33a2376589ef..d4efd9a2e8a1a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_exceptions_query.ts @@ -189,7 +189,7 @@ export const buildQueryExceptions = ({ }: { query: string; language: Language; - lists: RuleAlertParams['exceptions_list']; + lists: RuleAlertParams['exceptionsList']; }): Query[] => { if (lists && lists !== null) { const exceptions = buildExceptions({ lists, language, query }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts index 93d4e5e7719b2..de8de1bc513e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_rule.ts @@ -72,7 +72,7 @@ export const buildRule = ({ version: ruleParams.version, created_at: createdAt, updated_at: updatedAt, - exceptions_list: ruleParams.exceptions_list, + exceptions_list: ruleParams.exceptionsList, machine_learning_job_id: ruleParams.machineLearningJobId, anomaly_threshold: ruleParams.anomalyThreshold, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts index 07435fda0da2e..29b8b54d162df 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/filter_events_with_list.ts @@ -14,7 +14,7 @@ import { RuleAlertParams } from '../types'; interface FilterEventsAgainstList { listClient: ListClient; - exceptionsList: RuleAlertParams['exceptions_list']; + exceptionsList: RuleAlertParams['exceptionsList']; logger: Logger; eventSearchResult: SignalSearchResponse; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts index 1630192b3c03a..c464238715afd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts @@ -22,7 +22,7 @@ export const getQueryFilter = ( language: Language, filters: PartialFilter[], index: string[], - lists: RuleAlertParams['exceptions_list'] + lists: RuleAlertParams['exceptionsList'] ) => { const indexPattern = { fields: [], @@ -53,7 +53,7 @@ interface GetFilterArgs { savedId: string | undefined | null; services: AlertServices; index: string[] | undefined | null; - lists: RuleAlertParams['exceptions_list']; + lists: RuleAlertParams['exceptionsList']; } interface QueryAttributes { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts index e44b82224d1ce..b7bea906475db 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.ts @@ -18,7 +18,7 @@ interface SearchAfterAndBulkCreateParams { ruleParams: RuleTypeParams; services: AlertServices; listClient: ListClient | undefined; // TODO: undefined is for temporary development, remove before merged - exceptionsList: RuleAlertParams['exceptions_list']; + exceptionsList: RuleAlertParams['exceptionsList']; logger: Logger; id: string; inputIndexPattern: string[]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts index 81a6ce9b08f02..d42ba8fe57005 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_params_schema.ts @@ -39,5 +39,5 @@ export const signalParamsSchema = () => type: schema.string(), references: schema.arrayOf(schema.string(), { defaultValue: [] }), version: schema.number({ defaultValue: 1 }), - exceptions_list: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), + exceptionsList: schema.maybe(schema.arrayOf(schema.object({}, { unknowns: 'allow' }))), }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts index 6885b4c814679..567274be6a9f8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -79,7 +79,7 @@ export const signalRulesAlertType = ({ query, to, type, - exceptions_list: exceptionsList, + exceptionsList, } = params; const searchAfterSize = Math.min(maxSignals, DEFAULT_SEARCH_AFTER_PAGE_SIZE); let hasError: boolean = false; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts index 90497b6e34cb4..869c81f640561 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts @@ -21,20 +21,6 @@ export interface SignalsStatusParams { status: 'open' | 'closed'; } -export interface SignalQueryParams { - query: object | undefined | null; - aggs: object | undefined | null; - _source: string[] | undefined | null; - size: number | undefined | null; - track_total_hits: boolean | undefined | null; -} - -export type SignalsStatusRestParams = Omit & { - signal_ids: SignalsStatusParams['signalIds']; -}; - -export type SignalsQueryRestParams = SignalQueryParams; - export type SearchTypes = | string | string[] diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts index 2bb2b5ec47e2f..5bf2b47c78181 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/tags/read_tags.ts @@ -61,6 +61,7 @@ export const readRawTags = async ({ page: 1, sortField: 'createdAt', sortOrder: 'desc', + filter: undefined, }); // Get all the rules to aggregate over all the tags of the rules const rules = await findRules({ @@ -70,6 +71,7 @@ export const readRawTags = async ({ sortField: 'createdAt', sortOrder: 'desc', page: 1, + filter: undefined, }); const tagSet = convertTagsToSet(rules.data); return Array.from(tagSet); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts index 53c8a9bf0a7e7..9062de49fa6ce 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts @@ -68,7 +68,7 @@ export interface RuleAlertParams { type: RuleType; version: number; throttle: string | undefined | null; - exceptions_list: ListsDefaultArraySchema | null | undefined; + exceptionsList: ListsDefaultArraySchema | null | undefined; } export type RuleTypeParams = Omit< @@ -83,6 +83,7 @@ export type RuleAlertParamsRest = Omit< | 'falsePositives' | 'immutable' | 'maxSignals' + | 'exceptionsList' | 'machineLearningJobId' | 'savedId' | 'riskScore' @@ -101,6 +102,7 @@ export type RuleAlertParamsRest = Omit< | 'lastFailureMessage' > & { anomaly_threshold: RuleAlertParams['anomalyThreshold']; + exceptions_list: RuleAlertParams['exceptionsList']; rule_id: RuleAlertParams['ruleId']; false_positives: RuleAlertParams['falsePositives']; saved_id?: RuleAlertParams['savedId']; @@ -127,24 +129,6 @@ export type OutputRuleAlertRest = RuleAlertParamsRest & { immutable: boolean; }; -export type ImportRuleAlertRest = Omit & { - id: string | undefined | null; - rule_id: string; - immutable: boolean; -}; - -export type PrepackagedRules = Omit< - RuleAlertParamsRest, - | 'status' - | 'status_date' - | 'last_failure_at' - | 'last_success_at' - | 'last_failure_message' - | 'last_success_message' - | 'updated_at' - | 'created_at' -> & { rule_id: string; immutable: boolean }; - // eslint-disable-next-line @typescript-eslint/no-explicit-any export type CallWithRequest, V> = ( endpoint: string, diff --git a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts index 2b5b34edca140..ca2f881d6abd8 100644 --- a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.test.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ import { transformDataToNdjson } from './create_stream_from_ndjson'; -import { ImportRuleAlertRest } from '../../lib/detection_engine/types'; import { sampleRule } from '../../lib/detection_engine/signals/__mocks__/es_results'; +import { ImportRulesSchemaDecoded } from '../../../common/detection_engine/schemas/request/import_rules_schema'; -export const getOutputSample = (): Partial => ({ +export const getOutputSample = (): Partial => ({ rule_id: 'rule-1', output_index: '.siem-signals', risk_score: 50, @@ -21,7 +21,7 @@ export const getOutputSample = (): Partial => ({ type: 'query', }); -export const getSampleAsNdjson = (sample: Partial): string => { +export const getSampleAsNdjson = (sample: Partial): string => { return `${JSON.stringify(sample)}\n`; }; diff --git a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts index 7da9fbcfb7662..f455ac0696e4e 100644 --- a/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts +++ b/x-pack/plugins/security_solution/server/utils/read_stream/create_stream_from_ndjson.ts @@ -5,9 +5,17 @@ */ import { Transform } from 'stream'; import { has, isString } from 'lodash/fp'; -import { ImportRuleAlertRest } from '../../lib/detection_engine/types'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import * as t from 'io-ts'; +import { importRuleValidateTypeDependents } from '../../../common/detection_engine/schemas/request/import_rules_type_dependents'; +import { + ImportRulesSchemaDecoded, + importRulesSchema, + ImportRulesSchema, +} from '../../../common/detection_engine/schemas/request/import_rules_schema'; +import { exactCheck } from '../../../common/exact_check'; import { createMapStream, createFilterStream } from '../../../../../../src/legacy/utils/streams'; -import { importRulesSchema } from '../../lib/detection_engine/routes/schemas/import_rules_schema'; import { BadRequestError } from '../../lib/detection_engine/errors/bad_request_error'; export interface RulesObjectsExportResultDetails { @@ -28,20 +36,28 @@ export const parseNdjsonStrings = (): Transform => { }; export const filterExportedCounts = (): Transform => { - return createFilterStream( + return createFilterStream( (obj) => obj != null && !has('exported_count', obj) ); }; export const validateRules = (): Transform => { - return createMapStream((obj: ImportRuleAlertRest) => { + return createMapStream((obj: ImportRulesSchema) => { if (!(obj instanceof Error)) { - const validated = importRulesSchema.validate(obj); - if (validated.error != null) { - return new BadRequestError(validated.error.message); - } else { - return validated.value; - } + const decoded = importRulesSchema.decode(obj); + const checked = exactCheck(obj, decoded); + const onLeft = (errors: t.Errors): BadRequestError | ImportRulesSchemaDecoded => { + return new BadRequestError(errors.join()); + }; + const onRight = (schema: ImportRulesSchema): BadRequestError | ImportRulesSchemaDecoded => { + const validationErrors = importRuleValidateTypeDependents(schema); + if (validationErrors.length) { + return new BadRequestError(validationErrors.join()); + } else { + return schema as ImportRulesSchemaDecoded; + } + }; + return pipe(checked, fold(onLeft, onRight)); } else { return obj; } diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts index e91b735e1629b..5626d63b8f230 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules.ts @@ -92,12 +92,12 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete it', async () => { const { body } = await supertest - .delete(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .delete(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .expect(404); expect(body).to.eql({ - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', status_code: 404, }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts index 687551c2d8313..04f168d5b7953 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/delete_rules_bulk.ts @@ -114,17 +114,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -139,14 +139,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); @@ -241,17 +247,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -266,14 +272,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts index e3c4233383be4..66962df14e22d 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/import_rules.ts @@ -120,16 +120,6 @@ export default ({ getService }: FtrProviderContext): void => { }); }); - it('should report that it failed to import a thousand and one (10001) simple rules', async () => { - const { body } = await supertest - .post(`${DETECTION_ENGINE_RULES_URL}/_import`) - .set('kbn-xsrf', 'true') - .attach('file', getSimpleRuleAsNdjson(new Array(10001).fill('rule-1')), 'rules.ndjson') - .expect(500); - - expect(body).to.eql({ message: "Can't import more than 10000 rules", status_code: 500 }); - }); - it('should be able to read an imported rule back out correctly', async () => { await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_import`) diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts index 099ea950d128c..01138779ee39c 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules.ts @@ -207,12 +207,12 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send({ id: 'fake_id', name: 'some other name' }) + .send({ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts index 0bf80204e2445..26a39a46d07f7 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/patch_rules_bulk.ts @@ -261,11 +261,17 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(`${DETECTION_ENGINE_RULES_URL}/_bulk_update`) .set('kbn-xsrf', 'true') - .send([{ id: 'fake_id', name: 'some other name' }]) + .send([{ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }]) .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + error: { + status_code: 404, + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', + }, + }, ]); }); @@ -333,7 +339,7 @@ export default ({ getService }: FtrProviderContext) => { .set('kbn-xsrf', 'true') .send([ { id: createdBody.id, name: 'some other name' }, - { id: 'fake_id', name: 'some other name' }, + { id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }, ]) .expect(200); @@ -346,10 +352,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', status_code: 404, }, - id: 'fake_id', + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', }, ]); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts index bd83ef00ccf1a..59717724e4201 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/read_rules.ts @@ -92,14 +92,14 @@ export default ({ getService }: FtrProviderContext) => { it('should return 404 if given a fake id', async () => { const { body } = await supertest - .get(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .get(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .send(getSimpleRule()) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts index 83fb991ecef1b..127f688dfbc28 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules.ts @@ -212,7 +212,7 @@ export default ({ getService }: FtrProviderContext) => { it('should give a 404 if it is given a fake id', async () => { const simpleRule = getSimpleRule(); - simpleRule.id = 'fake_id'; + simpleRule.id = '5096dec6-b6b9-4d8d-8f93-6c2602079d9d'; delete simpleRule.rule_id; const { body } = await supertest @@ -223,7 +223,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts index 655f2b5d2e33f..54f29939fb6b4 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/update_rules_bulk.ts @@ -269,7 +269,7 @@ export default ({ getService }: FtrProviderContext) => { it('should return a 200 but give a 404 in the message if it is given a fake id', async () => { const ruleUpdate = getSimpleRule('rule-1'); - ruleUpdate.id = 'fake_id'; + ruleUpdate.id = '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5'; delete ruleUpdate.rule_id; const { body } = await supertest @@ -279,7 +279,13 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5', + error: { + status_code: 404, + message: 'id: "1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5" not found', + }, + }, ]); }); @@ -358,7 +364,7 @@ export default ({ getService }: FtrProviderContext) => { const rule2 = getSimpleRule(); delete rule2.rule_id; - rule2.id = 'fake_id'; + rule2.id = 'b3aa019a-656c-4311-b13b-4d9852e24347'; rule2.name = 'some other name'; const { body } = await supertest @@ -376,10 +382,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "b3aa019a-656c-4311-b13b-4d9852e24347" not found', status_code: 404, }, - id: 'fake_id', + id: 'b3aa019a-656c-4311-b13b-4d9852e24347', }, ]); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts index e91b735e1629b..5626d63b8f230 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts @@ -92,12 +92,12 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete it', async () => { const { body } = await supertest - .delete(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .delete(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .expect(404); expect(body).to.eql({ - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', status_code: 404, }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts index 687551c2d8313..04f168d5b7953 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts @@ -114,17 +114,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -139,14 +139,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .delete(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); @@ -241,17 +247,17 @@ export default ({ getService }: FtrProviderContext): void => { it('should return an error if the id does not exist when trying to delete an id', async () => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: 'fake_id' }]) + .send([{ id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); expect(body).to.eql([ { error: { - message: 'id: "fake_id" not found', + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', status_code: 404, }, - id: 'fake_id', + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', }, ]); }); @@ -266,14 +272,20 @@ export default ({ getService }: FtrProviderContext): void => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) - .send([{ id: bodyWithCreatedRule.id }, { id: 'fake_id' }]) + .send([{ id: bodyWithCreatedRule.id }, { id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612' }]) .set('kbn-xsrf', 'true') .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body[0]); expect([bodyToCompare, body[1]]).to.eql([ getSimpleRuleOutputWithoutRuleId(), - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: 'c4e80a0d-e20f-4efc-84c1-08112da5a612', + error: { + status_code: 404, + message: 'id: "c4e80a0d-e20f-4efc-84c1-08112da5a612" not found', + }, + }, ]); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts index e3c4233383be4..66962df14e22d 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts @@ -120,16 +120,6 @@ export default ({ getService }: FtrProviderContext): void => { }); }); - it('should report that it failed to import a thousand and one (10001) simple rules', async () => { - const { body } = await supertest - .post(`${DETECTION_ENGINE_RULES_URL}/_import`) - .set('kbn-xsrf', 'true') - .attach('file', getSimpleRuleAsNdjson(new Array(10001).fill('rule-1')), 'rules.ndjson') - .expect(500); - - expect(body).to.eql({ message: "Can't import more than 10000 rules", status_code: 500 }); - }); - it('should be able to read an imported rule back out correctly', async () => { await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_import`) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts index a199382f29213..3219ae7e0e2d4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts @@ -210,12 +210,12 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send({ id: 'fake_id', name: 'some other name' }) + .send({ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts index 0bf80204e2445..26a39a46d07f7 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts @@ -261,11 +261,17 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .patch(`${DETECTION_ENGINE_RULES_URL}/_bulk_update`) .set('kbn-xsrf', 'true') - .send([{ id: 'fake_id', name: 'some other name' }]) + .send([{ id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }]) .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + error: { + status_code: 404, + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', + }, + }, ]); }); @@ -333,7 +339,7 @@ export default ({ getService }: FtrProviderContext) => { .set('kbn-xsrf', 'true') .send([ { id: createdBody.id, name: 'some other name' }, - { id: 'fake_id', name: 'some other name' }, + { id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', name: 'some other name' }, ]) .expect(200); @@ -346,10 +352,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', status_code: 404, }, - id: 'fake_id', + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', }, ]); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts index bd83ef00ccf1a..59717724e4201 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts @@ -92,14 +92,14 @@ export default ({ getService }: FtrProviderContext) => { it('should return 404 if given a fake id', async () => { const { body } = await supertest - .get(`${DETECTION_ENGINE_RULES_URL}?id=fake_id`) + .get(`${DETECTION_ENGINE_RULES_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) .set('kbn-xsrf', 'true') .send(getSimpleRule()) .expect(404); expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts index 003c8645f1b22..0b1b49e379d17 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts @@ -214,7 +214,7 @@ export default ({ getService }: FtrProviderContext) => { it('should give a 404 if it is given a fake id', async () => { const simpleRule = getSimpleRule(); - simpleRule.id = 'fake_id'; + simpleRule.id = '5096dec6-b6b9-4d8d-8f93-6c2602079d9d'; delete simpleRule.rule_id; const { body } = await supertest @@ -225,7 +225,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body).to.eql({ status_code: 404, - message: 'id: "fake_id" not found', + message: 'id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts index 655f2b5d2e33f..54f29939fb6b4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts @@ -269,7 +269,7 @@ export default ({ getService }: FtrProviderContext) => { it('should return a 200 but give a 404 in the message if it is given a fake id', async () => { const ruleUpdate = getSimpleRule('rule-1'); - ruleUpdate.id = 'fake_id'; + ruleUpdate.id = '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5'; delete ruleUpdate.rule_id; const { body } = await supertest @@ -279,7 +279,13 @@ export default ({ getService }: FtrProviderContext) => { .expect(200); expect(body).to.eql([ - { id: 'fake_id', error: { status_code: 404, message: 'id: "fake_id" not found' } }, + { + id: '1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5', + error: { + status_code: 404, + message: 'id: "1fd52120-d3a9-4e7a-b23c-96c0e1a74ae5" not found', + }, + }, ]); }); @@ -358,7 +364,7 @@ export default ({ getService }: FtrProviderContext) => { const rule2 = getSimpleRule(); delete rule2.rule_id; - rule2.id = 'fake_id'; + rule2.id = 'b3aa019a-656c-4311-b13b-4d9852e24347'; rule2.name = 'some other name'; const { body } = await supertest @@ -376,10 +382,10 @@ export default ({ getService }: FtrProviderContext) => { outputRule, { error: { - message: 'id: "fake_id" not found', + message: 'id: "b3aa019a-656c-4311-b13b-4d9852e24347" not found', status_code: 404, }, - id: 'fake_id', + id: 'b3aa019a-656c-4311-b13b-4d9852e24347', }, ]); }); From bc5d8c20c1b1ebeedf2aa21a3c6b0656094e2154 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 03:36:12 +0100 Subject: [PATCH 33/65] chore(NA): skip endpoint Endpoint Alert Page: when es has data and user has navigated to the page (#68596) --- x-pack/test/functional_endpoint/apps/endpoint/alerts.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts index e41cf3fb90bad..e57efc8a7ce7a 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts @@ -12,7 +12,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - describe('Endpoint Alert Page: when es has data and user has navigated to the page', function () { + // SKIPPED as it is failing in ES PROMOTION: https://github.com/elastic/kibana/issues/68596 + describe.skip('Endpoint Alert Page: when es has data and user has navigated to the page', function () { this.tags(['ciGroup7']); before(async () => { await esArchiver.load('endpoint/alerts/api_feature'); From e74440b138ae78416ad1fbae8761b5888729b352 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 03:50:27 +0100 Subject: [PATCH 34/65] chore(NA): skip apis Endpoint plugin Endpoint alert API when data is in elasticsearch (#68613) --- x-pack/test/api_integration/apis/endpoint/alerts/index.ts | 3 ++- x-pack/test/functional_endpoint/apps/endpoint/alerts.ts | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/test/api_integration/apis/endpoint/alerts/index.ts b/x-pack/test/api_integration/apis/endpoint/alerts/index.ts index 67ef3ea42cf16..9ad83f509fc50 100644 --- a/x-pack/test/api_integration/apis/endpoint/alerts/index.ts +++ b/x-pack/test/api_integration/apis/endpoint/alerts/index.ts @@ -70,7 +70,8 @@ export default function ({ getService }: FtrProviderContext) { let nullableEventId = ''; - describe('Endpoint alert API', () => { + // SKIPPED as it is failing ES PROMOTION: https://github.com/elastic/kibana/issues/68613 + describe.skip('Endpoint alert API', () => { describe('when data is in elasticsearch', () => { before(async () => { await esArchiver.load('endpoint/alerts/api_feature'); diff --git a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts index e57efc8a7ce7a..e41cf3fb90bad 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/alerts.ts @@ -12,8 +12,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - // SKIPPED as it is failing in ES PROMOTION: https://github.com/elastic/kibana/issues/68596 - describe.skip('Endpoint Alert Page: when es has data and user has navigated to the page', function () { + describe('Endpoint Alert Page: when es has data and user has navigated to the page', function () { this.tags(['ciGroup7']); before(async () => { await esArchiver.load('endpoint/alerts/api_feature'); From 88754d2cb2c5454d5b58d19722e66285e9a01638 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 9 Jun 2020 10:04:05 +0300 Subject: [PATCH 35/65] [TSVB] Allows the user to change the tooltip mode (#67775) * Allows the user to select the tooltip mode * Fix problem on new TSVB and add new field to schema * Change default value on tooltip dropdown for the focused series option --- .../components/panel_config/timeseries.js | 39 +++++++++++++++++++ .../components/vis_types/timeseries/vis.js | 1 + .../visualizations/views/timeseries/index.js | 3 +- .../public/metrics_type.ts | 1 + .../server/routes/post_vis_schema.ts | 3 ++ 5 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js index 0b8b4be67b7a0..3e5e335a9ea39 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js @@ -61,6 +61,7 @@ class TimeseriesPanelConfigUi extends Component { axis_min: '', legend_position: 'right', show_grid: 1, + tooltip_mode: 'show_all', }; const model = { ...defaults, ...this.props.model }; const { selectedTab } = this.state; @@ -85,6 +86,22 @@ class TimeseriesPanelConfigUi extends Component { value: 'left', }, ]; + const tooltipModeOptions = [ + { + label: intl.formatMessage({ + id: 'visTypeTimeseries.timeseries.tooltipOptions.showAll', + defaultMessage: 'Show all values', + }), + value: 'show_all', + }, + { + label: intl.formatMessage({ + id: 'visTypeTimeseries.timeseries.tooltipOptions.showFocused', + defaultMessage: 'Show focused values', + }), + value: 'show_focused', + }, + ]; const selectedPositionOption = positionOptions.find((option) => { return model.axis_position === option.value; }); @@ -134,6 +151,10 @@ class TimeseriesPanelConfigUi extends Component { return model.legend_position === option.value; }); + const selectedTooltipMode = tooltipModeOptions.find((option) => { + return model.tooltip_mode === option.value; + }); + let view; if (selectedTab === 'data') { view = ( @@ -356,6 +377,24 @@ class TimeseriesPanelConfigUi extends Component { + + + + + + + + diff --git a/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js index b4c563f3c11fd..ddfaf3c1428d9 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js @@ -250,6 +250,7 @@ export class TimeseriesVisualization extends Component { showGrid={Boolean(model.show_grid)} legend={Boolean(model.show_legend)} legendPosition={model.legend_position} + tooltipMode={model.tooltip_mode} xAxisLabel={getAxisLabelString(interval)} xAxisFormatter={this.xAxisFormatter(interval)} annotations={this.prepareAnnotations()} diff --git a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js index 274b46bce2715..c53482b5db075 100644 --- a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js +++ b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js @@ -61,6 +61,7 @@ export const TimeSeries = ({ showGrid, legend, legendPosition, + tooltipMode, xAxisLabel, series, yAxis, @@ -131,7 +132,7 @@ export const TimeSeries = ({ baseTheme={theme} tooltip={{ snap: true, - type: TooltipType.VerticalCursor, + type: tooltipMode === 'show_focused' ? TooltipType.Follow : TooltipType.VerticalCursor, headerFormatter: tooltipFormatter, }} /> diff --git a/src/plugins/vis_type_timeseries/public/metrics_type.ts b/src/plugins/vis_type_timeseries/public/metrics_type.ts index 2b0734ceb4d4d..c06f94efb3c49 100644 --- a/src/plugins/vis_type_timeseries/public/metrics_type.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_type.ts @@ -69,6 +69,7 @@ export const metricsVisDefinition = { axis_scale: 'normal', show_legend: 1, show_grid: 1, + tooltip_mode: 'show_all', }, component: VisEditor, }, diff --git a/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts b/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts index e8838f57ae365..bf2ea8651c5a2 100644 --- a/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts +++ b/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts @@ -247,6 +247,9 @@ export const visPayloadSchema = schema.object({ series: schema.arrayOf(seriesItems), show_grid: numberIntegerRequired, show_legend: numberIntegerRequired, + tooltip_mode: schema.maybe( + schema.oneOf([schema.literal('show_all'), schema.literal('show_focused')]) + ), time_field: stringOptionalNullable, time_range_mode: stringOptionalNullable, type: stringRequired, From 5377dbb75897f7f7b64b888b85b1ac35b7b9a2d2 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 9 Jun 2020 11:25:59 +0200 Subject: [PATCH 36/65] [ML] Functional tests - stabilize DFA job creation (#68495) This PR stabilizes the classification and regression creation tests. --- .../apps/ml/data_frame_analytics/classification_creation.ts | 5 ++--- .../ml/data_frame_analytics/outlier_detection_creation.ts | 2 +- .../apps/ml/data_frame_analytics/regression_creation.ts | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts index c8baa13b56408..b0376b35ebd2f 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts @@ -11,8 +11,7 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); - // flaky test, see https://github.com/elastic/kibana/issues/68356 - describe.skip('classification creation', function () { + describe('classification creation', function () { before(async () => { await esArchiver.loadIfNeeded('ml/bm_classification'); await ml.testResources.createIndexPatternIfNeeded('ft_bank_marketing', '@timestamp'); @@ -66,7 +65,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('selects the source data and loads the job wizard page', async () => { - ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); }); it('selects the job type', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts index b5c2b7528437c..2daae60b0ad20 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts @@ -63,7 +63,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('selects the source data and loads the job wizard page', async () => { - ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); }); it('selects the job type', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts index c818619a18378..35425e47526dd 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts @@ -11,8 +11,7 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); - // flaky test, see https://github.com/elastic/kibana/issues/68352 - describe.skip('regression creation', function () { + describe('regression creation', function () { before(async () => { await esArchiver.loadIfNeeded('ml/egs_regression'); await ml.testResources.createIndexPatternIfNeeded('ft_egs_regression', '@timestamp'); @@ -66,7 +65,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('selects the source data and loads the job wizard page', async () => { - ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(testData.source); }); it('selects the job type', async () => { From 0b3391a8fd087960e741c615b2d433811fb99d67 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 9 Jun 2020 11:28:43 +0200 Subject: [PATCH 37/65] [ML] Functional tests - fix job validation API test with maxModelMemoryLimit (#68501) This PR fixes the job validation API integration test for the scenario that the test environment has xpack.ml.max_model_memory_limit set. --- .../api_integration/apis/ml/job_validation/validate.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/x-pack/test/api_integration/apis/ml/job_validation/validate.ts b/x-pack/test/api_integration/apis/ml/job_validation/validate.ts index 55497940190cb..fc8f837744221 100644 --- a/x-pack/test/api_integration/apis/ml/job_validation/validate.ts +++ b/x-pack/test/api_integration/apis/ml/job_validation/validate.ts @@ -226,6 +226,15 @@ export default ({ getService }: FtrProviderContext) => { .send(requestBody) .expect(200); + // The existance and value of maxModelMemoryLimit depends on ES settings + // and may vary between test environments, e.g. cloud vs non-cloud, + // so it should not be part of the validation + body.forEach((element: any) => { + if (element.hasOwnProperty('maxModelMemoryLimit')) { + delete element.maxModelMemoryLimit; + } + }); + expect(body).to.eql([ { id: 'job_id_valid', From 004df98c8712e707195c6580ab788b70a5412983 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 9 Jun 2020 11:30:15 +0200 Subject: [PATCH 38/65] [ML] Sample data modules - use event.dataset instead of index name (#68538) This PR adds event.dataset to the Kibana ecommerce sample data and makes the ML modules for ecommerce and weblog sample data use event.dataset to recognize the modules and also as the corresponding datafeed query instead of looking for the index name. --- .../data_sets/ecommerce/ecommerce.json.gz | Bin 814280 -> 819503 bytes .../data_sets/ecommerce/field_mappings.ts | 7 +++++++ .../data_sets/ecommerce/saved_objects.ts | 2 +- .../sample_data_ecommerce/manifest.json | 2 +- .../ml/datafeed_high_sum_total_sales.json | 2 +- .../modules/sample_data_weblogs/manifest.json | 2 +- .../ml/datafeed_low_request_rate.json | 2 +- .../ml/datafeed_response_code_rates.json | 2 +- .../ml/datafeed_url_scanning.json | 2 +- 9 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/ecommerce.json.gz b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/ecommerce.json.gz index b1a5dff7b2b5f402f1c468f4ea9e6376706ad08a..d47426df12ddfcd36f0ae33a122c91268d2941db 100644 GIT binary patch literal 819503 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

h|u;sPJ(0JL7j9(d=j( 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

#C%~yKT?{pj+Wg`SDwW8@I45q69Czj(VmIPU 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ý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%0A4*Yl)cT7664i|Z3u{o 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%0Ayn2%7&NEkBK(yAi#} z)kAN~@2vMMY}Ijp_97x{KKgekek9d5duqKeESG1dHd{oW0aK!D?sTHsZ@b^KR$^;> z{I?vE7IQkppmQ7jU#^Z*IkL&4)bwE^VW)QitSjn;6;n1A&~QHcKm7cvKQg|#u=t-n z+DTL7diL2Th3;26Oym^l0Tpd25pz9tb;EfV>eB zj}MySW`Tj2b!NP)@d?KI2Ib}1LEG&K+Nq=%3m9B<0|(EJkeL$HRb=UbGCPpMKK6#= zD@HQUeu;0R>5uy62>`>}U;!Zw{a>jR7rxxwx02h-t&e9rGRa^1-S4Sohg&C-d^4?h z`h$XtO7N(b*o0*fRs$JD_MCzO1Sh{+erI0M?(i;GDPz2Hwd)Agddv+T!Qe$&5uBt{ zm)2p8Mfu~{4t^H#i-HXr|9=!7FKPuq;Vnd)4*IBzODF39Vxq37+>Gw91l{I*rtAzl z+eU!GHUIOc$#n&vMbna$P|R4XWI83+DcouSo&1EVak5W0JSHUp>3^BAB{SFG>-0JQ zGGl!&??%k{-}u)1$L%56^gL!d_p;g_6C3o*0i$UD2Y%u*JmkLzJSG0y*hc{~8hbJD zOli8(}Yn=iY^&EUc1UGVn)YBm*@BcqJRxJ!hHJS$YNvo?xxUv z`q)Zo_oxW!+`rsAR6XFiagrmAN6Ws)(&C3s%r>VZhDX*C^#Rb~<6 zbwBeb_OFp9v&(vgmUXgCtlR_1g-(iqWa z?3yg${ox8lCVCx}Y4NXXk(}AjGwu25>0&x_8 zUC>Q05lUb*9dRu4cIDH#719E7VTOniCx-T~fMuw$8Khjqq zVkYDn(QD`w@1bNFIo+Xyjx02>pDyoGp?pwf4VEmzrh>jWXuEun0WJ@}KU#EM1&y8D zin>3NkjzL@G5T4dB(9A4*KyJ};^h6#rf)UwUKN;7fpVc)GNF z@3tNpB1KbH+Xh3iZ~->_MZOMt@%T=?l!#HlN`a}X4NmLZ-4oTOhn~flYL@md$(>g2 zma{XQBbH0B+ZN4{Qn+d{wVJHjFpwOtaTrYKzfKuL2&>c=xuu0!Ah7|^lyDzkHO;lf zHyN&PYLs!NP>5ueRInZX`GhjF9YFH7c$_v#X#(|kI#35?Zq4T78sr-)9v>A(qAeJ~ zHf1L(xz`^a!s+z58=E?u6Mzz-@O=B`_?u)`4$wOf7uslQe5@HADEmkd>eZD>(}RLb z=Dc*hYpuM%hME{}rOQyO70_fT%LM1gGhSe^>>ciO(~sD&=Im%$|NQV0p8Y1EieM~< zz>Z}r7bVoCUs16Wv-HyZF{ocP^>6?(DcSCz_agQj#i@M{t$07*^W{R4fxz9dvJUt)?ciy-E)IjIDTi`B!WOsM5Tgef&9^ zJ9qKBR6Q*@IDf?rVeYPMBFWk8o4lCH`cgJ}bS`>7RFJGLXSs&zJF1-{tNX?+5+va& z98b@f4YbUsvg{64A9TWR;GH#I^BvZAhm(ed_J zb*niY4mc^*4bNvl3$Jdh->;NN+mf3j>$bEF_Ss*7!Lc@g4p0O8#RZS0%#FTv0Z>AW$xOT}sr!-Y z<8H?TX8m*-ARi(6d)b5`j=H`z?ofeCNRjr2E%x64h&v?0GguHG(;22c7GQWAZU;Xt z7`>UE%lGIxBt-)(1B6sK*_s-itMJk!{35$l+B>Q3XB_t8;FqeWMaX=Hb(UOgFt@^8 zL}OG-G&#~~sv1RI{SElN!}j(wk=RvDUcS7G8-!ghH6t_!Ygm_xAn25EE07t

qdCjpe8j9 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 D)(JDG literal 814280 zcmV*jKuo_MiwFqkVzXNS17u-zVJ=~AZ*F;QX?kU3E^2dcZUF3ETa(*1vVK3mf~A-9 zu(nKG2$Fi5iygbp$s{h%WL>+dl!}r#5_c$amZChFr2O9x0P4a^149U$NxV5#DI_5@ zP^%m4uWxAlKAJ~myv&Qo(d6gRRh<3z#<@)Ma+PGu(J!w?^KDVY*__Xg-u?7xBpz(a zd>t3l+oaf((=1xYVs5cW;>PSYO&gQWPuU_a9`bxq|JX7XPx)uA&cA#L^FFg;ml?QNwM8w#oG_LLhAx!lCimD`To zK62wf*VhV8k~Fa7t{?c{?Zvh%;zwt_P0M7Sr+IM{+wNC1#kPCc5u1Ge^_Lxger|8< z2ETqeEL!GebXc0OaTpwV3C_u9M{(o*BTmY{xAFA&){B|Pd+}qXZr~(rH*!D3I~BW( z^W=Us`F$k0T0BmZO+KCH3#n<}^ADu?Ty7chnN<9XpfP`^(}?q)xMTG7)u@P<`~!Qg zUPeigJMZ%^agpUkB;SB}&MD3KR^5N-{FeWqNX+mb(D=*I*RTKedjm#3bA@~&kX%K@ zqY6jFoO8i7cKirp$an7`6v3_nMY<~~A>?`sLkK%U$eI&(Hj_*0;p1`@t?xPao%5m; zZ}rE=f`5F$X(*CdgC5=uMiVcbxEMwc7b6XNSSX@4!8$dBumtU+8tQC?nj)eBf3d{y ze2R!OWh#j>QbYi&TZ-syoF!{#QE-yECYq(u{LWd3XI5IM4IaVCGHY!rtosdB6p_+V7z~bGZkQnIp<upd%T{p@$gLH7`!GC6d0&yLtWx`#5Q;_-s1B*#?ow7J}NIPzTTovUP# zCCgRmTySUOsDE~}H}%i%VMqVS=WV305S5Xefe8s%Z>YdN#&WO{m(YlzR$_vvfh8uP z!kOoha5SV>_@)IKCkU+p8uh*0;FSV2kXS>78iz@H*jQHjR0kVBT|=<(8lhl}_kIQi z{fsoZ&5Nu;i8gxtz&XBh&beCc`WfHn8|OS*#{8E*E10}ZqD&dal9LX%hO>nspkM`{ zKx^4R%0f_hHs7tPN0pC7vgUucDdpFjL5delTu%WhA<;mJf4Udaq*v#IVB+@06aEIu zp{t<${tgJ=>uOUrBvVO{xqfOgxuu^za2Rn`F@GTz&W4LSN(H_|1>cEfepFIEgyVz+$`PZ@-8=?to=zNU3e-29s2fA|$Sal>MYV zq%3w?Rfj3>FF;Ij$7qKr9vXXJ0oZuAEpq;)9aQMVKdT4l^Ev;i`99P#TzcbkJX3&z zQEH>JjD1?;K`d#K(oiXX6yCUGLIb|XA?5GW5HXGN_fA(O1_=y=FvGnw7}%3TSB-f6 z)d-em52Q#WN2Zb@6GZ~?xur-xCm9Dq=U-fZ#DFI8AWh;aG>Hd!6xe+cVR=4+(oOZZ zv?ed+A|eMM_T=`DJ-K6r;@`a8%C(1`0%gmQs#=FnV~wGogn` zG|Hn0j)eokC`RO91s;6I`-

nXwgBaXiiK8G>bR*JOj7`gkJNy& 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

x`SAVj&J3t%T0 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%0D%pyKIeBi}io?JHD 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%0A)BZHZ0sDV3WJ36$ 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 PyCDBg-@kfgJ{bQ4_h05^ diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts index 5fecf8699bec8..c29df2c88fd74 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/field_mappings.ts @@ -173,4 +173,11 @@ export const fieldMappings = { city_name: { type: 'keyword' }, }, }, + event: { + properties: { + dataset: { + type: 'keyword', + }, + }, + }, }; diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts index b2392742c0197..f680329045625 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts @@ -296,7 +296,7 @@ export const getSavedObjects = (): SavedObject[] => [ title: 'kibana_sample_data_ecommerce', timeFieldName: 'order_date', fields: - '[{"name":"_id","type":"string","esTypes":["_id"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_index","type":"string","esTypes":["_index"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_score","type":"number","count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_source","type":"_source","esTypes":["_source"],"count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_type","type":"string","esTypes":["_type"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "category"}}},{"name":"currency","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_birth_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_first_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_first_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "customer_first_name"}}},{"name":"customer_full_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_full_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "customer_full_name"}}},{"name":"customer_gender","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_last_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_last_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "customer_last_name"}}},{"name":"customer_phone","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week_i","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"email","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.city_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.continent_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.country_iso_code","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.location","type":"geo_point","esTypes":["geo_point"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.region_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "manufacturer"}}},{"name":"order_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"order_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products._id","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products._id.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products._id"}}},{"name":"products.base_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.base_unit_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products.category"}}},{"name":"products.created_on","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_percentage","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products.manufacturer"}}},{"name":"products.min_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_id","type":"number","esTypes":["long"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.product_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent": "products.product_name"}}},{"name":"products.quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.tax_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxful_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxless_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.unit_discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxful_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxless_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_unique_products","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"type","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"user","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true}]', + '[{"name":"_id","type":"string","esTypes":["_id"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_index","type":"string","esTypes":["_index"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"_score","type":"number","count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_source","type":"_source","esTypes":["_source"],"count":0,"scripted":false,"searchable":false,"aggregatable":false,"readFromDocValues":false},{"name":"_type","type":"string","esTypes":["_type"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":false},{"name":"category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"category"}}},{"name":"currency","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_birth_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_first_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_first_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"customer_first_name"}}},{"name":"customer_full_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_full_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"customer_full_name"}}},{"name":"customer_gender","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"customer_last_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"customer_last_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"customer_last_name"}}},{"name":"customer_phone","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"day_of_week_i","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"email","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"event.dataset","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.city_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.continent_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.country_iso_code","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.location","type":"geo_point","esTypes":["geo_point"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"geoip.region_name","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"manufacturer"}}},{"name":"order_date","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"order_id","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products._id","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products._id.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products._id"}}},{"name":"products.base_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.base_unit_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.category","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.category.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products.category"}}},{"name":"products.created_on","type":"date","esTypes":["date"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.discount_percentage","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.manufacturer","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.manufacturer.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products.manufacturer"}}},{"name":"products.min_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_id","type":"number","esTypes":["long"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.product_name","type":"string","esTypes":["text"],"count":0,"scripted":false,"searchable":true,"aggregatable":false,"readFromDocValues":false},{"name":"products.product_name.keyword","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true,"subType":{"multi":{"parent":"products.product_name"}}},{"name":"products.quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.tax_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxful_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.taxless_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"products.unit_discount_amount","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"sku","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxful_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"taxless_total_price","type":"number","esTypes":["half_float"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_quantity","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"total_unique_products","type":"number","esTypes":["integer"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"type","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true},{"name":"user","type":"string","esTypes":["keyword"],"count":0,"scripted":false,"searchable":true,"aggregatable":true,"readFromDocValues":true}]', fieldFormatMap: '{"taxful_total_price":{"id":"number","params":{"pattern":"$0,0.[00]"}}}', }, references: [], diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json index 4c0186023b458..11d4f8e0b97df 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/manifest.json @@ -7,7 +7,7 @@ "defaultIndexPattern": "kibana_sample_data_ecommerce", "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_ecommerce" } }] + "filter": [{ "term": { "event.dataset": "sample_ecommerce" } }] } }, "jobs": [ diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json index 0a955a766bd53..d61e6ba22ec2f 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/datafeed_high_sum_total_sales.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_ecommerce" } }] + "filter": [{ "term": { "event.dataset": "sample_ecommerce" } }] } } } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json index a0b47e7135312..446f56a717e11 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/manifest.json @@ -7,7 +7,7 @@ "defaultIndexPattern": "kibana_sample_data_logs", "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } }, "jobs": [ diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json index 843a7d1651dc8..a9865183320d5 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_low_request_rate.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } }, "aggregations": { diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json index 3a0f67daa392a..9aef3386cb9ef 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_response_code_rates.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } } } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json index 3a0f67daa392a..9aef3386cb9ef 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_weblogs/ml/datafeed_url_scanning.json @@ -3,7 +3,7 @@ "indices": ["INDEX_PATTERN_NAME"], "query": { "bool": { - "filter": [{ "term": { "_index": "kibana_sample_data_logs" } }] + "filter": [{ "term": { "event.dataset": "sample_web_logs" } }] } } } From 9208708b53e2012eb65059876d5695ee14762459 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2020 06:14:02 -0400 Subject: [PATCH 39/65] Bump websocket-extensions from 0.1.3 to 0.1.4 (#68414) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Elastic Machine --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9f0d4c297fd25..2efda1cf7a2cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31624,9 +31624,9 @@ websocket-driver@>=0.5.1: websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== wellknown@^0.5.0: version "0.5.0" From 88f252ac506527fe0bd0cbe2c1e924a43e32b580 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 9 Jun 2020 11:20:36 +0100 Subject: [PATCH 40/65] [SIEM] Add create template button (#66613) * add template btn * rename file * unit test * replace connector with useDispatch * comments * add disableTemplate * rename flag * fix types * remove snapshot * fix types * add fix action * move disableTemplate flag into constants * fix types * Fix timelineType * button style * unit test * unit test * fix types * Update x-pack/plugins/siem/public/timelines/components/timeline/properties/create_timeline_btn.tsx Co-authored-by: patrykkopycinski * fix unit test * add unit test * add unit test * fix types * fix tests * fix unit * fix i18n key * remove snapshot * fix crud * fix crud * fix unit * fix tag * fix unit * disable template timeline * Update use_create_timeline.tsx Co-authored-by: Elastic Machine Co-authored-by: Patryk Kopycinski --- .../security_solution/common/constants.ts | 6 + .../__snapshots__/index.test.tsx.snap | 5 - .../matrix_histogram/index.test.tsx | 2 - .../__snapshots__/index.test.tsx.snap | 958 ------------------ .../components/stat_items/index.test.tsx | 7 - .../header_with_close_button/index.test.tsx | 17 + .../components/open_timeline/index.tsx | 7 +- .../components/timeline/index.test.tsx | 2 +- .../timeline/properties/helpers.test.tsx | 84 ++ .../timeline/properties/helpers.tsx | 62 +- .../timeline/properties/index.test.tsx | 48 +- .../components/timeline/properties/index.tsx | 14 +- .../properties/new_template_timeline.test.tsx | 104 ++ .../properties/new_template_timeline.tsx | 42 + .../properties/properties_right.test.tsx | 289 ++++++ .../timeline/properties/properties_right.tsx | 233 +++-- .../timeline/properties/translations.ts | 7 + .../properties/use_create_timeline.test.tsx | 60 ++ .../properties/use_create_timeline.tsx | 66 ++ .../components/timeline/timeline.test.tsx | 3 +- .../containers/all/index.gql_query.ts | 1 + .../public/timelines/containers/api.test.ts | 503 +++++++++ .../public/timelines/containers/api.ts | 8 +- .../timelines/pages/timelines_page.test.tsx | 16 + .../public/timelines/pages/timelines_page.tsx | 59 +- .../timelines/store/timeline/actions.ts | 2 + .../timelines/store/timeline/helpers.ts | 9 +- .../timelines/store/timeline/reducer.test.ts | 3 + .../timelines/store/timeline/reducer.ts | 3 + .../lib/timeline/pick_saved_timeline.ts | 10 +- .../clean_draft_timelines_route.test.ts | 11 + .../routes/clean_draft_timelines_route.ts | 16 +- .../routes/get_draft_timelines_route.test.ts | 13 +- .../routes/get_draft_timelines_route.ts | 10 +- .../timeline/routes/update_timelines_route.ts | 1 + .../server/lib/timeline/saved_object.ts | 13 +- 36 files changed, 1526 insertions(+), 1168 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap delete mode 100644 x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/containers/api.test.ts diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index d04d1f2c91b97..7a2b531346ac3 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -143,3 +143,9 @@ export const showAllOthersBucket: string[] = [ 'destination.ip', 'user.name', ]; + +/** + * CreateTemplateTimelineBtn + * Remove the comment here to enable template timeline + */ +export const disableTemplate = true; diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap deleted file mode 100644 index c0e0988168384..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap +++ /dev/null @@ -1,5 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Matrix Histogram Component not initial load it renders no MatrixLoader 1`] = `"

"`; - -exports[`Matrix Histogram Component on initial load it renders MatrixLoader 1`] = `"
"`; diff --git a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx index b45207ab47c7a..52a97e26550ce 100644 --- a/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/matrix_histogram/index.test.tsx @@ -82,7 +82,6 @@ describe('Matrix Histogram Component', () => { }); describe('on initial load', () => { test('it renders MatrixLoader', () => { - expect(wrapper.html()).toMatchSnapshot(); expect(wrapper.find('MatrixLoader').exists()).toBe(true); }); }); @@ -117,7 +116,6 @@ describe('Matrix Histogram Component', () => { wrapper.update(); }); test('it renders no MatrixLoader', () => { - expect(wrapper.html()).toMatchSnapshot(); expect(wrapper.find(`MatrixLoader`).exists()).toBe(false); }); diff --git a/x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap deleted file mode 100644 index 0d006d18cc49b..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/stat_items/__snapshots__/index.test.tsx.snap +++ /dev/null @@ -1,958 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Stat Items Component disable charts it renders the default widget 1`] = ` - - - - - -
- -
- -
- -
- -
- -
- HOSTS -
-
-
-
- -
- - - - - - - - -
-
-
-
- -
- - -
- -
- - -
- - -

- - - — - - - -

-
-
-
-
-
-
-
-
-
-
-
-
- -
- -
- -
- -
- - - - - -`; - -exports[`Stat Items Component disable charts it renders the default widget 2`] = ` - - - - - -
- -
- -
- -
- -
- -
- HOSTS -
-
-
-
- -
- - - - - - - - -
-
-
-
- -
- - -
- -
- 0 - - -
- - -

- - - — - - - -

-
-
-
-
-
-
-
-
-
-
-
-
- -
- -
- -
- -
- - - - - -`; - -exports[`Stat Items Component rendering kpis with charts it renders the default widget 1`] = ` - - - - -
- -
- -
- -
- -
- -
- UNIQUE_PRIVATE_IPS -
-
-
-
- -
- - - - - - - - -
-
-
-
- -
- - -
- -
- - -
- -
- -
- - - - -
- - -

- 1,714 - - Source -

-
-
-
-
-
-
- -
- - - - -
- -
- - -
- -
- -
- - - - -
- - -

- 2,359 - - Dest. -

-
-
-
-
-
-
- -
- - -
-
- -
-
- -
- - -
- -
- -
- - - - -
- -
- -
- - -
- -
- -
- -
-
-
- - -`; diff --git a/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx index f46697834d0e3..d81d23438bfd2 100644 --- a/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx @@ -91,10 +91,6 @@ describe('Stat Items Component', () => { ), ], ])('disable charts', (wrapper) => { - test('it renders the default widget', () => { - expect(wrapper).toMatchSnapshot(); - }); - test('should render titles', () => { expect(wrapper.find('[data-test-subj="stat-title"]')).toBeTruthy(); }); @@ -180,9 +176,6 @@ describe('Stat Items Component', () => { ); }); - test('it renders the default widget', () => { - expect(wrapper).toMatchSnapshot(); - }); test('should handle multiple titles', () => { expect(wrapper.find('[data-test-subj="stat-title"]')).toHaveLength(2); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx index 9a52e9cf4e538..34a20e7215906 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx @@ -10,6 +10,23 @@ import React from 'react'; import { TestProviders } from '../../../../common/mock'; import { FlyoutHeaderWithCloseButton } from '.'; +jest.mock('../../../../common/lib/kibana', () => { + return { + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), + }; +}); + describe('FlyoutHeaderWithCloseButton', () => { test('renders correctly against snapshot', () => { const EmptyComponent = shallow( diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx index 92a8fc9338877..344f10dfdb35e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx @@ -42,6 +42,7 @@ import { } from './types'; import { DEFAULT_SORT_FIELD, DEFAULT_SORT_DIRECTION } from './constants'; import { useTimelineTypes } from './use_timeline_types'; +import { disableTemplate } from '../../../../common/constants'; interface OwnProps { apolloClient: ApolloClient; @@ -52,12 +53,6 @@ interface OwnProps { onOpenTimeline?: (timeline: TimelineModel) => void; } -/** - * CreateTemplateTimelineBtn - * Remove the comment here to enable template timeline - */ -export const disableTemplate = true; - export type OpenTimelineOwnProps = OwnProps & Pick< OpenTimelineProps, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx index 581fa125d21e2..931623d080198 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx @@ -27,13 +27,13 @@ import { StatefulTimeline, Props as StatefulTimelineProps } from './index'; import { Timeline } from './timeline'; jest.mock('../../../common/lib/kibana'); - const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); mockUseResizeObserver.mockImplementation(() => ({})); const mockUseSignalIndex: jest.Mock = useSignalIndex as jest.Mock; jest.mock('../../../alerts/containers/detection_engine/alerts/use_signal_index'); +jest.mock('../flyout/header_with_close_button'); describe('StatefulTimeline', () => { let props = {} as StatefulTimelineProps; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx new file mode 100644 index 0000000000000..fb91bbd5a1124 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.test.tsx @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mount, shallow } from 'enzyme'; +import { NewTimeline, NewTimelineProps } from './helpers'; +import { useCreateTimelineButton } from './use_create_timeline'; + +jest.mock('./use_create_timeline', () => ({ + useCreateTimelineButton: jest.fn(), +})); + +jest.mock('../../../../common/lib/kibana', () => { + return { + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }), + }; +}); + +describe('NewTimeline', () => { + const mockGetButton = jest.fn(); + + const props: NewTimelineProps = { + closeGearMenu: jest.fn(), + timelineId: 'mockTimelineId', + title: 'mockTitle', + }; + + describe('render', () => { + describe('default', () => { + beforeAll(() => { + (useCreateTimelineButton as jest.Mock).mockReturnValue({ getButton: mockGetButton }); + shallow(); + }); + + afterAll(() => { + jest.clearAllMocks(); + }); + + test('it should not render outline', () => { + expect(mockGetButton.mock.calls[0][0].outline).toEqual(false); + }); + + test('it should render title', () => { + expect(mockGetButton.mock.calls[0][0].title).toEqual(props.title); + }); + }); + + describe('show outline', () => { + beforeAll(() => { + (useCreateTimelineButton as jest.Mock).mockReturnValue({ getButton: mockGetButton }); + + const enableOutline = { + ...props, + outline: true, + }; + mount(); + }); + + afterAll(() => { + jest.clearAllMocks(); + }); + + test('it should render outline', () => { + expect(mockGetButton.mock.calls[0][0].outline).toEqual(true); + }); + + test('it should render title', () => { + expect(mockGetButton.mock.calls[0][0].title).toEqual(props.title); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 38a85a7a92631..9e74298f3aca9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -23,16 +23,25 @@ import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; import { useSelector } from 'react-redux'; -import { TimelineStatus } from '../../../../../common/types/timeline'; +import { + TimelineTypeLiteral, + TimelineStatus, + TimelineType, +} from '../../../../../common/types/timeline'; + +import { SiemPageName } from '../../../../app/types'; +import { timelineSelectors } from '../../../../timelines/store/timeline'; +import { State } from '../../../../common/store'; +import { useKibana } from '../../../../common/lib/kibana'; import { Note } from '../../../../common/lib/note'; + import { Notes } from '../../notes'; import { AssociateNote, UpdateNote } from '../../notes/helpers'; + import { NOTES_PANEL_WIDTH } from './notes_size'; import { ButtonContainer, DescriptionContainer, LabelText, NameField, StyledStar } from './styles'; import * as i18n from './translations'; -import { SiemPageName } from '../../../../app/types'; -import { timelineSelectors } from '../../../../timelines/store/timeline'; -import { State } from '../../../../common/store'; +import { useCreateTimelineButton } from './use_create_timeline'; export const historyToolTip = 'The chronological history of actions related to this timeline'; export const streamLiveToolTip = 'Update the Timeline as new data arrives'; @@ -44,7 +53,15 @@ const NotesCountBadge = (styled(EuiBadge)` NotesCountBadge.displayName = 'NotesCountBadge'; -type CreateTimeline = ({ id, show }: { id: string; show?: boolean }) => void; +type CreateTimeline = ({ + id, + show, + timelineType, +}: { + id: string; + show?: boolean; + timelineType?: TimelineTypeLiteral; +}) => void; type UpdateIsFavorite = ({ id, isFavorite }: { id: string; isFavorite: boolean }) => void; type UpdateTitle = ({ id, title }: { id: string; title: string }) => void; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; @@ -161,30 +178,27 @@ export const NewCase = React.memo( ); NewCase.displayName = 'NewCase'; -interface NewTimelineProps { - createTimeline: CreateTimeline; - onClosePopover: () => void; +export interface NewTimelineProps { + createTimeline?: CreateTimeline; + closeGearMenu?: () => void; + outline?: boolean; timelineId: string; + title?: string; } export const NewTimeline = React.memo( - ({ createTimeline, onClosePopover, timelineId }) => { - const handleClick = useCallback(() => { - createTimeline({ id: timelineId, show: true }); - onClosePopover(); - }, [createTimeline, timelineId, onClosePopover]); + ({ closeGearMenu, outline = false, timelineId, title = i18n.NEW_TIMELINE }) => { + const uiCapabilities = useKibana().services.application.capabilities; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; - return ( - - {i18n.NEW_TIMELINE} - - ); + const { getButton } = useCreateTimelineButton({ + timelineId, + timelineType: TimelineType.default, + closeGearMenu, + }); + const button = getButton({ outline, title }); + + return capabilitiesCanUserCRUD ? button : null; } ); NewTimeline.displayName = 'NewTimeline'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx index 8bdec78ec8da2..952a7c104e19e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx @@ -18,14 +18,27 @@ import { createStore, State } from '../../../../common/store'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Properties, showDescriptionThreshold, showNotesThreshold } from '.'; -jest.mock('../../../../common/lib/kibana'); - -let mockedWidth = 1000; -jest.mock('../../../../common/components/utils'); -(useThrottledResizeObserver as jest.Mock).mockImplementation(() => ({ - width: mockedWidth, +jest.mock('../../../../common/lib/kibana', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), })); +jest.mock('../../../../common/components/utils', () => { + return { + useThrottledResizeObserver: jest.fn(), + }; +}); + jest.mock('react-redux', () => { const originalModule = jest.requireActual('react-redux'); @@ -44,16 +57,20 @@ jest.mock('react-router-dom', () => { }; }); +jest.mock('./use_create_timeline', () => ({ + useCreateTimelineButton: jest.fn().mockReturnValue({ getButton: jest.fn() }), +})); + describe('Properties', () => { const usersViewing = ['elastic']; - const state: State = mockGlobalState; + let mockedWidth = 1000; let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { jest.clearAllMocks(); store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); - mockedWidth = 1000; + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ width: mockedWidth }); }); test('renders correctly', () => { @@ -306,7 +323,9 @@ describe('Properties', () => { test('it renders a description on the left when the width is at least as wide as the threshold', () => { const description = 'strange'; - mockedWidth = showDescriptionThreshold; + + (useThrottledResizeObserver as jest.Mock).mockReset(); + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ width: showDescriptionThreshold }); const wrapper = mount( @@ -343,7 +362,11 @@ describe('Properties', () => { test('it does NOT render a description on the left when the width is less than the threshold', () => { const description = 'strange'; - mockedWidth = showDescriptionThreshold - 1; + + (useThrottledResizeObserver as jest.Mock).mockReset(); + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ + width: showDescriptionThreshold - 1, + }); const wrapper = mount( @@ -413,7 +436,10 @@ describe('Properties', () => { }); test('it does NOT render a a notes button on the left when the width is less than the threshold', () => { - mockedWidth = showNotesThreshold - 1; + (useThrottledResizeObserver as jest.Mock).mockReset(); + (useThrottledResizeObserver as jest.Mock).mockReturnValue({ + width: showNotesThreshold - 1, + }); const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index 1532a64e4083e..d4c43c9929f0e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -6,17 +6,26 @@ import React, { useState, useCallback, useMemo } from 'react'; -import { TimelineStatus } from '../../../../../common/types/timeline'; +import { TimelineStatus, TimelineTypeLiteral } from '../../../../../common/types/timeline'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Note } from '../../../../common/lib/note'; import { InputsModelId } from '../../../../common/store/inputs/constants'; + import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { TimelineProperties } from './styles'; import { PropertiesRight } from './properties_right'; import { PropertiesLeft } from './properties_left'; -type CreateTimeline = ({ id, show }: { id: string; show?: boolean }) => void; +type CreateTimeline = ({ + id, + show, + timelineType, +}: { + id: string; + show?: boolean; + timelineType?: TimelineTypeLiteral; +}) => void; type UpdateIsFavorite = ({ id, isFavorite }: { id: string; isFavorite: boolean }) => void; type UpdateTitle = ({ id, title }: { id: string; title: string }) => void; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; @@ -128,7 +137,6 @@ export const Properties = React.memo( /> { + return { + useKibana: jest.fn(), + }; +}); + +describe('NewTemplateTimeline', () => { + const state: State = mockGlobalState; + const store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); + const mockClosePopover = jest.fn(); + const mockTitle = 'NEW_TIMELINE'; + let wrapper: ReactWrapper; + + describe('render if CRUD', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + wrapper = mount( + + + + ); + }); + + test('render with iconType', () => { + expect( + wrapper + .find('[data-test-subj="template-timeline-new-with-border"]') + .first() + .prop('iconType') + ).toEqual('plusInCircle'); + }); + + test('render with onClick', () => { + expect( + wrapper.find('[data-test-subj="template-timeline-new-with-border"]').first().prop('onClick') + ).toBeTruthy(); + }); + }); + + describe('If no CRUD', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + + wrapper = mount( + + + + ); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('no render', () => { + expect( + wrapper.find('[data-test-subj="template-timeline-new-with-border"]').exists() + ).toBeFalsy(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx new file mode 100644 index 0000000000000..45b2ce62fb85b --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { TimelineType } from '../../../../../common/types/timeline'; + +import { useKibana } from '../../../../common/lib/kibana'; +import { useCreateTimelineButton } from './use_create_timeline'; + +interface OwnProps { + closeGearMenu?: () => void; + outline?: boolean; + title?: string; + timelineId?: string; +} + +export const NewTemplateTimelineComponent: React.FC = ({ + closeGearMenu, + outline, + title, + timelineId = 'timeline-1', +}) => { + const uiCapabilities = useKibana().services.application.capabilities; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; + + const { getButton } = useCreateTimelineButton({ + timelineId, + timelineType: TimelineType.template, + closeGearMenu, + }); + + const button = getButton({ outline, title }); + + return capabilitiesCanUserCRUD ? button : null; +}; + +export const NewTemplateTimeline = React.memo(NewTemplateTimelineComponent); +NewTemplateTimeline.displayName = 'NewTemplateTimeline'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx new file mode 100644 index 0000000000000..58927e7b236e7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx @@ -0,0 +1,289 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { mount, ReactWrapper } from 'enzyme'; +import React from 'react'; + +import { PropertiesRight } from './properties_right'; +import { useKibana } from '../../../../common/lib/kibana'; +import { TimelineStatus } from '../../../../../common/types/timeline'; +import { disableTemplate } from '../../../../../common/constants'; + +jest.mock('../../../../common/lib/kibana', () => { + return { + useKibana: jest.fn(), + useUiSetting$: jest.fn().mockReturnValue([]), + }; +}); + +jest.mock('./new_template_timeline', () => { + return { + NewTemplateTimeline: jest.fn(() =>
), + }; +}); + +jest.mock('./helpers', () => { + return { + Description: jest.fn().mockReturnValue(
), + NotesButton: jest.fn().mockReturnValue(
), + NewCase: jest.fn().mockReturnValue(
), + NewTimeline: jest.fn().mockReturnValue(
), + }; +}); + +jest.mock('../../../../common/components/inspect', () => { + return { + InspectButton: jest.fn().mockReturnValue(
), + InspectButtonContainer: jest.fn(({ children }) =>
{children}
), + }; +}); + +describe('Properties Right', () => { + let wrapper: ReactWrapper; + const props = { + onButtonClick: jest.fn(), + onClosePopover: jest.fn(), + showActions: true, + createTimeline: jest.fn(), + timelineId: 'timelineId', + isDataInTimeline: false, + showNotes: false, + showNotesFromWidth: false, + showDescription: false, + showUsersView: false, + usersViewing: [], + description: 'desc', + updateDescription: jest.fn(), + associateNote: jest.fn(), + getNotesByIds: jest.fn(), + noteIds: [], + onToggleShowNotes: jest.fn(), + onCloseTimelineModal: jest.fn(), + onOpenTimelineModal: jest.fn(), + status: TimelineStatus.active, + showTimelineModal: false, + title: 'title', + updateNote: jest.fn(), + }; + + describe('with crud', () => { + describe('render', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders settings-gear', () => { + expect(wrapper.find('[data-test-subj="settings-gear"]').exists()).toBeTruthy(); + }); + + test('it renders create timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-default-btn"]').exists()).toBeTruthy(); + }); + + /* + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */ + test('it renders no create template timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-template-btn"]').exists()).toEqual( + !disableTemplate + ); + }); + + test('it renders create attach timeline to a case btn', () => { + expect(wrapper.find('[data-test-subj="NewCase"]').exists()).toBeTruthy(); + }); + + test('it renders no NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).not.toBeTruthy(); + }); + + test('it renders no Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).not.toBeTruthy(); + }); + }); + + describe('render with notes button', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + const propsWithshowNotes = { + ...props, + showNotesFromWidth: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).toBeTruthy(); + }); + }); + + describe('render with description', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, + }, + }, + }, + }); + const propsWithshowDescription = { + ...props, + showDescription: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).toBeTruthy(); + }); + }); + }); + + describe('with no crud', () => { + describe('render', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders settings-gear', () => { + expect(wrapper.find('[data-test-subj="settings-gear"]').exists()).toBeTruthy(); + }); + + test('it renders no create timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-default-btn"]').exists()).not.toBeTruthy(); + }); + + test('it renders create template timelin btn if it is enabled', () => { + expect(wrapper.find('[data-test-subj="create-template-btn"]').exists()).toEqual( + !disableTemplate + ); + }); + + test('it renders create attach timeline to a case btn', () => { + expect(wrapper.find('[data-test-subj="NewCase"]').exists()).toBeTruthy(); + }); + + test('it renders no NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).not.toBeTruthy(); + }); + + test('it renders no Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).not.toBeTruthy(); + }); + }); + + describe('render with notes button', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + const propsWithshowNotes = { + ...props, + showNotesFromWidth: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders NotesButton', () => { + expect(wrapper.find('[data-test-subj="NotesButton"]').exists()).toBeTruthy(); + }); + }); + + describe('render with description', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: false, + }, + }, + }, + }, + }); + const propsWithshowDescription = { + ...props, + showDescription: true, + }; + wrapper = mount(); + }); + + afterAll(() => { + (useKibana as jest.Mock).mockReset(); + }); + + test('it renders Description', () => { + expect(wrapper.find('[data-test-subj="Description"]').exists()).toBeTruthy(); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx index 963b67838e811..f9ab7fb2e69ae 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx @@ -14,15 +14,21 @@ import { EuiToolTip, EuiAvatar, } from '@elastic/eui'; -import { NewTimeline, Description, NotesButton, NewCase } from './helpers'; + +import { disableTemplate } from '../../../../../common/constants'; +import { TimelineStatus } from '../../../../../common/types/timeline'; + +import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; +import { useKibana } from '../../../../common/lib/kibana'; +import { Note } from '../../../../common/lib/note'; + +import { AssociateNote } from '../../notes/helpers'; import { OpenTimelineModalButton } from '../../open_timeline/open_timeline_modal/open_timeline_modal_button'; import { OpenTimelineModal } from '../../open_timeline/open_timeline_modal'; -import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; import * as i18n from './translations'; -import { AssociateNote } from '../../notes/helpers'; -import { Note } from '../../../../common/lib/note'; -import { TimelineStatus } from '../../../../../common/types/timeline'; +import { Description, NotesButton, NewCase, NewTimeline } from './helpers'; +import { NewTemplateTimeline } from './new_template_timeline'; export const PropertiesRightStyle = styled(EuiFlexGroup)` margin-right: 5px; @@ -55,15 +61,13 @@ const Avatar = styled(EuiAvatar)` Avatar.displayName = 'Avatar'; -type CreateTimeline = ({ id, show }: { id: string; show?: boolean }) => void; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; export type UpdateNote = (note: Note) => void; -interface Props { +export interface PropertiesRightComponentProps { onButtonClick: () => void; onClosePopover: () => void; showActions: boolean; - createTimeline: CreateTimeline; timelineId: string; isDataInTimeline: boolean; showNotes: boolean; @@ -85,11 +89,10 @@ interface Props { updateNote: UpdateNote; } -const PropertiesRightComponent: React.FC = ({ +const PropertiesRightComponent: React.FC = ({ onButtonClick, showActions, onClosePopover, - createTimeline, timelineId, isDataInTimeline, showNotesFromWidth, @@ -105,111 +108,131 @@ const PropertiesRightComponent: React.FC = ({ onToggleShowNotes, updateNote, showTimelineModal, + status, onCloseTimelineModal, onOpenTimelineModal, title, - status, -}) => ( - - - - - } - id="timelineSettingsPopover" - isOpen={showActions} - closePopover={onClosePopover} - > - - - - - - - - - - - { + const uiCapabilities = useKibana().services.application.capabilities; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; + return ( + + + + - - - - - + } + id="timelineSettingsPopover" + isOpen={showActions} + closePopover={onClosePopover} + > + + {capabilitiesCanUserCRUD && ( + + + + )} + + {/* + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */} + {!disableTemplate && ( + + + + )} - {showNotesFromWidth ? ( - + + + + - ) : null} - {showDescription ? ( - - - + - ) : null} - - - - - - {showUsersView - ? usersViewing.map((user) => ( - // Hide the hard-coded elastic user avatar as the 7.2 release does not implement - // support for multi-user-collaboration as proposed in elastic/ingest-dev#395 - - - - - - )) - : null} - - {showTimelineModal ? : null} - -); + + {showNotesFromWidth ? ( + + + + ) : null} + + {showDescription ? ( + + + + + + ) : null} + + + + + + {showUsersView + ? usersViewing.map((user) => ( + // Hide the hard-coded elastic user avatar as the 7.2 release does not implement + // support for multi-user-collaboration as proposed in elastic/ingest-dev#395 + + + + + + )) + : null} + + {showTimelineModal ? : null} + + ); +}; export const PropertiesRight = React.memo(PropertiesRightComponent); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts index 88cbd3b1503f6..20569cc044be3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts @@ -109,6 +109,13 @@ export const NEW_TIMELINE = i18n.translate( } ); +export const NEW_TEMPLATE_TIMELINE = i18n.translate( + 'xpack.securitySolution.timeline.properties.newTemplateTimelineButtonLabel', + { + defaultMessage: 'Create template timeline', + } +); + export const ATTACH_TIMELINE_TO_NEW_CASE = i18n.translate( 'xpack.securitySolution.timeline.properties.newCaseButtonLabel', { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx new file mode 100644 index 0000000000000..68a3362b721d8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.test.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { renderHook, act } from '@testing-library/react-hooks'; +import { shallow } from 'enzyme'; + +import { TimelineType } from '../../../../../common/types/timeline'; +import { useCreateTimelineButton } from './use_create_timeline'; + +jest.mock('react-redux', () => { + const actual = jest.requireActual('react-redux'); + return { + ...actual, + useDispatch: jest.fn(), + }; +}); + +describe('useCreateTimelineButton', () => { + const mockId = 'mockId'; + const timelineType = TimelineType.default; + + test('return getButton', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useCreateTimelineButton({ timelineId: mockId, timelineType }) + ); + await waitForNextUpdate(); + + expect(result.current.getButton).toBeTruthy(); + }); + }); + + test('getButton renders correct outline - EuiButton', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useCreateTimelineButton({ timelineId: mockId, timelineType }) + ); + await waitForNextUpdate(); + + const button = result.current.getButton({ outline: true, title: 'mock title' }); + const wrapper = shallow(button); + expect(wrapper.find('[data-test-subj="timeline-new-with-border"]').exists()).toBeTruthy(); + }); + }); + + test('getButton renders correct outline - EuiButtonEmpty', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useCreateTimelineButton({ timelineId: mockId, timelineType }) + ); + await waitForNextUpdate(); + + const button = result.current.getButton({ outline: false, title: 'mock title' }); + const wrapper = shallow(button); + expect(wrapper.find('[data-test-subj="timeline-new"]').exists()).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx new file mode 100644 index 0000000000000..fb05b056cdf82 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_create_timeline.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { useCallback } from 'react'; +import { useDispatch } from 'react-redux'; +import { EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { defaultHeaders } from '../body/column_headers/default_headers'; +import { timelineActions } from '../../../store/timeline'; +import { TimelineTypeLiteral, TimelineType } from '../../../../../common/types/timeline'; + +export const useCreateTimelineButton = ({ + timelineId, + timelineType, + closeGearMenu, +}: { + timelineId?: string; + timelineType: TimelineTypeLiteral; + closeGearMenu?: () => void; +}) => { + const dispatch = useDispatch(); + + const createTimeline = useCallback( + ({ id, show }) => + dispatch( + timelineActions.createTimeline({ + id, + columns: defaultHeaders, + show, + timelineType, + }) + ), + [dispatch, timelineType] + ); + + const handleButtonClick = useCallback(() => { + createTimeline({ id: timelineId, show: true, timelineType }); + if (typeof closeGearMenu === 'function') { + closeGearMenu(); + } + }, [createTimeline, timelineId, timelineType, closeGearMenu]); + + const getButton = useCallback( + ({ outline, title }: { outline?: boolean; title?: string }) => { + const buttonProps = { + iconType: 'plusInCircle', + onClick: handleButtonClick, + }; + const dataTestSubjPrefix = + timelineType === TimelineType.template ? `template-timeline-new` : `timeline-new`; + return outline ? ( + + {title} + + ) : ( + + {title} + + ); + }, + [handleButtonClick, timelineType] + ); + + return { getButton }; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx index b07be4a471a70..74659cb17b0e5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.test.tsx @@ -26,9 +26,10 @@ import { mockDataProviders } from './data_providers/mock/mock_data_providers'; import { useMountAppended } from '../../../common/utils/use_mount_appended'; jest.mock('../../../common/lib/kibana'); - +jest.mock('./properties/properties_right'); const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); + mockUseResizeObserver.mockImplementation(() => ({})); describe('Timeline', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts index cdbf3e768581b..60d000fe78184 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts @@ -56,6 +56,7 @@ export const allTimelinesQuery = gql` } noteIds pinnedEventIds + status title timelineType templateTimelineId diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts new file mode 100644 index 0000000000000..26373fa1a825d --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts @@ -0,0 +1,503 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import * as api from './api'; +import { KibanaServices } from '../../common/lib/kibana'; +import { TimelineType, TimelineStatus } from '../../../common/types/timeline'; +import { TIMELINE_DRAFT_URL, TIMELINE_URL } from '../../../common/constants'; + +jest.mock('../../common/lib/kibana', () => { + return { + KibanaServices: { get: jest.fn() }, + }; +}); + +describe('persistTimeline', () => { + describe('create draft timeline', () => { + const timelineId = null; + const initialDraftTimeline = { + columns: [ + { + columnHeaderType: 'not-filtered', + id: '@timestamp', + }, + { + columnHeaderType: 'not-filtered', + id: 'message', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.category', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.action', + }, + { + columnHeaderType: 'not-filtered', + id: 'host.name', + }, + { + columnHeaderType: 'not-filtered', + id: 'source.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'destination.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'user.name', + }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + kqlQuery: { + filterQuery: null, + }, + title: '', + timelineType: TimelineType.default, + templateTimelineVersion: null, + templateTimelineId: null, + dateRange: { + start: 1590998565409, + end: 1591084965409, + }, + savedQueryId: null, + sort: { + columnId: '@timestamp', + sortDirection: 'desc', + }, + status: TimelineStatus.draft, + }; + const mockDraftResponse = { + data: { + persistTimeline: { + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: '', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591091394733, + createdBy: 'angela', + updated: 1591091394733, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + const mockPatchTimelineResponse = { + data: { + persistTimeline: { + code: 200, + message: 'success', + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzM0NSwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591092702804, + createdBy: 'angela', + updated: 1591092705206, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + const version = null; + const fetchMock = jest.fn(); + const postMock = jest.fn(); + const patchMock = jest.fn(); + + beforeAll(() => { + jest.resetAllMocks(); + + (KibanaServices.get as jest.Mock).mockReturnValue({ + http: { + fetch: fetchMock, + post: postMock.mockReturnValue(mockDraftResponse), + patch: patchMock.mockReturnValue(mockPatchTimelineResponse), + }, + }); + api.persistTimeline({ timelineId, timeline: initialDraftTimeline, version }); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + test('it should create a draft timeline if given status is draft and timelineId is null', () => { + expect(postMock).toHaveBeenCalledWith(TIMELINE_DRAFT_URL, { + body: JSON.stringify({ + timelineType: initialDraftTimeline.timelineType, + }), + }); + }); + + test('it should update timeline', () => { + expect(patchMock.mock.calls[0][0]).toEqual(TIMELINE_URL); + }); + + test('it should update timeline with patch', () => { + expect(patchMock.mock.calls[0][1].method).toEqual('PATCH'); + }); + + test("it should update timeline from clean draft timeline's response", () => { + expect(JSON.parse(patchMock.mock.calls[0][1].body)).toEqual({ + timelineId: mockDraftResponse.data.persistTimeline.timeline.savedObjectId, + timeline: { + ...initialDraftTimeline, + templateTimelineId: mockDraftResponse.data.persistTimeline.timeline.templateTimelineId, + templateTimelineVersion: + mockDraftResponse.data.persistTimeline.timeline.templateTimelineVersion, + }, + version: mockDraftResponse.data.persistTimeline.timeline.version ?? '', + }); + }); + }); + + describe('create active timeline (import)', () => { + const timelineId = null; + const importTimeline = { + columns: [ + { + columnHeaderType: 'not-filtered', + id: '@timestamp', + }, + { + columnHeaderType: 'not-filtered', + id: 'message', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.category', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.action', + }, + { + columnHeaderType: 'not-filtered', + id: 'host.name', + }, + { + columnHeaderType: 'not-filtered', + id: 'source.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'destination.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'user.name', + }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + kqlQuery: { + filterQuery: null, + }, + title: '', + timelineType: TimelineType.default, + templateTimelineVersion: null, + templateTimelineId: null, + dateRange: { + start: 1590998565409, + end: 1591084965409, + }, + savedQueryId: null, + sort: { + columnId: '@timestamp', + sortDirection: 'desc', + }, + status: TimelineStatus.active, + }; + const mockPostTimelineResponse = { + data: { + persistTimeline: { + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: '', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591091394733, + createdBy: 'angela', + updated: 1591091394733, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + + const version = null; + const fetchMock = jest.fn(); + const postMock = jest.fn(); + const patchMock = jest.fn(); + + beforeAll(() => { + jest.resetAllMocks(); + + (KibanaServices.get as jest.Mock).mockReturnValue({ + http: { + fetch: fetchMock, + post: postMock.mockReturnValue(mockPostTimelineResponse), + patch: patchMock, + }, + }); + api.persistTimeline({ timelineId, timeline: importTimeline, version }); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + test('it should update timeline', () => { + expect(postMock.mock.calls[0][0]).toEqual(TIMELINE_URL); + }); + + test('it should update timeline with patch', () => { + expect(postMock.mock.calls[0][1].method).toEqual('POST'); + }); + + test('should call create timeline', () => { + expect(JSON.parse(postMock.mock.calls[0][1].body)).toEqual({ timeline: importTimeline }); + }); + }); + + describe('update active timeline', () => { + const timelineId = '9d5693e0-a42a-11ea-b8f4-c5434162742a'; + const inputTimeline = { + columns: [ + { + columnHeaderType: 'not-filtered', + id: '@timestamp', + }, + { + columnHeaderType: 'not-filtered', + id: 'message', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.category', + }, + { + columnHeaderType: 'not-filtered', + id: 'event.action', + }, + { + columnHeaderType: 'not-filtered', + id: 'host.name', + }, + { + columnHeaderType: 'not-filtered', + id: 'source.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'destination.ip', + }, + { + columnHeaderType: 'not-filtered', + id: 'user.name', + }, + ], + dataProviders: [], + description: 'x', + eventType: 'all', + filters: [], + kqlMode: 'filter', + kqlQuery: { + filterQuery: null, + }, + title: '', + timelineType: TimelineType.default, + templateTimelineVersion: null, + templateTimelineId: null, + dateRange: { + start: 1590998565409, + end: 1591084965409, + }, + savedQueryId: null, + sort: { + columnId: '@timestamp', + sortDirection: 'desc', + }, + status: TimelineStatus.active, + }; + const mockPatchTimelineResponse = { + data: { + persistTimeline: { + timeline: { + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', + columns: [ + { columnHeaderType: 'not-filtered', id: '@timestamp' }, + { columnHeaderType: 'not-filtered', id: 'message' }, + { columnHeaderType: 'not-filtered', id: 'event.category' }, + { columnHeaderType: 'not-filtered', id: 'event.action' }, + { columnHeaderType: 'not-filtered', id: 'host.name' }, + { columnHeaderType: 'not-filtered', id: 'source.ip' }, + { columnHeaderType: 'not-filtered', id: 'destination.ip' }, + { columnHeaderType: 'not-filtered', id: 'user.name' }, + ], + dataProviders: [], + description: '', + eventType: 'all', + filters: [], + kqlMode: 'filter', + timelineType: 'default', + kqlQuery: { filterQuery: null }, + title: '', + sort: { columnId: '@timestamp', sortDirection: 'desc' }, + status: 'draft', + created: 1591091394733, + createdBy: 'angela', + updated: 1591091394733, + updatedBy: 'angela', + templateTimelineId: null, + templateTimelineVersion: null, + dateRange: { start: 1590998565409, end: 1591084965409 }, + savedQueryId: null, + favorite: [], + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + }, + }, + }, + }; + + const version = 'initial version'; + const fetchMock = jest.fn(); + const postMock = jest.fn(); + const patchMock = jest.fn(); + + beforeAll(() => { + jest.resetAllMocks(); + + (KibanaServices.get as jest.Mock).mockReturnValue({ + http: { + fetch: fetchMock, + post: postMock, + patch: patchMock.mockReturnValue(mockPatchTimelineResponse), + }, + }); + api.persistTimeline({ timelineId, timeline: inputTimeline, version }); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); + + test('it should update timeline', () => { + expect(patchMock.mock.calls[0][0]).toEqual(TIMELINE_URL); + }); + + test('it should update timeline with patch', () => { + expect(patchMock.mock.calls[0][1].method).toEqual('PATCH'); + }); + + test('should call patch timeline', () => { + expect(JSON.parse(patchMock.mock.calls[0][1].body)).toEqual({ + timeline: inputTimeline, + timelineId, + version, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index 9f5e65e0fc5af..10893feccfed4 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -77,9 +77,15 @@ export const persistTimeline = async ({ }: RequestPersistTimeline): Promise => { if (timelineId == null && timeline.status === TimelineStatus.draft) { const draftTimeline = await cleanDraftTimeline({ timelineType: timeline.timelineType! }); + return patchTimeline({ timelineId: draftTimeline.data.persistTimeline.timeline.savedObjectId, - timeline, + timeline: { + ...timeline, + templateTimelineId: draftTimeline.data.persistTimeline.timeline.templateTimelineId, + templateTimelineVersion: + draftTimeline.data.persistTimeline.timeline.templateTimelineVersion, + }, version: draftTimeline.data.persistTimeline.timeline.version ?? '', }); } diff --git a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx index 1fc3a33fbca08..e7b66c4e8addb 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { useKibana } from '../../common/lib/kibana'; import { TimelinesPageComponent } from './timelines_page'; +import { disableTemplate } from '../../../common/constants'; jest.mock('../../overview/components/events_by_dataset'); @@ -18,6 +19,7 @@ jest.mock('../../common/lib/kibana', () => { useKibana: jest.fn(), }; }); + describe('TimelinesPageComponent', () => { const mockAppollloClient = {} as ApolloClient; let wrapper: ShallowWrapper; @@ -58,6 +60,20 @@ describe('TimelinesPageComponent', () => { wrapper.find('[data-test-subj="stateful-open-timeline"]').prop('importDataModalToggle') ).toEqual(true); }); + + test('it renders create timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-default-btn"]').exists()).toBeTruthy(); + }); + + /* + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */ + test('it renders no create template timelin btn', () => { + expect(wrapper.find('[data-test-subj="create-template-btn"]').exists()).toEqual( + !disableTemplate + ); + }); }); describe('If the user is not authorised', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx index fd734d10ecba0..2c692d850cd16 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.tsx @@ -4,15 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiButton } from '@elastic/eui'; +import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import ApolloClient from 'apollo-client'; import React, { useCallback, useState } from 'react'; import styled from 'styled-components'; + +import { disableTemplate } from '../../../common/constants'; + import { HeaderPage } from '../../common/components/header_page'; import { WrapperPage } from '../../common/components/wrapper_page'; import { useKibana } from '../../common/lib/kibana'; import { SpyRoute } from '../../common/utils/route/spy_routes'; + import { StatefulOpenTimeline } from '../components/open_timeline'; +import { NEW_TEMPLATE_TIMELINE } from '../components/timeline/properties/translations'; +import { NewTemplateTimeline } from '../components/timeline/properties/new_template_timeline'; +import { NewTimeline } from '../components/timeline/properties/helpers'; + import * as i18n from './translations'; const TimelinesContainer = styled.div` @@ -34,24 +42,47 @@ export const TimelinesPageComponent: React.FC = ({ apolloClient }) => }, [setImportDataModalToggle]); const uiCapabilities = useKibana().services.application.capabilities; - const capabilitiesCanUserCRUD: boolean = - typeof uiCapabilities.securitySolution.crud === 'boolean' - ? uiCapabilities.securitySolution.crud - : false; + const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; return ( <> - {capabilitiesCanUserCRUD && ( - - {i18n.ALL_TIMELINES_IMPORT_TIMELINE_TITLE} - - )} + + + {capabilitiesCanUserCRUD && ( + + {i18n.ALL_TIMELINES_IMPORT_TIMELINE_TITLE} + + )} + + + {capabilitiesCanUserCRUD && ( + + )} + + {/** + * CreateTemplateTimelineBtn + * Remove the comment here to enable CreateTemplateTimelineBtn + */} + {!disableTemplate && ( + + + + )} + diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts index e11d1bcc72e09..e8b5ba68eecdf 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts @@ -16,6 +16,7 @@ import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/t import { EventType, KqlMode, TimelineModel, ColumnHeaderOptions } from './model'; import { TimelineNonEcsData } from '../../../graphql/types'; +import { TimelineTypeLiteral } from '../../../../common/types/timeline'; const actionCreator = actionCreatorFactory('x-pack/security_solution/local/timeline'); @@ -67,6 +68,7 @@ export const createTimeline = actionCreator<{ sort?: Sort; showCheckboxes?: boolean; showRowRenderers?: boolean; + timelineType?: TimelineTypeLiteral; }>('CREATE_TIMELINE'); export const pinEvent = actionCreator<{ id: string; eventId: string }>('PIN_EVENT'); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts index b2472cbe89a50..97ac423cee653 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts @@ -7,6 +7,9 @@ import { getOr, omit, uniq, isEmpty, isEqualWith, union } from 'lodash/fp'; import { Filter } from '../../../../../../../src/plugins/data/public'; + +import { disableTemplate } from '../../../../common/constants'; + import { getColumnWidthFromType } from '../../../timelines/components/timeline/body/column_headers/helpers'; import { Sort } from '../../../timelines/components/timeline/body/sort'; import { @@ -15,11 +18,12 @@ import { QueryMatch, } from '../../../timelines/components/timeline/data_providers/data_provider'; import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/model'; +import { TimelineNonEcsData } from '../../../graphql/types'; +import { TimelineTypeLiteral } from '../../../../common/types/timeline'; import { timelineDefaults } from './defaults'; import { ColumnHeaderOptions, KqlMode, TimelineModel, EventType } from './model'; import { TimelineById, TimelineState } from './types'; -import { TimelineNonEcsData } from '../../../graphql/types'; const EMPTY_TIMELINE_BY_ID: TimelineById = {}; // stable reference @@ -147,6 +151,7 @@ interface AddNewTimelineParams { showCheckboxes?: boolean; showRowRenderers?: boolean; timelineById: TimelineById; + timelineType: TimelineTypeLiteral; } /** Adds a new `Timeline` to the provided collection of `TimelineById` */ @@ -163,6 +168,7 @@ export const addNewTimeline = ({ showCheckboxes = false, showRowRenderers = true, timelineById, + timelineType, }: AddNewTimelineParams): TimelineById => ({ ...timelineById, [id]: { @@ -182,6 +188,7 @@ export const addNewTimeline = ({ isLoading: false, showCheckboxes, showRowRenderers, + timelineType: !disableTemplate ? timelineType : timelineDefaults.timelineType, }, }); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts index d17bc1f20e1e8..3bdb16be79939 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts @@ -139,6 +139,7 @@ describe('Timeline', () => { id: 'bar', columns: defaultHeaders, timelineById: timelineByIdMock, + timelineType: TimelineType.default, }); expect(update).not.toBe(timelineByIdMock); }); @@ -148,6 +149,7 @@ describe('Timeline', () => { id: 'bar', columns: timelineDefaults.columns, timelineById: timelineByIdMock, + timelineType: TimelineType.default, }); expect(update).toEqual({ foo: timelineByIdMock.foo, @@ -163,6 +165,7 @@ describe('Timeline', () => { id: 'bar', columns: defaultHeaders, timelineById: timelineByIdMock, + timelineType: TimelineType.default, }); expect(update).toEqual({ foo: timelineByIdMock.foo, diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts index a8ae39527cdbf..3666968e8ab92 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts @@ -98,6 +98,7 @@ import { } from './helpers'; import { TimelineState, EMPTY_TIMELINE_BY_ID } from './types'; +import { TimelineType } from '../../../../common/types/timeline'; export const initialTimelineState: TimelineState = { timelineById: EMPTY_TIMELINE_BY_ID, @@ -129,6 +130,7 @@ export const timelineReducer = reducerWithInitialState(initialTimelineState) sort, showCheckboxes, showRowRenderers, + timelineType = TimelineType.default, filters, } ) => ({ @@ -146,6 +148,7 @@ export const timelineReducer = reducerWithInitialState(initialTimelineState) showCheckboxes, showRowRenderers, timelineById: state.timelineById, + timelineType, }), }) ) diff --git a/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts b/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts index 40c568ecda741..281726d488abe 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/pick_saved_timeline.ts @@ -39,17 +39,15 @@ export const pickSavedTimeline = ( savedTimeline.templateTimelineVersion = savedTimeline.templateTimelineVersion + 1; } } - } else if (savedTimeline.status === TimelineStatus.draft) { - savedTimeline.status = !isEmpty(savedTimeline.title) - ? TimelineStatus.active - : TimelineStatus.draft; - savedTimeline.templateTimelineId = null; - savedTimeline.templateTimelineVersion = null; } else { savedTimeline.timelineType = savedTimeline.timelineType ?? TimelineType.default; savedTimeline.templateTimelineId = null; savedTimeline.templateTimelineVersion = null; } + if (!isEmpty(savedTimeline.title) && savedTimeline.status === TimelineStatus.draft) { + savedTimeline.status = TimelineStatus.active; + } + return savedTimeline; }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts index 9dc957604d4df..0e53cee0bf8ac 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.test.ts @@ -17,6 +17,7 @@ import { cleanDraftTimelinesRequest, createTimelineWithTimelineId, } from './__mocks__/request_responses'; +import { draftTimelineDefaults } from '../default_timeline'; describe('clean draft timelines', () => { let server: ReturnType; @@ -81,7 +82,12 @@ describe('clean draft timelines', () => { }); const response = await server.inject(cleanDraftTimelinesRequest(TimelineType.default), context); + const req = cleanDraftTimelinesRequest(TimelineType.default); expect(mockPersistTimeline).toHaveBeenCalled(); + expect(mockPersistTimeline.mock.calls[0][3]).toEqual({ + ...draftTimelineDefaults, + timelineType: req.body.timelineType, + }); expect(response.status).toEqual(200); expect(response.body).toEqual({ data: { @@ -100,8 +106,13 @@ describe('clean draft timelines', () => { mockGetTimeline.mockResolvedValue({ ...mockGetDraftTimelineValue }); const response = await server.inject(cleanDraftTimelinesRequest(TimelineType.default), context); + const req = cleanDraftTimelinesRequest(TimelineType.default); + expect(mockPersistTimeline).not.toHaveBeenCalled(); expect(mockResetTimeline).toHaveBeenCalled(); + expect(mockResetTimeline.mock.calls[0][1]).toEqual([mockGetDraftTimelineValue.savedObjectId]); + expect(mockResetTimeline.mock.calls[0][2]).toEqual(req.body.timelineType); + expect(mockGetTimeline).toHaveBeenCalled(); expect(response.status).toEqual(200); expect(response.body).toEqual({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts index 30225da6b42cc..9ad50b8f2266c 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/clean_draft_timelines_route.ts @@ -40,7 +40,11 @@ export const cleanDraftTimelinesRoute = ( } = await getDraftTimeline(frameworkRequest, request.body.timelineType); if (draftTimeline?.savedObjectId) { - await resetTimeline(frameworkRequest, [draftTimeline.savedObjectId]); + await resetTimeline( + frameworkRequest, + [draftTimeline.savedObjectId], + request.body.timelineType + ); const cleanedDraftTimeline = await getTimeline( frameworkRequest, draftTimeline.savedObjectId @@ -57,12 +61,10 @@ export const cleanDraftTimelinesRoute = ( }); } - const newTimelineResponse = await persistTimeline( - frameworkRequest, - null, - null, - draftTimelineDefaults - ); + const newTimelineResponse = await persistTimeline(frameworkRequest, null, null, { + ...draftTimelineDefaults, + timelineType: request.body.timelineType, + }); if (newTimelineResponse.code === 200) { return response.ok({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts index e9bceb2c66806..5447da8ef49d2 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.test.ts @@ -17,6 +17,7 @@ import { getDraftTimelinesRequest, createTimelineWithTimelineId, } from './__mocks__/request_responses'; +import { draftTimelineDefaults } from '../default_timeline'; describe('get draft timelines', () => { let server: ReturnType; @@ -80,12 +81,14 @@ describe('get draft timelines', () => { mockGetDraftTimeline.mockResolvedValue({ timeline: [], }); - - const response = await server.inject( - getDraftTimelinesRequest(TimelineType.default), - context - ); + const req = getDraftTimelinesRequest(TimelineType.default); + const response = await server.inject(req, context); expect(mockPersistTimeline).toHaveBeenCalled(); + expect(mockPersistTimeline.mock.calls[0][3]).toEqual({ + ...draftTimelineDefaults, + timelineType: req.query.timelineType, + }); + expect(response.status).toEqual(200); expect(response.body).toEqual({ data: { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts index 7b379741fc217..4db434ec816aa 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/get_draft_timelines_route.ts @@ -51,12 +51,10 @@ export const getDraftTimelinesRoute = ( }); } - const newTimelineResponse = await persistTimeline( - frameworkRequest, - null, - null, - draftTimelineDefaults - ); + const newTimelineResponse = await persistTimeline(frameworkRequest, null, null, { + ...draftTimelineDefaults, + timelineType: request.query.timelineType, + }); if (newTimelineResponse.code === 200) { return response.ok({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts index a479c818cb01d..d5ecd408a6ef4 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/update_timelines_route.ts @@ -52,6 +52,7 @@ export const updateTimelinesRoute = ( templateTimelineId != null ? await getTemplateTimeline(frameworkRequest, templateTimelineId) : null; + const errorObj = checkIsFailureCases( isHandlingTemplateTimeline, version, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts index dfbf273cbdec2..bbb11cd642c4c 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object.ts @@ -7,7 +7,7 @@ import { getOr } from 'lodash/fp'; import { SavedObjectsFindOptions } from '../../../../../../src/core/server'; -import { UNAUTHENTICATED_USER } from '../../../common/constants'; +import { UNAUTHENTICATED_USER, disableTemplate } from '../../../common/constants'; import { NoteSavedObject } from '../../../common/types/timeline/note'; import { PinnedEventSavedObject } from '../../../common/types/timeline/pinned_event'; import { @@ -122,7 +122,6 @@ const getTimelineTypeFilter = ( const draftFilter = includeDraft ? `siem-ui-timeline.attributes.status: ${TimelineStatus.draft}` : `not siem-ui-timeline.attributes.status: ${TimelineStatus.draft}`; - return `${typeFilter} and ${draftFilter}`; }; @@ -147,7 +146,7 @@ export const getAllTimeline = async ( * Remove the comment here to enable template timeline and apply the change below * filter: getTimelineTypeFilter(timelineType, false) */ - filter: getTimelineTypeFilter(TimelineType.default, false), + filter: getTimelineTypeFilter(disableTemplate ? TimelineType.default : timelineType, false), sortField: sort != null ? sort.sortField : undefined, sortOrder: sort != null ? sort.sortOrder : undefined, }; @@ -321,7 +320,11 @@ const updatePartialSavedTimeline = async ( ); }; -export const resetTimeline = async (request: FrameworkRequest, timelineIds: string[]) => { +export const resetTimeline = async ( + request: FrameworkRequest, + timelineIds: string[], + timelineType: TimelineType +) => { if (!timelineIds.length) { return Promise.reject(new Error('timelineIds is empty')); } @@ -337,7 +340,7 @@ export const resetTimeline = async (request: FrameworkRequest, timelineIds: stri const response = await Promise.all( timelineIds.map((timelineId) => - updatePartialSavedTimeline(request, timelineId, draftTimelineDefaults) + updatePartialSavedTimeline(request, timelineId, { ...draftTimelineDefaults, timelineType }) ) ); From 0a738917142edd260b2eb566df4fe925291d35a7 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Tue, 9 Jun 2020 12:21:42 +0200 Subject: [PATCH 41/65] bumping makelogs version to v6.0.0 (#66163) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9423ee31c8bbe..5bf39a57c1ac5 100644 --- a/package.json +++ b/package.json @@ -298,7 +298,7 @@ "@elastic/eslint-config-kibana": "0.15.0", "@elastic/eslint-plugin-eui": "0.0.2", "@elastic/github-checks-reporter": "0.0.20b3", - "@elastic/makelogs": "^5.0.1", + "@elastic/makelogs": "^6.0.0", "@kbn/dev-utils": "1.0.0", "@kbn/es": "1.0.0", "@kbn/eslint-import-resolver-kibana": "2.0.0", diff --git a/yarn.lock b/yarn.lock index 2efda1cf7a2cd..f7b310cca7590 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1389,10 +1389,10 @@ oppsy "2.x.x" pumpify "1.3.x" -"@elastic/makelogs@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@elastic/makelogs/-/makelogs-5.0.1.tgz#f4f9f5edc61299c7c81f5f30629e3a6fe72a50d7" - integrity sha512-I0QOzIHkWlaKVLqQkJMTHMW6F+yYK0Boq84RIVXGFkoeq82Vsn6jww2SBJ5wSjHa8M7HRfa2g4uqH6u+RSKlxA== +"@elastic/makelogs@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@elastic/makelogs/-/makelogs-6.0.0.tgz#d6d74d5d0f020123c54160370d49ca5e0aab1fe1" + integrity sha512-i+BMxM3pKy9CAqcvMvdHLxvM0Dlnx+4JeScWHM9fFn4+2rAHGCqWflm/UGhTgQh3xn+yXKMLoEbfMIi5Aw1ysw== dependencies: async "^1.4.2" commander "^5.0.0" From bebbd6d2c4dc5306e497422aacde87a287130150 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jun 2020 12:24:30 +0100 Subject: [PATCH 42/65] chore(NA): skip apis Endpoint plugin Endpoint policy api (#68638) --- x-pack/test/api_integration/apis/endpoint/policy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/endpoint/policy.ts b/x-pack/test/api_integration/apis/endpoint/policy.ts index 792c8440cdea1..c3e95f2db1bc0 100644 --- a/x-pack/test/api_integration/apis/endpoint/policy.ts +++ b/x-pack/test/api_integration/apis/endpoint/policy.ts @@ -10,7 +10,8 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('Endpoint policy api', () => { + // SKIPPED as it is failing ES PROMOTION: https://github.com/elastic/kibana/issues/68638 + describe.skip('Endpoint policy api', () => { describe('GET /api/endpoint/policy_response', () => { before(async () => await esArchiver.load('endpoint/policy')); From 974dcab91733ff7adeabb760e0373d5bbcbfb1cf Mon Sep 17 00:00:00 2001 From: John Schulz Date: Tue, 9 Jun 2020 08:23:07 -0400 Subject: [PATCH 43/65] [Ingest] OpenAPI spec file (#68323) * All(?) routes Lots have one or more things wrong but it's a start * Some Agent-related models & routes. Plus some examples for request and responses * Ignore rule requring PascalCase interfaces It's not an option to change interface name, afaict lowercase matches the OpenAPI spec/key name * Remove generated specs * Fix misplaced schema Response shape was listed as a request body Co-authored-by: Elastic Machine --- .../common/openapi/spec_oas3.json | 4397 +++++++++++++++++ 1 file changed, 4397 insertions(+) create mode 100644 x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json diff --git a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json new file mode 100644 index 0000000000000..f0ed3ed9a0364 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json @@ -0,0 +1,4397 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Ingest Manager", + "version": "0.2", + "contact": { + "name": "Ingest Team" + }, + "license": { + "name": "Elastic" + } + }, + "servers": [ + { + "url": "http://localhost:5601/api/ingest_manager", + "description": "local" + } + ], + "paths": { + "/agent_configs": { + "get": { + "summary": "Agent Config - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentConfig" + } + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "items", + "total", + "page", + "perPage", + "success" + ] + }, + "examples": { + "success": { + "value": { + "items": [ + { + "id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", + "name": "Default config", + "namespace": "default", + "description": "Default agent configuration created by Kibana", + "status": "active", + "datasources": [ + "8a5679b0-8fbf-11ea-b2ce-01c4a6127154" + ], + "is_default": true, + "monitoring_enabled": [ + "logs", + "metrics" + ], + "revision": 2, + "updated_on": "2020-05-06T17:32:21.905Z", + "updated_by": "system", + "agents": 0 + } + ], + "total": 1, + "page": 1, + "perPage": 50, + "success": true + } + } + } + } + } + } + }, + "operationId": "agent-config-list", + "parameters": [ + { + "$ref": "#/components/parameters/pageSizeParam" + }, + { + "$ref": "#/components/parameters/pageIndexParam" + }, + { + "$ref": "#/components/parameters/kueryParam" + } + ], + "description": "" + }, + "post": { + "summary": "Agent Config - Create", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/AgentConfig" + }, + "success": { + "type": "boolean" + } + } + } + } + } + } + }, + "operationId": "post-agent_configs", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewAgentConfig" + } + } + } + }, + "security": [], + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/agent_configs/{agentConfigId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentConfigId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Agent Config - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/AgentConfig" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "item", + "success" + ] + }, + "examples": { + "success": { + "value": { + "item": { + "id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", + "name": "Default config", + "namespace": "default", + "description": "Default agent configuration created by Kibana", + "status": "active", + "datasources": [ + { + "id": "8a5679b0-8fbf-11ea-b2ce-01c4a6127154", + "name": "system-1", + "namespace": "default", + "package": { + "name": "system", + "title": "System", + "version": "0.0.3" + }, + "enabled": true, + "config_id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", + "output_id": "08adc51c-69f3-4294-80e2-24527c6ff73d", + "inputs": [ + { + "type": "logs", + "enabled": true, + "streams": [ + { + "id": "logs-system.auth", + "enabled": true, + "dataset": "system.auth", + "vars": { + "paths": { + "value": [ + "/var/log/auth.log*", + "/var/log/secure*" + ], + "type": "text" + } + }, + "agent_stream": { + "paths": [ + "/var/log/auth.log*", + "/var/log/secure*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + } + }, + { + "id": "logs-system.syslog", + "enabled": true, + "dataset": "system.syslog", + "vars": { + "paths": { + "value": [ + "/var/log/messages*", + "/var/log/syslog*" + ], + "type": "text" + } + }, + "agent_stream": { + "paths": [ + "/var/log/messages*", + "/var/log/syslog*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + } + } + ] + }, + { + "type": "system/metrics", + "enabled": true, + "streams": [ + { + "id": "system/metrics-system.core", + "enabled": true, + "dataset": "system.core", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "core" + ], + "core.metrics": "percentages" + } + }, + { + "id": "system/metrics-system.cpu", + "enabled": true, + "dataset": "system.cpu", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "cpu" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.diskio", + "enabled": true, + "dataset": "system.diskio", + "agent_stream": { + "metricsets": [ + "diskio" + ] + } + }, + { + "id": "system/metrics-system.entropy", + "enabled": true, + "dataset": "system.entropy", + "agent_stream": { + "metricsets": [ + "entropy" + ] + } + }, + { + "id": "system/metrics-system.filesystem", + "enabled": true, + "dataset": "system.filesystem", + "vars": { + "period": { + "value": "1m", + "type": "text" + }, + "processors": { + "value": "- drop_event.when.regexp:\n system.filesystem.mount_point: ^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)\n", + "type": "yaml" + } + }, + "agent_stream": { + "metricsets": [ + "filesystem" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + } + }, + { + "id": "system/metrics-system.fsstat", + "enabled": true, + "dataset": "system.fsstat", + "vars": { + "period": { + "value": "1m", + "type": "text" + }, + "processors": { + "value": "- drop_event.when.regexp:\n system.filesystem.mount_point: ^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)\n", + "type": "yaml" + } + }, + "agent_stream": { + "metricsets": [ + "fsstat" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + } + }, + { + "id": "system/metrics-system.load", + "enabled": true, + "dataset": "system.load", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "load" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.memory", + "enabled": true, + "dataset": "system.memory", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "memory" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.network", + "enabled": true, + "dataset": "system.network", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "network" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.network_summary", + "enabled": true, + "dataset": "system.network_summary", + "agent_stream": { + "metricsets": [ + "network_summary" + ] + } + }, + { + "id": "system/metrics-system.process", + "enabled": true, + "dataset": "system.process", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "process" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.process_summary", + "enabled": true, + "dataset": "system.process_summary", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "process_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.raid", + "enabled": true, + "dataset": "system.raid", + "agent_stream": { + "metricsets": [ + "raid" + ] + } + }, + { + "id": "system/metrics-system.service", + "enabled": true, + "dataset": "system.service", + "agent_stream": { + "metricsets": [ + "service" + ] + } + }, + { + "id": "system/metrics-system.socket", + "enabled": true, + "dataset": "system.socket", + "agent_stream": { + "metricsets": [ + "socket" + ] + } + }, + { + "id": "system/metrics-system.socket_summary", + "enabled": true, + "dataset": "system.socket_summary", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "process.include_top_n.by_cpu": { + "value": 5, + "type": "integer" + }, + "process.include_top_n.by_memory": { + "value": 5, + "type": "integer" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "socket_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + } + }, + { + "id": "system/metrics-system.uptime", + "enabled": true, + "dataset": "system.uptime", + "vars": { + "core.metrics": { + "value": [ + "percentages" + ], + "type": "text" + }, + "cpu.metrics": { + "value": [ + "percentages", + "normalized_percentages" + ], + "type": "text" + }, + "period": { + "value": "10s", + "type": "text" + }, + "processes": { + "value": [ + ".*" + ], + "type": "text" + } + }, + "agent_stream": { + "metricsets": [ + "uptime" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "processes": ".*" + } + }, + { + "id": "system/metrics-system.users", + "enabled": true, + "dataset": "system.users", + "agent_stream": { + "metricsets": [ + "users" + ] + } + } + ] + } + ], + "revision": 1 + } + ], + "is_default": true, + "monitoring_enabled": [ + "logs", + "metrics" + ], + "revision": 2, + "updated_on": "2020-05-06T17:32:21.905Z", + "updated_by": "system" + }, + "success": true + } + } + } + } + } + } + }, + "operationId": "agent-config-info", + "description": "Get one agent config", + "parameters": [] + }, + "put": { + "summary": "Agent Config - Update", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/AgentConfig" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "item", + "success" + ] + }, + "examples": { + "example-1": { + "value": { + "item": { + "id": "0b7130d0-5a37-11ea-ac2c-25e9ab4ecb2a", + "name": "UPDATED name", + "description": "UPDATED description", + "namespace": "UPDATED namespace", + "updated_on": "Fri Feb 28 2020 16:22:31 GMT-0500 (Eastern Standard Time)", + "updated_by": "elastic", + "datasources": [] + }, + "success": true + } + } + } + } + } + } + }, + "operationId": "put-agent_configs-agentConfigId", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewAgentConfig" + }, + "examples": { + "example-1": { + "value": { + "name": "UPDATED name", + "description": "UPDATED description", + "namespace": "UPDATED namespace" + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/agent_configs/delete": { + "post": { + "summary": "Agent Config - Delete", + "operationId": "post-agent_config-delete", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "id", + "success" + ] + } + }, + "examples": { + "success": { + "value": [ + { + "id": "df7d2540-5a47-11ea-80da-89b5a66da347", + "success": true + } + ] + }, + "fail": { + "value": [ + { + "id": "df7d2540-5a47-11ea-80da-89b5a66da347", + "success": false + } + ] + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "agentConfigIds": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "examples": { + "example-1": { + "value": { + "agentConfigIds": [ + "df7d2540-5a47-11ea-80da-89b5a66da347" + ] + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + }, + "parameters": [] + }, + "/datasources": { + "get": { + "summary": "Datasources - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Datasource" + } + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "items", + "success" + ] + }, + "examples": { + "example-1": { + "value": { + "items": [ + { + "id": "5d273cf0-5a44-11ea-80da-89b5a66da347", + "use_output": "default", + "inputs": [ + { + "type": "docker/metrics", + "streams": [ + { + "metricset": "status", + "dataset": "docker.status" + } + ] + }, + { + "type": "logs", + "streams": [ + { + "paths": [ + "/var/log/hello1.log", + "/var/log/hello2.log" + ] + } + ] + } + ] + }, + { + "id": "66490980-5a44-11ea-80da-89b5a66da347", + "namespace": "testing", + "use_output": "default", + "inputs": [ + { + "type": "apache/metrics", + "streams": [ + { + "enabled": true, + "metricset": "info" + } + ] + } + ] + }, + { + "id": "df1ccae0-5a49-11ea-94a6-81affd263f47", + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + }, + { + "id": "f96a09d0-5a49-11ea-94a6-81affd263f47", + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + }, + { + "id": "9ca403a0-5a66-11ea-9468-c911a41ab4f5", + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + }, + { + "id": "27925980-5a44-11ea-80da-89b5a66da347", + "enabled": true, + "title": "UPDATED title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "streams": [ + { + "paths": [ + "/var/log/nginx/access.log" + ], + "dataset": "nginx.acccess", + "enabled": true + }, + { + "paths": [ + "/var/log/nginx/error.log" + ], + "dataset": "nginx.error", + "enabled": true + } + ], + "type": "logs" + }, + { + "streams": [ + { + "metricset": "stub_status", + "id": "id string", + "dataset": "nginx.stub_status", + "enabled": true + } + ], + "type": "nginx/metrics" + } + ] + } + ], + "total": 6, + "page": 1, + "perPage": 20, + "success": true + } + } + } + } + } + } + }, + "operationId": "get-datasources", + "security": [], + "parameters": [] + }, + "parameters": [], + "post": { + "summary": "Datasources - Create", + "operationId": "post-datasources", + "responses": { + "200": { + "description": "OK" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewDatasource" + }, + "examples": { + "example-1": { + "value": { + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/datasources/{datasourceId}": { + "get": { + "summary": "Datasources - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/Datasource" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "item", + "success" + ] + } + } + } + } + }, + "operationId": "get-datasources-datasourceId" + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "datasourceId", + "in": "path", + "required": true + } + ], + "put": { + "summary": "Datasources - Update", + "operationId": "put-datasources-datasourceId", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/Datasource" + }, + "sucess": { + "type": "boolean" + } + }, + "required": [ + "item", + "sucess" + ] + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/setup": { + "get": { + "summary": "Fleet setup - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + }, + "required": [ + "isInitialized" + ] + }, + "examples": { + "success": { + "value": { + "isInitialized": true + } + }, + "failure": { + "value": { + "isInitialized": false + } + } + } + } + } + } + }, + "operationId": "get-fleet-setup", + "security": [ + { + "basicAuth": [] + } + ] + }, + "post": { + "summary": "Fleet setup - Create", + "operationId": "post-fleet-setup", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + }, + "required": [ + "isInitialized" + ] + }, + "examples": { + "success": { + "value": { + "isInitialized": true + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "admin_username": { + "type": "string" + }, + "admin_password": { + "type": "string" + } + }, + "required": [ + "admin_username", + "admin_password" + ] + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/epm/packages/{pkgkey}": { + "get": { + "summary": "EPM - Packages - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "properties": { + "response": { + "$ref": "#/components/schemas/PackageInfo" + }, + "success": { + "type": "boolean" + } + } + }, + { + "properties": { + "status": { + "type": "string", + "enum": [ + "installed", + "not_installed" + ] + }, + "savedObject": { + "type": "string" + } + }, + "required": [ + "status", + "savedObject" + ] + } + ] + }, + "examples": { + "example-1": { + "value": { + "response": { + "name": "coredns", + "title": "CoreDNS", + "version": "1.0.1", + "readme": "/package/coredns-1.0.1/docs/README.md", + "description": "CoreDNS logs and metrics integration.\nThe CoreDNS integrations allows to gather logs and metrics from the CoreDNS DNS server to get better insights.\n", + "type": "integration", + "categories": [ + "logs", + "metrics" + ], + "requirement": { + "kibana": { + "versions": ">6.7.0" + } + }, + "icons": [ + { + "src": "/package/coredns-1.0.1/img/icon.png", + "size": "1800x1800" + }, + { + "src": "/package/coredns-1.0.1/img/icon.svg", + "size": "255x144", + "type": "image/svg+xml" + } + ], + "assets": { + "kibana": { + "dashboard": [ + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "dashboard", + "file": "53aa1f70-443e-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/dashboard/53aa1f70-443e-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "dashboard", + "file": "Metricbeat-CoreDNS-Dashboard-ecs.json", + "path": "coredns-1.0.1/kibana/dashboard/Metricbeat-CoreDNS-Dashboard-ecs.json" + } + ], + "visualization": [ + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "277fc650-67a9-11e9-a534-715561d0bf42.json", + "path": "coredns-1.0.1/kibana/visualization/277fc650-67a9-11e9-a534-715561d0bf42.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "27da53f0-53d5-11e9-b466-9be470bbd327-ecs.json", + "path": "coredns-1.0.1/kibana/visualization/27da53f0-53d5-11e9-b466-9be470bbd327-ecs.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "36e08510-53c4-11e9-b466-9be470bbd327-ecs.json", + "path": "coredns-1.0.1/kibana/visualization/36e08510-53c4-11e9-b466-9be470bbd327-ecs.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "3ad75810-4429-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/3ad75810-4429-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "4804eaa0-7315-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/4804eaa0-7315-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "57c74300-7308-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/57c74300-7308-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "75743f70-443c-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/75743f70-443c-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "86177430-728d-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/86177430-728d-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "9dc640e0-4432-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/9dc640e0-4432-11e9-8548-ab7fbe04f038.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "a19df590-53c4-11e9-b466-9be470bbd327-ecs.json", + "path": "coredns-1.0.1/kibana/visualization/a19df590-53c4-11e9-b466-9be470bbd327-ecs.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "a58345f0-7298-11e9-b0d0-414c3011ddbb.json", + "path": "coredns-1.0.1/kibana/visualization/a58345f0-7298-11e9-b0d0-414c3011ddbb.json" + }, + { + "pkgkey": "coredns-1.0.1", + "service": "kibana", + "type": "visualization", + "file": "cfde7fb0-443d-11e9-8548-ab7fbe04f038.json", + "path": "coredns-1.0.1/kibana/visualization/cfde7fb0-443d-11e9-8548-ab7fbe04f038.json" + } + ] + } + }, + "format_version": "1.0.0", + "datasets": [ + { + "title": "CoreDNS logs", + "name": "log", + "release": "ga", + "type": "logs", + "ingest_pipeline": "pipeline-entry", + "vars": [ + { + "default": [ + "/var/log/coredns.log" + ], + "name": "paths", + "type": "textarea" + }, + { + "default": [ + "coredns" + ], + "name": "tags", + "type": "text" + } + ], + "package": "coredns" + }, + { + "title": "CoreDNS stats metrics", + "name": "stats", + "release": "ga", + "type": "metrics", + "vars": [ + { + "default": [ + "http://localhost:9153" + ], + "description": "CoreDNS hosts", + "name": "hosts", + "required": true + }, + { + "default": "10s", + "description": "Collection period. Valid values: 10s, 5m, 2h", + "name": "period" + }, + { + "name": "username", + "type": "text" + }, + { + "name": "password", + "type": "password" + } + ], + "package": "coredns" + } + ], + "download": "/epr/coredns/coredns-1.0.1.tar.gz", + "path": "/package/coredns-1.0.1", + "status": "installed", + "savedObject": { + "id": "coredns-1.0.1", + "type": "epm-package", + "updated_at": "2020-02-27T16:25:43.652Z", + "version": "WzU2LDFd", + "attributes": { + "installed": [ + { + "id": "53aa1f70-443e-11e9-8548-ab7fbe04f038", + "type": "dashboard" + }, + { + "id": "Metricbeat-CoreDNS-Dashboard-ecs", + "type": "dashboard" + }, + { + "id": "75743f70-443c-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "36e08510-53c4-11e9-b466-9be470bbd327-ecs", + "type": "visualization" + }, + { + "id": "277fc650-67a9-11e9-a534-715561d0bf42", + "type": "visualization" + }, + { + "id": "cfde7fb0-443d-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "a19df590-53c4-11e9-b466-9be470bbd327-ecs", + "type": "visualization" + }, + { + "id": "a58345f0-7298-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "9dc640e0-4432-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "3ad75810-4429-11e9-8548-ab7fbe04f038", + "type": "visualization" + }, + { + "id": "57c74300-7308-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "27da53f0-53d5-11e9-b466-9be470bbd327-ecs", + "type": "visualization" + }, + { + "id": "86177430-728d-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "4804eaa0-7315-11e9-b0d0-414c3011ddbb", + "type": "visualization" + }, + { + "id": "logs-log-1.0.1-pipeline-plaintext", + "type": "ingest-pipeline" + }, + { + "id": "logs-log-1.0.1-pipeline-json", + "type": "ingest-pipeline" + }, + { + "id": "logs-log-1.0.1", + "type": "ingest-pipeline" + }, + { + "id": "logs-log", + "type": "index-template" + }, + { + "id": "metrics-stats", + "type": "index-template" + } + ] + }, + "references": [] + } + }, + "success": true + } + } + } + } + } + } + }, + "operationId": "get-epm-package-pkgkey", + "security": [ + { + "basicAuth": [] + } + ] + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "pkgkey", + "in": "path", + "required": true + } + ], + "post": { + "summary": "EPM - Packages - Install", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "response": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ] + } + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "response", + "success" + ] + } + } + } + } + }, + "operationId": "post-epm-install-pkgkey", + "description": "", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + }, + "delete": { + "summary": "EPM - Packages - Delete", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "response": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ] + } + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "response", + "success" + ] + } + } + } + } + }, + "operationId": "post-epm-delete-pkgkey", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/epm/packages": { + "get": { + "summary": "EPM - Packages - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchResult" + } + }, + "examples": { + "success": { + "value": { + "response": [ + { + "description": "aws Integration", + "download": "/epr/aws/aws-0.0.3.tar.gz", + "icons": [ + { + "src": "/package/aws/0.0.3/img/logo_aws.svg", + "title": "logo aws", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "aws", + "path": "/package/aws/0.0.3", + "title": "aws", + "type": "integration", + "version": "0.0.3", + "status": "not_installed" + }, + { + "description": "This is the Elastic Endpoint package.", + "download": "/epr/endpoint/endpoint-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/endpoint/0.1.0/img/logo-endpoint-64-color.svg", + "size": "16x16", + "type": "image/svg+xml" + } + ], + "name": "endpoint", + "path": "/package/endpoint/0.1.0", + "title": "Elastic Endpoint", + "type": "solution", + "version": "0.1.0", + "status": "installed", + "savedObject": { + "type": "epm-packages", + "id": "endpoint", + "attributes": { + "installed": [ + { + "id": "826759f0-7074-11ea-9bc8-6b38f4d29a16", + "type": "dashboard" + }, + { + "id": "55387750-729c-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "92b1edc0-706a-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "1cfceda0-728b-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "1e525190-7074-11ea-9bc8-6b38f4d29a16", + "type": "visualization" + }, + { + "id": "a3a3bd10-706b-11ea-9bc8-6b38f4d29a16", + "type": "map" + }, + { + "id": "events-endpoint", + "type": "index-template" + }, + { + "id": "metrics-endpoint", + "type": "index-template" + } + ], + "es_index_patterns": { + "events": "events-endpoint-*", + "metadata": "metrics-endpoint-*" + }, + "name": "endpoint", + "version": "0.1.0", + "internal": false, + "removable": false + }, + "references": [], + "updated_at": "2020-05-15T20:08:11.739Z", + "version": "WzEwOCwxXQ==" + } + }, + { + "description": "The log package should be used to create data sources for all type of logs for which an package doesn't exist yet.\n", + "download": "/epr/log/log-0.9.0.tar.gz", + "icons": [ + { + "src": "/package/log/0.9.0/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "log", + "path": "/package/log/0.9.0", + "title": "Log Package", + "type": "integration", + "version": "0.9.0", + "status": "not_installed" + }, + { + "description": "This integration contains pretty long documentation.\nIt is used to show the different visualisations inside a documentation to test how we handle it.\nThe integration does not contain any assets except the documentation page.\n", + "download": "/epr/longdocs/longdocs-1.0.4.tar.gz", + "icons": [ + { + "src": "/package/longdocs/1.0.4/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "longdocs", + "path": "/package/longdocs/1.0.4", + "title": "Long Docs", + "type": "integration", + "version": "1.0.4", + "status": "not_installed" + }, + { + "description": "This is an integration with only the metrics category.\n", + "download": "/epr/metricsonly/metricsonly-2.0.1.tar.gz", + "icons": [ + { + "src": "/package/metricsonly/2.0.1/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "metricsonly", + "path": "/package/metricsonly/2.0.1", + "title": "Metrics Only", + "type": "integration", + "version": "2.0.1", + "status": "not_installed" + }, + { + "description": "Multiple versions of this integration exist.\n", + "download": "/epr/multiversion/multiversion-1.1.0.tar.gz", + "icons": [ + { + "src": "/package/multiversion/1.1.0/img/icon.svg", + "type": "image/svg+xml" + } + ], + "name": "multiversion", + "path": "/package/multiversion/1.1.0", + "title": "Multi Version", + "type": "integration", + "version": "1.1.0", + "status": "not_installed" + }, + { + "description": "MySQL Integration", + "download": "/epr/mysql/mysql-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/mysql/0.1.0/img/logo_mysql.svg", + "title": "logo mysql", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "mysql", + "path": "/package/mysql/0.1.0", + "title": "MySQL", + "type": "integration", + "version": "0.1.0", + "status": "not_installed" + }, + { + "description": "Nginx Integration", + "download": "/epr/nginx/nginx-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/nginx/0.1.0/img/logo_nginx.svg", + "title": "logo nginx", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "nginx", + "path": "/package/nginx/0.1.0", + "title": "Nginx", + "type": "integration", + "version": "0.1.0", + "status": "not_installed" + }, + { + "description": "Redis Integration", + "download": "/epr/redis/redis-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/redis/0.1.0/img/logo_redis.svg", + "title": "logo redis", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "redis", + "path": "/package/redis/0.1.0", + "title": "Redis", + "type": "integration", + "version": "0.1.0", + "status": "not_installed" + }, + { + "description": "This package is used for defining all the properties of a package, the possible assets etc. It serves as a reference on all the config options which are possible.\n", + "download": "/epr/reference/reference-1.0.0.tar.gz", + "icons": [ + { + "src": "/package/reference/1.0.0/img/icon.svg", + "size": "32x32", + "type": "image/svg+xml" + } + ], + "name": "reference", + "path": "/package/reference/1.0.0", + "title": "Reference package", + "type": "integration", + "version": "1.0.0", + "status": "not_installed" + }, + { + "description": "System Integration", + "download": "/epr/system/system-0.1.0.tar.gz", + "icons": [ + { + "src": "/package/system/0.1.0/img/system.svg", + "title": "system", + "size": "1000x1000", + "type": "image/svg+xml" + } + ], + "name": "system", + "path": "/package/system/0.1.0", + "title": "System", + "type": "integration", + "version": "0.1.0", + "status": "installed", + "savedObject": { + "type": "epm-packages", + "id": "system", + "attributes": { + "installed": [ + { + "id": "c431f410-f9ac-11e9-90e8-1fb18e796788", + "type": "dashboard" + }, + { + "id": "Metricbeat-system-overview-ecs", + "type": "dashboard" + }, + { + "id": "277876d0-fa2c-11e6-bbd3-29c986c96e5a-ecs", + "type": "dashboard" + }, + { + "id": "0d3f2380-fa78-11e6-ae9b-81e5311e8cab-ecs", + "type": "dashboard" + }, + { + "id": "CPU-slash-Memory-per-container-ecs", + "type": "dashboard" + }, + { + "id": "79ffd6e0-faa0-11e6-947f-177f697178b8-ecs", + "type": "dashboard" + }, + { + "id": "Filebeat-syslog-dashboard-ecs", + "type": "dashboard" + }, + { + "id": "5517a150-f9ce-11e6-8115-a7c18106d86a-ecs", + "type": "dashboard" + }, + { + "id": "9c69cad0-f9b0-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "855899e0-1b1c-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "a30871f0-f98f-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "e121b140-fa78-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "f398d2f0-fa77-11e6-ae9b-81e5311e8cab-ecs", + "type": "visualization" + }, + { + "id": "c5e3cf90-4d60-11e7-9a4c-ed99bbcaa42b-ecs", + "type": "visualization" + }, + { + "id": "d3166e80-1b91-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "346bb290-fa80-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "Container-Block-IO-ecs", + "type": "visualization" + }, + { + "id": "590a60f0-5d87-11e7-8884-1bb4c3b890e4-ecs", + "type": "visualization" + }, + { + "id": "341ffe70-f9ce-11e6-8115-a7c18106d86a-ecs", + "type": "visualization" + }, + { + "id": "System-Navigation-ecs", + "type": "visualization" + }, + { + "id": "089b85d0-1b16-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "99381c80-4d60-11e7-9a4c-ed99bbcaa42b-ecs", + "type": "visualization" + }, + { + "id": "c6f2ffd0-4d17-11e7-a196-69b9a7a020a9-ecs", + "type": "visualization" + }, + { + "id": "d56ee420-fa79-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "1aae9140-1b93-11e7-8ada-3df93aab833e-ecs", + "type": "visualization" + }, + { + "id": "e0f001c0-1b18-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "dc589770-fa2b-11e6-bbd3-29c986c96e5a-ecs", + "type": "visualization" + }, + { + "id": "96976150-4d5d-11e7-aa29-87a97a796de6-ecs", + "type": "visualization" + }, + { + "id": "8c071e20-f999-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "d3f51850-f9b6-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "5c7af030-fa2a-11e6-bbd3-29c986c96e5a-ecs", + "type": "visualization" + }, + { + "id": "e6e639e0-f992-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "bfa5e400-1b16-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "7cdb1330-4d1a-11e7-a196-69b9a7a020a9-ecs", + "type": "visualization" + }, + { + "id": "78b74f30-f9cd-11e6-8115-a7c18106d86a-ecs", + "type": "visualization" + }, + { + "id": "Syslog-events-by-hostname-ecs", + "type": "visualization" + }, + { + "id": "3d65d450-a9c3-11e7-af20-67db8aecb295-ecs", + "type": "visualization" + }, + { + "id": "ab2d1e90-1b1a-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "825fdb80-4d1d-11e7-b5f2-2b7c1895bf32-ecs", + "type": "visualization" + }, + { + "id": "26732e20-1b91-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "Syslog-hostnames-and-processes-ecs", + "type": "visualization" + }, + { + "id": "522ee670-1b92-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "51164310-fa2b-11e6-bbd3-29c986c96e5a-ecs", + "type": "visualization" + }, + { + "id": "bb3a8720-f991-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "Container-Memory-stats-ecs", + "type": "visualization" + }, + { + "id": "5dd15c00-fa78-11e6-ae9b-81e5311e8cab-ecs", + "type": "visualization" + }, + { + "id": "327417e0-8462-11e7-bab8-bd2f0fb42c54-ecs", + "type": "visualization" + }, + { + "id": "d2e80340-4d5c-11e7-aa29-87a97a796de6-ecs", + "type": "visualization" + }, + { + "id": "19e123b0-4d5a-11e7-aee5-fdc812cc3bec-ecs", + "type": "visualization" + }, + { + "id": "3cec3eb0-f9d3-11e6-8a3e-2b904044ea1d-ecs", + "type": "visualization" + }, + { + "id": "2e224660-1b19-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "12667040-fa80-11e6-a1df-a78bd7504d38-ecs", + "type": "visualization" + }, + { + "id": "d16bb400-f9cc-11e6-8115-a7c18106d86a-ecs", + "type": "visualization" + }, + { + "id": "34f97ee0-1b96-11e7-8ada-3df93aab833e-ecs", + "type": "visualization" + }, + { + "id": "fe064790-1b1f-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "83e12df0-1b91-11e7-bec4-a5e9ec5cab8b-ecs", + "type": "visualization" + }, + { + "id": "4e4bb1e0-1b1b-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "4b254630-f998-11e9-90e8-1fb18e796788", + "type": "visualization" + }, + { + "id": "6b7b9a40-faa1-11e6-86b1-cd7735ff7e23-ecs", + "type": "visualization" + }, + { + "id": "4d546850-1b15-11e7-b09e-037021c4f8df-ecs", + "type": "visualization" + }, + { + "id": "Container-CPU-usage-ecs", + "type": "visualization" + }, + { + "id": "b6f321e0-fa25-11e6-bbd3-29c986c96e5a-ecs", + "type": "search" + }, + { + "id": "62439dc0-f9c9-11e6-a747-6121780e0414-ecs", + "type": "search" + }, + { + "id": "8030c1b0-fa77-11e6-ae9b-81e5311e8cab-ecs", + "type": "search" + }, + { + "id": "Syslog-system-logs-ecs", + "type": "search" + }, + { + "id": "eb0039f0-fa7f-11e6-a1df-a78bd7504d38-ecs", + "type": "search" + }, + { + "id": "logs-system.auth-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.auth-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.syslog-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.syslog-0.1.0", + "type": "ingest-pipeline" + }, + { + "id": "logs-system.auth", + "type": "index-template" + }, + { + "id": "metrics-system.core", + "type": "index-template" + }, + { + "id": "metrics-system.cpu", + "type": "index-template" + }, + { + "id": "metrics-system.diskio", + "type": "index-template" + }, + { + "id": "metrics-system.entropy", + "type": "index-template" + }, + { + "id": "metrics-system.filesystem", + "type": "index-template" + }, + { + "id": "metrics-system.fsstat", + "type": "index-template" + }, + { + "id": "metrics-system.load", + "type": "index-template" + }, + { + "id": "metrics-system.memory", + "type": "index-template" + }, + { + "id": "metrics-system.network", + "type": "index-template" + }, + { + "id": "metrics-system.network_summary", + "type": "index-template" + }, + { + "id": "metrics-system.process", + "type": "index-template" + }, + { + "id": "metrics-system.process_summary", + "type": "index-template" + }, + { + "id": "metrics-system.raid", + "type": "index-template" + }, + { + "id": "metrics-system.service", + "type": "index-template" + }, + { + "id": "metrics-system.socket", + "type": "index-template" + }, + { + "id": "metrics-system.socket_summary", + "type": "index-template" + }, + { + "id": "logs-system.syslog", + "type": "index-template" + }, + { + "id": "metrics-system.uptime", + "type": "index-template" + }, + { + "id": "metrics-system.users", + "type": "index-template" + } + ], + "es_index_patterns": { + "auth": "logs-system.auth-*", + "core": "metrics-system.core-*", + "cpu": "metrics-system.cpu-*", + "diskio": "metrics-system.diskio-*", + "entropy": "metrics-system.entropy-*", + "filesystem": "metrics-system.filesystem-*", + "fsstat": "metrics-system.fsstat-*", + "load": "metrics-system.load-*", + "memory": "metrics-system.memory-*", + "network": "metrics-system.network-*", + "network_summary": "metrics-system.network_summary-*", + "process": "metrics-system.process-*", + "process_summary": "metrics-system.process_summary-*", + "raid": "metrics-system.raid-*", + "service": "metrics-system.service-*", + "socket": "metrics-system.socket-*", + "socket_summary": "metrics-system.socket_summary-*", + "syslog": "logs-system.syslog-*", + "uptime": "metrics-system.uptime-*", + "users": "metrics-system.users-*" + }, + "name": "system", + "version": "0.1.0", + "internal": false, + "removable": false + }, + "references": [], + "updated_at": "2020-05-15T20:08:08.708Z", + "version": "Wzk4LDFd" + } + }, + { + "description": "This package contains a yaml pipeline.\n", + "download": "/epr/yamlpipeline/yamlpipeline-1.0.0.tar.gz", + "name": "yamlpipeline", + "path": "/package/yamlpipeline/1.0.0", + "title": "Yaml Pipeline package", + "type": "integration", + "version": "1.0.0", + "status": "not_installed" + } + ], + "success": true + } + } + } + } + } + } + }, + "operationId": "get-epm-list" + }, + "parameters": [] + }, + "/epm/categories": { + "get": { + "summary": "EPM - Categories", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "count": { + "type": "number" + } + }, + "required": [ + "id", + "title", + "count" + ] + } + } + } + } + } + }, + "operationId": "get-epm-categories" + } + }, + "/fleet/agents": { + "get": { + "summary": "Fleet - Agent - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "type": "object" + } + }, + "success": { + "type": "boolean" + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + } + }, + "required": [ + "list", + "success", + "total", + "page", + "perPage" + ] + }, + "examples": { + "example-1": { + "value": { + "list": [ + { + "id": "205661d0-5e53-11ea-ad31-4f31c06bd9a4", + "active": true, + "config_id": "ae556400-5e39-11ea-8b49-f9747e466f7b", + "type": "PERMANENT", + "enrolled_at": "2020-03-04T20:02:50.605Z", + "user_provided_metadata": { + "dev_agent_version": "0.0.1", + "region": "us-east" + }, + "local_metadata": { + "host": "localhost", + "ip": "127.0.0.1", + "system": "Darwin 18.7.0", + "memory": 34359738368 + }, + "actions": [ + { + "data": "{\"config\":{\"id\":\"ae556400-5e39-11ea-8b49-f9747e466f7b\",\"outputs\":{\"default\":{\"type\":\"elasticsearch\",\"hosts\":[\"http://localhost:9200\"],\"api_key\":\"\",\"api_token\":\"6ckkp3ABz7e_XRqr3LM8:gQuDfUNSRgmY0iziYqP9Hw\"}},\"datasources\":[]}}", + "created_at": "2020-03-04T20:02:56.149Z", + "id": "6a95c00a-d76d-4931-97c3-0bf935272d7d", + "type": "CONFIG_CHANGE" + } + ], + "access_api_key_id": "6Mkkp3ABz7e_XRqrzLNJ", + "default_api_key": "6ckkp3ABz7e_XRqr3LM8:gQuDfUNSRgmY0iziYqP9Hw", + "current_error_events": [], + "last_checkin": "2020-03-04T20:03:05.700Z", + "status": "online" + } + ], + "success": true, + "total": 1, + "page": 1, + "perPage": 20 + } + } + } + } + } + } + }, + "operationId": "get-fleet-agents", + "security": [ + { + "basicAuth": [] + } + ] + } + }, + "/fleet/agents/{agentId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "type": "object" + }, + "success": { + "type": "string" + } + }, + "required": [ + "item", + "success" + ] + } + } + } + } + }, + "operationId": "get-fleet-agents-agentId" + }, + "put": { + "summary": "Fleet - Agent - Update", + "tags": [], + "responses": {}, + "operationId": "put-fleet-agents-agentId", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + }, + "delete": { + "summary": "Fleet - Agent - Delete", + "tags": [], + "responses": {}, + "operationId": "delete-fleet-agents-agentId", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/agents/{agentId}/events": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Events", + "tags": [], + "responses": {}, + "operationId": "get-fleet-agents-agentId-events" + } + }, + "/fleet/agents/{agentId}/checkin": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Check In", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "checkin" + ] + }, + "success": { + "type": "string" + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "agent_id": { + "type": "string" + }, + "data": { + "type": "object" + }, + "id": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "type": { + "type": "string" + } + }, + "required": [ + "agent_id", + "data", + "id", + "created_at", + "type" + ] + } + } + } + }, + "examples": { + "success": { + "value": { + "action": "checkin", + "success": true, + "actions": [ + { + "agent_id": "a6f14bd2-1a2a-481c-9212-9494d064ffdf", + "type": "CONFIG_CHANGE", + "data": { + "config": { + "id": "2fe89350-a5e0-11ea-a587-5f886c8a849f", + "outputs": { + "default": { + "type": "elasticsearch", + "hosts": [ + "http://localhost:9200" + ], + "api_key": "Z-XkgHIBvwtjzIKtSCTh:AejRqdKpQx6z-6dqSI1LHg" + } + }, + "datasources": [ + { + "id": "33d6bd70-a5e0-11ea-a587-5f886c8a849f", + "name": "system-1", + "namespace": "default", + "enabled": true, + "use_output": "default", + "inputs": [ + { + "type": "logs", + "enabled": true, + "streams": [ + { + "id": "logs-system.auth", + "enabled": true, + "dataset": "system.auth", + "paths": [ + "/var/log/auth.log*", + "/var/log/secure*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + }, + { + "id": "logs-system.syslog", + "enabled": true, + "dataset": "system.syslog", + "paths": [ + "/var/log/messages*", + "/var/log/syslog*" + ], + "exclude_files": [ + ".gz$" + ], + "multiline": { + "pattern": "^\\s", + "match": "after" + }, + "processors": [ + { + "add_locale": null + }, + { + "add_fields": { + "target": "", + "fields": { + "ecs.version": "1.5.0" + } + } + } + ] + } + ] + }, + { + "type": "system/metrics", + "enabled": true, + "streams": [ + { + "id": "system/metrics-system.core", + "enabled": true, + "dataset": "system.core", + "metricsets": [ + "core" + ], + "core.metrics": "percentages" + }, + { + "id": "system/metrics-system.cpu", + "enabled": true, + "dataset": "system.cpu", + "metricsets": [ + "cpu" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.diskio", + "enabled": true, + "dataset": "system.diskio", + "metricsets": [ + "diskio" + ] + }, + { + "id": "system/metrics-system.entropy", + "enabled": true, + "dataset": "system.entropy", + "metricsets": [ + "entropy" + ] + }, + { + "id": "system/metrics-system.filesystem", + "enabled": true, + "dataset": "system.filesystem", + "metricsets": [ + "filesystem" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + }, + { + "id": "system/metrics-system.fsstat", + "enabled": true, + "dataset": "system.fsstat", + "metricsets": [ + "fsstat" + ], + "period": "1m", + "processors": [ + { + "drop_event.when.regexp": { + "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" + } + } + ] + }, + { + "id": "system/metrics-system.load", + "enabled": true, + "dataset": "system.load", + "metricsets": [ + "load" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.memory", + "enabled": true, + "dataset": "system.memory", + "metricsets": [ + "memory" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.network", + "enabled": true, + "dataset": "system.network", + "metricsets": [ + "network" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.network_summary", + "enabled": true, + "dataset": "system.network_summary", + "metricsets": [ + "network_summary" + ] + }, + { + "id": "system/metrics-system.process", + "enabled": true, + "dataset": "system.process", + "metricsets": [ + "process" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.process_summary", + "enabled": true, + "dataset": "system.process_summary", + "metricsets": [ + "process_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.raid", + "enabled": true, + "dataset": "system.raid", + "metricsets": [ + "raid" + ] + }, + { + "id": "system/metrics-system.service", + "enabled": true, + "dataset": "system.service", + "metricsets": [ + "service" + ] + }, + { + "id": "system/metrics-system.socket", + "enabled": true, + "dataset": "system.socket", + "metricsets": [ + "socket" + ] + }, + { + "id": "system/metrics-system.socket_summary", + "enabled": true, + "dataset": "system.socket_summary", + "metricsets": [ + "socket_summary" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "process.include_top_n.by_cpu": 5, + "process.include_top_n.by_memory": 5, + "processes": ".*" + }, + { + "id": "system/metrics-system.uptime", + "enabled": true, + "dataset": "system.uptime", + "metricsets": [ + "uptime" + ], + "core.metrics": "percentages", + "cpu.metrics": "percentages,normalized_percentages", + "period": "10s", + "processes": ".*" + }, + { + "id": "system/metrics-system.users", + "enabled": true, + "dataset": "system.users", + "metricsets": [ + "users" + ] + } + ] + } + ], + "package": { + "name": "system", + "version": "0.1.0" + } + }, + { + "id": "fdb1fea0-a5f6-11ea-ad52-534e35d3cd6f", + "name": "endpoint-1", + "namespace": "default", + "enabled": true, + "use_output": "default", + "inputs": [], + "package": { + "name": "endpoint", + "version": "0.2.0" + } + }, + { + "id": "2d792280-a5f7-11ea-ad52-534e35d3cd6f", + "name": "endpoint-2", + "namespace": "default", + "enabled": true, + "use_output": "default", + "inputs": [], + "package": { + "name": "endpoint", + "version": "0.2.0" + } + } + ], + "revision": 4, + "settings": { + "monitoring": { + "use_output": "default", + "enabled": true, + "logs": true, + "metrics": true + } + } + } + }, + "id": "51c6ad1e-a9c0-4c70-80da-99a5c51eedaf", + "created_at": "2020-06-04T19:52:24.667Z" + } + ] + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-agentId-checkin", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ], + "security": [ + { + "Access API Key": [] + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "local_metadata": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NewAgentEvent" + } + } + } + }, + "examples": { + "stoped to starting": { + "value": { + "events": [ + { + "type": "STATE", + "subtype": "STARTING", + "message": "state changed from STOPPED to STARTING", + "timestamp": "2019-10-01T13:42:54.323Z", + "payload": {}, + "agent_id": "bee40627-8cbd-45df-add9-98c390f9db10" + } + ] + } + }, + "running": { + "value": { + "events": [ + { + "type": "STATE", + "subtype": "RUNNING", + "message": "state changed from STOPPED to RUNNING", + "timestamp": "2020-05-26T20:44:57.480Z", + "payload": { + "random": "data", + "state": "RUNNING", + "previous_state": "STOPPED" + }, + "agent_id": "bee40627-8cbd-45df-add9-98c390f9db10" + } + ] + } + } + } + } + } + } + } + }, + "/fleet/agents/{agentId}/acks": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Acks", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "acks" + ] + } + }, + "required": [ + "success", + "action" + ] + }, + "examples": { + "success": { + "value": { + "action": "checkin", + "success": true + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-agentId-acks", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + }, + "examples": { + "example-1": { + "value": { + "events": [ + { + "type": "ACTION_RESULT", + "subtype": "CONFIG", + "timestamp": "2019-01-04T14:32:03.36764-05:00", + "action_id": "51c6ad1e-a9c0-4c70-80da-99a5c51eedaf", + "agent_id": "a6f14bd2-1a2a-481c-9212-9494d064ffdf", + "message": "acknowledge" + } + ] + } + } + } + } + } + } + } + }, + "/fleet/agents/enroll": { + "post": { + "summary": "Fleet - Agent - Enroll", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "item": { + "$ref": "#/components/schemas/Agent" + } + } + }, + "examples": { + "success": { + "value": { + "action": "created", + "success": true, + "item": { + "id": "8086fb1a-72ca-4a67-8533-09300c1639fa", + "active": true, + "config_id": "2fe89350-a5e0-11ea-a587-5f886c8a849f", + "type": "PERMANENT", + "enrolled_at": "2020-06-04T13:03:57.856Z", + "user_provided_metadata": { + "dev_agent_version": "0.0.1", + "region": "us-east" + }, + "local_metadata": { + "host": "localhost", + "ip": "127.0.0.1", + "system": "Darwin 18.7.0", + "memory": 34359738368 + }, + "current_error_events": [], + "access_api_key": "cU9KdWYzSUJ2d3RqeklLdFdnNF86ZW05ZjFrMThUWW1GRW13OHMwRGZvdw==", + "status": "error" + } + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-enroll", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "PERMANENT", + "EPHEMERAL", + "TEMPORARY" + ] + }, + "shared_id": { + "type": "string" + }, + "metadata": { + "type": "object", + "required": [ + "local", + "user_provided" + ], + "properties": { + "local": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "user_provided": { + "$ref": "#/components/schemas/AgentMetadata" + } + } + } + }, + "required": [ + "type", + "metadata" + ] + }, + "examples": { + "good": { + "value": { + "type": "PERMANENT", + "metadata": { + "local": { + "host": "localhost", + "ip": "127.0.0.1", + "system": "Darwin 18.7.0", + "memory": 34359738368 + }, + "user_provided": { + "dev_agent_version": "0.0.1", + "region": "us-east" + } + } + } + } + } + } + } + }, + "security": [ + { + "Enrollment API Key": [] + } + ] + } + }, + "/fleet/agents/unenroll": { + "post": { + "summary": "Fleet - Agent - Unenroll", + "tags": [], + "responses": {}, + "operationId": "post-fleet-agents-unenroll", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/config/{configId}/agent-status": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "configId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Status for config", + "tags": [], + "responses": {}, + "operationId": "get-fleet-config-configId-agent-status" + } + }, + "/fleet/enrollment-api-keys": { + "get": { + "summary": "Enrollment - List", + "tags": [], + "responses": {}, + "operationId": "get-fleet-enrollment-api-keys", + "parameters": [] + }, + "post": { + "summary": "Enrollment - Create", + "tags": [], + "responses": {}, + "operationId": "post-fleet-enrollment-api-keys", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/enrollment-api-keys/{keyId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "keyId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Enrollment - Info", + "tags": [], + "responses": {}, + "operationId": "get-fleet-enrollment-api-keys-keyId" + }, + "delete": { + "summary": "Enrollment - Delete", + "tags": [], + "responses": {}, + "operationId": "delete-fleet-enrollment-api-keys-keyId", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/setup": { + "post": { + "summary": "Ingest Manager - Setup", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + } + }, + "examples": { + "success": { + "value": { + "isInitialized": true + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + }, + "examples": {} + } + } + } + }, + "operationId": "post-setup", + "parameters": [ + { + "$ref": "#/components/parameters/xsrfHeader" + } + ] + } + }, + "/fleet/install/{osType}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "osType", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Get OS install script", + "tags": [], + "responses": {}, + "operationId": "get-fleet-install-osType" + } + } + }, + "components": { + "schemas": { + "AgentConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/NewAgentConfig" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "datasources": { + "oneOf": [ + { + "items": { + "type": "string" + } + }, + { + "items": { + "$ref": "#/components/schemas/Datasource" + } + } + ], + "type": "array" + }, + "updated_on": { + "type": "string", + "format": "date-time" + }, + "updated_by": { + "type": "string" + }, + "revision": { + "type": "number" + }, + "agents": { + "type": "number" + } + }, + "required": [ + "id", + "status" + ] + } + ] + }, + "Datasource": { + "title": "Datasource", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "revision": { + "type": "number" + }, + "inputs": { + "type": "array", + "items": {} + } + }, + "required": [ + "id", + "revision" + ] + }, + { + "$ref": "#/components/schemas/NewDatasource" + } + ], + "x-examples": { + "example-1": {} + } + }, + "NewAgentConfig": { + "title": "NewAgentConfig", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "NewDatasource": { + "title": "NewDatasource", + "type": "object", + "x-examples": { + "example-1": { + "enabled": true, + "title": "This is a nice title for human", + "package": { + "name": "epm/nginx", + "version": "1.7.0" + }, + "namespace": "prod", + "use_output": "long_term_storage", + "inputs": [ + { + "type": "logs", + "streams": [ + { + "enabled": true, + "dataset": "nginx.acccess", + "paths": [ + "/var/log/nginx/access.log" + ] + }, + { + "enabled": true, + "dataset": "nginx.error", + "paths": [ + "/var/log/nginx/error.log" + ] + } + ] + }, + { + "type": "nginx/metrics", + "streams": [ + { + "id": "id string", + "enabled": true, + "dataset": "nginx.stub_status", + "metricset": "stub_status" + } + ] + } + ] + } + }, + "description": "", + "properties": { + "enabled": { + "type": "boolean" + }, + "package": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "title" + ] + }, + "namespace": { + "type": "string" + }, + "output_id": { + "type": "string" + }, + "inputs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "processors": { + "type": "array", + "items": { + "type": "string" + } + }, + "streams": { + "type": "array", + "items": {} + }, + "config": { + "type": "object" + }, + "vars": { + "type": "object" + } + }, + "required": [ + "type", + "enabled", + "streams" + ] + } + }, + "config_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "output_id", + "inputs", + "config_id", + "name" + ] + }, + "PackageInfo": { + "title": "PackageInfo", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "version": { + "type": "string" + }, + "readme": { + "type": "string" + }, + "description": { + "type": "string" + }, + "type": { + "type": "string" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "requirement": { + "oneOf": [ + { + "properties": { + "kibana": { + "type": "object", + "properties": { + "versions": { + "type": "string" + } + } + } + } + }, + { + "properties": { + "elasticsearch": { + "type": "object", + "properties": { + "versions": { + "type": "string" + } + } + } + } + } + ], + "type": "object" + }, + "screenshots": { + "type": "array", + "items": { + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "src" + ] + } + }, + "icons": { + "type": "array", + "items": { + "type": "string" + } + }, + "assets": { + "type": "array", + "items": { + "type": "string" + } + }, + "internal": { + "type": "boolean" + }, + "format_version": { + "type": "string" + }, + "datasets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "name": { + "type": "string" + }, + "release": { + "type": "string" + }, + "ingeset_pipeline": { + "type": "string" + }, + "vars": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "default": { + "type": "string" + } + }, + "required": [ + "name", + "default" + ] + } + }, + "type": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "required": [ + "title", + "name", + "release", + "ingeset_pipeline", + "type", + "package" + ] + } + }, + "download": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "name", + "title", + "version", + "description", + "type", + "categories", + "requirement", + "assets", + "format_version", + "download", + "path" + ] + }, + "SearchResult": { + "title": "SearchResult", + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "download": { + "type": "string" + }, + "icons": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + }, + "status": { + "type": "string" + }, + "savedObject": { + "type": "object" + } + }, + "required": [ + "description", + "download", + "icons", + "name", + "path", + "title", + "type", + "version", + "status" + ] + }, + "AgentStatus": { + "type": "string", + "title": "AgentStatus", + "enum": [ + "offline", + "error", + "online", + "inactive", + "warning" + ] + }, + "Agent": { + "title": "Agent", + "type": "object", + "properties": { + "type": { + "$ref": "#/components/schemas/AgentType" + }, + "active": { + "type": "boolean" + }, + "enrolled_at": { + "type": "string" + }, + "shared_id": { + "type": "string" + }, + "access_api_key_id": { + "type": "string" + }, + "default_api_key_id": { + "type": "string" + }, + "config_id": { + "type": "string" + }, + "config_revision": { + "type": [ + "number", + "null" + ] + }, + "config_newest_revision": { + "type": "number" + }, + "last_checkin": { + "type": "string" + }, + "user_provided_metadata": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "local_metadata": { + "$ref": "#/components/schemas/AgentMetadata" + }, + "id": { + "type": "string" + }, + "current_error_events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AgentEvent" + } + }, + "access_api_key": { + "type": "string" + }, + "status": { + "$ref": "#/components/schemas/AgentStatus" + }, + "default_api_key": { + "type": "string" + } + }, + "required": [ + "type", + "active", + "enrolled_at", + "id", + "current_error_events", + "status" + ] + }, + "AgentType": { + "type": "string", + "title": "AgentType", + "enum": [ + "PERMANENT", + "EPHEMERAL", + "TEMPORARY" + ] + }, + "AgentMetadata": { + "title": "AgentMetadata", + "type": "object" + }, + "NewAgentEvent": { + "title": "NewAgentEvent", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "STATE", + "ERROR", + "ACTION_RESULT", + "ACTION" + ] + }, + "subtype": { + "type": "string", + "enum": [ + "RUNNING", + "STARTING", + "IN_PROGRESS", + "CONFIG", + "FAILED", + "STOPPING", + "STOPPED", + "DATA_DUMP", + "ACKNOWLEDGED", + "UNKNOWN" + ] + }, + "timestamp": { + "type": "string" + }, + "message": { + "type": "string" + }, + "payload": { + "type": "string" + }, + "agent_id": { + "type": "string" + }, + "config_id": { + "type": "string" + }, + "stream_id": { + "type": "string" + }, + "action_id": { + "type": "string" + } + }, + "required": [ + "type", + "subtype", + "timestamp", + "message", + "agent_id" + ] + }, + "AgentEvent": { + "title": "AgentEvent", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "$ref": "#/components/schemas/NewAgentEvent" + } + ] + }, + "AccessApiKey": { + "type": "string", + "title": "AccessApiKey", + "format": "byte" + }, + "EnrollmentApiKey": { + "type": "string", + "title": "EnrollmentApiKey", + "format": "byte" + } + }, + "parameters": { + "pageSizeParam": { + "name": "perPage", + "in": "query", + "description": "The number of items to return", + "required": false, + "schema": { + "type": "integer", + "default": 50 + } + }, + "pageIndexParam": { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 1 + } + }, + "kueryParam": { + "name": "kuery", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + "xsrfHeader": { + "schema": { + "type": "string" + }, + "in": "header", + "name": "kbn-xsrf", + "required": true + } + }, + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "Enrollment API Key": { + "name": "Authorization", + "type": "apiKey", + "in": "header", + "description": "e.g. Authorization: ApiKey base64EnrollmentApiKey" + }, + "Access API Key": { + "name": "Authorization", + "type": "apiKey", + "in": "header", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" + } + } + }, + "security": [ + { + "basicAuth": [] + } + ] +} From 994dba102ced0531ca13773947c0ad32e0353165 Mon Sep 17 00:00:00 2001 From: "Devin W. Hurley" Date: Tue, 9 Jun 2020 08:41:37 -0400 Subject: [PATCH 44/65] [SECURITY SOLUTION] [Detections] Add / Update e2e tests to ensure initial rule runs are successful (#68441) * adds/modifies e2e tests to ensure find_status returns succeeded after rules are created, instead of just 'going to run' * add documentation around newly created e2e tests explaining bug and specific regression to be on the lookout for if these start failing --- .../security_and_spaces/tests/create_rules.ts | 45 ++++++++++++++++++- .../tests/create_rules_bulk.ts | 45 ++++++++++++++++++- .../tests/find_statuses.ts | 21 ++++++++- 3 files changed, 108 insertions(+), 3 deletions(-) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts index 449168d73f4ef..8847b0c3250ac 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts @@ -6,7 +6,10 @@ import expect from '@kbn/expect'; -import { DETECTION_ENGINE_RULES_URL } from '../../../../plugins/security_solution/common/constants'; +import { + DETECTION_ENGINE_RULES_URL, + DETECTION_ENGINE_RULES_STATUS_URL, +} from '../../../../plugins/security_solution/common/constants'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { createSignalsIndex, @@ -65,6 +68,46 @@ export default ({ getService }: FtrProviderContext) => { expect(bodyToCompare).to.eql(getSimpleRuleOutput()); }); + /* + This test is to ensure no future regressions introduced by the following scenario + a call to updateApiKey was invalidating the api key used by the + rule while the rule was executing, or even before it executed, + on the first rule run. + this pr https://github.com/elastic/kibana/pull/68184 + fixed this by finding the true source of a bug that required the manual + api key update, and removed the call to that function. + + When the api key is updated before / while the rule is executing, the alert + executor no longer has access to a service to update the rule status + saved object in Elasticsearch. Because of this, we cannot set the rule into + a 'failure' state, so the user ends up seeing 'going to run' as that is the + last status set for the rule before it erupts in an error that cannot be + recorded inside of the executor. + + This adds an e2e test for the backend to catch that in case + this pops up again elsewhere. + */ + it('should create a single rule with a rule_id and validate it ran successfully', async () => { + const simpleRule = getSimpleRule(); + const { body } = await supertest + .post(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .send(simpleRule) + .expect(200); + + // wait for Task Manager to execute the rule and update status + await new Promise((resolve) => setTimeout(resolve, 5000)); + const { body: statusBody } = await supertest + .post(DETECTION_ENGINE_RULES_STATUS_URL) + .set('kbn-xsrf', 'true') + .send({ ids: [body.id] }) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getSimpleRuleOutput()); + expect(statusBody[body.id].current_status.status).to.eql('succeeded'); + }); + it('should create a single rule without an input index', async () => { const { index, ...payload } = getSimpleRule(); const { index: _index, ...expected } = getSimpleRuleOutput(); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts index 6c3b1c45e202e..47b09fd1fe3c7 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts @@ -6,7 +6,10 @@ import expect from '@kbn/expect'; -import { DETECTION_ENGINE_RULES_URL } from '../../../../plugins/security_solution/common/constants'; +import { + DETECTION_ENGINE_RULES_URL, + DETECTION_ENGINE_RULES_STATUS_URL, +} from '../../../../plugins/security_solution/common/constants'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { createSignalsIndex, @@ -68,6 +71,46 @@ export default ({ getService }: FtrProviderContext): void => { expect(bodyToCompare).to.eql(getSimpleRuleOutput()); }); + /* + This test is to ensure no future regressions introduced by the following scenario + a call to updateApiKey was invalidating the api key used by the + rule while the rule was executing, or even before it executed, + on the first rule run. + this pr https://github.com/elastic/kibana/pull/68184 + fixed this by finding the true source of a bug that required the manual + api key update, and removed the call to that function. + + When the api key is updated before / while the rule is executing, the alert + executor no longer has access to a service to update the rule status + saved object in Elasticsearch. Because of this, we cannot set the rule into + a 'failure' state, so the user ends up seeing 'going to run' as that is the + last status set for the rule before it erupts in an error that cannot be + recorded inside of the executor. + + This adds an e2e test for the backend to catch that in case + this pops up again elsewhere. + */ + it('should create a single rule with a rule_id and validate it ran successfully', async () => { + const simpleRule = getSimpleRule(); + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_create`) + .set('kbn-xsrf', 'true') + .send([simpleRule]) + .expect(200); + + // wait for Task Manager to execute the rule and update status + await new Promise((resolve) => setTimeout(resolve, 5000)); + const { body: statusBody } = await supertest + .post(DETECTION_ENGINE_RULES_STATUS_URL) + .set('kbn-xsrf', 'true') + .send({ ids: [body[0].id] }) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body[0]); + expect(bodyToCompare).to.eql(getSimpleRuleOutput()); + expect(statusBody[body[0].id].current_status.status).to.eql('succeeded'); + }); + it('should create a single rule without a rule_id', async () => { const { body } = await supertest .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_create`) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts index 6ff5a8c552ab7..f659857b89a97 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts @@ -42,6 +42,25 @@ export default ({ getService }: FtrProviderContext): void => { expect(body).to.eql({}); }); + /* + This test is to ensure no future regressions introduced by the following scenario + a call to updateApiKey was invalidating the api key used by the + rule while the rule was executing, or even before it executed, + on the first rule run. + this pr https://github.com/elastic/kibana/pull/68184 + fixed this by finding the true source of a bug that required the manual + api key update, and removed the call to that function. + + When the api key is updated before / while the rule is executing, the alert + executor no longer has access to a service to update the rule status + saved object in Elasticsearch. Because of this, we cannot set the rule into + a 'failure' state, so the user ends up seeing 'going to run' as that is the + last status set for the rule before it erupts in an error that cannot be + recorded inside of the executor. + + This adds an e2e test for the backend to catch that in case + this pops up again elsewhere. + */ it('should return a single rule status when a single rule is loaded from a find status with defaults added', async () => { // add a single rule const { body: resBody } = await supertest @@ -61,7 +80,7 @@ export default ({ getService }: FtrProviderContext): void => { .expect(200); // expected result for status should be 'going to run' or 'succeeded - expect(['succeeded', 'going to run']).to.contain(body[resBody.id].current_status.status); + expect(body[resBody.id].current_status.status).to.eql('succeeded'); }); }); }; From 605b79e8ca5e2d88d11814443530bc7316d76827 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 9 Jun 2020 06:36:56 -0700 Subject: [PATCH 45/65] Convert Index Templates API routes to snakecase. (#68463) Co-authored-by: Elastic Machine --- .../client_integration/helpers/http_requests.ts | 10 +++++----- .../home/index_templates_tab.test.ts | 4 ++-- .../public/application/services/api.ts | 10 +++++----- .../routes/api/templates/register_create_route.ts | 2 +- .../routes/api/templates/register_delete_route.ts | 2 +- .../server/routes/api/templates/register_get_routes.ts | 4 ++-- .../routes/api/templates/register_update_route.ts | 2 +- .../management/index_management/templates.helpers.js | 10 +++++----- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts index da461609f0b83..75d1b69eb6157 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts @@ -12,7 +12,7 @@ type HttpResponse = Record | any[]; // Register helpers to mock HTTP Requests const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const setLoadTemplatesResponse = (response: HttpResponse = []) => { - server.respondWith('GET', `${API_BASE_PATH}/index-templates`, [ + server.respondWith('GET', `${API_BASE_PATH}/index_templates`, [ 200, { 'Content-Type': 'application/json' }, JSON.stringify(response), @@ -28,7 +28,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { }; const setDeleteTemplateResponse = (response: HttpResponse = []) => { - server.respondWith('POST', `${API_BASE_PATH}/delete-index-templates`, [ + server.respondWith('POST', `${API_BASE_PATH}/delete_index_templates`, [ 200, { 'Content-Type': 'application/json' }, JSON.stringify(response), @@ -39,7 +39,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const status = error ? error.status || 400 : 200; const body = error ? error.body : response; - server.respondWith('GET', `${API_BASE_PATH}/index-templates/:id`, [ + server.respondWith('GET', `${API_BASE_PATH}/index_templates/:id`, [ status, { 'Content-Type': 'application/json' }, JSON.stringify(body), @@ -50,7 +50,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const status = error ? error.body.status || 400 : 200; const body = error ? JSON.stringify(error.body) : JSON.stringify(response); - server.respondWith('POST', `${API_BASE_PATH}/index-templates`, [ + server.respondWith('POST', `${API_BASE_PATH}/index_templates`, [ status, { 'Content-Type': 'application/json' }, body, @@ -61,7 +61,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { const status = error ? error.status || 400 : 200; const body = error ? JSON.stringify(error.body) : JSON.stringify(response); - server.respondWith('PUT', `${API_BASE_PATH}/index-templates/:name`, [ + server.respondWith('PUT', `${API_BASE_PATH}/index_templates/:name`, [ status, { 'Content-Type': 'application/json' }, body, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts index 8f6a8dddeb195..7c79c7e61174e 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts @@ -188,7 +188,7 @@ describe('Index Templates tab', () => { expect(server.requests.length).toBe(totalRequests + 1); expect(server.requests[server.requests.length - 1].url).toBe( - `${API_BASE_PATH}/index-templates` + `${API_BASE_PATH}/index_templates` ); }); @@ -318,7 +318,7 @@ describe('Index Templates tab', () => { const latestRequest = server.requests[server.requests.length - 1]; expect(latestRequest.method).toBe('POST'); - expect(latestRequest.url).toBe(`${API_BASE_PATH}/delete-index-templates`); + expect(latestRequest.url).toBe(`${API_BASE_PATH}/delete_index_templates`); expect(JSON.parse(JSON.parse(latestRequest.requestBody).body)).toEqual({ templates: [{ name: legacyTemplates[0].name, isLegacy }], }); diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index 3961942b83ea3..d1950ae714550 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -211,14 +211,14 @@ export async function loadIndexData(type: string, indexName: string) { export function useLoadIndexTemplates() { return useRequest<{ templates: TemplateListItem[]; legacyTemplates: TemplateListItem[] }>({ - path: `${API_BASE_PATH}/index-templates`, + path: `${API_BASE_PATH}/index_templates`, method: 'get', }); } export async function deleteTemplates(templates: Array<{ name: string; isLegacy?: boolean }>) { const result = sendRequest({ - path: `${API_BASE_PATH}/delete-index-templates`, + path: `${API_BASE_PATH}/delete_index_templates`, method: 'post', body: { templates }, }); @@ -232,7 +232,7 @@ export async function deleteTemplates(templates: Array<{ name: string; isLegacy? export function useLoadIndexTemplate(name: TemplateDeserialized['name'], isLegacy?: boolean) { return useRequest({ - path: `${API_BASE_PATH}/index-templates/${encodeURIComponent(name)}`, + path: `${API_BASE_PATH}/index_templates/${encodeURIComponent(name)}`, method: 'get', query: { legacy: isLegacy, @@ -242,7 +242,7 @@ export function useLoadIndexTemplate(name: TemplateDeserialized['name'], isLegac export async function saveTemplate(template: TemplateDeserialized, isClone?: boolean) { const result = await sendRequest({ - path: `${API_BASE_PATH}/index-templates`, + path: `${API_BASE_PATH}/index_templates`, method: 'post', body: JSON.stringify(template), }); @@ -257,7 +257,7 @@ export async function saveTemplate(template: TemplateDeserialized, isClone?: boo export async function updateTemplate(template: TemplateDeserialized) { const { name } = template; const result = await sendRequest({ - path: `${API_BASE_PATH}/index-templates/${encodeURIComponent(name)}`, + path: `${API_BASE_PATH}/index_templates/${encodeURIComponent(name)}`, method: 'put', body: JSON.stringify(template), }); diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts index 26e74847e3e05..e0d92b3800785 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_create_route.ts @@ -16,7 +16,7 @@ const bodySchema = templateSchema; export function registerCreateRoute({ router, license, lib }: RouteDependencies) { router.post( - { path: addBasePath('/index-templates'), validate: { body: bodySchema } }, + { path: addBasePath('/index_templates'), validate: { body: bodySchema } }, license.guardApiRoute(async (ctx, req, res) => { const { callAsCurrentUser } = ctx.core.elasticsearch.legacy.client; const template = req.body as TemplateDeserialized; diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts index b5cc00ad6d8cc..1527af12a92a4 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_delete_route.ts @@ -24,7 +24,7 @@ const bodySchema = schema.object({ export function registerDeleteRoute({ router, license }: RouteDependencies) { router.post( { - path: addBasePath('/delete-index-templates'), + path: addBasePath('/delete_index_templates'), validate: { body: bodySchema }, }, license.guardApiRoute(async (ctx, req, res) => { diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts index 12ec005258a62..ae5f7802a8408 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts @@ -16,7 +16,7 @@ import { addBasePath } from '../index'; export function registerGetAllRoute({ router, license }: RouteDependencies) { router.get( - { path: addBasePath('/index-templates'), validate: false }, + { path: addBasePath('/index_templates'), validate: false }, license.guardApiRoute(async (ctx, req, res) => { const { callAsCurrentUser } = ctx.core.elasticsearch.legacy.client; const managedTemplatePrefix = await getManagedTemplatePrefix(callAsCurrentUser); @@ -55,7 +55,7 @@ const querySchema = schema.object({ export function registerGetOneRoute({ router, license, lib }: RouteDependencies) { router.get( { - path: addBasePath('/index-templates/{name}'), + path: addBasePath('/index_templates/{name}'), validate: { params: paramsSchema, query: querySchema }, }, license.guardApiRoute(async (ctx, req, res) => { diff --git a/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts b/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts index 5b2a0d8722e46..7e9c3174d0591 100644 --- a/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts @@ -19,7 +19,7 @@ const paramsSchema = schema.object({ export function registerUpdateRoute({ router, license, lib }: RouteDependencies) { router.put( { - path: addBasePath('/index-templates/{name}'), + path: addBasePath('/index_templates/{name}'), validate: { body: bodySchema, params: paramsSchema }, }, license.guardApiRoute(async (ctx, req, res) => { diff --git a/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js b/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js index 9f1fab4039397..292aabad85054 100644 --- a/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js +++ b/x-pack/test/api_integration/apis/management/index_management/templates.helpers.js @@ -7,10 +7,10 @@ import { API_BASE_PATH, INDEX_PATTERNS } from './constants'; export const registerHelpers = ({ supertest }) => { - const getAllTemplates = () => supertest.get(`${API_BASE_PATH}/index-templates`); + const getAllTemplates = () => supertest.get(`${API_BASE_PATH}/index_templates`); const getOneTemplate = (name, isLegacy = true) => - supertest.get(`${API_BASE_PATH}/index-templates/${name}?legacy=${isLegacy}`); + supertest.get(`${API_BASE_PATH}/index_templates/${name}?legacy=${isLegacy}`); const getTemplatePayload = (name, isLegacy = true) => ({ name, @@ -50,17 +50,17 @@ export const registerHelpers = ({ supertest }) => { }); const createTemplate = (payload) => - supertest.post(`${API_BASE_PATH}/index-templates`).set('kbn-xsrf', 'xxx').send(payload); + supertest.post(`${API_BASE_PATH}/index_templates`).set('kbn-xsrf', 'xxx').send(payload); const deleteTemplates = (templates) => supertest - .post(`${API_BASE_PATH}/delete-index-templates`) + .post(`${API_BASE_PATH}/delete_index_templates`) .set('kbn-xsrf', 'xxx') .send({ templates }); const updateTemplate = (payload, templateName) => supertest - .put(`${API_BASE_PATH}/index-templates/${templateName}`) + .put(`${API_BASE_PATH}/index_templates/${templateName}`) .set('kbn-xsrf', 'xxx') .send(payload); From 41af3962595a184dc5b0d16383f65a6df107b196 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 9 Jun 2020 06:38:32 -0700 Subject: [PATCH 46/65] Enable Watcher by default to fix bug in which Watcher doesn't render in the side nav (#68602) --- x-pack/plugins/watcher/public/plugin.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/watcher/public/plugin.ts b/x-pack/plugins/watcher/public/plugin.ts index 80f8503af67ce..3d907ac0dff3a 100644 --- a/x-pack/plugins/watcher/public/plugin.ts +++ b/x-pack/plugins/watcher/public/plugin.ts @@ -64,8 +64,6 @@ export class WatcherUIPlugin implements Plugin { }, }); - watcherESApp.disable(); - // TODO: Fix the below dependency on `home` plugin inner workings // Because the home feature catalogue does not have enable/disable functionality we pass // the config in but keep a reference for enabling and disabling showing on home based on @@ -85,9 +83,16 @@ export class WatcherUIPlugin implements Plugin { home.featureCatalogue.register(watcherHome); licensing.license$.pipe(first(), map(licenseToLicenseStatus)).subscribe(({ valid }) => { + // NOTE: We enable the plugin by default instead of disabling it by default because this + // creates a race condition that can cause the app nav item to not render in the side nav. + // The race condition still exists, but it will result in the item rendering when it shouldn't + // (e.g. on a license it's not available for), instead of *not* rendering when it *should*, + // which is a less frustrating UX. if (valid) { watcherESApp.enable(); watcherHome.showOnHomePage = true; + } else { + watcherESApp.disable(); } }); } From bc6aadd0fa5591910813b135d3c24a4424ce35bc Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 9 Jun 2020 06:42:12 -0700 Subject: [PATCH 47/65] [Ingest Manager] Update queries from `stream.*` to `dataset.*` (#68322) Resolves #67672 Part of https://github.com/elastic/package-registry/issues/491 See https://github.com/elastic/package-registry/pull/492 for package registry changes. Updates existing queries to use `dataset.*` fields. from `stream.*` fields. I looked at the EPM code paths for asset installation, and did not find anything that would need to be changed based on the above package registry changes. We don't hardcode anything specific for field names. The package information (i.e. [nginx package info](https://epr.elastic.co/package/nginx/0.1.2/)) is not affected by the current package registry changes. --- .../server/routes/data_streams/handlers.ts | 10 +++++----- .../services/epm/elasticsearch/template/template.ts | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts index e4c860713a6f1..2c65b08a68700 100644 --- a/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts @@ -31,12 +31,12 @@ export const getListHandler: RequestHandler = async (context, request, response) must: [ { exists: { - field: 'stream.namespace', + field: 'dataset.namespace', }, }, { exists: { - field: 'stream.dataset', + field: 'dataset.name', }, }, ], @@ -54,19 +54,19 @@ export const getListHandler: RequestHandler = async (context, request, response) aggs: { dataset: { terms: { - field: 'stream.dataset', + field: 'dataset.name', size: 1, }, }, namespace: { terms: { - field: 'stream.namespace', + field: 'dataset.namespace', size: 1, }, }, type: { terms: { - field: 'stream.type', + field: 'dataset.type', size: 1, }, }, diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts index 85d4a85e245c2..ef3542b7ecffd 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts @@ -388,12 +388,12 @@ const getIndexQuery = (templateName: string) => ({ must: [ { exists: { - field: 'stream.namespace', + field: 'dataset.namespace', }, }, { exists: { - field: 'stream.dataset', + field: 'dataset.name', }, }, ], From f6e93a19d3d8d1d94e28991961e3e67eade1575b Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Tue, 9 Jun 2020 07:00:31 -0700 Subject: [PATCH 48/65] Fixed pre-configured docs link points to the wrong page and functional tests configs (#68606) * Fixed pre-configured docs link points to the wrong page and functional tests configs * Fixed doc link --- .../alerting/action-types/pre-configured-connectors.asciidoc | 2 +- .../sections/action_connector_form/connector_edit_flyout.tsx | 2 +- x-pack/test/alerting_api_integration/common/config.ts | 2 +- x-pack/test/functional_with_es_ssl/config.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc index b3e401256f27b..e41bd0939495d 100644 --- a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc +++ b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc @@ -28,7 +28,7 @@ two out-of-the box connectors: <> and < actionTypeId: .slack <2> name: 'Slack #xyz' <3> - config: <4> + secrets: <4> webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' webhook-service: actionTypeId: .webhook diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx index 24dead473fb61..cbbbbfaea7ea3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/connector_edit_flyout.tsx @@ -197,7 +197,7 @@ export const ConnectorEditFlyout = ({ )} Date: Tue, 9 Jun 2020 16:13:01 +0200 Subject: [PATCH 49/65] [ML] Transforms: Support sub-aggregations (#68306) * [ML] WIP UI support for the sug-aggs * [ML] extract sug-aggs from es config * [ML] fix for range filter * [ML] delete sub-aggregation * [ML] isConfigInvalid * [ML] fix actions, support parent agg * [ML] update getAggConfigFromEsAgg * [ML] unit tests * [ML] SubAggsSection * [ML] fix snapshot, add validation * [ML] fix label capping * [ML] rename Filter query label * [ML] fix updateSubAggregation validation * [ML] fix state update warning * [ML] increase MAX_NESTING_SUB_AGGS * [ML] functional tests for sub-aggregations * [ML] change the tooltip message * [ML] update functional tests * [ML] fix typo --- .../public/app/common/pivot_aggs.test.ts | 25 ++ .../transform/public/app/common/pivot_aggs.ts | 44 ++- .../public/app/hooks/use_pivot_data.ts | 23 +- .../aggregation_dropdown/dropdown.tsx | 3 + .../agg_label_form.test.tsx.snap | 124 +++--- .../__snapshots__/list_form.test.tsx.snap | 2 +- .../aggregation_list/agg_label_form.tsx | 122 +++--- .../components/aggregation_list/list_form.tsx | 2 +- .../aggregation_list/sub_aggs_section.tsx | 95 +++++ .../pivot_configuration.tsx | 32 +- .../components/filter_agg_form.test.tsx | 2 +- .../filter_agg/components/filter_agg_form.tsx | 2 +- .../components/filter_range_form.tsx | 6 +- .../components/filter_term_form.tsx | 11 +- .../step_define/common/filter_agg/config.ts | 1 + .../step_define/hooks/use_pivot_config.ts | 353 +++++++++++++----- .../step_define/hooks/use_step_define_form.ts | 2 +- .../apps/transform/creation_index_pattern.ts | 62 ++- .../functional/services/transform/wizard.ts | 47 ++- 19 files changed, 700 insertions(+), 258 deletions(-) create mode 100644 x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/sub_aggs_section.tsx diff --git a/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts b/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts index ab00211313d62..9e748068742f3 100644 --- a/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts +++ b/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts @@ -44,4 +44,29 @@ describe('getAggConfigFromEsAgg', () => { }, }); }); + + test('should resolve sub-aggregations', () => { + const esConfig = { + filter: { + term: { region: 'sa-west-1' }, + }, + aggs: { + test_avg: { + avg: { + field: 'test_field', + }, + }, + }, + }; + + const result = getAggConfigFromEsAgg(esConfig, 'test_3'); + + expect(result.subAggs!.test_avg).toEqual({ + agg: 'avg', + aggName: 'test_avg', + dropDownName: 'test_avg', + field: 'test_field', + parentAgg: result, + }); + }); }); diff --git a/x-pack/plugins/transform/public/app/common/pivot_aggs.ts b/x-pack/plugins/transform/public/app/common/pivot_aggs.ts index d6b3fb974783d..54dfd9ecda7b1 100644 --- a/x-pack/plugins/transform/public/app/common/pivot_aggs.ts +++ b/x-pack/plugins/transform/public/app/common/pivot_aggs.ts @@ -79,17 +79,32 @@ export type PivotAggDict = { [key in AggName]: PivotAgg; }; +/** + * The maximum level of sub-aggregations + */ +export const MAX_NESTING_SUB_AGGS = 10; + // The internal representation of an aggregation definition. export interface PivotAggsConfigBase { agg: PivotSupportedAggs; aggName: AggName; dropDownName: string; + /** Indicates if aggregation supports sub-aggregations */ + isSubAggsSupported?: boolean; + /** Dictionary of the sub-aggregations */ + subAggs?: PivotAggsConfigDict; + /** Reference to the parent aggregation */ + parentAgg?: PivotAggsConfig; } /** * Resolves agg UI config from provided ES agg definition */ -export function getAggConfigFromEsAgg(esAggDefinition: Record, aggName: string) { +export function getAggConfigFromEsAgg( + esAggDefinition: Record, + aggName: string, + parentRef?: PivotAggsConfig +) { const aggKeys = Object.keys(esAggDefinition); // Find the main aggregation key @@ -108,12 +123,21 @@ export function getAggConfigFromEsAgg(esAggDefinition: Record, aggN const config = getAggFormConfig(agg, commonConfig); + if (parentRef) { + config.parentAgg = parentRef; + } + if (isPivotAggsWithExtendedForm(config)) { config.setUiConfigFromEs(esAggDefinition[agg]); } if (aggKeys.includes('aggs')) { - // TODO process sub-aggregation + config.subAggs = {}; + for (const [subAggName, subAggConfigs] of Object.entries( + esAggDefinition.aggs as Record + )) { + config.subAggs[subAggName] = getAggConfigFromEsAgg(subAggConfigs, subAggName, config); + } } return config; @@ -199,6 +223,7 @@ export function getEsAggFromAggConfig( delete esAgg.agg; delete esAgg.aggName; delete esAgg.dropDownName; + delete esAgg.parentAgg; if (isPivotAggsWithExtendedForm(pivotAggsConfig)) { esAgg = pivotAggsConfig.getEsAggConfig(); @@ -208,7 +233,20 @@ export function getEsAggFromAggConfig( } } - return { + const result = { [pivotAggsConfig.agg]: esAgg, }; + + if ( + isPivotAggsConfigWithUiSupport(pivotAggsConfig) && + pivotAggsConfig.subAggs !== undefined && + Object.keys(pivotAggsConfig.subAggs).length > 0 + ) { + result.aggs = {}; + for (const subAggConfig of Object.values(pivotAggsConfig.subAggs)) { + result.aggs[subAggConfig.aggName] = getEsAggFromAggConfig(subAggConfig); + } + } + + return result; } diff --git a/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts index 6266defc01e16..13544b80ed1b2 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts @@ -31,12 +31,25 @@ import { PivotGroupByConfig, PivotQuery, PreviewMappings, + PivotAggsConfig, } from '../common'; import { SearchItems } from './use_search_items'; import { useApi } from './use_api'; import { isPivotAggsWithExtendedForm } from '../common/pivot_aggs'; +/** + * Checks if the aggregations collection is invalid. + */ +function isConfigInvalid(aggsArray: PivotAggsConfig[]): boolean { + return aggsArray.some((agg) => { + return ( + (isPivotAggsWithExtendedForm(agg) && !agg.isValid()) || + (agg.subAggs && isConfigInvalid(Object.values(agg.subAggs))) + ); + }); +} + function sortColumns(groupByArr: PivotGroupByConfig[]) { return (a: string, b: string) => { // make sure groupBy fields are always most left columns @@ -62,7 +75,7 @@ export const usePivotData = ( const [previewMappings, setPreviewMappings] = useState({ properties: {} }); const api = useApi(); - const aggsArr = dictionaryToArray(aggs); + const aggsArr = useMemo(() => dictionaryToArray(aggs), [aggs]); const groupByArr = dictionaryToArray(groupBy); // Filters mapping properties of type `object`, which get returned for nested field parents. @@ -136,11 +149,7 @@ export const usePivotData = ( return; } - const isConfigInvalid = aggsArr.some( - (agg) => isPivotAggsWithExtendedForm(agg) && !agg.isValid() - ); - - if (isConfigInvalid) { + if (isConfigInvalid(aggsArr)) { return; } @@ -185,7 +194,7 @@ export const usePivotData = ( /* eslint-disable react-hooks/exhaustive-deps */ }, [ indexPatternTitle, - JSON.stringify(aggsArr), + aggsArr, JSON.stringify(groupByArr), JSON.stringify(query), /* eslint-enable react-hooks/exhaustive-deps */ diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx index e5381f09713b5..c28588f727e97 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_dropdown/dropdown.tsx @@ -13,6 +13,7 @@ interface Props { placeholder?: string; changeHandler(d: EuiComboBoxOptionOption[]): void; testSubj?: string; + isDisabled?: boolean; } export const DropDown: React.FC = ({ @@ -20,6 +21,7 @@ export const DropDown: React.FC = ({ options, placeholder = 'Search ...', testSubj, + isDisabled, }) => { return ( = ({ onChange={changeHandler} isClearable={false} data-test-subj={testSubj} + isDisabled={isDisabled} /> ); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap index ed32fb3d6ad5f..10258f53aa25b 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/agg_label_form.test.tsx.snap @@ -1,70 +1,72 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Transform: Date histogram aggregation 1`] = ` - - + - - the-group-by-agg-name - - - - - } - closePopover={[Function]} - display="inlineBlock" - hasArrow={true} - id="transformFormPopover" - isOpen={false} - ownFocus={true} - panelPaddingSize="m" + + the-group-by-agg-name + + + - } - onChange={[Function]} - options={Object {}} - otherAggNames={Array []} + closePopover={[Function]} + display="inlineBlock" + hasArrow={true} + id="transformFormPopover" + isOpen={false} + ownFocus={true} + panelPaddingSize="m" + > + + + + + - - - - - - + + + `; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap index 3134af4c8b21d..89b54e6d0a22f 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/list_form.test.tsx.snap @@ -3,7 +3,7 @@ exports[`Transform: Minimal initialization 1`] = ` = ({ const helperText = isPivotAggsWithExtendedForm(item) && item.helperText && item.helperText(); + const isSubAggSupported = + isPivotAggsConfigWithUiSupport(item) && + item.isSubAggsSupported && + (isPivotAggsWithExtendedForm(item) ? item.isValid() : true); + return ( - - - - {item.aggName} - - - {helperText && ( - - - {helperText} - + <> + + + + {item.aggName} + - )} - - setPopoverVisibility(!isPopoverVisible)} - data-test-subj="transformAggregationEntryEditButton" + {helperText && ( + + + {helperText} + + + )} + + setPopoverVisibility(!isPopoverVisible)} + data-test-subj="transformAggregationEntryEditButton" + /> + } + isOpen={isPopoverVisible} + closePopover={() => setPopoverVisibility(false)} + > + - } - isOpen={isPopoverVisible} - closePopover={() => setPopoverVisibility(false)} - > - + + + deleteHandler(item.aggName)} + data-test-subj="transformAggregationEntryDeleteButton" /> - - - - deleteHandler(item.aggName)} - data-test-subj="transformAggregationEntryDeleteButton" - /> - - + + + + {isSubAggSupported && } + ); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx index cbcb6c668b58a..a02f4455250d7 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/list_form.tsx @@ -32,7 +32,7 @@ export const AggListForm: React.FC = ({ deleteHandler, list, onCha const otherAggNames = listKeys.filter((k) => k !== aggName); return ( - + = ({ item }) => { + const { state, actions } = useContext(PivotConfigurationContext)!; + + const addSubAggHandler = useCallback( + (d: EuiComboBoxOptionOption[]) => { + actions.addSubAggregation(item, d); + }, + [actions, item] + ); + + const updateSubAggHandler = useCallback( + (prevSubItemName: string, subItem: PivotAggsConfig) => { + actions.updateSubAggregation(prevSubItemName, subItem); + }, + [actions] + ); + + const deleteSubAggHandler = useCallback( + (subAggName: string) => { + actions.deleteSubAggregation(item, subAggName); + }, + [actions, item] + ); + + const isNewSubAggAllowed: boolean = useMemo(() => { + let nestingLevel = 1; + let parentItem = item.parentAgg; + while (parentItem !== undefined) { + nestingLevel++; + parentItem = parentItem.parentAgg; + } + return nestingLevel <= MAX_NESTING_SUB_AGGS; + }, [item]); + + const dropdown = ( + + ); + + return ( + <> + + {item.subAggs && ( + + )} + {isNewSubAggAllowed ? ( + dropdown + ) : ( + + } + > + {dropdown} + + )} + + ); +}; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx index 5de35a683a376..a3a2e7c4eadfa 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/pivot_configuration/pivot_configuration.tsx @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { isEqual } from 'lodash'; -import React, { memo, FC } from 'react'; +import React, { memo, FC, createContext } from 'react'; import { EuiFormRow } from '@elastic/eui'; @@ -16,20 +15,32 @@ import { DropDown } from '../aggregation_dropdown'; import { GroupByListForm } from '../group_by_list'; import { StepDefineFormHook } from '../step_define'; +export const PivotConfigurationContext = createContext< + StepDefineFormHook['pivotConfig'] | undefined +>(undefined); + export const PivotConfiguration: FC = memo( - ({ - actions: { + ({ actions, state }) => { + const { addAggregation, addGroupBy, deleteAggregation, deleteGroupBy, updateAggregation, updateGroupBy, - }, - state: { aggList, aggOptions, aggOptionsData, groupByList, groupByOptions, groupByOptionsData }, - }) => { + } = actions; + + const { + aggList, + aggOptions, + aggOptionsData, + groupByList, + groupByOptions, + groupByOptionsData, + } = state; + return ( - <> + = memo( /> - + ); - }, - (prevProps, nextProps) => { - return isEqual(prevProps.state, nextProps.state); } ); diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx index 7e23e799ae32e..35f9734a59482 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.test.tsx @@ -42,7 +42,7 @@ describe('FilterAggForm', () => { ); - expect(getByLabelText('Filter agg')).toBeInTheDocument(); + expect(getByLabelText('Filter query')).toBeInTheDocument(); const { options } = (await findByTestId('transformFilterAggTypeSelector')) as HTMLSelectElement; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx index 3e67a16e3c1ed..ac6e93d3ed5eb 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx @@ -62,7 +62,7 @@ export const FilterAggForm: PivotAggsConfigFilter['AggFormComponent'] = ({ label={ } > diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx index cfc6bb27c88a1..7f6c23dddb9fc 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_range_form.tsx @@ -60,7 +60,8 @@ export const FilterRangeForm: FilterAggConfigRange['aggTypeConfig']['FilterAggFo onChange={(e) => { updateConfig({ from: e.target.value === '' ? undefined : Number(e.target.value) }); }} - step={0.1} + // @ts-ignore + step="any" prepend={ { updateConfig({ to: e.target.value === '' ? undefined : Number(e.target.value) }); }} - step={0.1} + // @ts-ignore + step="any" append={ { // Simulate initial load. onSearchChange(''); + return () => { + // make sure the ongoing request is canceled + fetchOptions.cancel(); + }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -115,7 +117,6 @@ export const FilterTermForm: FilterAggConfigTerm['aggTypeConfig']['FilterAggForm value: undefined, }, }); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedField]); const selectedOptions = config?.value ? [{ label: config.value }] : undefined; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts index 8602a82db8f2f..d8b37b25f50d1 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts @@ -30,6 +30,7 @@ export function getFilterAggConfig( ): PivotAggsConfigFilter { return { ...commonConfig, + isSubAggsSupported: true, field: isPivotAggsConfigWithUiSupport(commonConfig) ? commonConfig.field : '', AggFormComponent: FilterAggForm, aggConfig: {}, diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts index 72bfbe369757b..d35d567fc8469 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_pivot_config.ts @@ -4,12 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { dictionaryToArray } from '../../../../../../../common/types/common'; import { useToastNotifications } from '../../../../../app_dependencies'; -import { AggName, DropDownLabel, PivotAggsConfig, PivotGroupByConfig } from '../../../../../common'; +import { + AggName, + DropDownLabel, + PivotAggsConfig, + PivotAggsConfigDict, + PivotGroupByConfig, +} from '../../../../../common'; import { getAggNameConflictToastMessages, @@ -18,136 +24,297 @@ import { } from '../common'; import { StepDefineFormProps } from '../step_define_form'; +/** + * Clones aggregation configuration and updates parent references + * for the sub-aggregations. + */ +function cloneAggItem(item: PivotAggsConfig, parentRef?: PivotAggsConfig) { + const newItem = { ...item }; + if (parentRef !== undefined) { + newItem.parentAgg = parentRef; + } + if (newItem.subAggs !== undefined) { + const newSubAggs: PivotAggsConfigDict = {}; + for (const [key, subItem] of Object.entries(newItem.subAggs)) { + newSubAggs[key] = cloneAggItem(subItem, newItem); + } + newItem.subAggs = newSubAggs; + } + return newItem; +} + +/** + * Returns a root aggregation configuration + * for provided aggregation item. + */ +function getRootAggregation(item: PivotAggsConfig) { + let rootItem = item; + while (rootItem.parentAgg !== undefined) { + rootItem = rootItem.parentAgg; + } + return rootItem; +} + export const usePivotConfig = ( defaults: StepDefineExposedState, indexPattern: StepDefineFormProps['searchItems']['indexPattern'] ) => { const toastNotifications = useToastNotifications(); - const { - aggOptions, - aggOptionsData, - groupByOptions, - groupByOptionsData, - } = getPivotDropdownOptions(indexPattern); + const { aggOptions, aggOptionsData, groupByOptions, groupByOptionsData } = useMemo( + () => getPivotDropdownOptions(indexPattern), + [indexPattern] + ); + // The list of selected aggregations + const [aggList, setAggList] = useState(defaults.aggList); // The list of selected group by fields const [groupByList, setGroupByList] = useState(defaults.groupByList); - const addGroupBy = (d: DropDownLabel[]) => { - const label: AggName = d[0].label; - const config: PivotGroupByConfig = groupByOptionsData[label]; - const aggName: AggName = config.aggName; + const addGroupBy = useCallback( + (d: DropDownLabel[]) => { + const label: AggName = d[0].label; + const config: PivotGroupByConfig = groupByOptionsData[label]; + const aggName: AggName = config.aggName; - const aggNameConflictMessages = getAggNameConflictToastMessages(aggName, aggList, groupByList); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + const aggNameConflictMessages = getAggNameConflictToastMessages( + aggName, + aggList, + groupByList + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } - groupByList[aggName] = config; - setGroupByList({ ...groupByList }); - }; - - const updateGroupBy = (previousAggName: AggName, item: PivotGroupByConfig) => { - const groupByListWithoutPrevious = { ...groupByList }; - delete groupByListWithoutPrevious[previousAggName]; - - const aggNameConflictMessages = getAggNameConflictToastMessages( - item.aggName, - aggList, - groupByListWithoutPrevious - ); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + groupByList[aggName] = config; + setGroupByList({ ...groupByList }); + }, + [aggList, groupByList, groupByOptionsData, toastNotifications] + ); - groupByListWithoutPrevious[item.aggName] = item; - setGroupByList(groupByListWithoutPrevious); - }; + const updateGroupBy = useCallback( + (previousAggName: AggName, item: PivotGroupByConfig) => { + const groupByListWithoutPrevious = { ...groupByList }; + delete groupByListWithoutPrevious[previousAggName]; - const deleteGroupBy = (aggName: AggName) => { - delete groupByList[aggName]; - setGroupByList({ ...groupByList }); - }; + const aggNameConflictMessages = getAggNameConflictToastMessages( + item.aggName, + aggList, + groupByListWithoutPrevious + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } - // The list of selected aggregations - const [aggList, setAggList] = useState(defaults.aggList); + groupByListWithoutPrevious[item.aggName] = item; + setGroupByList(groupByListWithoutPrevious); + }, + [aggList, groupByList, toastNotifications] + ); + + const deleteGroupBy = useCallback( + (aggName: AggName) => { + delete groupByList[aggName]; + setGroupByList({ ...groupByList }); + }, + [groupByList] + ); /** * Adds an aggregation to the list. */ - const addAggregation = (d: DropDownLabel[]) => { - const label: AggName = d[0].label; - const config: PivotAggsConfig = aggOptionsData[label]; - const aggName: AggName = config.aggName; - - const aggNameConflictMessages = getAggNameConflictToastMessages(aggName, aggList, groupByList); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + const addAggregation = useCallback( + (d: DropDownLabel[]) => { + const label: AggName = d[0].label; + const config: PivotAggsConfig = aggOptionsData[label]; + const aggName: AggName = config.aggName; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + aggName, + aggList, + groupByList + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } - aggList[aggName] = config; - setAggList({ ...aggList }); - }; + aggList[aggName] = config; + setAggList({ ...aggList }); + }, + [aggList, aggOptionsData, groupByList, toastNotifications] + ); /** * Adds updated aggregation to the list */ - const updateAggregation = (previousAggName: AggName, item: PivotAggsConfig) => { - const aggListWithoutPrevious = { ...aggList }; - delete aggListWithoutPrevious[previousAggName]; - - const aggNameConflictMessages = getAggNameConflictToastMessages( - item.aggName, - aggListWithoutPrevious, - groupByList - ); - if (aggNameConflictMessages.length > 0) { - aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); - return; - } + const updateAggregation = useCallback( + (previousAggName: AggName, item: PivotAggsConfig) => { + const aggListWithoutPrevious = { ...aggList }; + delete aggListWithoutPrevious[previousAggName]; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + item.aggName, + aggListWithoutPrevious, + groupByList + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } + aggListWithoutPrevious[item.aggName] = item; + setAggList(aggListWithoutPrevious); + }, + [aggList, groupByList, toastNotifications] + ); - aggListWithoutPrevious[item.aggName] = item; - setAggList(aggListWithoutPrevious); - }; + /** + * Adds sub-aggregation to the aggregation item + */ + const addSubAggregation = useCallback( + (item: PivotAggsConfig, d: DropDownLabel[]) => { + if (!item.isSubAggsSupported) { + throw new Error(`Aggregation "${item.agg}" does not support sub-aggregations`); + } + const label: AggName = d[0].label; + const config: PivotAggsConfig = aggOptionsData[label]; + + item.subAggs = item.subAggs ?? {}; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + config.aggName, + item.subAggs, + {} + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } + + item.subAggs[config.aggName] = config; + + const newRootItem = cloneAggItem(getRootAggregation(item)); + updateAggregation(newRootItem.aggName, newRootItem); + }, + [aggOptionsData, toastNotifications, updateAggregation] + ); + + /** + * Updates sub-aggregation of the aggregation item + */ + const updateSubAggregation = useCallback( + (prevSubItemName: AggName, subItem: PivotAggsConfig) => { + const parent = subItem.parentAgg; + if (!parent || !parent.subAggs) { + throw new Error('No parent aggregation reference found'); + } + + const { [prevSubItemName]: deleted, ...newSubAgg } = parent.subAggs; + + const aggNameConflictMessages = getAggNameConflictToastMessages( + subItem.aggName, + newSubAgg, + {} + ); + if (aggNameConflictMessages.length > 0) { + aggNameConflictMessages.forEach((m) => toastNotifications.addDanger(m)); + return; + } + + parent.subAggs = { + ...newSubAgg, + [subItem.aggName]: subItem, + }; + const newRootItem = cloneAggItem(getRootAggregation(subItem)); + updateAggregation(newRootItem.aggName, newRootItem); + }, + [toastNotifications, updateAggregation] + ); + + /** + * Deletes sub-aggregation of the aggregation item + */ + const deleteSubAggregation = useCallback( + (item: PivotAggsConfig, subAggName: string) => { + if (!item.subAggs || !item.subAggs[subAggName]) { + throw new Error('Unable to delete a sub-agg'); + } + delete item.subAggs[subAggName]; + const newRootItem = cloneAggItem(getRootAggregation(item)); + updateAggregation(newRootItem.aggName, newRootItem); + }, + [updateAggregation] + ); /** * Deletes aggregation from the list */ - const deleteAggregation = (aggName: AggName) => { - delete aggList[aggName]; - setAggList({ ...aggList }); - }; + const deleteAggregation = useCallback( + (aggName: AggName) => { + delete aggList[aggName]; + setAggList({ ...aggList }); + }, + [aggList] + ); - const pivotAggsArr = dictionaryToArray(aggList); - const pivotGroupByArr = dictionaryToArray(groupByList); + const pivotAggsArr = useMemo(() => dictionaryToArray(aggList), [aggList]); + const pivotGroupByArr = useMemo(() => dictionaryToArray(groupByList), [groupByList]); const valid = pivotGroupByArr.length > 0 && pivotAggsArr.length > 0; - return { - actions: { + const actions = useMemo(() => { + return { addAggregation, addGroupBy, + addSubAggregation, + updateSubAggregation, + deleteSubAggregation, deleteAggregation, deleteGroupBy, setAggList, setGroupByList, updateAggregation, updateGroupBy, - }, - state: { - aggList, - aggOptions, - aggOptionsData, - groupByList, - groupByOptions, - groupByOptionsData, - pivotAggsArr, - pivotGroupByArr, - valid, - }, - }; + }; + }, [ + addAggregation, + addGroupBy, + addSubAggregation, + deleteAggregation, + deleteGroupBy, + deleteSubAggregation, + updateAggregation, + updateGroupBy, + updateSubAggregation, + ]); + + return useMemo(() => { + return { + actions, + state: { + aggList, + aggOptions, + aggOptionsData, + groupByList, + groupByOptions, + groupByOptionsData, + pivotAggsArr, + pivotGroupByArr, + valid, + }, + }; + }, [ + actions, + aggList, + aggOptions, + aggOptionsData, + groupByList, + groupByOptions, + groupByOptionsData, + pivotAggsArr, + pivotGroupByArr, + valid, + ]); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts index fc47a9e3d3477..f5980ae2243d3 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts @@ -73,7 +73,7 @@ export const useStepDefineForm = ({ overrides, onChange, searchItems }: StepDefi }, [ JSON.stringify(advancedPivotEditor.state), JSON.stringify(advancedSourceEditor.state), - JSON.stringify(pivotConfig.state), + pivotConfig.state, JSON.stringify(searchBar.state), /* eslint-enable react-hooks/exhaustive-deps */ ]); diff --git a/x-pack/test/functional/apps/transform/creation_index_pattern.ts b/x-pack/test/functional/apps/transform/creation_index_pattern.ts index a72f1691af647..d6dbcde436dcc 100644 --- a/x-pack/test/functional/apps/transform/creation_index_pattern.ts +++ b/x-pack/test/functional/apps/transform/creation_index_pattern.ts @@ -57,6 +57,26 @@ export default function ({ getService }: FtrProviderContext) { transformFilterAggTypeSelector: 'term', transformFilterTermValueSelector: 'New York', }, + subAggs: [ + { + identifier: 'max(products.base_price)', + label: 'products.base_price.max', + }, + { + identifier: 'filter(customer_gender)', + label: 'customer_gender.filter', + form: { + transformFilterAggTypeSelector: 'term', + transformFilterTermValueSelector: 'FEMALE', + }, + subAggs: [ + { + identifier: 'avg(taxful_total_price)', + label: 'taxful_total_price.avg', + }, + ], + }, + ], }, ], transformId: `ec_1_${Date.now()}`, @@ -87,12 +107,33 @@ export default function ({ getService }: FtrProviderContext) { field: 'products.base_price', }, }, - 'geoip.city_name.filter': { + 'New York': { filter: { term: { 'geoip.city_name': 'New York', }, }, + aggs: { + 'products.base_price.max': { + max: { + field: 'products.base_price', + }, + }, + FEMALE: { + filter: { + term: { + customer_gender: 'FEMALE', + }, + }, + aggs: { + 'taxful_total_price.avg': { + avg: { + field: 'taxful_total_price', + }, + }, + }, + }, + }, }, }, }, @@ -131,6 +172,12 @@ export default function ({ getService }: FtrProviderContext) { form: { transformFilterAggTypeSelector: 'exists', }, + subAggs: [ + { + identifier: 'max(products.discount_amount)', + label: 'products.discount_amount.max', + }, + ], }, ], transformId: `ec_2_${Date.now()}`, @@ -162,6 +209,13 @@ export default function ({ getService }: FtrProviderContext) { field: 'customer_phone', }, }, + aggs: { + 'products.discount_amount.max': { + max: { + field: 'products.discount_amount', + }, + }, + }, }, }, }, @@ -249,11 +303,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('adds the aggregation entries', async () => { - for (const [index, agg] of testData.aggregationEntries.entries()) { - await transform.wizard.assertAggregationInputExists(); - await transform.wizard.assertAggregationInputValue([]); - await transform.wizard.addAggregationEntry(index, agg.identifier, agg.label, agg.form); - } + await transform.wizard.addAggregationEntries(testData.aggregationEntries); }); it('displays the advanced pivot editor switch', async () => { diff --git a/x-pack/test/functional/services/transform/wizard.ts b/x-pack/test/functional/services/transform/wizard.ts index 03c8b2867b240..8b61e8c895e30 100644 --- a/x-pack/test/functional/services/transform/wizard.ts +++ b/x-pack/test/functional/services/transform/wizard.ts @@ -242,14 +242,20 @@ export function TransformWizardProvider({ getService }: FtrProviderContext) { await this.assertGroupByEntryExists(index, expectedLabel, expectedIntervalLabel); }, - async assertAggregationInputExists() { - await testSubjects.existOrFail('transformAggregationSelection > comboBoxInput'); + getAggComboBoxInputSelector(parentSelector = ''): string { + return `${parentSelector && `${parentSelector} > `}${ + parentSelector ? 'transformSubAggregationSelection' : 'transformAggregationSelection' + } > comboBoxInput`; }, - async assertAggregationInputValue(expectedIdentifier: string[]) { + async assertAggregationInputExists(parentSelector?: string) { + await testSubjects.existOrFail(this.getAggComboBoxInputSelector(parentSelector)); + }, + + async assertAggregationInputValue(expectedIdentifier: string[], parentSelector?: string) { await retry.tryForTime(2000, async () => { const comboBoxSelectedOptions = await comboBox.getComboBoxSelectedOptions( - 'transformAggregationSelection > comboBoxInput' + this.getAggComboBoxInputSelector(parentSelector) ); expect(comboBoxSelectedOptions).to.eql( expectedIdentifier, @@ -258,11 +264,14 @@ export function TransformWizardProvider({ getService }: FtrProviderContext) { }); }, - async assertAggregationEntryExists(index: number, expectedLabel: string) { - await testSubjects.existOrFail(`transformAggregationEntry ${index}`); + async assertAggregationEntryExists(index: number, expectedLabel: string, parentSelector = '') { + const aggEntryPanelSelector = `${ + parentSelector && `${parentSelector} > ` + }transformAggregationEntry_${index}`; + await testSubjects.existOrFail(aggEntryPanelSelector); const actualLabel = await testSubjects.getVisibleText( - `transformAggregationEntry ${index} > transformAggregationEntryLabel` + `${aggEntryPanelSelector} > transformAggregationEntryLabel` ); expect(actualLabel).to.eql( expectedLabel, @@ -270,15 +279,31 @@ export function TransformWizardProvider({ getService }: FtrProviderContext) { ); }, + async addAggregationEntries(aggregationEntries: any[], parentSelector?: string) { + for (const [index, agg] of aggregationEntries.entries()) { + await this.assertAggregationInputExists(parentSelector); + await this.assertAggregationInputValue([], parentSelector); + await this.addAggregationEntry(index, agg.identifier, agg.label, agg.form, parentSelector); + + if (agg.subAggs) { + await this.addAggregationEntries( + agg.subAggs, + `${parentSelector ? `${parentSelector} > ` : ''}transformAggregationEntry_${index}` + ); + } + } + }, + async addAggregationEntry( index: number, identifier: string, expectedLabel: string, - formData?: Record + formData?: Record, + parentSelector = '' ) { - await comboBox.set('transformAggregationSelection > comboBoxInput', identifier); - await this.assertAggregationInputValue([]); - await this.assertAggregationEntryExists(index, expectedLabel); + await comboBox.set(this.getAggComboBoxInputSelector(parentSelector), identifier); + await this.assertAggregationInputValue([], parentSelector); + await this.assertAggregationEntryExists(index, expectedLabel, parentSelector); if (formData !== undefined) { await this.fillPopoverForm(identifier, expectedLabel, formData); From 6bb9e3fcf972e749bd2a30451fd829c4982a489b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Tue, 9 Jun 2020 15:56:54 +0100 Subject: [PATCH 50/65] [Telemetry] telemetry.sendUsageFrom: "server" by default (#68071) Co-authored-by: Elastic Machine --- docs/settings/telemetry-settings.asciidoc | 2 +- src/plugins/telemetry/server/config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/settings/telemetry-settings.asciidoc b/docs/settings/telemetry-settings.asciidoc index a5f5d1c44ffac..89c018a86eca6 100644 --- a/docs/settings/telemetry-settings.asciidoc +++ b/docs/settings/telemetry-settings.asciidoc @@ -29,7 +29,7 @@ See our https://www.elastic.co/legal/privacy-statement[Privacy Statement] to lea | Set to `'server'` to report the cluster statistics from the {kib} server. If the server fails to connect to our endpoint at https://telemetry.elastic.co/, it assumes it is behind a firewall and falls back to `'browser'` to send it from users' browsers - when they are navigating through {kib}. Defaults to 'browser'. + when they are navigating through {kib}. Defaults to `'server'`. | `telemetry.optIn` | Set to `true` to automatically opt into reporting cluster statistics. You can also opt out through diff --git a/src/plugins/telemetry/server/config.ts b/src/plugins/telemetry/server/config.ts index 99dde0c3b3d96..ae9b70bb9f367 100644 --- a/src/plugins/telemetry/server/config.ts +++ b/src/plugins/telemetry/server/config.ts @@ -56,7 +56,7 @@ export const configSchema = schema.object({ }) ), sendUsageFrom: schema.oneOf([schema.literal('server'), schema.literal('browser')], { - defaultValue: 'browser', + defaultValue: 'server', }), }); From 4a387727648e462082e8a998664cc3cbacb0fc69 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Tue, 9 Jun 2020 08:23:58 -0700 Subject: [PATCH 51/65] [DOCS] Adds documentation for drilldowns (#68122) * [DOCS] Adds documentation for drilldowns * [DOCS] Incorporates review comments * [DOCS] Fixes to text * Updated gif sans nav bars * [DOCS] Adds image of drilldowns and other tweaks to text Co-authored-by: KOTungseth --- docs/drilldowns/drilldowns.asciidoc | 108 ++++++++++++++++++ docs/drilldowns/images/drilldown_create.png | Bin 0 -> 87682 bytes docs/drilldowns/images/drilldown_menu.png | Bin 0 -> 53455 bytes docs/drilldowns/images/drilldown_on_panel.png | Bin 0 -> 41533 bytes .../images/drilldown_on_piechart.gif | Bin 0 -> 876715 bytes docs/user/dashboard.asciidoc | 2 + 6 files changed, 110 insertions(+) create mode 100644 docs/drilldowns/drilldowns.asciidoc create mode 100644 docs/drilldowns/images/drilldown_create.png create mode 100644 docs/drilldowns/images/drilldown_menu.png create mode 100644 docs/drilldowns/images/drilldown_on_panel.png create mode 100644 docs/drilldowns/images/drilldown_on_piechart.gif diff --git a/docs/drilldowns/drilldowns.asciidoc b/docs/drilldowns/drilldowns.asciidoc new file mode 100644 index 0000000000000..2687441c99340 --- /dev/null +++ b/docs/drilldowns/drilldowns.asciidoc @@ -0,0 +1,108 @@ +[[drilldowns]] +== Use drilldowns for dashboard actions + +Drilldowns, also known as custom actions, allow you to configure a +workflow for analyzing and troubleshooting your data. +Using a drilldown, you can navigate from one dashboard to another, +taking the current time range, filters, and other parameters with you, +so the context remains the same. You can continue your analysis from a new perspective. + +For example, you might have a dashboard that shows the overall status of multiple data centers. +You can create a drilldown that navigates from this dashboard to a dashboard +that shows a single data center or server. + +[float] +[[how-drilldowns-work]] +=== How drilldowns work + +Drilldowns are {kib} actions that you configure and store +in the dashboard saved object. Drilldowns are specific to the dashboard panel +for which you create them—they are not shared across panels. +A panel can have multiple drilldowns. + +This example shows a dashboard panel that contains a pie chart. +Typically, clicking a pie slice applies the current filter. +When a panel has a drilldown, clicking a pie slice opens a menu with +the default action and your drilldowns. Refer to the <> +for instructions on how to create this drilldown. + +[role="screenshot"] +image::images/drilldown_on_piechart.gif[Drilldown on pie chart that navigates to another dashboard] + +Third-party developers can create drilldowns. +Refer to https://github.com/elastic/kibana/tree/master/x-pack/examples/ui_actions_enhanced_examples[this example plugin] +to learn how to code drilldowns. + +[float] +[[create-manage-drilldowns]] +=== Create and manage drilldowns + +Your dashboard must be in *Edit* mode to create a drilldown. +Once a panel has at least one drilldown, the menu also includes a *Manage drilldowns* action +for editing and deleting drilldowns. + +[role="screenshot"] +image::images/drilldown_menu.png[Panel menu with Create drilldown and Manage drilldown actions] + +[float] +[[drilldowns-example]] +=== Try it: Create a drilldown + +This example shows how to create the *Host Overview* drilldown shown earlier in this doc. + +[float] +==== Set up the dashboards + +. Add the <> data set. + +. Create a new dashboard, called `Host Overview`, and include these visualizations +from the sample data set: ++ +[%hardbreaks] +*[Logs] Heatmap* +*[Logs] Visitors by OS* +*[Logs] Host, Visits, and Bytes Table* +*[Logs] Total Requests and Bytes* ++ +TIP: If you don’t see data for a panel, try changing the time range. + +. Open the *[Logs] Web traffic* dashboard. + +. Set a search and filter. ++ +[%hardbreaks] +Search: `extension.keyword:( “gz” or “css” or “deb”)` +Filter: `geo.src : CN` + +[float] +==== Create the drilldown + + +. In the dashboard menu bar, click *Edit*. + +. In *[Logs] Visitors by OS*, open the panel menu, and then select *Create drilldown*. + +. Give the drilldown a name. + +. Select *Host Overview* as the destination dashboard. + +. Keep both filters enabled so that the drilldown carries over the global filters and date range. ++ +Your input should look similar to this: ++ +[role="screenshot"] +image::images/drilldown_create.png[Create drilldown with entries for drilldown name and destination] + +. Click *Create drilldown.* + +. Save the dashboard. ++ +If you don’t save the drilldown, and then navigate away, the drilldown is lost. + +. In *[Logs] Visitors by OS*, click the `win 8` slice of the pie, and then select the name of your drilldown. ++ +[role="screenshot"] +image::images/drilldown_on_panel.png[Drilldown on pie chart that navigates to another dashboard] ++ +You are navigated to your destination dashboard. Verify that the search query, filters, +and time range are carried over. diff --git a/docs/drilldowns/images/drilldown_create.png b/docs/drilldowns/images/drilldown_create.png new file mode 100644 index 0000000000000000000000000000000000000000..1573a3dfb4f4f50acfb1b61e839081ddce76b68c GIT binary patch literal 87682 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 literal 0 HcmV?d00001 diff --git a/docs/drilldowns/images/drilldown_menu.png b/docs/drilldowns/images/drilldown_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..28e0d995f840d493d86cef60f2dd81ec6bd87833 GIT binary patch literal 53455 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

iUASMN+pMcTs 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 NQIu7asg`;j^gkXFrB(m{ literal 0 HcmV?d00001 diff --git a/docs/drilldowns/images/drilldown_on_piechart.gif b/docs/drilldowns/images/drilldown_on_piechart.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9b3311df03250b52220806b4c06ac516f1eae05 GIT binary patch literal 876715 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%0Ant24CEdj6eGvI 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%0AamPW#D zAO$a!DqcC;3zboJkf<8s98{Ob#L(_oYV;!7efF0?aRAf0J@17saOq#1<)f}~-7k%J zjAoAlh)Usm3>(M_msrMp)xk`w0+V`;I-+onetrk|GA5^+5KVnEfgC;@FO*DwkCw3` zMCVtuopOT8eRQKWP);)Y!ozsXghypZ7nyi$In4fO)8Rm0pNV)(c9`e{C3Diuw#xr# z!tFKg;aY!v*Qz)g5*XYYGF#r=pI)VhmM9&gO{}C_-^@&7rW6A?rP}2V@ZZKsBaT8i zNJDgRYUjtqVa7tYbQ3}AJwEFNV| zR?_D4{26U%1^gsA##ME$<~e|Bw6Oa|bMGdVC7KrDIZyHXD1K$u{lG@?9$RDwpAKPAyjKDra;Sep|Ow@Lj ziO&NuN1MAT=erY!ez;Q(-NtffyXaJ!80+bzm-lcvH>o^5Ndm5bpWL&ZUq@5FH;xn1 z5Q2x{0fuZjR5s-|xhlTR|0^%Ps=iC)q_)YVhf=2L!Z`Tp|B6>oirmk+qpR41! zQTvwh6OJoB7?yO+YA6$s-_71&C1Z0Qqt9>sXw;q+aseVr}-QRtDJ zx-sV%@K)3@iQekKcx9qe)&OAWXZ?2kO?(A?-UQ183FQ&V zT?!m`@gzjjYieA@gp&T;e*1`@7@Jdc+Zj)aN{xMD8+}9~U_`_V=w;IBC$0z^h}+a~ zzg~9{ixo>LdKf{yR$ic_W4)ctR6ZF3b?5wJcY3=ZM0XYZN1KqFj_0!`oqKJu`ue7R zEvLKc^scb2IR+tF(Nbkz>PSj5v0`j6ae1bgVfpg zC9z$}2kdt=a>gYuqXpUsY&@~%XV3iDr$1<$>6%WtKP*+~mDXuveps6D5v^Io7xj4m zD3kSu&dIWU)mG}kO1cD)FBtTxFLz55C7mMgl_dhoc*&G;?m5*p_WUdHt^Ce(#jQBR zez^2N&7m{3wD|BxALJ{6k9#8!2xhe;KJ{dkT;lOK=YMi~WP@*L#{KhPs~SN(4#d}RhOIoF(0*t`CYV~Zod$G5q;FyIcx3*F*^mg})Z20c<0+Xy?2aum9%{u7FD_l^x%)SHIZ7adq;y8T#fUV!%Z^f(XKrwkQi~oo{1l`^u#4oG7fLYl%Qsn7u7HTjNXZ>_^K460?~Od$OBPi$uRS3Q8~(8Eq5kepKcM|rLd3X!iszk84<>KF~B2mK>dRU zbdc*k>&|B`&ALmmtr6TeEn~P-`l*Ii_?SbQpMKbFZ^a0FG6hU2b5RUW1@eC& zf?e(mwb%#eNrXKEjND*`N_bA3cG|B$@~SCs=r-jI*3RaDdTDcqdjf7;nc|u%Byhg)!7nmBT@8!-C& z!jN&T<;t5|3maApD%es}*LNQt6#-$&SsR2|xlELomKvdVYbjXd*TZtPEm)2=bHcMX z?zFKte=SSQ9>wHE?{ga+_1u|l!H3fGV;FqKe+SI;3Y8dOxA3+#*-EIb4|n6q*KLsF zW?+oazFdI-PEbf6%olJgTYz7{KQLPyafHtRG*V#m+XfWprLU5rBS$hAtB3a`2}vGZ z`ao15x!{*{Tglob6(I;@?KYintUQR6-mS;6Mi_SU;(2tejb0fBro~qkjR!Vm7AUyG zP9oD|0c?F?k^A@O>PjS1ZTVYU@ehQ1U3w%V)#JRTwIM;p$7pIIHc(Eeiuo(no=D|L z%+eBO$f-))q9N|!M{TOmV}C8Wlh^_br&4u_z2HHb@Me2{)s9m}C*XuQ~I)oN5e(0THp3XFRe3r`!gn)yN85tKpdzfD~w^;2EXtvpFiV_z6xV@Nd>I@p zN1^c>*y^q+!I~oMc;k`T8^>|WeV;0NX`&ROss6>JENk3U3A;lyV{16rVfx2F*|4RE zyTo~>$yEDWO@6ctXsnlv*SwMRHd;wtyte33<#X&R2On61k3S4Ac14PC_cH9O^Un7D z=$~SJ`eV2QayLrAPRBMRB2AsS45EbSy`sq8)W_i&>PLC1v@t-)mOzVE`V^VyYSijr zSrOafjai{@?Yu|%aG7&iw5+(TQA5$-I~U3MXPJ>8No69XZb#yyozE}spr1a+%t-Fg z+!qB^!8GUfzdRRWL&jpFTOLlN@v@HFlk{rQ<(?xE2@14pvx(MMH(8&x{`q^cEgWP)FT;KuhX{ zn)bOBi!hlH*g3<(im{I(AGq2+Oc4^2rCyQ5u#ZMWxP60D>v)x{Z2^PbviX~meO;N@ zJR{KKO*k*SyA=iUd_<;U++F$)H>VP94Q+7p?LE$KLN`H8HaF<|U>2*?PAYErZf_wj z_Zh9*fa@-0io^!I$|l?SGVizrLv5Q`}42h+5*~IX9gcmL1hnL$Vf~uUFJ7 z1n^yNin(FL&-Px2-^V5CmHed7D$LkezzVavCE7-i{~BS}7nxj*pcVdl{1vD3Lp~!h z&~_cXz%Z%Qa)sa2yE0v07~p}rCOU$J{^SMzQFhJvHxT;r@4`p3%Xd%yY76n5#NNL; z(-{0E>~yRWzcayf+-mx9^Yc5L(SreGw|f?`L`rEC)i++3mfVX!cLM47zUJ{;Q$Ue$ZG9+j zDtv8CgKu>}OHMh?U#R%(1^MN`%+|oz*@2cw+OmrBnj3e&3ao_xp9|%k=kdjbt{pCW z8SI}lpo>dA@DF&(BoyBvmv|dJHw_hkp#Yq+6b=%Uy@T7~Hv=^axOA+&mO?30jEm|J zrQ%W2Z_)3t0On|lN-jG zM3eCHm%W+F6|Va8cuq186wpKUgw(8LL-)_9W7XW;4LvE0)Y&vQDTgk`TbaM# zJz&??EQ8azxx@;a?9RKK2-#(>qblwot2`D69)aDP$SGlUIS(G?a&1I8dY|9m{A$zf zk1$`7v4en!Pep}~ru!|%_#fkFl}wB~C%~hj)FXiL?l%#tyNy56!4D^#GAOyqJ3pJb|k5r}zqFw1L04 zXjDaIl$?mtv+|n*-_YZCdrd1n>+J4xqSQ-R?uCE5KYb@cZZHz$$-uD{#ab1^>-7;{ z>89){q3SGeBJwEQ+;jJvme-5(z`J)Ii)i==y0r{Pm@Gz9!eV(n4OCWDB)>6fS#zYp zl9Mp8&xi{jkP9SzA(VIZ^hJ>!rVc*lkJ?I)p3b{1IJmKEBaO=4qKCCYW33@qqKAoI z$t5BT&@q*Z=xmefr>f5w%4U-^#d7Z2r&$B-gvUeHn2=B+SFoc5IG)pJ%41X**&*hy z3IHx{YOBYh!86in8&6anhu4B5?1mRIg=}xw7^jfn z6>NZOc`iSS#0~e-Cr)$;kEarW?wPhYym)+I670Vbeuw*?wh99baaCH?oPaRSn)+pN zpUfo*i%(4zM#}M9D}I%P@U1>N=r!3RXR|8-v+Vp};Wb@>AjlArn}xkK-Y|bv+Z`|5kRK<~EvSFA zcND6fmsl7G-0x*bZ~6RGQymh8Xt(N$GQfRPB7Bsw=4#6yQ#b&0M4TsPO8ZYX~l zRID3L+s6qEkqJv6g(OBU{siZr_1mL_^7g&-{j)Xe2NI8!do9 zLEMyh{bGZEZ&G;|Y|SOAHVrN`n4yKVl>8izTDbFK6(Xsh>#$7OumWm8+vW&#m1SqF zj3L}+$sA?H0a*ocik4!l)(x9-<~Y2u;hI1EF=UYcs^9ROd*_FwKA>kb_&}v4hC{b^ zvqWT88lc?L5V(RhRz1X$)+a2HfQbiM3y1K@7&5;p#6`pYsI&mCL9D?~uAu&Vq4a12 z4KFib6ogt#lT?rtS^3Qotn8@2;*AQtcN{O{Q|P~2*w3L(iiGu!nl)&5jju88u@z{a zy-B&4fAx1+#tqu{Df94>@jwM7eFv5`Wk4o%5iqzWLncZf%OWmF6UcAE0eS?$EjWb@ zfx-z+=}Dlx2dBDEpn3uaCJ=z>aOxZa^-DNSC4uG@oVJ}n`wmVwM4)>Qr~gQxzn&4; zB7nZb89Eu8pmE@;25sU;6&$a-$9HY;RS-jn*ySCd6duJSLv#!BHRL^F)FZCx9&5u$ z8OBNYl`&w`09xHc74=o7^Y1KtUVJE7j>_*1{<3y;UODWdo-Y4ZZUVoh8sE1Dmz%LlgbJ`dq9g_oVWYWbZiT7}AMT3bSxfxEF48)ouF;tfKbvH(( zn!Adc+ZSXWI1Gd*M9em0ZBP!h>YlFSIJ(s?0V$&(F5+h zOKFUTHW5t~iaJ7o&|)HNDE62AV+d=*&XcwIAka}X%SJRymk|kHo~E=y8tjI44#vQ& znn#|JcS>QeFoyA=oB&%eC|hn#QI}N)b#;D^RzQyJ{)mR!pqq}4U2+ri)hou9be>BR zAsd|D1AWt+Mmwi!LmAR6sG;QoRTDfhC*@4VJvdQd%ucDb8$|9$G(<7!^5`{bXS=v& zVWteK*Ug7U1V*hSu1;*#=CuospN=*r#wy-)0_sbg%Rg6y%eDIK5q$5beig|O(XjS; zciwi4;InM&&e!(KDl&Q{3OCxnw;rzjRL+;HJvjMZpv3*4p%BHJ_eQMUpkYTLkkerGCoSP^%WpJ_dO-@N!% z33U0RzL4zR(3mv0*01iDn!1u>O*G2w0pS)#as7ndbL5{lL8LW@7V-B{8)e`dZ9%rXqjzWF+PhM;Y(^33z~GlpiZ02PY%5dQY2 zob<@x;2;ORA6V{RngVtA`y(JsnEb4j?5tnd4CxnNRctAh3%{$p{P~M&@AXTnsGP~y zMQl;}*)W$sr`q5*#Y(C)vTsWDRC#W;i7MQWHB_zWH227gD42yDCQjv)CT0pZX85fH3N z6G*Tm9D4RV;&Nii_imY4-b(H>4R~Z0S!nH2 zV~wr5rV#A!zIJeMyc3yvC#uBBwaDdO#D6A&`(2NYQBS)V&qktGO1^K^C%?FCKTMgw zUx0r?y?2 z9>f>b;;$ZL6qIDV`;vA2>Kc3YEI;QeF7M6Y^Ww6CAfIa%q2N_d!SG(;%i_Y?mcqW- zm&0F+-j0=2)Rb!TU;7AUS?OiPg=J0e%d0BOKYy#3JFfV$Q|V??Sx`{f+*MOv^`DaP z>8!TQy|%2R_UrC{P{P1$-O^_LtET#%@%o9y`kA%*#jg$Ni49c`8d_@`R<>UCEjEYw z{0Aj;b~g{sG*5hPp4(_%JZ$NoXj$55S=(<_rflsxZT-01R#wnfSNETo&`o&rw*NmX zp?{)te5rGBrOVx-Yiy=#ZnA=BKQ3YR^Z3T; z`2N}W(fP#J{mH4B$=UJA%c~EmPp0Q5XC~jz99&+D39~b^vr8MZtG{R0zt8TS&0b#3 zEqtCQ_RN2}K3wzZ)8^?lny~oy>hsj(=egPc^n{JQ&--Wp(FtGH{-YCi50~eAmsgfo z8cNm|->q+KtRGyipZ(ofnBG`h-q_mPT>8AZx3>BH>|0U7w|`eV*LuR*#NOWF{>Iw= z$=Uw-<-y^}!QZRHk++EDm=xcB$Z+5ZD5Tnh-b2mgNpf?RP&=Km!i=r>mwC!K73SsH1seE$*=M?)W# z1}P1=+>lx?m#Xe9P~{4D+wkF-u2Nyiv;a^qHpi$o3uNEd|L`&ReFQ(xXj}c~_Q3Vg zu*iBkd8_-RFM@<`u|V(Qq1CZ7)M=7-fe)Yh`+&hvr|3~tjl`X&>Htc#a}m%M5rc zPLpnvjmY8A6*&?)UgXb_xgzF-Y20m6KZxDGubJoQWk0EYKLx%7OLMYCskArz1*}Ga|MMIPWEB%GpI5w zgt9if`U{h7?^bUt$5Z=CyIqCI3F1e4=z){Sv+lE2Zb5@kSofZJ3l(Ir>bM6okL=(l({`nJUj` zwBN3-s`w46&b1%iEsvMJs;Q}|Gyh$q)+ny(+iag=@P~v;n*}U)f z?kuv;hlI@+r+Od~D#@cB0Gl7YM+>}aXpURlIqCwfZXtyzILl7cLsQQHhF=SqDo#4cfI(h`%*kF=;Wzd(tAg| zax$zrS*{+&KPl3z+&nBfC-gN*F3PfbM1X83=#j*8m<9dmoa9x<$@Bd_O0G2-#KC+LDMGN$Fjuxt zIF)R8BlYNOJzft}tS>Z(4SlgDJwD9sZtA8bc0m^Lr2_?5rg|1qSLfj<(L>euEUxLp zAq^``i{Yv+5X<&wmBI$51!=&O3%x~zSs)xHcvoTzE&`NuZQ~X1qSMUq>l_){Xx26Y z)_A{&GpY!B9Z*PAlI)A|n~Ia0Z%;JdccVovU>QpYKn+P(h=VB^S6h*$R)9;|p)FCm z&6HjdWA+%oq;Ff}jPdP3ig^;=Bf(*bZ4_>-`*~Q2yD=qk+r>6frhOvWgyemC;?pEA z3a-1o@vvhnyFymMd9NYDgFQ((OF@H*XFQhm-QiC}(gKo!o zqZnva5W^6N=o21YN#R58>Ye0L$R8=t{F?ytJ9z0xl#u9QOMnl^y(yqSz}V=+l}H2U z+Ycupxhn`a?W-6RYxr3kuu)feB{E)MIr=H*GB`o^67h-nyETY4h(>1{!H9-a0EA?z zcwl|Z^Pfy|4nVigNoYljf)YJZ-}%9Hx;Mu8(|mAo?4#fWH6ni+gAgKVc6Xb`W>vba6?)xBllKA=>qpjKpD*GBbzfUzGv z@H42D`c7kJTGwJ|9%;Zgg;>ebC%u97hD);c*bXBtRGRU{mX%X zvG?n&PfGtdqKYJm}=_@fW$$cPBY)gr^%D_xVO%$)HJ5w%|vM7&aPa?I#E-~E_p&aIV3 z`)uZ#N$i?h+wz&%ze_8u8w+vqPglbGNSZ!Ot+x!Qh0u8bv>VqJ`nYt126dRh?c^C@ zNJJTvjXP2-g#;zPGM^)Up(C>ysH1eWv;X+=fyjGX%9wx8cS#k+j<=uO< zIA?8QXE(#qL1~PG@}?%MzE7ri>7>d?y8e@$F}eMI8T?hW_C0n;u?F*>ukiFpgO*~N zcaM%Mx|WA@sD9~TRo$2@5vUu3{yl-sjcJT^5dkv?$4ctjVk^~7qOo?AEmsb`CZOa1X|V>j4W7vLApBg3RLa(&7rJMXP37)99Q@3+{*-8$4lmT z|GinEl7U1j_p|hZ!zaHq=GjUV9^uowjGZSS7KZ;$a_>>Av5)vHk)zw?gw-M4ggzb#+#jyeD9K1xWJu+>k#7{2xP zWF!S9FLU*4D*azN_ddMM?5okMZq1G6TMmR~1n030tEIQX?>2OUQOb07Wo`0KtN2O0Nb6v|7emI+Lpv0gx-v4p6dA z1RWGo#5fJb)RUPBz-iTvFa`v25j2Hmw18p}DUlEh z1IHnYu*=${!9rweMO1VI+O=r12qL9G5kSjJOv3^b5{#*>!~kT`T2>lN<)qKyG^5Vs zVe*=6dIoFF>d#GW-cm%( z|iL;4^;GhNt@iJQ`Vh7WQV5VR%Ff}{c4jSu6Ah!bpYB6M!On^LW zvLeFrHai7JJH^`w&$)%LOfQfFJAjT5KAs!!?k60xuN(jx$0+8>ZRc{3w56vbq!67!e$iyGt0Eu~dc8VMW>iEvNgl@urub7u|J<1zRur^`AcYEpG`z_V z30Y_r4Mo$~IbG7{{Bhq*pL$}*=!&R1qqB^l8G%$xcF%02f-;6I#6*uJ{PIHl?Zopl zbtC4bwgn=pa6kbl8L$la3=Dw5Y3Wwzd^>3AisoM(|mho$4THwjwV}#o6}d_6BN(VfXV>>+svS`p{>lw2B~30OZAOsFZ>y7!WRo|NGnN4i@Y$EnI_4s}jVdanGbafLh20cQ6oT{~ywDDwO$XMa9v~6r&oXmPC-zWs z!fEKhhIBV$ZCRPpjHdypc1az+mNGcApbS@)z0ombA!`wjo z!dI|)g`r-@~rkWTT^Tmy!KmFmhUh5;Y&Zvw+Qp>(i@A@_If=% zeE@?FKM^=&n`vU~JHd1wwRFvJTCY9ONfBN8kVvAX-mZ7ckHi+Pu~#9#uM2HWADo+n zT4xDT_=8k7{x-C0+vX|V+?4&=wJ>i*zt|HQpyl*Rzg?@Q@l#C;N07t?p5Z5y zt`ZEgc+NP$391OB#U@L!$8=C5V?q~Tf8!g&9BO@=Uh$08*O9#{dQNjAkVe|9ZXFLS zI&!M>fiyV0%5|thC+jYUD9z!WhRA*I3(^PX+mY!j*9+LPtyWREB)zx_1MgTsIyzfu zS6|B;P~C{8lOtuw#sk+$+L$xCD)l<^l3Na=Gfj5U>;1^5neRX?wCNYhb3J-<7P@Rd zab7~UBicw8p>{0_Pj_%1{wVxfIxSdik!-^WC_iidU!}tiqRWm*5+PeMnJct zGF1jBle2?pu|1#rk$x!4-BZ1VxN=^KfhX*MrPA_;D80Z?Lmew6^Ce<(kwFS3lTpDe znP^%Z=2cKzTbIf3>-vl80Q-Uc6?mZPct0cZT?G|Um_LW+D(KZ*Wg|k^ENDYBY+SP) zrJLq%2t?_r37b*tSOx>0h3;q!XQ|Uu#fG&2{i4f-B2$tvh~a*{m<>JQrI0y%P~3(= z3c!qS#EhDSqC3+fxJ46k-1pBw{QT(kPXv`|Aj5D^ynGOCOA$kbX)=Zm67Lr{!zf)e z@4nb|on4x!T614{D0S;xV2qYA-%4!JLaB3wE@Os z#YU|D2vlE0k8?)kRsm-$G@c2^MB9t}^5KH;R7&zdIxkLOBa}3(!wmkh&DWDrrI%F{@ z5kWi0Ev8-{<nh;I^so!3BPr)h&zj!!H_ zn$m0sG90fi^7STiA(Nijj7!sfrtcL$zan`P>P${?$<%(`Z0(#0e=w}+$n^>eV1$!0 zg1;W8E{*;LolKOgL{IxCc ztKvW4I6Xx<^h-N`qH3##;1^uwMs^6MXAO#`vqIxbEmSM%>NfP+P?lza!u~0tX+rd? z7C{^~8){ZVtECo)+5@9t0K#MCyE1rBum^lY&u;@k-%j1Zu5$OVn>wR*=)PE#5rZk7 z=AJAl9Im2z0A?_pxjO$G>_TsL#k?-3xjy2!uJm}_4Nn#C&-Lb0;PMRGZ>7vjnjR>G zObyjbYXPn)qfy2$YO-}fPt~Ux0f#GNLf$K3%@j$(J*=(N)6N08%hxwex(~_>ScXg~ zNYN8O?&o7}}!A`t?1y zRb#F>i2wa3&9(i;15ngecO3%0Biz8S>r6Erc#v`+rJ(_9xt?PJ9j6U8~TCPG+xZi}am1m^Im5L2LbmoQ7z&1c4q3^Lz@syg6c7EHY<6Iji5{ z>_*;O%9X;_pp>}8pHFR96qB;VKIF~)T#j`BX4}C)?_+d6y)J+97yVg2@3LVh@rDMB2XSejyyAzWU4L-39#X zmqEHWrU(*Jtck+}KA3!m~g(*Wd z^wPlTa+7a$jT}6eomks;%TD4x!Cx9jjkX$0Lp#0UHY+N(V8QT91Y7 zrZ@Dn#jG0K^Nzo$Wr%;72+fgs35QPiapE~uOwGsof<;nXA2a++=Rq%^ zqVQM6=4)RznyZ|L<)ogdeKWg0M=sg?P^H@!_u~5K&zD6_IP_!Qt4wl7H02i>4?fA% z^`7N@8+C)QGg-rMr^MxH-mO~(%YPqSNWLDrC-$A2AS_dX&LrVKun&1St@kp@ulgWE zwg`@S`;zQ=K$h{6w+AGa)l8t+I@``Y%O||*ZjR2;(+HqT;7Y7M?7N!D1iQUmu`Bm?c!YbvW|m&0d>Vc|P?3>2bSG?ASJX6dLNu z#JL&g-JP1!NA=P&dL_B{E)^@xuBvM{vKT!Y{aNbwy|^+S z#q;=TPu+W1_;4b1|Hp4%LO<(+{XCG!ckkLw6_G@c;sWA5FD`JPz7|*@!Js|FuFYOs z93N4-XZr%C&n<5tt12iqz+zD%cIWl$e6ex7A+;KJqk&X*)PwijYRc zF$ecUt>2AoycO4l&0+~BqoKa=w5#3}%q1xm($r@0^^+%gYUp4oC zULnEpQ;xp`oh~+tX}S0HvC7KiU*1e>kReHFZmejLb9nW>)xax3#;G)lNND=}^sTw_ z&`xKvX(-b{*y)P%-8b>lk-6&}njekIP+R%v$1+Fajkb(JFc2kv|IbByIuusQx34UNpeA6?Sf z`gt3kERd(Kb*}y-TQ6EgSF2E(^}#>K<(7c-O! zy%Ib{538x?NqYiHxteoz;IX}?HURCX4bdJttqT)cQB&g0M1K8 zsnS%9iqc{%?^&P(y0C@CWJHU(pqNVhdiA^6lvw9JSG{E!N3Ze)$*L%uRGH$+)@zGN z2xkT;UN_FBT>D}9<#ke)>-3gW@w$?VGm>2~><+`Ra!q)Oio9Vc9$=PXAH^7!RQ7^5 zaV2-kEY6Zp0(JaAE}(cEFMY6XaVIE2p)3Q)=8qQw{8&LcnWuRu_g}FM4`dB4h`N3Tlf?rp)k%-AhB;tRKo8H}>fd7h(iTYUcDule`a2tuYJW zl;g|-C)jv-t5FIDWYF<@(ly($On~`T|-}z1VkAH)0RePGlTg-sFXe}>zZ7& z!4LB$&Zn6$*e9-{+36%5mWI6o2|eI$TEqg&EA)v0Yxq&TS($-g+<}35K+u8%$t+C7 zr4Ff9(lDG~$~CzniM7%<@OQW6dbxRYq$QDGk8cy+R-!ILM-fE0a!F>^?%G&BM+cN;J16o;3Uq$Bdck5u+gDD{pL|zYV_v>J zs&=c(ZP;wWk~PAp_Fa<;tJ?1xi@=Scj;5^Muz{h2Guhm&!*vcdAa%^8D~)}Rb|arR z!R^Cl?}xWS$-Dc3#amlCkmfS`7lJ32%DcQb9x4p*zer^Kax6H8b7LjV*F)vI!4v0s`0}rpWn&;l4^(Hef0>3zUq|ErZQCrPfVyM~WehBp%95Fs!c%wBn%>0a#R@Je}jYoE|t zsdqy@7Nh8C3eMOJZ%ex~h)n#TXKMbuzyDTU5Xcr&cBNaT!M^-K;4`^Y)ywX`f#BFq z@kMVs*IY7YAG}Vl-%8{R+NUysk)PL;5{2dKpxjRSm zS#w7J%LGn9RX*8gX&XwL=&v_SLY#{~TMk5UqT$oR z)-Qnp+PAMk{6H@)?f?N!0ROS3H<$>)zHDtMAI|(fW%Bd{)GJwAF-^&`93&fpYIW@z zNRx}8v&!{eALQswb7J9dvLN-P-BwpcA9RN*-{5gb%C7XG?!PB!?#fErF0-KGYN}ju z=SQvQqdmu~-?OE6b{$nNiK{%bj}T1m`Aw#i&Q}%Uin;xi3QcNBqnwfz^rE$v?6p*4 zEOd5>;%(eC&l;t}gjkCa+|MH(KD8`MaOLFL`Jp>rF8lJP$E)`bS4g!K;Wvv=?ovg* z0sFrWz85au+T@vAo5r2*f|y7l4xjK9x#0WGWUi)^o>h$Q-dH8mCg*BK4;W-0$m#)P z6gCA^3}+-=vT)e}D)OK5QO7r}F&2q62tw%OoGHeb=r|(twx$@RU%%^{>dIu#8o+bH z0?Qt#r5l$dqQ-FkrAUE4DStkLLKze4NDKIOxMMFMF;($)xjX8uYmr2o*O6ij*Q@`!idxc9>zmuoN8ID#cot`Uz)FpI_p_EqG0PRBcCpS~P9w5hZyfK&m4q zz)m$_7>aaP)*_;;W^ba(XmoDtr1oGRS}@Po#KQ=XiYan$!qYrg7KxaF!YNeR)OA)d z7O6bw)Txz1(j3)YNq>J@iZb>n7klOPM0XFdsEyBw0*5O%)2)jhl@HtUhyh9;9SUaED`w_Jl0wx~7>C zt6BaIMyhY*xCe^=^d5VC_4cwP2<+#n&tAS-voyK6Mr zeXKUnFjSc$Y7||`Os7F0<$}s7E|6}^clDHvr3H^=F1$PBkGIa%;)T$-ElQj_LokH2 z)-sycLO1)3P=!lImUQ)c)Ui?oY2oYLM;zIQv+)@%qs-{Bloc_P6@Wz*hea>WJm>{q zMtr6>iw7j(uRN8fY5djw!1!dZw8Sc)OEPZEC~9TuEAl$( zCf@OUlG4>!vw8RtkWy!XTnE8AOw6!1d+LDHG>qitUVWRBlmYd^N=C#hMT08?tMxfJ zr;d#4&L*Fdyw6!Oe6vgEbD~E&$3w;gBbfkNtpL!bfCylGcji;;#F~jIX0Ytjt)gt0 zGr5j48Oju+zX$+WVx*j73-jM+{-Qe$H7R$PB4$tSD423e^-;FIqWVHrD0eF|BHnWt zhu3CIr+r$`3v{roRw~M^G|l{G3t{5stcYy9qU%$Qoa8nZ<-(e9f0@4g{2_ARtiSZcsd1htj!y{;d zOpK90%LvK9%!B=D4UMts3vlekfO4YL7HmXS$TFvB)Vpp*ufR-?o)`VYNb@fp#GBdp z5rf1mZp~81>-cgS%{$k=s=S!(6(5|1q=n&&dVkl-4kj> z>0dQ^byJ+$KQL_#2o7R5$HA#aBia#+bG~y{J{wlUfxtxD$%Y6<^Ee$xsWhL!_?15y ziS(3Vb2mIqF=hyi-L_qVoJAogMXe9k3^@D}hwI zDo$a+zQH(7^UFjQRF65lsYStK~wPe z6L7P&I@cpIJ{;+ch9ln*DUULR+4f@n-$hk8z$F@o!vU>I>^yC?Q{hxrtC{oE@mG`1 zOK}U3IQH_bTyfvvglf42+0UuL12g?3-4lO4`~IEuc$z*Mkr3a6F(zP~i()4@DK^96 z{})B){ZEDW$MJhz<1XV~F0Og6z4t8X-fN`DCPc2iXN02ez4pFVX1do3$ta1Eu9=-x zM${#wJ`{yCeSQCd^V>O(^LW3XujeZzGOuX%q(Ya&*eS^`jR${y_SNgw$qNEO!>saV zZhsEQ7&E5_$tw$I*u0%m)$*S|*h=gAOLfeC(4YXWFiCopz#g)Y?5vmO><^as?WiWP z=*nsKHEQ(pV0TGPMjYhegtwr7CUZBnRQaNQrLcNND9)#}b7)77FWA@Z_}t;^No1D{3fHRTG&XvH5yk z?UV9K0&&QIT~8yp$1p?uSfP?@ws9yc943&@p@>Y4rE#3@;qWh#6k5K#wZRnL@LUnh zWA)()7)AupXFP1~YlaS97cn`l9m3Qv z6nmK#-)n#2U03YG&guSdBXo|~Q{>%J|M-&hyL=}Z!8d8?Jac`!#DET(znI?&c#}=k zx5-SUJ0VdCd}`1ONjcuhDeyXc+I#;#mr}x+;T2u~ zcaw5lsZ)dRhq<=Hxmf@DBUCo&hqo#JKKJSce6{#gSY+|_XF%KSg4QcR&y_#hc5J%7 z^Le5Jr#JtnmGa-^+d-bDKHWOcp8fj|GZW--MK*TW<}rV8y4`m7;eS!S5;5WHXRieh ziE$3sy&kQDKCGM+=7)?_T8kzYP;?kr83#iV`t zZ0Pm5;)|A8;kMY0&I7kSv9NC{Vc!kI_ASE>u7n+ihV6?D`6|9NGN+$t%u+ASRl>ViBgXyhwtYfLV450yr0em+@pw zD>+zzoCu}_;(!WHHV7IE9~ElR#uN0U`TAFQz3Pik7hTaRb7L1eTUJ0ES&X4 zf!uMNJQtyiLs1<00XOAx_b>VjuIVh6;E&h&c*w!`0B2&^4?S6=-An@8Du;4FBwLZAMPwYPA3|jnJG-aToWu#NM#+|sam*Dp^^LAwgXz_G2fq% z$)9f2cHiZGh5X>of1kd~PMsL$kjjDkax*pmZ?{{TbF->HgZ-zao8f2NfM2nR{(PXg z(CYazUpeSdX{p_?Ht<1R^xbDEX9hh`7cPZNJBpK^DyIKXWilu)9*PDZsjUtC-+;h> zxl?_8IA0cY)8ePb=6IRzhsWbTHMgcx&Sa{D{L%{St+9I)x+4@iH~-LY_U7}aI$xHv z!v6cR^E+l^fsx94cI=tnxAoB{Q1>qeKQC{#-nDBn{L^``{opG9VDsP8N3Y)HKFu^N zyi~XUdHz}Cfkjt~Mf00SF^_fsOnv)Zb4Tiw*jW-#=KRFaq(ik^D?N~78=giP(`Ef#onp`NJi zyS??>m!o&|r1DJf2;SD#YBFOfu+UlP<6f65_NH9S!SxlK^?xLp_A^~>&g4O`=kc_O z-^f+2vVclS?(&dP5P#W5y}X}(^yqg>qTguTWM%xfpOdG<{tecZkt<6#b>9!@-=keb z2;Hklof)Zf4z|4RXPesCC4bLfA<*yM)l-KX?y>dt%mPi-c`-n>8u6Y-M4zBhUYu|c3U!+PXmli;&XswlUq%| z>P@Y0JlmAvU)50-x@Vhy?{+NqT{cBI2ZL=Nm_;4TKL0(=o28&)|11RM$4Wk)={~#o zJI2lC5^M~3L9>5C)i(3 z+!0dRN)zR}$Fb<~2ayUh5^TGMI{9SrsZX&>gZN)=MgCZssF@$vj#sklyZz^#guNQ9 z6!~Qh)uK zwa0e_C(c^trAir)QqK!B%7PLzHc`<)K)eJKxd%zW z=_Axrni>U2{$0kw(gx+;>=UfqN>su5XN~O8P>KVln`(N6{MXV&rS(%e26$51v&6M?+WmCI^2Nn+!z zDe+tEaGkuY=%!uSo4r8(o}*qoGN0PzZz^oq2E|vcWp)uwe|6j9+6w#8JI?Ht4<&Pb zIwb^O3DN>4BjEVXUIg+4dP*+1@J-|-MO#0B5=vv&0(%^@A+`Frt%-Q-mk%N*Gek+e z90A$UD{!{;4m8;|1(aqk_kNfmYgm%$x~!I}odnX10%SY~4FE#OBiI{&rW@zYCyz| zZ7-|M>5R%w%*m8T$`qewW}-2ZM^#$-mC-I~lRs1F@4O)uvVl@!V))uBYWdv4&83I{ z_jmj02F-cEi}n%JE%#N zKOb=vCuBSYHXCMP??V^DOveN-YI}pvrJ1=GdQ_VJO*im=np!p7FMysh@x~v`8Cj~p zyqUf{xt^?W`;hz6amfNN6w-C5+8OQ-)=uLE)7R8ZP(~QaW$h&n;^=|UiJuMUoCcKQ zE0q1VWz6nf-+%fx8S?5>)8YEwxRvX4o8TEK@6#9hb18!li)$@?F9ufJk9%WOzB?@A z(w5mQYRzsAHj%EI!m+=x4QUx99XtLftZWs_NL>9JAl3W{ruT;?w=F0VzM-Co-g1!p zmNo#5l$+QPGCBddSfXM)94bcp*)-(>t<4_hnt4A-OyHrMy5~Qr9EL`<;y$eAR6(CU zzgqU+0aMi*m>M)rtm<@%M7z>Js4)-{O>7b^R)-4z5s*79VYBP~ZK=XrHinrqkvQw` z&!bT-jMR-LT@TO^###*qyGAH=^yJBV#6#6JGMxrVH~xE zrw`QxU_TEooAOry`V1a#lNI;*lDhOX!LQ>vrIaWV-SGv86aeVE+E>wQZ;Xk>>M&tq zV(v}$cBRJnK?3ie2WdHVRmm$`=UQwF-cXYj;}N(Wr+xv%-B@dx1Y770m)fI1J=RILj3&$r;bg=AWs~2@OxC_dRavOq7i{&Nj%xvcXFM z7qY-tBb!&*j)jsitS3pgA=wH(4&EvG_q&YSMp*MlMGIhOIehM_AfJbF-oL@>Kn;u9C8Kw9JPwb zUsZR#Qp0MzKA_@Xl7dZD-vxlXNAI@-l89mvuKhd~oF^(ZXkqWF@q$M1@|MGbEou3M zmeI-smXXp5kQ)$If03WT=;2|zKXDPW>L`^(ozOON+bEkn`IdE(zO0V9PgHQOPTl-T z(MdaI2zzj8sFm|PC8^ff6c!nqINw#;?-ghxlB3;r)Yve3fFIM=oOhf#pA&=yK~i&0 z@vDWZ&k5zqxe0rKedb+NR}i#@@O8u@%M2(QVci4~bCu5rsw}KFSiOt`H`9_d+9^iN zBuLMYJ{S)kxX={KY;4UCu(+5R%WV3S1kNYsT6jWq2375y<*0pW>O7;XGhBRwoGi&4 z!+5o65$=v&#aOp{KL_-HmxP;0+=lO7$lX@H?ZJt@t5gVr22UH}=zL#5BD(;$e>H;gle&7S0S;$t3%PE6Z;khe>kWTar;QXBx&(Otb6*1ly ztXKxTSGRlK7Mmwk=!|qJm?%mlxK8RB(`~|Yxyz)isRR1B0<91)-9T}@o7S39aJ#9M zse?Imtf`(RxlMCKX(zOIr!=_;vG zPvfYUVa(nlIkSQaz$|GcT#Jybb;5cw;7PM`*M=nKMq~Ao&gmT!m%G-#vkLzpJ1J>X zQL&6A3=leZL4yRchA&{Aqq1I8RebX_p=_s_gmxwXp#{oPDza2|L2gpGdV3WM6Hlaq z_7^s6M?i!)w`120r7ioezm(l!iV4cK_){NxZo$?bf34IUMl|Vw+$tX4JN(_bFDmP$yb8YwOGB(!;#-pXe2BaU!*qd zr7`gX!Qo}O<>gt|87!ml>73#gP~Gw+AU*L)u;BTu@x*^ge0;qU(bW39GEj0aq(+22 z%m4cbNK?y!W3dwa)7xq2oz))+%LgQsR=;*PYJIOd~j;gq5)NLZxrs)lg6 z{han6T=d^0J>%tw5NX{=kK9mq>;~nPx(S*|qS7U=H?CrP8G200Z{Xl}k^b3{cZQuf z%=*VYG)Us;qsQMxU3;9ZNaZQW7K2fWVE=%K1!VAnr&XuxBQ}w}^RqjPBC#2=VeDAsPrPQQm`xOg z0{}uIoz;s#67{`BH!nJ#>eChMbxmnh1P7Hje=J#>)g2N-M-z6jCMc;w+q!BYoy2)* zqu-EZJ~&>}SloJG;zcLGOPQ`NN1^>YzPzAi8wshbl3BuP)K?q2gbh=Y2QFl~)|m09 zs#<$fXwbs$!F!HEFT2+L<=M(fWtem!#k$)dXZ(^qkiEXFQb(8?O@HvFLZwQ6&Sb^P zpg?wuB>`z74k)K9Z`^!N&+Ha<{{bj=)2-lm#1;WHdPTp9Wcx2bO%A{Lr(9`HRN+r8pze~2i0i7h0^vea%f6|; zQ&qM>dQNKwAADQ33@7(%pg$+MwkyP`HGSA^`;r4eu#*Xa<55i&oS|Iht%c)p)}kwo zDpdqoW{n;j-LjXU0_b}SKV~xr8WCl@uxirc3)?Dkn>r@Mv$!f%ikK-75JXk`YlP2#jJN;{3%jV13|6daBB2Jj|y)JC2Ep(Xir&+Mnoh< z>sysSbBNYRu!N@lNl~4`aXbaXN^mIaRP7@`ww4)3BaUAr_`PAEyi85;lIrjsh}K|P zy#q_bU;ITb;PxW%{zbPRp?6~UFk;;-3P&tZA|~%JDdH1BC0x-4Z0^ioF6>^+`fg zFOjPo^4;UpLNi4rtJu0EF^)}&6P36Vxq|&BG1$l;F4Y;*Su|TCnl?ZecbzQzdA7NMK8B5bwu2S|QnG2ooK8JW$6$&I1R$ea^+ zf`gF&g@yP|A4e%y1;)etzrTz@84xMU;JSJuIij>anSvQW!bdN2ZhAku^BFih#kD2_ z`mb3ZfVGYyPmh}EhK^l1`Wel}l?x9>lEh|t2 z1xt>Fl#pr#4uxc)NJ$I3D(yswtG|`;uHi0lpF#Pe{P6OdswbRprC+dU8i1hP9I{6D za&6u!FesqZa(yBNHcV~}@r${(sG#bvxy#TK8`K~IJeI!SL?4^x*ss-}FOy4>Etxp20xz8R9s?=f{^ z@-!e<6XW92)ki;(PyT*+b8!~?R)qf(L#DCGis8x?w^BRWe<#61BT`L5)972#0Qgom zA1mz(MO2?iP%U;-xavXFail6FE9x;k%FBPQwsQ3oWS$VBx@!eWTh})CCH%-R`{ST} z9l96~$a*|caTvhCO*=gCiM`3Q6_+`!sU53#aGsz&pu#pcjH}96QWyXRRWSr--5;GP zQ2G$$++U);P7r4FDR|oybA9sQ#2-B9)7~Q4K4@|zv`ELa8p+-_99^Bs82KNN9LFsy}&@&y%|FI}pb1B;EJkFmU`!y|bOj3V;2U(5d=13;~ zknhx}{Zn|1miUIhzAGW0(9NLMnxgD!Qkcg`e%l#jZp~p0pZWY@? zJfuQi`IU7-H9>b9=VuDT&m%BfjcTgj;BX-F-zSX)5>ji{z_l;>u5zN}0`Z#aTNUlU zma$>>di9kOM=4)z!RA$Kit@vZD1D=}5B3mQ0a)2vF0q)isea7|dCbrAEp=h-Q=c;z zscvtVjW~cP125Tr>dg&`Uj7q4R%aJjgCNLTK65mi3OVp!uIc{rW+}`YG69pxrt3}Vd2^Zu-iXL$j~c#EZ;Lj9WgCX*(En{v{(5_KT$r8xdlo-16eyQ?P2u$ z6tX)z2WH|Z;c5U0&=&;mgD>yoJO!9)u(JUT5<4{30G1)jxWvf4*bS?l?)zxL3Gg#zt?TL@h}p zyd>lXNu2L-X3>rU9~q|Bj2QzxhB!B^_-5RovVB#sM18z0|I><5@tk|H=D#ZSUB|us z8}0SPE}yueF2Hrv!aRtgkl9Y-oWaW`bMfG{qDvP;?(A0eX?x?9COL0j*;i$pEP9P} z3vt4<2UcU07I6w#;j1EBx4Geuh;4xC z-?@Zo3gOHP8RgfyZ}U&(KhS;q;h9|3h3h@P`_Qem3!r&cI|LLos87UUocETVBv@rf z#r8(qG8kz4e=EN=Dn6f)*h2n{Y3EppfdB>`C4heHDBK%0zUxqLMjtK8%vJIl!=*D! zs2FbaQ?uy(BZRkE>d;a=AsQ(?>N@_^BkCt|(=Z0)H`ES!)4F6ex$-#C04_#iAWn-k^tRRA4 znRHt|hARlhdpWLa{8MC}MucF{zsK^EE5uU0=U2w2)O^+pY6!_L(&q-@GU^5L?__gR z3mjn5A4mB{1V=8(mKLdT6s)LZ-7(0zwgnq9kJD(PS_X{URU~)W3xBU2PI(scf!a2E z{<6RYXXz`IS22H{sNx>-X%uGV?>|8o*NkccUwV(GCP*a{e6~@QTSGeO;qqTyQ_j}3 z^p+$~)68ABn(3($W&V5!r?~UUVpYGtJabU8YbnjgM5Rf$gR9RQy$D|Vl*D7Ix5~q6b|sQTtpExooE}0xFrRjEvgsbINVC|y6~tzlhn3Vu@+Xw2 zvq;3U!c_h_Fk*HiBBgm#`oc)Zn#1&QX86}Ly%fP-WhCSg|FhdPlYRdU^SG|pBLzz( zCbb%4X3hntN=`{`iEy)^U+WxLnm@>XZH@T)qWG887F@*ivQMp9_NWzd*q(*!^qS}7 zhK*=p>70H^_yD=OpiF-CWxK-ey3~(%mu2RXlXAj~e6yyW$X#N$c%|dNcp2QIQ{`of z=KCV~U8-`>7gSAr*HD!~Jg>QnVok)okw#trE!Yil2u$H_kFhLYQqvcyM=5kH2r7Fu z@!1aP1_n#9M!R{Rlt*7Qj%LoCHFt7DI#v9aI^R9xY8JhB$0oWQ>ibPP$lw2rTeP?} z@!Y&sxJQZ)cqZy@ppH#&o~~M5?D5)iSbi!u+AO(MW7KhVm80w8;dVLP(7E2H$nufq zbKh8;XmvS<5aq;NhMlhuQ=lG7tqF?C`wo#=k*2*`ci?nz&qx6SY|F(xcQL4oDHMY| zc{a#>&GaU*6Hae$Tv^p|2>`L*%Hs%`O3m=KUxhp;5YT+zbkkTv(GM^n zi7RUqT<|N4$tvp)O7;1}0mCk!xS>JYORC|?nQSL}fb3nKQ^>3ww>mrW$0l9Xn`|x7 zO2l3+E*X@wL7tg(8F2Aw$?eC2aGCZSw*Orz9MXCSVBc7JX|Sx$8`Dm>{AFQ4!rSP~ z_%ti^!NQ=5!7MgT5AP>_3@i0X+XcagC#7YD%``QL<@*O;eY!deU_aRlqFtpVovfJ+ zS%fD$KU@5BD8~Hnh`4(XnBlgw_z7?yT)>!91G(+8!bp)d9LFj62@)iao>U%Er;^5b zUUCV^=NdL)Z2q1$;<z>{CvVmlI(6W4MEm)oo7RsTSp&?5GOO@!JD+KM>5n-rGy_Q~ zHkIqbS+SOK;0vcSO63wy3M@YiaCLDEe ziA_hqL`qGygLQFGX5ZTNHvgdLGr0!6fi@UDFhJqir;7nEmhv11fc1*fU>iyGc}8QZ z<@V`xm7`-CXhF)zM2u?8=H`?l*jUdamI+r9M&X=yfk+GM|6Xa(CZBFdz{aJArNgJP zMk)pb2e-=ZSypHtSe#Q}uqctvEp$97l7!B_RX`xOgdGY=alOP8Nc`T#OKejDStWz) z>T6?LQ@Sl&SheH1YL}K)M|Anro}p=;kE;B`n$azd15XK<`X+yzGg#GSY4t6r(zFKsjCX>R{(FU}>Gb6Vc<){LyZ$yaaNHk;oYR!pSc=S> z<26?&)M+P6jk0UvFTu*eHiKyz)sjjmJL=&1BI@;! zT=u0%_d=2gD?fboEK55Rv znNy|{E}t{R>v3!{;Qhy<5U{{hEeot3FyKc@)1E~uZ^(h%Txb+=gQrF%X;lylCPjnj zawRDzT{VjldD6!uBry*gu=;{6Y4w1yoK?*y=G^7_@J!>b6OesZ$NrTWkb?n8zi-)} zRadpXjFbeQ_EhHf6+uZqB^BDFS--G(o$Y6QKb)zORqmaYxL_%12ea9OnN1y+V;nGq zM-Jb%g$~;XXRif8R08=>%a2Q2T-3B)+(}jy^kIug%Tfoogj&>-q`sPdldJFm6@$0% zN0n+H>VpSv+mBT~a~il&{?W&8obbFt{OUodXO6QR1#!bPUq_IhX0G(%usU3BIIlhH z-80IX|ED48aQCAOm-(N+Sph2*ENnb8oImg)*r44Gmu7Ih@Y!Jd#t%`4}E0~v-fl&DXUlLA*uY>+VpIXjFok$ zI0eXclPT0QlA`k!ZOl}iWEPXa@An_tO#FqE-+PzG%(NJnRt&uzI&jz5G$uoMp-~sd(IsK zn5|k;potDO$i(3Sd1N zg>!tUvzKYT{&`M=j#z5_S0lq3VyY9W;8(-7dwqy*JJj#wt3_c159*>oR$0S9og!%BSC4R>e1$>coXgvnymV?gPmRg#TMz5l+aa+Db z@KnCyy-DpmpG6WI-q%Z{TL;1x0GpJ2z1%(FvQ;7KjN+sRY8k^Lf!EJAmrv)CX{Ody zX~-;?qmd{3<9r1%NFcQt`wvi`Z&jcNF%Ub~@Y$HRwoYPoPxBDZ-b$NuOy>nt3d}ab ze(iE2c7-0|Af3%T>Yj#Y<*no%2&>V!%Ru`La|_ZM6jp015br`d%;1c6V!WRxB0Qg1hZ9MZvbc%EId3daFh!G1~)9c z)G4EDeAv}o2Xdm}R$0W!!>@Q#Ny^dHrYxY^7=!&A9plyqYVChO1w_ZvS)sk$Y_ISe zTIGPSrFD4$wbj?b6mShw$YR&o*x%?mr;!SfEhA{|PphI;6}OlJN&&;0fi<~Gmj>Mv z6!bvfWcJo@v$f((Ln6WI1E!bm*L@i|7gO|f*NAtSfk@+1E}7LYDm*Im=4=kSQl@^r zL+L_Ty8*Oa#)!;!98Ls!Q!!8XH6?%+Hfup*o)+bw!vJ(RN0rs+Ug~}$w8UJjvj}gM zZ7G_}T?W+pPFMT-VN1d&*fhH*eW7K+qS9Uyu$$7Cdx?QqsLXcuq&Q}sh}_%;n3^XMKu(hVzH*#VuZSAf!%C z!5hQ5_v8%`rw*XADEzQLt8*2#YJ>K`HAdZ`)rQ~OaBLZ`Ok3sT@!+!*i1EN)OLq8m zoIw{1cNA-)3pU~9!W3jC@dE2iXsAw)t6)m$ckX{QZmG38`=e{35dKphW-&kfZWLd0 z(CcuCMH6H1dwL2i5Fv`3&zr-$b$Ywo^W-8obnp^tt8Yho07Nzd=BExsuwAZ`3{Z3LiW=KHY6`+0XuFJ67-fKeF?3!y*;pUk z$^RU5qX2gQ9GV9!e7*Q&Ju{hI^jeF293*up2rS172VOyAeta&yh6RLe#(g!pWo|OZW7``|b0> zl-c5s8zO{WeV=)OCU2$Yi(*SkPwa`4w|NDre7wtL7tAm$VlAyvyjymX9Y6eO4vfg_JRYL-K_v?@oW?{~`&9cbHht^9t=g zYQNId>(+pK7YPdeyf~)K*pa3IgS+G7+}wh)(U$0GmtgVxqxI}(aZK)R$?{)_T6`^f z91rR6u!8ip)d@%gerWpA5TQ%f2iHKLS7)dS!S7}RvNH56!uPr6g#=fTpY_g)KY2q1 zG=IJgZtjizE$fgiS@htk?@a)gF`G}aT9mVnY=sBHw6iI1pl$XPy~>=8`BF&C^l3`& zt=z8WyWf}IoN_yS%3=X%Qm0(gJ9kcMl}(JnVn&PwD`XrSE8TfPN6xrBEIKmm!EzXj zxZC5PS|48x5rn0N;sVz=_h}ialjj@OYE{de*XJ~DTPj%%SsQE@ys=|UPTIpiyVlZf zZjU`6GSJkv{;7|hvnpM)9U_Go^cR%m=%n3&cFicB?No2DtQ9B(y%-yUjRK}bRUsTP z+Pkz;CGDMzB|*UI%TOr)selHQzZ(Yu+KOp(Mslz1^Z=tVO>eE{KY;}N-hbmPu9Zk{ z^ng{77_jb1M+2Tybdgx*`8l)u*E~I%rSeYWuTb1=kt;|ZiLU9;>c-(-p8cIyS?p}WV1yJ->Xq?Df zc>@FGOY;mDf9kF0hVX)n?y{QDkzG-3W*yyUqm&Gba>N#&Q4+qNAu$&)nWJPenu z5=B_F$N_tDw@udZY#LY-#JM!wj|jtXpX^qd0X%mh&s@kl1Juhqi3f+qvsWH!Uh(ko zr=7e0vqYQDBSF9O%*XHUBY_)#`+f?s>r`NZ|6DONSUN9adcl}&!A#dlZ?X7qN%>z` zE_R6ft($+vf9Jg~Mpj^4Jg%paqu8#;9%pC1guY&Ozk#YC0=eomyScVES>L^`hFiyr zPrhbrqTM45=|qt^CUIg}qXm_N@29U_X~A=Ik(oc}jig<^AH4#;%x36;-Mc>)GkQqh zx6-3Idi(L5zX3sM{jY$l%dvQ|CZc4I(e~C3he+@G8UBp|3w{Y~V>6HyZoco^b4yD| zR#WtO;HW6_>BnNbInmW`mub@$&4IfgP*tK+@sSVS=sWq{@hh_1(j>B~Erb6Fo%9p{>-C?aae<~F3GW*VlvP5UZ?k=n2gCx%M3);ME zQ$#3%rR2;j`FNC^I<0L?vBL?O$2{`pTVIHirQnqv+q$MQjR;K4H;ZA=n1a1U`Kg4@ zQ4aMEk^I{kW)>9&R$`gKFzp>-!%4)IjBg*)iY9FYfFvwn2Fua zZ~RZISlue(jZo0{(Gpd|i6&)$ElvBn zF8d;8sl8gImFLxiyrc`e_jRh+zVB&&$nTaoW1Z>1W<-Zt4P`ub9z7*cd8sR2Js$@w|B z`J`%+H%1L*vUbJny|p*OOekUy+5qZEcq=`1>9C*2d?Nd0%1DDjPHope8T@)wuBV0?b&)hYV7%&0l% zdrL6If%-sw^dEzPV`6?zLkUw7cVie=Thx9F#Djd<5}PQ z!r)5bdsEQ_sZDiJU5&_lW4pHD&jcN+IfP#``8F-qf)_LN*4n?Fy12rm$#K@cUb^7rVWgb0KxMTA^%7w-s7z5AZ*_th|O?G}Rc(4F+On5>6uR4+7qV zSg?(~ZGC8OlYDHTShy%_KU6rCt;1z48)DbBrQsHx<$d};eQGCDq^U%g?O?B~ghR)E zTl>!!OY{EAcW?c(X_?Z0p*I5=M7@YT zQOx)*-{^cn)0dGxBFO7BR5Bqr25wl{uS3UE2j4P|?!S(g)GH2W$ZqL9SUKRj9A9!r zJ?$8mbXMl7L85nMEElB3SYgJH{nSu44Sxm%Y?5f(5|<&S_g>66pU{w1{ENpFEBv0#83W4s@n1C#So3(VZ=W5D zJ2%{)z&*^c2>iz;F*NRM5A0#*ZG=Y?@0(IZ0spa*Rze^bwjLpDt?;C^p zy~C}sFU6SKt{HQhZe5UcBm zOtP1N{2OpyST=+mI%lm|m|^;;m5r>_eN}e|+MW{f;e;Hf6;q@7*yOxTvC-#-+$Z?6 zhqgZEy5|9>lLqBq3KGyI`_o^O_LX9_E^4|?rJ_zaJ;!=AbM)omak;Ng)86PE24lme^!k$|kaz;`cSQ(jrn>@Ft`uHomIK||?-TvJ^sW-fEC#%g=?HVn~Wfdnc?hEyN3s|2r zNDh0Tpd96VmHkOl61Rr`w*pPSQ^aY^s7*!$X&5DRW!KC82DsJ3VsM0Hi*pUUYkg$;B_4K%20{L zCG{}B+o)Iac?XTN3NL^pJ8k(ZquN+RI!S1n+mFU2Q3Znr838IS=w1zuHS^_9)v;$2 z?sd!M{jmfAxklajs9p|%KRD=L)7U7U4^#sk(4bgsvMQ5k@bD~jan1GBV0H0cQn;H4 zPJT&Zw6WlffLU?g(W7Cj%5PTUPd76*5!G+U9Lhhwn#FzAA1B{@@5NfhLv1xA^t6fV z?#JYF{zfR=55>5Ze4X2c9nU=%GQV^Q`~s({Dx1K4jqi21))&Tc{CQrB-8?>*j-Zh! z^ivYBdDmiP%5k_|NM0*O$zH%c54LBj(~Lvk zGvlG%Zc!f&*JA<|r{MNl%0sPiRJ4%TkeBtUP(hnf)eo0iS)bp&VwF>HMJ902#yVyi zf>8rGg@;E+-544abff~YJjz7Dh;{nuW;PU^A@uU23RsW#*;MqzB}c9_amiHdm*Ug~ zUH>HkbCr8nkQ!I(Q|uRK4fQVFG)#?LlSJq^fd3RD&YioJTYoi~bgPa%`XloeWKR;p zPYPnPC-cBMYN7GNDlSjl_NQZCe(=?vgG)2Oqw}0donx{mo?l$=R9b&rrGQa0z%*dh z!?_0L$ON3RCXj5beODnh(utYVg3UAzq3}e$Z}M#)jBe3kPOSi=DfqUQo3Ve=(5k=_ zu;@4vsmLRA9i&qu;B)UuSaU5*uN7cU6nXlZuf-au5H6NMPI+b|FI5Y>$pk0@Y@c)r zA)loD@bw5wbK|-lk5Jdks7Zb87g>g3zXgusjyt>jQY+Ij&F~x|ndUCjk652aYzp|7 z9;QkC2&^tbso3xmX9+o&x2k z7zhZEq)?QSIFMqsn!^8s+UQ>hFixm9vy&~(QxE{3eVmXZhnV+Dd#{_;v9}XG?XP?AjA6k=Q_=9FRg7~jy ziwH)zBcKyhfp)oTA!tD{|DsQMx;<(-u^*u?s6O{2jPiK^Qz^w|i&-hXA=xJ;K_bXj zf;;5E^kNbeqz`aZ6YO5~So1Gt^*PRQr|Vzw&Tij>l|y`frd;oe;7r(s3Ch9-k2jbF8V+$VDNRH|k02T@+Kd~3k zu6}rJ_K1uq zwtk18Y|P1_@Nl*IZ5y9*q5F$#ja)d^DDTFrP)H&rrWn zVt1Th4Xr67FI2x|f{Sh=POqKE1`x{&Ay_pQsa*i~uD-}B$3q&dk_ox52HE_6UR#>| z@Av#&uiAri1ttCk@He#$9R)-BXvyNU1(=Lb8l-?Hy(&q1Kq}S1#<9Fr8e_v5WtRGg z^ypD5O#eS<294$HFBo32-N?M%M6rFG1d--}>pTNz0YLG@c9YEZ5^BRkT>I1%=c!h3 zR2r;_b_{l4fS&R^#+Sohkbrr+uw;eDQ#2@*0lz%}FB^q-10XBA4bNz-89eY)r(w-R zR@2=MuivnBIJUkjC9= z-G1-{@%+l}>2WGVa2J{z1UIF!-Gy-wEHkSlwdH}?Yb4zOHAiaQz&rdzk=F(OY%WHbe6kXx_b?vO;m$}?oHRARV| zty|e|v|gfJl~aV=bB1{G)V8+X5(pyhePrK@sXdf^xHy}ZFBolDb<3cOn|Cq)r`<86 zN{^#}nLvEPEnY1B`8rRG6Q`zP9*z$0CG`r!`Fcs`H>|mU?0rDfKI!1TkAOZ&SFT9_ z-v|xd?#T(oq6pFhRcPsRl zhx`2J&fFLGuD5&knYH(vnX}K@>-+umam4gon1QKdy1Su-sDPd)j@JpIPdKMnr=!+RLQwD%G9OV0kEjl@BoHhasU ztDoZg#rXVam z5H6)c!Vx(0wNDPfgl`!MZ!qxR1`uAEfx?j3rDwlDfpZDO#P@Lgu!K3L4=M979A6B! z!`k^I^ZB>6a}S6G1Qc~$M`Yy!I^>&gNq`2M&iBA@V~(dVo#uUGUw`_C%D=C#aAd6F zn!dn)cjY@h_jwd!Kw5HqREn$BJSka8IAZNM4=gP|OWP5WBs zh7mpYz%?Jy2?>rRx;F!PB&?me&69LOyfttEn(K;@YvlpNceV4N#1|~FYgH}`_lU(C zM#8Kl=n!n4Kob|rGxb91*V)CI{mPP1*4Ln2JHgk>R7T6qk9tK&zt_j3%y=GvSzGxL zkp3M8iy5}~ZBA0{isox(vP08tmen%()zvSn7*)xKL?uG9_4hAl&m`A|9oFpLZ5%-% zH{IYP1mvc6;Ou-iew_4EoYzNsxjT$KqVIcWL3_!$kV7+w=YRALj!4}6DYk(D+`55O zVFovzXGeT{phQTt|Na*0Pg>Xh8S}mfPdAwl_%G%1B!O+8Y3Bglwp`b;!s>F_44SZZ zoj`*+d;d8}Py+wI)Ri|ptN6c>itVj(@OB;RcKh<^&m6aH?B^@E^=vPqR1dmz=!;kV zc64HqTTZ{<`hR-Y^*e9=XYS?EiR5g!_wKd&@pAPU!Q>gy>Dhw+R{s5x#7W17v+h>h z^dOP+UiI?6^LDTz{$(Nl@qdZ`88D4k&ajJ*XNc4x{ZDsS?5fB>V~FfQWR8CN(f*3w zpj15pThy^+$w+yL2|JmBG}!|q(Qib+1C&hZJ&}|QncUOe-ux92mD?MJ=Wp`Rq*~I~ zV}oCW=*UzVZm=b9-k}8vl_yneu5J>q7Lfh2GGvp8o6F^r%OkK%_tluvwaeO-cg3xb z^tI>OwIQTa^G9=HzT|1DOkENz?=6v(w{7B?MgiV zI^gHERN#jYX;R{kDWs5-%c%1T=aZ_FbIj~Q&F|-!4=0fkNoKV(of8*7oln<^%=mfV zIc;_pp^g@&PmPJ{%_c72vkFRot;ha(Bqz=A7T_k&Le!4JH|hBzu!IkJ+n`QBX5U00 z@BZIgrEt@NE2z8!KXG_oP2L^T z-dFdwT!*DQOu&wQxn($4ECk<6*aPHIAQbybIO_|(+eS$clh=vrGd)guFEgL8*R8he z!y4KCyN^*MOmHvm!PWi;_-d=3*>VeB6C0e>)+cb}p+qGn8y-rErBr`k)Zl1+vCjunUMSP1Q}@&|^}1wD$zhU9 z{9+7Lw^DxAtIK-OiD8tY2xBLnsToL}r>P%Zzq=r){S$CW!rVt@ImSQKRyfu+dNb_U zFd;=S9y`^?ajcOB&6XD)3t&2FnzyNZ@&@%Boe&immn;=S0*Wj}xQmId@yCp|F9&|gYiqIM)vvcnZBj!UerO_}!*}l#p2I$0 zY?@E=P36#kZ^BJsWXjvnfw;Nwi+D+F>?_4=DNGY%ok-j$AoYoS<%r$^7 z*ftP}u8?U8C9LH*q=+f6B%}z!pLOa=9QJFi#mQ?GFPcpV~vB8pt>*aTIjg!lZ zt4GH=J0+hjS1F=dPkC>_LgKv&<6IKm8)Fa$$g=>6E@qLes4c~GkX2QZE}$P z>!rh}lJvh~nUBU-<%i#?GgS0W=NxNr<4ljl4QehYmY$oKEGbg_I0ZtqymDlIr z`5x#yMzB1>N8_|)iX`of2iJ8tf^a5^@yL?c5jrT- zM=WQT(+6YgGY2Q{RFAf5sh^Fid2Y)~&lX4Wmze9!v!TQIB<`(+TK0h_ID-Ps|Lg*g z?HY`=UNL{D;(dlJ5i}xquoQkp>(=ab`x1llPD3r%1=6h>Hwy95fOtd68FPAfD(vS+ zNE}sA5A*WWpx+;JTy2;Yi!k`dC(!{$Y@fEY7G^zn1Hdk#RqCx_* zOU$l5vK$cnX$TXkGA0vUS*~!=vKJ;zg>nvZ?YorH$q_y};>~L5<;C8pOIFaJOr3g; z{#BN~KXpp$yj)Pu87P?MgAzzCTn4eUj!&G|#hXL`swnEPD0u*hk-9w;6~rMFZqvCr z+1qsCjp>#JJY+#G^7|Le@s?uD&h9K|-8Tbx&r*Y~{Gi#SEPW zSpihLUn8hM)a^pN#tDlwz{|ymCqJn;HRK84ws$Q8Vx&1k9 zG)%~Y(ib31A+VzmyPf}>+pdr&Vqe}asCy>YcZ|5M_66HF%&uq6MT&a?p&GBwV@3_X zLo+}FTAmWP*~~m7)$@mP6`U{or3CYWxgDjoaS4>(YLI@bEoTQj%v)a_(T@M&V)O3S z9kF1m%~mjFve=lE{i0uO+?FqykvR9E7F}9T?&sLUc{Tg7MTqL#!i!m58N<8*3W}t& zBX%xMJdGh;de1LWt)3iGHJ)?rYuKlrP2v>9@cHz`qO1E2FZ2(8UN zQ66wd$G_dwcgw+|Mt@S|n;Cs~D^S>pG7Ni3xE=RcW9s7+w&n-LQp^vjv_Dm;IPjG!k=Z+CNX$yx#k~U3?lF)4AZp$CCB;fw z$1G3VFr=)?1w<&&a!_S6D(VQxCeRvZFG9k_yy?ERW@Qv@@-KsA$|{)gv29sSMDS+# z>Z6Uswl+^h`b#tfNQ|u>R^83fS?VGHL_GRoo!V7NiRz6@CJcLfS9qfj5<4D2*;y(3 zGe=8t=0Njw>zN>7Q>gz=64pQYgX_>m9wbwo6W{YN;R+nFGM-9xudIE&Y8-Ld@y16! zx`U+7B;TZcz0}M`DsDva9We02<9ukD9U=KwX8M( zm}iQFQ_PmJd9qN<@Mq|3gVi%?GuSr6MOd?o!ZTe|p%O(tu1HSyVm^c4&6?5Qk6&cL z8D3oiW}tN;q*vc-Pw5@8ep zAczD+Csc&Zhp+*qpecf{`g$b^B}#ww)}dq$TED=<&1`0>9 z2*3%IC(p+IgqFpFS;@bi57GyPahUy-dJ@5q^=tRhzMy@b3&&w}kW4;||CWty0S|l5 z(nVDeWP}RK@{RzPCwx#Q0LVnx&&#|KQh38UU_r)fDgPtwOxkKDP0e!PLx`g7Mz3wr zz?+-_`#wc0+5yMy0qD`dN1*{H;Gip^f}4<%B-x<*_JD`(pyw5jr^lde$e?$Tl5^Ie zFX5m=-=N=P!{_ZmZQXb;zVK(vLqS4A!SX{PxLt!36;UPm2DMOJ(Ls5-G(S1WP zGefal%I+;NFDm6Yvf)J5;UuBqWclGlE96(J;WUro^pN3<6qR)Knykj*?7rcgnc=5< z@o!hdd1&AWf@~z8b)-OOq)>7s0ya`?HB#a+QW`Q+7NY8xGhE>)R?#?O52SXd5_-3x zTHKh*Z8uQGI_g#>X=|k7RZh%Az|aOutDj*qAP$#{>ToKhQpD9PSOWoYFRRgz!+ahANOr*$fy=aPD;cmsHk?YF>6u_@k~%<9o0ugQaha4WJSeQT(|SgI(lvE) z8StYvkTC*4GatC;7}_Zx$ZgB|9EM4DhetCX%4i0lxnrS$28PsPikJm4&I9-413A!7 zc4!C;HdH_<40BI6NLn^5ythhT31yV(e(r!2yn(a@i3FK6%)igk0~cG zMY;kY;w$y54YY3=M=u8+k%jL_qVQKR16xpZ%Iw63nj(Bt*Q}))NKMLrESI|4X=9U1 zw53#^SgG{@UCW_+kA*l2tXK=7So0IltS2acV~mku5_@a!^}$72CKSvtDD2^sB)_M~VtEi@IFMAhMaQBdm6-8@%aY7TBid|1lcVwahEaIW*pm!Nn8cyo z1PSI3eH!CWO_FK#WvT73nMR;~3)yVsS)}ECX2C{EbMDrWt_lVPS z#6(aPR20LFwO(aK zvzsQ89Z0_n+yT9X@Py^a)TMSklMb_`3O|z;@~oEcOXmwFS)Ff9yG=&*vZnkNJ@;RB zJM;v-8g)yFFs%*b;AmG*ZVSHymF7=SFJKSo#nW#a>PHIZ7>2yZ#^;<5oEHk$fB^}Z z>he&*TqvwyP={Grn361zZaMOq04|<+aK3A}hV45o0-QAT9lkuMDGbVECNxvl!n`0<|t@@0OI(i;&k?=aw4B)7Lb0p9SVZSSPQO6vUb zgsEv|>iPh;=_T=6jl{|rH>uAM5$I$Z);80zIPM4q;g>%Z=C@+b(xZqgLxZsC{@;hM)4Rj{CO!Ii5Iys!eWQR&fu!aVV* z*WZ?M!-GUoSe#}-16IMJpr9@+i`Q^~ym#1(#`(b-uu*gvI zM4jeje36~HK^le|6ipMbkzXActZ^%tB3zTMi=!Oyrzzv-Rpx9i;iB*mQNvv+3sx`G zW-}4%iToSpVhd^fpdph9jasYcXIqMF>`Qt$uikAeJ>j^oldS#aPPisH__See5mL-y z6t7w3oLJorfr9TsxRkXxQImVtL0|OYLGL#F%EmO=sO_jmwRxCy!WtoL=97BVety4915yMS3<6$;-er zG@^_1V-Z__zf%61m|Os~bQ!7s8HZR9TG`%KWF4$0q5$`#R<_tr6xkWVNm=hbH6X$$qHzw6dwEyU=n{(ygqpTH@DghHqyoKXk@~gIr0}+aUZRB3H z;a7{NS2(K0k0+_?VL&$IW47Za&&esXP`3lNK*`e)MJs{FTF=ulvHD1-*`?y`5y20$ z356`8JTo6z7rE^4!Tua5e!gp?h?DG*D$TjPgJUN*0~FVsu=?Cn-j$49Nyq9qVZa6Q z!EuC#n)<8jnBNgp`V2Vd#2OF6V{q$_bDb)7Ns+psd7t+}E2}}z?MnPecb0{E?}9`0 zg7C-1O#cPs!v(j&nNZC!JKBx^l$Ni?g>laXOmQJV$wcyo*bYPSZ&_k4-x%bDTYjQ0 zR=Ms*bB-$?wflbOdWbVIlk!g|y5Vz}CEl*x_b=Vdb6rOd};&7T))G;11V5#!ET zF#-7itB5lVkidZYrr`C(KJ>NWp?Hx(InD7mCOr&Gx= zt{fD{5gMio!#VL3)>@<0=eVgUd>_<5#wBbR`+c=8xl}Fu(%!)2^X<8<=-r1O=aNb8 zG;?fp>YC3%H^n~qpYYf84abQWtm&${H2Sv4bpab{awZ>Li-$j%V_=($0paT>q%wD7 z=GfeU$Ky@&`>(dXqCZZtr$jo{ecb!c`LKHUFa6)*JD+cTr&rWGe{U+U^gn*YJax%G zeHVDTA>msk@%Pc@?_Jo(gI#jFlv5i#-@R4m^RBwyX(#H8nu&x|87PD#Gq;gO2p7uN}Yp2uyHHZI2CJzfNTBzze>)RGKp#hQ{r z-cAQmT1$LzSD$-iT}v7CT&+`dbFBZ+?bl_BJPt7oH|9w0`Ox1pPu0)}vwQ!{@w00-^tANKHO}Zh+CMWD zBxSj@zCJe6`-}Z|A*PQzG7A@`l;b|<- z|Hc2TvdjRu% z5j)=;h^NGzXig1NaH?zmPD}lxdqE-?yWt-(-*x*+qDlIa-DFY8G!MGTQNA`YU8ohCVpZ!`4(?Kx|1J40na5Jy55^F;VJt0)U$%0z z&L@(W>n7Bi9QhF}NrnY}F2$&jsF!RQFu=1pC{{cMp~!q`KwsQ!Gki3GXy1C z*|J3>o_$Er7%?i%_1erV{r34{p)~I+fVwR91rUhAbPvSF$9Tlx!gz`RfIen8T|YL< zYgKMNTVbDeQIAS7??zd_W+j_MRWoOGuY8S=W;k32?(|vPJ6=1!U&k)nFto(Ts^7%K z%*3+Q)HnaVcbvIZk-4*{MM$z`WR{hcjZOZvZS#O_>ySfel0$TkqmzqcNRd-`wX;9s zqvubTFTt+g+T9|)yZgtvrxbd4czVQke+n=13d!+`&+$TAdIv{&hb8+~4t$RN{<(Vb z%NKvYZ&hE-g99v01C>PrOPYh@vqD0`!jfykvI-+y93ztkqN8KtOB&*FD6B(WC6_oa}D}*=2P(?v6Q)$egb6+{&Mb**AQzZfIz1 zX#3I7+1D^Q)3CJNuzB3Df7NJZ(CB90*fZ8Rw%E9E+}zyOJiXC8zuF>>)7sV8Honxh zbJE`4(cVASzPQy^Q#Z?CS2a(&>r~>1s#(9GgKlHgpfP z^-gd0wYT*>#q@ID;%49KVc+&;-_dpdSa<)$zk$J#fzyA3-^)i%{~H|}7@b}jUECNw zM~~j2$NKxn#>U4sj>fhw#*VJWE^fxBhsW1^R;**cmzyq?>AT-bS7{5`w4G`o0swRrrn^b|XnOS?x)m;aX6 zw^otuPf*L%|IlkwgPY4sTe*>2M-N-am)o0b+uJ+aSC8BOp?CHUcJ{aTmb>>ZulINN z4>wSUd)r4xCr8(hNB^NuPA*O^t}bV%uP#rnuCA~CUS4-LUr!BP-~7FP{CB%Cdw2Wy z{^a=nbm8ye&coIA!}ZnU#qqz#D>NGYzh3_T9UwGD=P`|PEuuRZM9TTrn~%OX9Ll1a zqg+?eA5A4_zdTe|I2g|;7e%X5Uo`CZN3-JXaDDM;I-li8j!Hv`M&|iurkWDphk=~) z`eSzvetL;K>`0O2^pihu?=xrBT-BzE-<5_9_S}D~2w%EO$k^di^3u*b?oQ;7Q)oGL zct{crIIt=wvo-I|X9<4*Z=oo)2Lz%#3L+U}4GU(x8N)a> zBUsbQ;F6O^bE6iWjY;|}u~+qjcDn)0LxNd-R2o7}&!3yTtg>R6rAM^P54`}@6@;^O zlIa-mj$ZwWe%?cCmBTjKGN&q33bNWvHw$~Qo1yDBpZr#i$ZFTaMxt>y(v~@dEYoAw zZZFq+w|wv0mz({)yZ{`|KZvIS&!7AVwu-Xck30u|3KJBgv^7^?mixsSHWm9NIq&fG z3oi-DIAse}bvb2^G9)I;iR*l)DryJNoRyV?caP*=4 z0DYx>?ImN$kyLS*gi*y5$xHiMxD0`#%&_O-@sIT|2d*FOCxQ!bWEBG0cGP@$(tbA3 zUJc^9a*Hdv+pVnWa!QneVPfENogsmgjxLyZtN}>q?aAR;FZ4m&UUTp66|$e|L)G~J zt(PQ553bdeOCM{xV|}E&wqxBO1C~1SC!m+`tRLX;76TKPa7rUf&U&jMogJ6^N)DVm z3YGjr6-)f8{O`gaEvGt}fN^XwL;x1UPcAGXaL1zn(M#`tHFKtv0q5hmx^;pwtEl2g z`d0OsE2$-+2CZrLIltRguR*i`Y8e-Em5}%A8qpmp;)4zNWhdeAwm)ua)Ygl-E3sUe zrMq#_>8!68ee77NSQ6{%;gMk0yC%0d%{+kcj9}lkmFCg+hG*9^A1G_PpA?ydn9tb6 zFartMB5H?l1gdI#aPT-7g8`Z@PM)*kYihb8okImGLhp}BHB|pNCPP`?_w__P4{anS zpvc<}?0*ruO{~V{Gqi?7v6C{5!*aNHt|Az72V?;Zfv)R#AzEfYUa6@tk+V%umRb(* zhb)=1Jf>98d^j5liSImIOuRc3D!RGb*`g5al3@v4xfw(n0`rw(YH6_Q5(v4-Hpx27 zfE3KO1s{aU$SFHCP0_koQ6KuSUVZr^ZyypsEmI31@>Cl+cH0Xef+C{u`CtG>1P&>e zImn*z$^Sx0Q6Rt-kBt$FCwSzG&Wc(7X`bfW_!X#5z0>|(A0Jl?NZr%bAQuXIP zI2PTn#fE7QnZj@hlH%U>1(Q!PZb*5{h=(}Jg?8A=vHlKMZObR2_b|hy)0~3Qi4^*q z3n=j}W8v!yfyh3ifx&J6^hT`K7XZPdP7w#C z*iVd;cseBxCGcfJuZUp^-R*-smkq}lN5w_4z6$P3m!e26`FzUI+Tt>B5&?^%TpI8N z?)T<%aXRV*|ILSxyPIy9gyAN^<3rGkB`Dj+BXh+!_WgR~y-|usTeJ&BYQexjYPNkD z_lSHdnv%JC%p+$nEcjEo6@~>MG{?HsMUv3Mf`MZ?IC2s6M2J0%hJ0>(2O4ED>O=!9f#jPw<>rKpg$ zSy<%*Q(2v0I?tE}kxXCc#!=Zy-UGza?a)bf9ob(RV?VjpvSJIdbJ z2{voT6;sRqwzUXN|8^eZXJsip89`k4P_SX}>S3YqSpB7t_Q41dkp2=jXhlFZhP@kT z2X1`NbwmMsx6K49SXL6>oh$Unc}e#$97#d#3YL+_B#T7>IBu9U;b$@gUtk)%jF{rK zG>_|r)`W5Eoilpoq76<3dP0ys_%b23~DYPTq~SqzxHY^H1+G`Opb|rxpL$@kECp z@kI4bC5AN?k#hf?(xRTr(ds-fnEX52{@-zt%t>>|880)J5MgR*~Im{e+L?n z!q;W~5V}*Lq=@If4_Q~O<=LI~$9G+oYW+JfLI3Uln0oOu^xyI4uX-z|Y3SxI>8j1} zTjM$W*}FN&%MY0Z1`X8G_j_9Cztdm;0nLpi`^M1!Jv<4fZ@&V>0)QYJ?h-c95=-os z0K)kI@ZDEjF*5wS05Zcs3hzLwj6gtyb;O26rGSl?jSqZ^OVGwArPMOzHgNvNnzbzO z$*-8tHsEWrPh5~_qD63hcyNrUkxXH*Fo#K9Y4G^EE8YfC2#f9?SV$(h$yXt$oU-U} zf@(^rZ^CA9v_)ujX|QmuN_!vZ4-|$$M!;DMQ98quK}r?O;7GdQ7o-s8B@iHju_d1b z&9x4#a4gOQTt+C+T~ugBHZ(pcG?F=@sx&z03itrWQi5YiA|j~K>#`4wVL@a-#sF+3 zB$gHwCP6>2*}jK5;hCtG}DX_3}u)Br>C=EW?G7fVG zY9WP$J)lINL?fn*$}glm(!FKnxG9@?=M6c6h6oH9WAXFl{HP?Rq4uZq#I=S3M~1Pm zyC_g%WE~7wi%}ZHs_ugX$?%0h8>Mg;q?DjQ(pD9$nGoXUc!}G1Y)pt22H=TiPdr7a zgke+{5JBEez=;76M#^C&65J}2Q@?npBtjl!8zzYk02(4gsd8y6=iexO$RY*0QU`k^T*^r! zl2bIERPLb6;aUthlAyXNl-fm`1PUZ^0dfWaTWc}C`2af*m^+9VVVK^78J?vWlwm(| z2Z_ar#3EoMET95<@IigxSXfU*TR4_70?>oNvPGi(_Qhzoic#PkC5fsv5J43E(ak02oW`#s+GVK50)lsW;| z#RyD*ky8FlArzG*d4|1ohOJeL@h2er0jVyGj1j=gWXH5Vgh5nheFztQf8X2B*+Gwc zbqUP!sv@z|#30mAqBJ;`StK}*5wjEnP|Ao2&;?=Te=|(WJVRinF=B3|a*KU{$99oN&;k}} z0so%CVIXMpa$& zf!E`HPpwU|^`*?}?S z*qCSw4!K1@$kd?sFfdT2?yn1E^q}gOFXXqX6?0;(*0WlWS3a9uecF!Yepb~HehsNf z9d00mzr2nXy;ObW3yC-=VmOb(eO1h6Qh)G=kCVpo5GizH1{scOIIke4KCB(XZ@7n9 z-Ju%NBtjknO{dJ#^LxSLu;4E}v0*IaoTDE&4&!Cis?^;ZqekksFzWc#z_d_p6OictqIJ@Vrxdd3mGsn?IMd6YEs-he56q zAUEhUut5MpUponz8aM%tzt30?jBXDO?&%~Rt&tZu`iNuIRf1vRaMt9RF!WPd2@4Vu(rIRF;7`}FQ^$-}k zELyLio6rvJ9jRA&NhDT_Cp-l%M&PcQAyJV??WkVZVao#ocJzb}wR_`b9~q&N%K9m) z1Lhi2OO&qLeL1g!eI=V1p?#tJhW;;%vq_Hg_nRnIsS7dZ+(s#Sd+l_2>AEwc*ULCx z=3#Y6te-PD_qI_N5!eaaNt{)^_XOqT30UPWq{kR|o&g=wvo&60y<`==e?i=;X!q2+ zU~Nia3By{*rEL^tF-*BsPT>|9yroQZrBb9zV~7+ogm>oxVNIj3hb?J}-^1->D!U~a z$_CQGI<8XBM*gx4Pm;Nk@Wm4F4Fc+f`H70n2t47v!C#1H zsjNiUOcW`C=X1vYm3H#xBQaZv?v+K0r&*Q~ICo-9EofTD-JnwHdbzBL2wH+5t4P3h zvRai2WmCenoGU|<+#AO?S2{3)Cxw@L6gj)}uH5jq{z+Ur=Oq*@YDNXuPc+XxLMEY) zJrici0i(hmTYf&KzSX&Q*z>CvGK|qHGzD(11^<2OB7`G9f9?%?8xeudfmZiBjJwE| zzXAV>1bbu*ezuvBlO6v0bMyouXu)_j4IBksG{7p0okMg)-#JL_AX$cy(!=XS{6(T^ zsnY4;rY_y!eV4{y+2ZFtt`qxR;$e`#FCo&XLBsRG1eeAbQ{vT*-Z(#K9c*Uokmy|w z$N2&WQqPr%^-;>8cwmnB+qUY*xM}+ceB4Hx1Esa3BUKfDwm{2RrZ#bc$?cN~#T{ z(^dN&E}s!a#x#e=G)tj90Sw$?aM~!VZ*GXi`VD`^oeMf_Um}@WiagrN;wOMXG2!$( z#OoVO^q_Q?9m98L-?>|6TqGC5$-7uzc!l1N%RNg2(wqHh!Ac=V(6Lb-~e*I(YN$K;Qr1 zKYzT6Z}`}8#Kp4QyKeRkWF%F7b5cgC*nQHR9y4`NqO!g)T_ezW;jolARCPapcT2?y z17e7R>)NSyRZFkisNc$&sO1<*B9E+XwN=pf-(Ras1D_5|&($eXaXkXCJ>X#J_a5Zx zVxWbs0Ok1`Mu=DdL1sRr7>Uj~6XdPBb`M-_))E3b==T&a7|Mk=ktJiVkJPzjnt z(&%Kl59JPCL=rymOm@nP*KecJb=wVJL+`L!mTyqHPs`YW6>drGQaHn}@dl5FGFjvx zuT}SWMEUf`q>-B`u3eK=`w3Fh(-@UEqn`R7NqTEHj3=)lXB!-hL>XsmY+#W2S3F}W z@DDaItQ3M)n7HRNSSEQo22f%c4WID8!c$Hn(0wnK5-wh0XR^Z(DVf5V_Z7)f^?f09 z_Nz|ZoZ?SW=Rwf>Q$CxjdkpABk@8g2WJ zC|OeY!i?4E*S1Q^3%zQq%p{h6%wSYclpC5GvJ#L}+=TWIuM&cjyG>?~NxeTgo@}yE7W<8yF6m85WB+H0bm;DSh zCVI1f@R}k6X}W~$h~Ia8`Q;ze+n{o`6>{vTkzEp=(;v->_mZ%uTH}fBz!=YFy4W}x zTdFbFktqn!A|UszRo#O#pgXgXAQK$L6$bvTzQZk?A)f|6_|r%8Ax z?Ce}>eRgqc?t4=XyGk<_cn4>Nd`3-1<$Kd68s6ohIU5l%f;{3KON9!Ugl+I&l zrhk4q&nC#=uqzsEVCI1xRp`}euZV_qCz3t* zq)NMkh~LS+#1)zvu>wZRQi(HXO=kHpQ>fLhA4F=^dRs7X{Qet~Xy~oH8zDl))Qn@g zbXSzgi=T;0uQ+19P5SO)h=qd3GO{?<@M3*d|6Ne*4yY-syMV~c?}M$T2av}?~s0c|GYVtx7n^YDSd6cFxJo4??-_M(a2ULdsc2b9oGo4Qy%a9 z{pN44x<5(8g_cHWz3+C-{T6!OsWu;GCF}n=(o}9(Tj_r#>InkBt2GM;OB6h&TZ9pg zD$&zcskG*g{Ia`aV&@i!%k3r=est+0HTdE>K;!jz-uE1MH|1VtB)bLXp|hY6`j)T8 z0H<+06XoaQ|MU?m?S4P6r|`Kc_J>wCDS`W?*E)Qe;Dzb@M0ta3Ta?D zRn#ZbzeYx`(Bz&e!E{fRjr5xhqK`RH`VKQ(Ubn!w?EpMg(=3v@62V+zo^Y;_NJae4 z?l?ox7UO^TOuXK8@iu*SGgSSpLgGQK%zSRYK9RjbaYI_DRM-*_eu z7Y#==em>)+`!!sZoSg@>h)GZE*?VX3b7QPaPWcF_D~BBq#p+ ze-wDf>c$+sEi}=0t|9 zZ!E}+%iP+ODOy``qapW9ifuD7^%-ZZOjbi4Y#tLz^_FHwG_icnJ4Bwx!QhJ*FBI2H zaeq1`#ol+kmn>k4`C!FDt&_{iUq2OXTPsV2w_|UBX{d`7y2{v*#FNsb=09X*rM8Wn zrkL7bYoIFPwll|7MhMY~?l3=dwot^m{prZMcb@m0yHA?dB)9>TifMf@8G5??Y_YsQP& zFMrIcd9QdVlrbo>|L`$X7;#g)zXQ;5ony0(MNvA50jzxZUoJG6+rFTkBc&o*q6o`1|gXsOB*&T5wwb40@;8j|_j(p1~^HL~S_GYGsEBFhO;SlE>v6P8u z4*nQ@IkKCj#l<3X42x9@)}u`LCT>M)m!`Qk^zpy2$&DTs`c*M!{kp%p=8~xu9BBD` zkK9M~RSQrltN7t3ep$$%qZfmbtTIz`B5v97)=$NlQ{p}A_J&pm21_ghrj9ADcn<;t z$->O$gJN>@1@p5;6Zi2hXtZqE_wEO?T4L$x)kLZms8U&yUEvI&A|e=!^yQ7w%m;ip zwlsXDqtXA7sjm-`+Gczc5y(NYS_@36N}IQ$t$Ei9kItDDsC07LQp-c! zuy>sSKSogSXo+EWsdDU2!YJ_HhXGo?@tqb$-aG8q1EKYJM<%ZN7yrfmkt2ha+5s6;onXMiy3g~$Xt7!6s;9_sCcpw< zhu}-|BikepojA9=ngYLO9GT@nN6Q%ad+s+se$g2iGU{)ljUrXUHZ`_$SIpSoPGJG9 z%g!o$*y?0{zZx*Dc%#r97{?=n`@=|dBXreQmiS#U?`!t(wAQgB>K7>HLn=eg3aKm` zAk$|_m%Q13OQGGlBpidmefR)g zF4tyuc`SUSZx68#aflQ23zsU3L35d+FflKhEdRc*dZ?#Di;S5PMZ?c>76f5Cdemm^ zmy8p7Pdrg$2rr6Mq{r8;i8Z4WI6ga{&-Z04`R z5uI%jBrF!m!FLfXwqc2PnP&GP{-env^I@`gX-+->h4wmG#LFq~XZ46+x3e^#mY9#fUIJMtfBffP`ch z+#x@Wa6gyf_9M9KB`Q8MztWIYnD%ZBC>N-PMF$%ec!&!U2~j!+X6g&2iQK1&Z~&VU zS{Lur-nP{A)dP*cWWIe&6VWChd4*jkHehws9P&rp6;;nHpUk@+=xo=eFGInl{6e>g z0Gkv4^Ie}WN8C5EOZ!;?;?`1gX9cdDX;yxIf5LmN z>s;44@AEwOJ)3(!sjD{dcWuWap!UMsV7+^Dos%{jM8eaW-wC5B>oENdJZ zyXM&<$zXQ}jqqEECGT2w@LMY-8JlmnjCwvPkg|R1(@1O{{dqNGt<|uw()Qmh;(UFE z4Pmrnj4sq*C@_@~H<1x;$xQS_*4SE)=i1puS{DOHlMxvY42wGp?M_cwo$t;#rDt<+ zV~j3E1s>kZGi=KfCm<&*nLlV_!z*@km7{sBwqsYwYB?FtR%{_t+-EnfZm3>!oq$XS z)x?#h566$*t+D%*VDWj3@5{i0xM4f1N!Zs&2hN&(G8tu?lo3y|GLJ=>D{A0zxSsP2L*kg45mUtuNCo^A+b;{t#(uBSVIyG zd~71MgAO(%wRDGpP9|~ofci`2xApf5WB4S?tgA#TOQICnZw%m)wG;T-;RD{6rV8Ss zXZL`a4>aIKBigGhAvcH?B)oJ`4~JLo79mW`?cfh(#Sp5prm_VA$+!w}Kx!iBp;=)QwcyP75R zT{fp|Qupc}xDupRk}Mp`DedZgF$Ok}_MPE2b)R>2Pn2^%llP=!B+W=J-3J4;8*|k@ z|EioZ8uY`1zr4xbj3@RKU#{4UwYPKYfPI3r=RNT3C+2KP7&b2-caR~+6YC;y^zV>R z6sb077HjKq;csV-wo_Ix&rZtV9iLtZ`bDFv*I&okT7LH7pTa(Kt}x+M`LVg;?kAF? zX{#`AwzPMZns@cF*VTz$_&%>cNe)Sy(2i-vKUk@LC8;w6GAL3?mr?WIn)mI$uTv}$ zhk5RD{-t=hS6!mR^B%3pmp9c2t<5Fw8VqdwX=vX9Dt$$Yp-c*GG0K zEo?XE{@ZqDQdi7V(Y#%hzS8V!=9^>4xq{lUx4vl7dE_1E;|Dy%D!lcZ{ax22GPnG9 zC_4|zveWF{h6aS`3U`5zWkR#`AeMR%n^y3-XOLC5`7q4u21a9K4Ajh$AyY;d_VoLC zjea=I@#zNbUGv+6ywmqg+k6LI6;2OfDgPB_W1ac>^JX-a2D)h6&z9c%Ah71G%n-zJ z%N%F|Yw~K}yLV}J7oy&zv7RfRLtlM8cR%XgeZ_i46{=e=twm2H0fSB0bXn=E-}rmN z00RvuD`Y5VZ2m}>;q~T`_mA&|I@JR)o^-5y0A>xaTl;?R>swol!#Nrj1?7{!k1b2$ z4DeQkSh96yn@C;@$KNixAW8}9++Ux~_IA(l-ReHzKlz3%;d?F{>+=& zJ}71Ehhvb3@6x}%Jn@*umXuhje|98(GmU}>82t*sQyCHUslS5*e8e&mC-7sl7JvL< zXw*ud%Y1l&$_KLy#CH0>D7It---7SaN0G}v@F&fusO}qrp4T%@amIo?{r~=DBd6X7 zrwiazG9;lns(1Ph6h8#q>DyBLu#Yv4R7|%=FpXP5F};w8Tj{Z_8K%7Qe;ZZPPr6{aDO*Fdo0?t zz;j2$Nb88?vgZZpM=-BJ+NJRV>CoKS5?Tr3pk2Ilz5IG$tl9mSAJeawMMFa~&DRj8 zc@!7dK1YU58$a(NgkF*UbjjW<{lcf1abJbD*Wf?qS09CY*@u-2G?kTn%0GFiZyrkHN?xhT)t&ylof*-7 zsps;g;EwCpwfRIQfkxE1rXM|}$5M(*0a>Okx3BR?emLb+CiA6ZNT5St{jcRI_mf{_ zd&)a$l8aAM6T(50qoh4&zGy4gXlap&UEaSD(;WHrz~%7g=J5X0fgLl&-zr1~My{KE z;kdA*Ns&+)>Xo>y+kyHWA#|n7Nue5=pC;=14(7)%r?`LSjL-5Zow&-u^<5b`7kNpS ztt8S;csKv`{Vj)y>l??!zmhiA)2ZRQ(8w?2&p-b=efdMw*z`t;eDv0bcRS;k7B<4a zKf3knWc2%z=(3>=zDv<^@aW$sJ$6JktaqZnxm*94k7jQ~|N8e0Bp6dE6$8BS393;W z!HoEO;R(;hn0H+jHV=pn@!EdzI??fj$6LYGg}qWi2DiU| z!Yoqj;tekc7~YOo6j|wg8&45UII59w^hkoKLxTM{jI5hraWTR2a)Q;31nc+l#y@8t zI40P=Pq6=%;Bb&&b7O}(pWt+mV0}E1tIo#NFVQ_Z(c@yG=j9(JH)F+bC!Qz`|2+^p z^UTJsC2nT0%kRK~s$l%!A;Q-oGw>|TvnSEq`sWqa^JE!=&?j%UFlYP)>%v2SX3%Pb z4=k`xZk%d^J(_)DQ|I0A4j=cCud()ZtSH$#M9}u%&m_N)v!YUog1w0vm4H9^l4DYs zUuU&+rF2EVLxU~{e?H4}*v)hPMMa$zxd+R0K6?;zIdD1bS6d705$spu`y}3{O0}Kk+nLV;}@FF(Sb60z$kxi|9ZFX>_UfnfXwW}JBsYcEC@VPw`&1qQ(q`Jw6FOT zV)-2^Dp7%F5Db#2nnsZ5Zqp{wPvI?s7qj?~kssaZ*JR7mWfveJEAtMB^r*5%eJ9Jy zz2!lfm%FJ|uR>4D#(4?D7zDGNLp*)L!u)|;MTRFAK)AQmlO_@;%O1Hg8(b~nksA5n znWXRkyFf3;9zxA8{)-^JGm6%@z8LiJR z-pmv?Rs+rkayO6bO| zuWiW==i@92Rl}$7_p_9K4fe$ay-|?SOopZO!EEkf-b9R5dR0##g(c#OtIHKKvlRqx zY?6PkWTl7Pkie?J-CxTf2SiA^ODuXKKPnBLOM&riGKK2EiqdKGAW zM&&zoaSNQoi>FA-(EGyP6!c*p9gwk2xUF8Di`u00_HQ{H4XXm2)1>^mPN#MfJ*Ux$&aR8^v)vWn^g7ZhO;c9ph#v=F*PoGJDDTZ;xgafSIdABlBsujKQc4MTttq2-E zy_v-;BOv!pWp_srb(_L76L#lv$Sv7N#f{OwvkI6F`y@hy%Q;C|h9kaGQw;A8$8^^k zBQTq|*9v@_eISuq`cEk)(pu5~L4fM6!ReWOmMJB`*_g_C&ytvXLraus;?SWKH}GdBwCd*uxjunR73v$yK?* zj;?iLCyj_RVR(@@W3U5{1Tl9@`Eu>gwbd2oOJ$2B{`T(yrK-|w`E(WYdkQzsySpx$ zZ|>?VveP8at;M@UbfT*KKFliC6wE;CYl^+kDb=MaS18@QcJB3L-HmJm<%Zhd^@R-$ zjpr0=n|gjLH#??FsI+v=zie!|_qj*KvSa(VN~_qSglgMh-{+>br>_l~+n*WaD78Pg zKJiH>A!J~^b1q^uv=cehq1G))1TJ+&rT?eigE;f%l*NZIC&+`Xp{6tuFVl{u``e#w zzKQm+B&9XB)gn&!KqL*78e@r#1^UM-F?~Epo0L9&we<t-x1b$$}r57pE!W(pc1bv+*#N_KCT`?i+OL2f#r8~1z176`N1Y9}2GsQzlW(t_HQyS$fc&;UAT+*`EVK+a z+HLJfHv3+KKJ===WcF9so`U=D+5|5hBi=avbXpD4ONR=m1ZcE1m1&IOruj!yJpLS*ONv^O&#t1NhZGT=bJ%(O05$QW&A}X`j zCqxR!6HNqx3><;NofxJv-XF$oxPVA!QQ&oSL53oISG|zWF{u|3QHJHtb2KwjH0BGQ zrOTbEF9@SyWYJPi8cY_*gx^>wZx|@SpbDNMEni$BI2ig6z#8^#`RS^7u{|oA{* zvCZh?$}GIx3xcb{==&4D()IvN=Z~z3{chhp&Th+zU6g!!cPgKum(MN^!hnUH9hqLg zF$cUD%VqPFu!5wReo!Y@x{51y%#V;N*g;L#*qz`NE82_|q64+uU~qnzi}2%J2nmhN zK83p?*u22e>1^wlIX9qYoPs22l405i94Z81D*BcT^Jw%(_VL$gmpU;f((s}otpM$G zt1*(N&{Y=I486u0%54n*SWmBNWfw5ixl+p>Axt%>WC5dpx1~PlXYffaW)~E8*2v2> zXct&bP%rIVzlHgr`6$tP(+-7yK4FZ^r!iGwf#*4KP>Hx~redpcU9C5pSW*D5#x-B4 zODIGJEm-SxY6`Sh1|zE+8LBaOanUSpEdtkAL|p>niESORwYvZtfQO16ELeUbOgQ@k zO|I@$nn_%Dl9App5#5`Rv!JpV@f#*0;sl8J3vw2zjLl~gCMQ{PcsSP5^*$z)Ka+@Z zx216R)_)-L@xrZWRs1C!ZmPyqCf8;M4pBVF4fD4P6zk{zZJVxBwD=^X83C%P|KRgf z*~e|+yXdH8zoi}Wt-pHzO?<3Gy*co*>h|Y`>g*@_w8bMm+XC|0SlcGy zGpT?KBU+!-Q=aHa3~3&n#6hpwX$X5_z|9*p?yW)Ck;vYF3C(_Z=qgB8^UeF)RSUqC z1xtw)sU?3Iz1l~XAl;-xVy98J>_HZYj^mZ|0H?h$DqmUC=3lnb_2uk*0AJk6hAs zvk_J*RaL(>ylhaTkS9;tGQaO%i>02SBk+!YO$P_PrNJBZ*5v9kEQz|~x5%3(wkawb zsm%~@bn<302E zw&eDOwZaqTvb6WXD!Vknm@M<%-p^g$eMFgW`X^&7Pgch=@i6L)=i8iannYNoGQmV4 z3~;lBLWfIu0aE4j9l5pu&=-=#78xR)fv3*oJeX9!27(sRug=YD9#S`HCAZZ;(geWd zUcqBAI+E%AQ0?72ZNJQ8emid0cI*!PTJ%6iCTwI4Q`-q9;^B0RJZ|?|Yao?-hdzXKQAnD&Ss)CZ_f<3%vK%lGUz4$^ zeUbCfo3D=xGB{77GZcGfOsT1SVt}wchByI)|3lvNV(RYZz-N!tpJyROL{ZA3L}Nc8 z?}46NevO)ee>6XR!@$ma+4`PSu-0B!Cz%h{*ReXHU&GW!LJMhogxjU4M zSI^SKaK67AZm4ug{}+7l60+cFPA-Eu0d3yBlCGn}W~d*0nId9znHML`hZhuI_yg;T zaMyt_y{flfOr$M6+-X*e5R@4npuo?F%<@L@zS2OO@T3HOgK@YOWt0V`!@3p(hBMw? zOC=`JtOA(o{vhbAALZqY<_b`NzkKsuW{4N21GzjUzHE)Ho>Gz(vd?$byW~ncvFldd zSeYu4Quw@+i+3I1^3__x_L+MXO@#2$;2idD;(N_QV;I}&--5p)XECh*8Y@1K^yis3LIZ@yX3aNO+k}g7dO%a|`hGQqia-3~N(vELVS3f|rg6E5<}HQwCFscyV4$ z6NyM6nTiz;ckqeYn|w7C#nS_{aWCs*AwlZ>T47w*HXY5}O?ml&su3%y!@^-_fGW8k zjvtQH0!kzs>-HxXPu&qy)B_U2C8^Y#WD&V`8nXKk#P z;-6;=nw%9hr@fo29PCyLBrFO2X0ugVL@z$_Q2&ZLpS*MmS5N-z65-C|slCZ<$*`&l zQhed@!c8#?)HQ>$qXEed1v` zR>pX)RLol|vor3xEQMQk1DXV`+i;_rUhHW)JBhH5o@9CmL zS<64G=E_t7M|jykew5FtE;;(En5Mh8E_bzrU#$!79ccLF2G$?|Uq_ns<`#-I9#nLw z1JAJ+5wpR_PA^v7M@&&;_Uo(clGm3+%W66mL1ziFOPR^040bj80*>=z(2;5y`1?`gJI zBph#|iMZJ=VFJzd{_Qs1VXRUl@4xM&(rqv@?d;bW)-;f-!q?q{=x3uB_#wY#_yvj8(L-6;i8t*{$8LY0E*}Da*1x05a$c3WaV@ z|9-SMG+55Co4u#Q%or-2#_(1U^ZckO#RQq#pej?o@os58I8}HJ*uG(@VcM5=t>}u; zr`W--Yx-|o+}||~^do2uuj&L_!zgFZJUjdIhCyS)Y)?Z$Wt7+@u*JN~?>$c7j|Mo5 zE=cQTjK4RVcsDOm{|_trKFyB8dy<&>@=;fW*@W*@18~`Xec3%yhfMEvJbiNn2&D?~ zZ>|}I-9jjG&YwTMRu}QmO@uUCKay=6b5BC&VWkRnV;$;zB&hXgPqcq+ujf|ew>W?* z_?xNXDVDg}i@ej$ny=civR2O0#RlJ+6#HK6X*sy=SoM3!DHdSyo`q>sfOs;bI zWQ5MxkY4z@k)`o@N-Cdfn_1W`xDV@NJ8(^)8SYWiQn+AImdZEQr_{5q{jf$^)g*cB z7DTO21IEBrx8m@JzCfV#M~=K_s-CB*K00-NW^)TDDq!NJx!u||V)nv#L?2K0G#}$n z%6-N)Iy1k$*GZnyY!f;g?QLF)KANF{R&1i5?g&Ma($+tIk$xfSczs-0GE zcaN*-ooM8R80?2R^`w{TPHn{9_>Bq%WK0tCe z+{iipoJ{DSZGbokbYy@_*M%NhzWIK50Y|v{{93%hbB3hnx>5}Sc*-<%FkZNlXofKP zcL~@Kj>GN;ny0dY8yKoZsvOuJ`uI5g< zrC>;z_`RgIOOxQQh%;!Ihg^x<3+}p*@M1i!hI)`HzRsnKqhJ$=kIE>5Nh%UGJ43)! z+bb>J4BppZTU9+F%V_2aO|{=<(mn=sq4g$G^=l(m?&)anNBUk1&_UQoVPe}Wx zud6(lBOB(-B~b;AWSffx^mTDzP~aRs|uzBDx6Y5;La)N^+{I*e~Sw7@QdoOxm9MO zlLWH<$7>j5qLUIh+pdI8)v(YTrzaI1bbhs9YHz1`(%F7;rX{{5v`FR;_<2u!g~de{^_b+ z5ZQHcHx;mtTzwAU=jBdIOC-Dd-Icc_7m)VUy{aNPT}8i)#eKw*zjUmr&-r{+K8P?y z4sfN&YDA9T{i5D40|sz-1YNmPl~>9iuWUfN0R!9mq@Yv+ji&zRvTj%(&!aB$@2BIf zKTXGd>P7!w z2{q(rz$YXN{H6ut{uf_ab10Ec^*HU_!7Ab!KfSBLoHXlkj%?W$O_&0zVB(ui-V z;$v?fi6-}-($>;5(eR-qTRvEzm_S^oF9i3S?J(eDZ-zv-Z~4U&=G48S!H3#`%r4i_ zXS(?kAR@uD`36n0n=xj>!P_60Mkawk{J3?b_qJ7)Q|8#3EYsrLr@aUh}*(GB8Nj!G< zUe9j5(#jS&WQ078TRpsk^c$&377De$b~O3t&Yn=1BYSHc!Z&Tu~P#X1}4S$QpV4 zsO_mYp6Mf8k%4!m^H08JIsaVgqZDn7$Mr{wtH>mSr&9MduPJ-=Fc2 z0S>QtmWI5Kd0HK5*{*6`Z1Za{=>5O*DSO{Py}IjgrQWH=`pa3h3`kB$9Yavzq)}E{ zsVAbjQRPnx&zEMHTqQ!-C9-u9*mv@`>h&ZaM>u|A`?pz%x(?7hM*%$DT19fU92Jhp zX7$%58D$0gYK8 z^eT#}mD8oc#@b^~N90%6-tN;hW7|{18Z1cx1pKiALLh`!_)*hBo66rx0^YC3($e^c z#LClSKLxthq|6RAV0`XN<${t%jg~;T4K{f7k-eHRG!I{hFm0?I1FTM3D*Wgiil^x- zEB!H;1Wx(5Cl2K*SIx>wmiC;>Hfv-KerjxgTm<^hw`VE} z!mJc6kimPwC69anAMOZyRT;~+IZA2T@hg7GlYKh>W2-%woP{&+HSCY(l^y}gXZL!? z#UWj)z^4yJl#ga_%c5*%8$`vX$ZO5-8OyK=%k2F@DVb)==`wz0v`q=hy(NsL=*-g6 z^czdc6gD7*WlKU|thLl^Cx~QCz?{6HGG-aR5tB)+R*bZo6Jgk#gr%#s83<3YMJ}*1 z)jyoX2uXaDgf6EQX)6mF< zN*yDonFe;+2c_$z6g?}|Yc|e|*ABOW(Wy@7zKCdem2E*xsm96QYdM~%fXtUPs-ai$JncDmT5Z|8hdl1*Oz?ePZ?b&+hxUl*y*^tPYDI-i}yZ5nN0Y)gx-V z4{V3A$_D0^d}Vfbn2GH=OQ|iIv~0t+?G}^Km=r!kw*rnvqWwTjbbHUZkm> z|3wi;^765QK$hqCQ4Ume7|*>?9o4$z zP|=A1!cP+p19cYo1S0k1pBA~?uv9zLkLzX+nY{lDt}olN)6qpN_?0FYi7-*H^Hxsd zs>?HT>ob}qnd7)iluTtB8#d7vByMKPXMKir`^a1qQoGf+AOs~S$v=XBykNrbgX4kL z$R+iP&)=5_HN1Q%9^_QgrH&YZ_jRX+=|}qe=byRJ*<&X1&vu!#l=gZrgyY5iYL+a$5X$4cK;us8 zg`S`>SI-j^w}$<|`m;c;e?cOuvkN?4jvT@C%_#N7A+Ep%4tE)$gg2Mon|=olhg=e9 zmYRVhSB0kNg|c-72-au;ARGld(cVk*y|l~sW-K87v|bj`dUI3(`o+BG)S$2$E{DIn z3ZDpsUUsEuV8W}Q>l32ll<#yS(uU}b_$-`21Yu?@Hsj1Xj1WL=sWhd)WcQXefLU#y z{sJXS2zZ;Zh1+I*v`EENZvI`aD)K{Bt$X!!c@1aN%GFHS8#}`X`@F)p_mELx$-O|? z3+?q3SC`a(qmcg!TgSjF+gyL+v4pe$0b%zmr4PS6#k7_`gPeXz-$O3in9^T*;$qT- zDlHe4+u={Yf@Jb1Ku)KIi{e^AZMOa;g3vU3H?c^xQYPi=!c!fqZZ2YemgvdNx%|mq zjD$vbx=w2v-7FF*_J~IRrCMkyrc}fhD3(^Ck}qYIY)Liq6+QLt3v9 zk+gLdU4M%rE`MjLWadNd?6BEq@4}2+>nih-b=s;Q4BP>)|J4QT!cFjGm&=RY}-S``lDD?9h% zxk(AdkRv=FVfgp?u0-@xzZb{K+!NV{p$Y0p(PWMb@hk*QK7)0 zq=Md@lFmNvPtU|HD|%d=biA=&=*sk;PB6}3seIyKBakwB9ranT^j=Y|7Tbr7@nWk5X=ZI@Vd*bt)8GWM{2IoU5E%(;U z_)WLokwJkIeZ9sdzt~w)CVUqz^1iVAgAR{ds!7L{Z2Ei6pXv)FkC%B--ei`eDOPZ%`<<<6tk@+kkOXl!+-%(Q`AmMYe^|q4)k{m?KV|)( z#d9ai2o44xI9LgaVgLej!`%5JXBA|O+E9^cO{Up)$1 z*wu(MmZG6OyEx1TLg5*Ks6;E~$S7)s6K4UB(+bnC-@v>Ow3Oh@C)?D18<29-yE^5_ z`on6)g`;7oJ`0w$o@RRYiC2X{i_#&U6u!dr)4c2pe`E!(vj$%Ge~rU|esRP;Jl*Ry zgZq#{vx32`au8dlVXNJn3(E@!T+a`?h7jJ{sw_6_5)U)dRC|5+IuyI@>c9P#ip68m z6BzP(i#du%%$s{Bg+}!3gRFt&>@O!}=bX@~iY3!oWLZhW1<{GM#$rEvxznScm;&|kZzB-5V0ElLqs`C(v)`6hVU7*BiA6pm&J7e;rHUhTs7SEA*ezR!Nmu6&WS_N$B>t z+lL7GN;dBq8l#GZdPWh-rgER*;+0?*Ddr=`)!UW=LGXx&BZ0Coy0>kkoKdPiKWEJ6 zojW6(Lazuy^f6zo7dZubus$hk$_p=L{}*G7Ji~=qlv^06!8~I_ceqZNazLX?qS=c? zl`7F}7QZp)X0`@gc?vafSfX7Z>c#zbZ4`W;b3qj++J1S3)T(gyimq?2V)N-f@3y`V zsT48)Vs8eHQQ$eV(K_EReZ2K4foa}7h0Dy;JgaKEdrQN(Dytc(Ci;y?HN}z^vzGv3 z%G95|OsQ`uSUClWXNyLV{r+v|rz~h6zwM)w1u*4gu7q{ZKCw0mCt0&l(N+A}ToMmj zHTyT!y8%$wyr|s;vx)rL!rZ8H>}cC*L+AJj&qXwuC8y5f+eYYkS?jq*H{e@-AHW7A zRXHe6TiyR$%tO)4agLZ27JagwD>O=PwOXZu4b*Vd4-b$KFdYm4m}?Pa;%+X;n_gos z01>yqD#q8hqZ)p0oX>tf>Rl!NXd1FaZSZCfk?XDVLZz^mk1g7vuCt+3y0pRu=wI#$ zSB|P$mFUmut@SivG+nczQ-@0HJ&ogSq=`R>=}^@g?_PxYXvoAw)=H5am+8U*Txb&M zq++{?!y?d=PbN}cP2!mY;FGD+fS#)>K4TTlTHq^eQfMqR_vw%wy05VFy@hYK>~ zdcU3cWa`S39pj>N4m-^SgtD*v7wf>Vn@$Bm>cUm(&%2IIcLi>;d<7eZ$8-N1KBB)ex{7+|n z^qwaL!f!{?z@RLPWbG1U`Js-^eW4l8(w%4GOIsvGILHMd#SubCsE)_CK#%?9fk<^v zU5~khCErvLwk=!Gkju281NU35<4mS@;qa4)Kq5siYC&xszhEzLj!tOX=mm7$rR$TMJzMfi9FQ@aZ~FUb9?j@-j`&Y9#C_1D zWO%%a%Xpc>N2N)k&#o#L3P)hD+H9Z{J+5gp@TvQSJMlSn4vJr!lq?D6$4eQb^^$*B zf&vr^zn=-=Kg*L`Q4!B9T7cxwr$Q|}6%IxSs@X_4iD#UbR>0(oV%DWUZ;!dUgTjc6s$FRe^=Xy8{y7gFzDv@cZ^PX z_k_QypK+{L6r6URJI;3djCdsl;Yy1ss}`JS)frj1_LB|sVO?}MY#bK}pXojL=`ZNh zOVihM*h4gUex{$rec+`JcsDS%Ox*o{NYw*UrTtUOSEVfd;f|$726&HxZ7wG<{qHn^ z`fbII(lqgB)sZxS=em|NHB0@b3^yg??v`j>ujF~Lf&c=&nAu1kE_OlKRsYhg^FVcD z1zj=OzI_O1YPLkT|5Zd`F7^C@&Zsty-rYQKz8QABj04hn;utO%Ei^5TQSKZefXvy6 zRbVj^*4vi_+n7zvrpJ0=Ezc?NMpEM(?xp=A{N~lio0Uv$vjpOWK1hg@#sLz!{^Cg} z^wAYYK~*90W1-eu>T;@L2|%I`@W`;-<5VB&HLWNMqSD!y7$~Z+g#AyzbHf%Omdgde z{0gHevQlJAy5c429R9c4Z>sLpG5kxbF_}RIIui0_#bssp=*awXqXM0W{I{Xe6Ob`# zMcQb^=-BxI^zk4pw40v$1?j}esg>~O&c@5Iu%KT2F~g79K4jQ}{>hblIBhJS&vWj^ z1q`_S#u1wu{=JxkAe_h=O*FrY1%K^p2B=c$lQN(n$ec(&pd^Vdcy2M@;kRy!y37R* zJc!1N!&Ytei$gj5o{LiB0O460q7DN`)5U}6f+SAx!zxK*wjh}f*8g4eYf;LRg7CR2 zS4kH%{?F~gD*6%G@@a#V0C+HfUE{x&QjqTznCs|6=S3{szEms{_w!x4BA&S0X;E)&qsdN>Tyk{{Hg0tb__)iAJjB5=SZk1HWZ*pZk)- zjW-VoBcj#|j{KZUp@6*3{ieJ?aWFmRq8`sZTdcKwm|+cnE9asx@YYdRp`QzO^1<9A zRK&q)y$gCXPaN&z_h0M0A&Y;_X?-7u)VwF!re@7h&0}|l1g(&} z3IOF^s5dt4v3z7MO~RGKV@d;(^MKn!kUOY5qKj}m`wnII%84}bbWG$KF0{eG(-Xar zPE6S5qFk$nAXUPM>DKAI?pZik^IY_at9R&U<3rM1#<$Z)hJGg7K8Hv4$Q}X>O`qfz z_1?4tR+9kPzc>c}4TX*sA1mE`*g+Q^2y3wVru~dxVvI|7$zL43L8y*dXzYnH0bize z;$m_ob2+BlYUg^c>gfQrBmfsxj8SFc-cr+wE;PY1cK`7!u@s8Xu#5Yvb&|i3_Cd?U zLt|VJ(M~>z4Tqg;4XunaJ`4ZN65G7_5;`FdUVCX!pAhaAV#3L~gk@l8KxNG7aE5sI z1_&AqL9s?mzH&ku5;T(F@{6NUI%CsJ@j@D~@ef!rQ#^mMR}XgIJ3tZ^D*1YWZ<{P{ zU)Egq>NP{;6@4juTiJjyh90Yt3YX2K_@0d*e;kcSD_W4@*0avjcn#0sv zPtRPEvajQ}~PPkP`RD&c9~#RC(ap)oS>+~gs%21s#BjaTHVd9DS>(_&PSsK~Uj!23tWDV7qVl}cnAOofVt6>g zpho{>lPtNz1cwFjYHXkb*bnNDX{U=nz{2K>qTUYnIjo2zsc4#DU+SKE`B3<(3qnFl zgcP|D9QN+)n_sy?9iO%7?dYGfGz!r+b%~^a<_gGHaRXo6v;LkVuHsnXU7RGMA<6F) zK|?;sBvudQK&Sah+JxoXq3b`(4YM?Bt*^-a>iUzgVs)>Wbl`BOIZNy2_%;3KPA59+ z9Ec$b+1II)KxosItrtuLb}5V>uXSqZ%NZ5drYQO4Yw@eK4)sZgA5_8sx^bHHX2Ld4 zEHEMyVE~h}BvS_H57G9WWdE#?2OP$IKrz~`_7&Ctwz#&V(U zYG|Q{R_Qab)rOI&RlDoj9?Q9<#?OZ4#GL4+s{nKB^F6k8R!G}o6_0vHxT#ydSB2Lh z6+#LIhqe{X+({lJM05`Y%k>S~1oj75=02vut4#CfRCRe|#RJkeEZgUmZU#*wBcqH9KUOMZ!bydvn&*ltY#vN- zMhoq%t%8dU_P|AsAMqSxr^?{zm-<095K%rtO2M?-CB2eaqm%TP+?N%zP@>)uW^GqA zR1LK~peB~)b0BWR2@gKvPJ5xpyM!zDRp}4uWdR=vAH;(6u2pCA6k%U7G&;uIir5L= z3C>zRUpwruQI!=EN3Cy>rkiXx62`gL@^ou1)X`S@Ai-cg|}pE_;960gp`65 z>1d_#wZsW3^({@RkG6(3Sg^jH3~PKMbD*`s$pEW9Z64r<4g|08s!bSnI-p&^dOi<% zgp;VLaLqE-qeik2k;T>>DlvNm?_W z6M4ME7b60B>(yC&9pLh&eCcBucq{jDL=`z_WM<%SOWrYZEi6O9b9WYf$~C|`5Qk!9~T z&sG=A=!OSg{;@KG!jd*Qeql*&W_*@*tMCTp;^`r!rs9=G`!^{l8`T?|4DaH%)K~51 zx7I&rBVqYzsPo4B9JR;8I(H)v9v}RsnOoNl1&(p|(@lLWCljMmQ3G2i^6!3Xc{Tsv z8m7&v=*QDSdXfO|$6L<(Xn%8sHEbzXYZq5fjqTdwvlTa*NDzQ_sK#$Hq?GP%W?+5? zK+nz%e5V}w5(2gpcUXSOnW2WCorJRyX|;qji3^$ih!85dPWzc)e)em9ON#c?HKt_v1OObFpB}I|AeA~n zhb6F}Z<^`6T5A;4m}8m@nvHBX$WWTch=^+ro>t};s{MIJ$pc{w*O{fD?H6_8NmVdQ zvdI#<6m@2Wjx0}odjJ`w=ud9qM9Qx^+n3PkIeKB2Q{DzL$e~a$?Gye1F-x!~zb9AG z0^R&wv={8I{Dp~wJpR7?1xz6-t7cxt{2okB7rhnBUgn9@6SaoQ@+`o(lU`)fb9^va zpug(+ENU9=)+>vZ9i(Z>EWmDa_=um+@PAL|5EO$Iqtr6GBtg+!m(ZGNhY}KFY}R57 zH;+p|5Lj6kQ`y-1zL0E4NynUcw>a)JCNca1*K)=1YvtTg1xvZx%v8y|kvTV!#mw~Ufdr5pkC8O{`IW*} z!StB=SC*a=1ZfglNT}h+?*-WVlb@WTSz%&QPF${B`=gK7f;)c_!Lo0kd-qN- z1V=pl>UbTR2ZTzuSdO5*#sQdlYv#!YVj6Bh7W&AMNgJ+yc)!QK^;b)ihBaX#$#MzQ z>uFBSnj-}M%kjr(t_y(u`4i{v4m{3JJDrUHT@H_L*8`>n%dsUz6&bkCzTblUhsLkp z8M@?NsOiEYW;rsey0q?(#KI|jfp3>Y?#bPlmUjxVXluRO?4-!Y4(VDH`BikV4yyRJ zSFgRxMm^6vUD2~OkUy1-RKqvS+gclKWDnN5xIb0cCTHl(kW!CzDHEvtuNNl{mVoNU zR;sr;G%mJ8>o=eHtYOTSEE==teiRt(evv-6jkMwTOE;x1nq(ZA$WYqXbFvg;N>R%= z+!?{?8F^+l$XDjKG3o#V_keKGtMmchqw;wd{XIeEjKKj3!MI!iD5<-b+ZZ~xuXt+Z zUNW_x&9Zc)>}$e?#zs{1TaMQ5)R{;bqkQfZmQt*XJYQy&KWi=JLyrj^mBXJV!Kfx*|mi! zdvy_I+9JTR0x!BxGyk6c;sv+NmjUNWUtWaHsldO+D4AUdlx85=dZCGPusmXpbw%X- zc8v6jN`w&bNKjzHx}jIp>`zTbIGzH6xRJ8P_5yR^iylM6s?FjoHUvvk(8~gw^FKg> zu)~Vz7MsulwNtq$LO*B_lXB&h%(uz7nohS1`o(Jx1&gw4-@9#ZOU^rHS9kRhp0G(Vn6g17+K3jnP+hW6Rhj^^HFALBIKqNg2E zdR_4OUV)Y1)Xr^QM-oqEsW;z`WVVNIcwESxP@f02KF20w)WIT-ro7QHFc#sz`-!o> zloKkk0%NN_GQVOty^g7_DIA3`7t^q_E-9}Ql^k}UmwLlU*x=JOLaPYAcvJnvpkx&% z;#7itNzIX70;J&#>H$J9n@g&H%TTNeTaAboLrN>Z;Gc9fDq`8N%@O+M5T%&#-fGNs zQsQaq#rQ$~*%)5s!`KRB$Ccy=JWuz4)&5lG_@NpJE%}GY zH!Y7^4~%-cL$LV>Y#vgr1oI!|@(Q8ytFMuj^wdHo7?(sd-&xvjrQ4$tqK}uMuJjAM z!SE*!^WE#^yU9ql$1_bcqs?LGUKFQiw=plC@yXa^O1$9SL(A7MKu&RSJ0zreCHWNQ zpV;Dpw`2Go5*+<3!z5pYN~{V6uccu{3kIH`hce6LPD-lQQdFHH8r;j9Z4^}N0LK%G{#yjiub zJ2JJI7w2MlDVyLQM73MhnC@+W5*6IFd*J`25YaQ7!{|m{E^?Hi!Un=}G3IAUA^f9? zyhk5N?!7u-f%mg!+noXgSBayKfrFoz* zd=nXla>9F1Bnf8Nks5hjYuI*+VRBXxl6?RT&=3y18GROHlFb)hF2RT7$cou9Yn?M7 z$RP?Buo^dM1Vg}go>NSt&>Ro+AT6S5&yZv55>&uo0~p{t35X;M1}+X`id4x2K~NvQ z@O0I=V@g>8cXw>|WmoyKYz;^(`6E>w>Hh(cxD0W(lW+MUzaXIqK?@&%0fz8vwJ{J> zPyrNTg6h=~hbIcapaTtH1I$2}F!*GjvrFO#bJA%Orm_t>xDDvwgO~}Ajvqg7fo zz-eg5N1Slj2c+N#S+=7v8hy}*T4|D%%qCP>wP~4ilfK5EuNY(EStQu=F9CC&qL2Z< zlOh-q3_2hH`=yv5BA-!d45o;RT!5b`v2EXZG3=L=h^hu)`GEt9S4bIk{&h;510oHI zNFsp@5ZW-mkOsg23>d%w)G2?tqyGwNfB-g7AuhO0A_@#jAOKSU4UVUx>2w@rR}hSO zd3|Uz`1TdLxu!hPqep0utpJ)&Go({gq^k!~3Tct9um<1iq(c~`eQ*f+hYBIjz+?38&{Kgn_N(TAF6|W)QIt%%BECAOlOV22Lso z_QZP$X|8})U2`arpO<@LD4g$#H>eP=bt9%FN2d1rd8`RV#(56hFk3aa6Lv^xJCRD< zm#6C$9a(o0xlk*M@NT2Vrw>FPqDp?xPzG039IhxFz(558FbXcys3KdRr(g+Ipb}JI z1j7QJt_!=y<_INbb_)oq7=fuhhGM5A3Z58DNH=N=bBhU)KJ3W=P)8f0AOKpBw1tO) zOiKv@P$8n=S;HEGIyre>OEd5Ut=({(z@VAv3!7}9ah^%7LHabO7Z2PZ3&p^;{* z0$gn73qAw^2><~~p#Pe0UJ@~0k8Wac!FdkA zP_H1jxUC6Av>*y{Gk(h2raiR{qOlDtw-bUuZpPrVH;ltM{0p5Vp%9V>HhB&uFbg`2 z!^?mTf*=db;0y?H!}P=oH`@%)Py`j`syvLtwo1f4YYfbw388>(%TNq_AS03>3Co~= zu`sD9Q3Sx6#pPkEzQDzxV8cG^#0wz`ZM?&sRAcm10-QH&9wTi#e8VzAjo8KvpdbnS zK~H7?lsZrW&|t&HKnoH&$CQi!f*=U=6bgLM#LplIGLj=+>|U*~44uFS(16FOybR93 z$byW+)%Xl^X#ce=%$&4>rjD=(n)$51CBHu!Cq2;(95=R1VGMQ_3Q+1#LBWqkN@#ts z4BU_eP*K1Q009+sT&@6HXUamjWi=tkw^!P67d(b~qrqRAVjoOW425X$`gtb&2B?sb zE37!|fP*CIrZ~|Il@kj)l@hVQ2#jC}|18k|YzceN2vL9r*+5SV&Cm_a(AC(WacK

QgN-|;Qq^1ToEVBh$_6!YDMiou2bbl+vG-vAEa^DQO# zJ^$ePO&DgY7z&=>369|V?ck)-PwlOBiPGN)jzLoN;2W;t2hQN*2*0#kG}I+gfhMl3 zfdvNZ!J!?tui*$b5C*6H6+rzj@phoZK0#7$iE}bLeLC+L2121c~d<*sa~%?cJ@165&mL(V4#Ih2~U354u1P ztbq^JKo0w054vFHgp>@{VBi__=GI^m_>c_MVBgjN==2~B>cHkWGY{2ZN+|K><6sSo zj^_F>=WU)6_@E2qpbsXI45l;>wz6SPq;#~&X^V{N00~9ju3XM_Y4~OGo4#0~52gzj)Lhuv?i~$+o z2R`b~yzSfFythuiap6ol$}K6rS$f_L!rs~kny}7q1BcsP!eK7C6?C;}F7Gwr2|)l0 ztYHmI@Cf#R3rxVdH9-zmzy)zGPvpP^a?s}V@CZy`4fMbTOmONI_)QNOU*DU+1dzTH)xZR}U=I(^=b5hXOfU}i@CXx+ z@Fy|zNFWXvlnN9-?_+N3Ink1tEm6F_%eemQzFfbkH|z-aCdO{#J?exXSO0KA8V{Yo z0vV72TZ6!1P~@O@BAL6>Vh_=%P21dI>D(Doh_x=k~<|+VqVmTA@N+Eva;oA4$=$ zc0=W5O`l3(DvGW2=Z&LV10TLg2(RP0Zi~FUSyTyOsCZw`1)D1=TgQT^05cv;?P6QX zk0UQE`Bx&vHx@B!{K%3cJD)jSzlI%K_H5d(I$$hw9QZ(h_{hea}YNPCzLHh3NOSkL)Ubp$wGpH8Y;cv zW>ShNr=XHbJ4evU3cC4}!mARaup3FO?O5#QAi%;Kue`nb66i1W*mJ0`!xBTt5nyOx z(mVSo19891HUp3$`UnJ#qytH_XpKV{6v)HWLOO|^Sa^x0nKNTyryO3;3@H{l%h`vQ zaz5E+n>TeqDy41CjLi5c?x2Y4&Z}v&E89I6SQ`0pm zP07qybZJJHGs{UQ%~;AQCl);gvJ+1=-xPD8R&@y!Q2#>TjD=8D%h{%xX;zi=QI=-q zHO)$S5oVueB;6;OKkfWfwKb6~$4oV|b+s9eVx4AMJ6W367G!;Wc2_vdS@aWjp(TmK znQHYdA_R@GG)Ls7X!)>zRwt+;w|x`^`Hi^krx<1VZ3cr4Aw^MXuoJt*Hp5-`hl zjO;!uqr|K~Dmx1XO9LrFup&R^DyExryxQlcP{S-!&RNrRR8C%|L6Z?)Fl|-ONm*(Y z=QE#8meW{1v6J0r^wZKfHjrAEn3s@LSjmNfHV`e-&W)l<)A z7+I9)QImc4Oh%#>v`u2#M)S;C1yU1fqk9H)P5);*?HX=lQDP_XH@{Ak5lGPVnvrSh z3_4J_K}G3LoFkuR_Yu-!{EUR}us${huVW~S3fUq5xU=#xlS4z9v`SWfgGo_taqDj~ z*DtA6!T)6EPo9BwbyY%#Er;i4)ql3`u77r0q5{Yfr@5(r))L&)OxHitO(R?TpkJPH zMW>Wxu78O#UE9nAEP({ePQy}DOM->8KmjmU@zYiO0%gEJwPbXot5nw-cR*lqs#Er> z;OAUrCv9=cOxtiEp%~SvL>;SyjuPO`lK;3r2zJeBUCYht=G8h7y$)Y4;SWKIL%Tlw z4nHbl(Q^p4yDcKj5nj|@@SH=u@f=TL%WEEyK7=vF>_~d#dD8Q+mqov9uSx{*UP7|8 zyY_@HLF40BRj#5wd1=UzkA!3-B{|96NUq2nFzXgxh%hL1t=Bgwv35M$h;7v8Al>kdXfQV1nr zjI<;rr8!M%R@0gliY83xRYgt4E-eCz!yz;Q$};vVJGV2X?ow$YGorDNYIF=Nc~rew zPKiJYiyf(s{p8p`KNL`r4KzR{ zD=1hBx` z6QyHZXYUfm%9T0drEZj^Q}i;4ncA|Z(X(StCF7BE@Kk#v`{^))(g#Nrqn3SGsA-g{ z7^cq5sa1t+Y}nC;HZ%hZvB<;aj?jjE9N`JP$O9wN^ocew0t;Y^Y-(|G)t78ktFYrL zNF4!IeJ1rOgl)wypU0eZqW@JX7op2awX__gxRMqTAq07vf{OAO1ugfqYkT&2Q&Zd# zFnbLUD)f`Rclxw@^(jzo32Ru20Vc6YT`EK!t3K7X*CgyX0v14^f+O$%Q}pfZ6Ka43 z{k9lWA(8HmP(ZFB?*t#NI--Q1t<&ChdA8!j0P$UMojrta{$v1`pHW| za+{WJIHI_3IWA%qiwfI*SQ240#dh;~j^#uoV?+^4da&C)S8TU6Q`rlcoCA!xL>QNZ zg)v~jlOV+&r?HF+3404X)A6#pG|%py!I3Q|lW6z+VBC=&AAco+l1`~ixaNkNJ@KetBR2*qrT zdkDg|SwFNeaUV#bXHXcm&5q!1p!LINz$}6kfN?~dCqdixV0scGmad>fA!MuogRrzM z$S4}^7grpD(mmFXD@=R{QV5zeB9W@Q>|e zRKXGmyTVk&b3j89fA%(5&LIm&q`EA(=r%}%LBY5c#nD;6*+g6y<1l-RobUqP0(Qz&1f>*$sk6+6!V1bG(cjY|j=v5}vJj zprah~NPFDlVUD+(!y5nxOWWJtjkl*G?(=xyKIpOVz_Z=(YCi|t&5E?``Ksf4|O}<8|kn*s`maewzC5rX)n9F-wqFSpd%i{XM5(eweQ}aWA?uHzT3^w`DLTy zOYa)5t;RFj394Ks;`KxqbViv?t22UtKF zSWy}}F&b9+9NK_~oVlT7a6xOZA8~M(KiP+9ND~%h2VsbXXrMr9;y(sd!X=a@2h(e~l& z7zm_@hiA;j)zJ<3bBXOEAbohoYK$gyBolGG4Pxw%Wxz8`!IM0AmOS7@NkS8EpvPFS zgl4dWap{e2m<3oX2S%8}JZQvTu_kmV1YS6WGbssp_(z5?NPdhKg{-D#phursoc>$J zWCY1aaz}EQu%xfCVrX%Zdd#j0HM)HfzF@yJ>@aw7-u;Ms`%4kc6@X{Fp^}v4IdRIbnpm zamh$3nx^~&syT%(C`-RU1szBMPzbkJD1<+xnl`{n+i*xm@CHWs0;*&PqeM!9V1y@N z$x|o<%DSeoY=$<-0|B(kL;OQt@P<5L2XF9(#@Pl-K!<2Rhi$0L_)$U6j30K0hRY1C zeK>_&u)S??K41Y&VLU{RpvIr*hHS_pQ@j&kS;Z#QLUz$Nb^%Q1CeNsXo?dlWf@r zc=)?4gweM_rln*J*WA1;3<+wqJH&e+bU>yS?WSDK*k3 zrP3>%BCf>JEj>{t<ehv}4ppbyP=H)JT=oN<PO10EW#nepI z)J^5oPW4ns-3b__MoS&lNPW~(Mb%VQ)l~J=R&~`^h1FPX)q$`(Rw;+-dr@0Ohjd5> zyYtoR>(yQ5Ra_-jTn*M;{Z(SU)naAVW_8wQh1O`5)@h~IYPHsD#nx=q)@|k1ZuQn^ z<%x7)hhEiHyJL;dL)T?>z857{=X23PE!K05*LFqMbp_XN#n*h**L~&JZk5zO1=xTU zSTiHQw8J}UWK_HZJ>px~+ElyibJXjDSg>eRij`PKHNA{o)s5xYj`i4&1=)}l*^wpL zk~P_rMOl%Zhl1U|&SO;2V-4toK8QuweY4qyB|d8G#%|m7&Df=7+NO2dr-j<6mD;JL+N!nMtHs)^h1v#L*@G2`f|c2jnAqC9Kf$0`q{Y~U z{fe}^zpvOgvF*km9oT{G+Lfh70^A9+HNCcN48d?%(AzqJ5RA7qJ%sh!q@~!Ni*sR0#8OL~+^`a%NG z5{55e2PCM08sGt5h~M0eUV-J1SO|h3NQTKelPjxBEWpbehy@;qh02QGpJ@gj$O9fI ztpl}Q2aTUL04;jN0u^8f6##)Cc$5Fatj7GACjbHX`~(#!%+PAf|5e7a6$lOu0(QWH zAW#7w;9(U|U`F`fPtdO#(10LtmLrIT5v~Cp1_2&mhYGGQ(<)*sI|3EhVI!{MCkTQX zsIMEAVE|s82R;IgFwAXuf_;GGHmCv4+J-`2 zfB>t3JlL;&z=HkqEEUEABxnO9fPx@MPg9Nscz}X7aNi@4%|>?901kp2_OB<9uR4ye zLVkiz#sVH-ggTDUUSR|fz~obo(DZO8)^2m%g0W-O-QAaGzyM&nY}NK&@m_-X?S z)@A8EJN}hMP3D0|nJm-_H-^}TBlt;moW^yul?Q3tbKX-9`Q!)Uhz5R2(b|ah388|H zGLX2(vtx}X=#^?*UiR@*e!e6vrRa;6MK8r@CJfz;_UI_G(vRk7F%{{OuB4DQ=><&F zlxArtL+O_OzmA4!kCy3~Znl-S>6`{fo&WAqi{@#auIZmHFr3~8(K5_(c+b+}V4>#c zpl0g!B5EzOU|wK^AozqD(6Yv9#)LLhF_l$m{OUvHYOoILvNmh69@Me+)O9RWwboSS zjnt0t8Yc=|ke=wLhH8@bhq{C*#B)^*BEbvzB_?PZwO))$aaa+EYfCZZ@_^EJ)t+A za1&vyKwIsIz^-V*=ETEhY{iCe$wF)cZ>`lfZfUCxaawa6^1s*%p-t;Ude;iyiX%0;UE~w zNO4fdq={G%tvrYZZ|KKGaZb?OhbL%;FQ9{F5Qbv2SmXFEPy{= z_^c-gt-1`+2qbb#Fl9#AEYiX(WELG$hJr%o-zSfSY4%Gj2+@aZhEs6LBS1jH=A6z( z@CIkmyd-c1k8cK7^qL43?f)JL0wnI&2tZsGW<}-!*NhYi_lQFHFDUTl56>|iBXCbnCkb9a;$%O9`g-Nf;(;Y*7axY?8h8Rw zXM|El0!DxWEO%oSpo1XrMA`;-3+CZ+I08iH?QtCR1ji_WFZ4#Q>yT^*VYwWWkeNx3 z(rJhW>_+V;Ir~!8P(8fIVHu!SdR$!ofujdxv zPq2g(cS;B5_o{9K&;P3GPk;h=XajhNajSmr$|5bA7&Fh}P|rdF&*EZKZxam&a#}ac zWbdpeHZ52NW^0CIZhw&Hz8g#Ug2LQp_q1PX&jtOo@v(&DLdJqT2m(6LVm41qWZC4Z z{(?L}2O|zU00r`CLdzM)jHhmK1jw0i#kwQX#(4sEiJxzCZ%tv9!iO8y5I5{(mkiGd zMu0zXdkHrw?OJ)D3WT6Ap?uIKc-Zj!0}oISX?TtLiG|m6{%U>12K)_ycoAfbceL zU%4Y~VwKyca3RBe>=Zt1C~+diiWVnCw3xG`$%Q9(QUvOdA-i%oj|vsqQ0Y>e5EmLnn$&5-ggh_yyh)Yl!>v+} zJ{?N6t4*m6kxo=PZ!OtFL(5W6!QVIMa^AD@WfhKCSfegQ0&m zTt0Ah^X}ink59fk$D-iV%YS}Ze|Y&A(GvzBNCFzimwyK$m>_b8h4h_)r);wHRNA3bkPlPD-y51nWLL<`G0Q zyySu8c;)0#5Eh0Wd0jHNNFz-uk65$NG}}O1Dn3~%L|ik`R>-A7d3PubO#ak;fA>VYcL)G(Caj zV^1^|;{Etm^t&D7N$N24ez==7yYl%K)dViTHp=6vzg`1SpN{2 zoE$#*P(<0O5^dvi*FJ4C89~)X`m=dhYe)Cl3fdjkW?|pmx8Iy)>QRZPV#n{i6RL+V zNm%DSpxkxi{I}$jdltBNaV!4#mx>!+Am^Hs6pw{Vd+zVy?yX9>>Z@nCHddJD2YTbA zqf2|_oqe8p?xt^-I_tj!@0@TV!mg_9`yH=)NTTnPPBY#pr+m}4Pd%RR!DF9&dRPyh zJmS39E+&hGD@05*m!3}j>`JpQ-u2qU5C8iZbswSkGLC;8^Uh=5dF7yAXMXV;;O{zw z1rYE;AwptAIdU|lHYBiqlJZ|@Mi)JhFfV_`!(9cdN5BsTuR}ZlLCSQ*i2qOU;w7J` z0lC=03xw(BE5p0jy-qX3c>N|Jsj?XgJOJ&wyfdoJxs>22_AbySR;qlk}uOW2sMXKD42HY#fHL1{ZlsG@~-z zCR2biq#SKyW-@D19*tSch59sU_S7a(oH&hK^iOlzDvMKsnyz>dBNs4SDd@=7AC@L` zrdo~FgFc~x8YFNZywa1P#>E3h5UEpb0ZS3rDnlFQWFAqR;uLjL8k`96h+A`wR?3JI zExvUuV)@~2s>Rl$IFTLcc;X9r5k<4ebvI=BA{n>l7JLA9AOG=~1}_|I#xc@^ENEQK z*H9CWcC=z9qFoIQON-YZLL?sFAO;joL&KO_=Av8Otv{DigBn0GF>?~s%2uXBcV5OD z$i-enoTpogWN;hj>qy?x5seIDrX9qXMl{ZZTi${fcT{tg-0%W;UQ_|WBQ;W@V`>Ddyr8d%erisYG9(_+*wllq z<3w)|gTD(E$rJIL$N+;Fc`qPB6H07i007_xCSEa%OZ);AmzcycezA;W+~O4zp~g4P zF^hQ|V;#2`$UPQvk8f;ZBD~nhP4KainY?2nA6dyRCOk2clZ<02J2}WwUhul#c<2lcI-gBLi91s8@`2++f z00000fC5$lhatxYB1TvxF*q`DtTlSOIC!)?b*VvJZ9;mlM1;IYd7(*4O-W~xPi=fx zS6Nq(!B~W+S$mIKWX4*0p<9BKTw}IgW1L}bcVc2?V}z4simzz0#%YY2Y=xw4Y;J9Y zlWm8sZT?zrcC>DZv2c8YaDI|;soHXMc5;ZVbd{rYyvufjnRbYzcaNNST!46kig}!> zd8)^Hi<5hZzAtKajitgWoAovgIHtkU7E+~us`=dGlqt)^_Pw5YAY%&xDouEp7| z&F!w)->+v|vCZ4E$JDd4w6nd%v*PWu>GQO@y|mchwAm)ZM)8_PxKtzGPFsjDo?mw8Fo_ z!_Cyh#KgqP%EZ&&#M+`+0WD6 z;?v>f)8y>a?Do^``_uFO)A|3@($3V^+tlXs)z|*j=K9yZy4cs*+T#1#>-F00`rF&w z+vM`w^8MW1;@slo+~(}v)zaSJ-roNI;MT(9?epXQ|K!)Q%_< z^7iKIf_Gp=jrR_e2Y*;rRFa`S9HQ@#XyU@%`@W{r&X*&%FQt{{R30000000000000{p8 z$?+RVu%N+%2oow?cyJ%XhY%x5oJg^v#fum-YTU@NqsNaRLy8oJq5$&6_wY?kl%y7)yTXy8XmxZIv}^6VKV|cCK7OhY0t@W3}oWzjD^P<=o1( ztJkk!!-^d{aTlLx(aJ^3LBTl`} zbfQuP4HYV9_)yw*5Z0VnXC&$AbYu<~PQODNq{J^Cr#XolozcV3kQX-Y2s-~%Mnw`Q zJ#!lW37@*X`}gqU%NGqRQ#{yS4DsQI&O0AYySPRLcEA~8i!IL_lnE?e@PQc^RDjV4 zgM3(3P&{V@Xh>(;!IH=s`9Z~xL(zB<4JR8KvdJG7&gbHbFvck3j0^3Alr@}0lT|$N ztOD06I>tkoUDl*yq(S>YlSx);orqRE!|-)bI-BTN4l8hB#Z!U?^|%T*yBL)YG%3+& z=9y@wsU}wmzyI#H^uddg6%sm}l8PCEyoBg!DS z=4!{Ty!PtrufO7I2d;_SH4vtF>IvsW%El?tKG5pK5wz4+Yi+X$U8`-h%x-%vMc#hf zZMf8uL~ga_p3CjC>SCK`x!kV1ES&ow>uj9p;u~!{b&~s3y8s6)@W2G0`>(jP5`<1E z3Jl=z!w^R-@x&AlU;qOQ7=liy9Cr*OdmeLz4jBU=M8H4q(IZ_# z&@fY`-F$Wv4UZ2oj*z41qyhBG{3Kw)0}mu%v;s*a5rY8+C}02-8<4KL>L!$|ve`&0 z&Cgnftn$YuEV+6RIk}MIdnk;wlS@#!#Ldj{+c4A4@jx*`PCAMUw2kj^^S=Bx+wAd* z@3~;#JKo^GXbo(f1ja`uQW|9Mfd_JVPQr2zv<)Nt(9?T5$dJWP&>BR1MjFu z4rUPNOwjm)Au@56*+s(}O-~=1eH?M(|19yhthb@3e3E?4Re*D-*7rIagDGWmj3EM+x ztjLdCOtBD}V1yDhfhKG4K@tp_LnG3&9V$488)r~uB973A=TIR(UqFoP1_Hv@@q=>% zNWcb8hyVzXK?_kpf)>bt11*d|3m_N-GLfkPC_DfPS}VZCyzs->LFNqQ;NXaC5sFvn zDUAGh#Uz>9zzcX257iVAtEI4DEMlgX7Uf|mqV8I7NP$4#r$j>g=5Q+Q< z21zi17Lrg+4J6?KWH3PtVzAXDoQ|p|yO<9PVi#{1q8zr6&OW-)EM^pf8M(+sH#G5# zyD|fMDm7pzvA2!97M2;5*r*iTQCM5>ZV!ob=N^vt3MokTqYBNeXnvxWa_piPe8>zX zY>_ZK4Z{}E*u(+xg^+g8Zy5AshCp9IobUeuRC~iHL@q+<+Kry+94dlFG#rL*iew271S;Jb)3@`w!y-uz06;FaKERqi2$-p>{ z4^-@H5*jaxa+V{SkcW)9qa_V+IZm=>eXQgMQ>|+xCNhYvmSP?%;A~CKa%MfKWsfLA z0SG_<*2YZcF^7!+VHR_l$BcjpG{FB08w-y+<~-+k)VUpYrt_@Y(GEKESxpuSRsK1zjD+apMLc$h8JEkZTa^`q#h?_O3hNYheQ$1RY=jG2&!rQvEH@ z(7F^o=uD4&xWiJ{uC}zRC2eeLYE<9$;H9`-uW8d6R_IQ*y4TI_cDwuC@Q$~<=S}Z= z+xy=5X1At9WbJUXs@v9Xx3#-X@PZp$+U`C$!4t0VhC3YF*xs<4%25t(aD(C)ueilG z&hd_4+~XE^hBGW)q*cwCAkzOnxuxn?zd5Iz;3x00%xC^64j)Wh84g!Q;>PE6^xWr0 z8nn-Q?&zR5+QBqWy3!TJ<7ri=MJ|DQMw-6#s#`r!4vEJuHeriR#LpyB@6x7n$0Mwq z19DeSyV|inqIf{#x%?PLDC`?Il<=eOC=oO{_#DY90*`rv9!S`oWe862gBzLX1y6R- z9X`|tH++jnItIV?%3B^rK;pzEqGTC9r-U3-+=CLLs0QCDArxJpA3u`##deU=pd(^L z@C5Iu>9Pctu9*WB5-|raZ~{Y#NCbKsp@;miL6?_LzVhXh32&?g9m6;vv=a7=J*Z&{ zTvUVhwlRe<6v7s|B@X{3Kncnn{7(~_NZ8p6vI*?-V-;R-B`3<4iB)8R9}{YfAzVN$7-HxP@Oq50OS{kTz?I#xGo0 zhGuw%Xqbj-xQ1-lhHm(Va2SVjIEQpthjw^}QwM8$xQBe`Xn+$BeHe&>SZM_@YlC=* zh?t0qXgB7jYOMcuYO6+St>%c2m}rLBXQ`HnmuQKa2xytsiK+I9pg4w>mWh6Na|M%% zspae=F1s44-~bWH4<|4LBB=yIAOt5+Ss1{57`X%<0D4l;1rg~1zNJ|W z`H(hQ5;Xt72t&X{O7IFafB~Y!2q(ZVQjk}aU`CW6d-F&M9km4H@CrjfKk*nwbtDB0 zXkg@clQglA3Bi>$*gX*D4r2r@sg*FX2SPw$$`dz)1x6o5 z4oWZtv^70;$qcU`K+z+PZJ334Gi?X4JkwwiJV+4j(3lZXK#GHhdjJG7r36602vQ&f zT@aN@aFXie5C*9Pnz;izFa&$422vmeUI~{>gO~+D4jym<4q#amkqaJx5SnlT7EuTb zZ~_?Meg!c`pu%?yL2F~d2tvRQR*8|!nG5&0leD!1STvfaS)E-V1^Zx-uBlK+RtOmI znBo6e2s zyh9v4*_}8hn;yWL=^zD~fB{{E0fpcIow)JKL74Ed4;-qZd1NQ_@RU2? z0o`Dg7%&h@un!opS2SP?Z~6=lKnWgTq!GE312LrhaHRZ@j~K9bN4f_dumipYr9}Tq z2MxLd3lJJvvk;0_B)2`3N= z4uE4{Bhk?Sz{rAd|T; zuWGOlwy*>M4ytz%+whWjv@;JYvGouRMOzKh z5DxVqvEd-G@(>QvP_$k9wf2y-iOICcn5_z7m;h$AJ3FysTeMz#5BX3o191=90ATr$ z4?8OlMT-r0%c%%)4{V#bGMBSFE4W2#4|zL;`LK}C^0)TjxYAG$I%~K$(GJjXI7p|s zqIx77_siu3mvHQ3Apbf!`B>6B7^kMz78mBS3NJvN~;_ka&OYX&y3!ZN|UwIB!5 zAj5BHC(NJ(T~JcmNDkQZKig1xSxi_h)ecoGJ;YH!D4{$ql@i)GncJ|KUyNB;oR{4= znTm5ge(A*k<%`o0j@Y9=kGYuXw38N?#V?^Vj5`mO-~kqF6Z`)#4RW9hP+W(kw4K%` zds3i!+Q(0-`3fJY1hBUUT@XiAteGR#L|r5hldK7u9Fb&1zFee5mZiyiKpbS$Ni?OI zoIFo7MM|DrQ^2YOi)mT!`9^rO%BkFqF`={gFb`Q^1E-J^`LGFVAPlYb$XjS_2SGpW zaIe~z3)W{hf!UK+WR3H4uc9;!0W}bN0LC4_^T-jO@pCJuQp?N=ft#NyI$lFbvs?M#+O$)Zti7 z-Hi@moP77(?GU<#@|N>~vZX;cMSKs(U;}gw7Wx063v!UibFDWUU=Hgr564U1drJ^#y$&{j2x9>)n*a#{ei93I zFaMK-(%}xW00ufB0u^8Z7T^NrfCnD#;g)a;>wpgpPT=@}4_S}}`5+qafC!Fk5HVfi zFX0Z!URdKqL8O|=bU z&AO+qVuD$)E$f&g;Ei0c^eyZ=MCxu;O)75Yr<+=|CLY5E|(~58coW z9UR>}tP#tY4m1#$adbtTw8gJL@6`Vh3Uts^{J@V4xbg!bO6k}{#KBS@FF%Dq4*E_- zmBkP4knGH0S)4pSV@v~psgLxO3p=m}pDxdKw-1`I1UnxJVuXF^pa!-O+yzlmct;W^ zZs6TL>$)HaKDh8UAqqGS@n)Xm8NT5i{^58K>~C%b$AIw*(G7%kJRg+~i4{r601cr4 zTkVuQ*{D4LR1!7$k9%%TnotNoPhm+J9?i`OtU<0A;8|6EU z&{Xoh4b%}y2c)5zkPcM~5c~uVBv{bkL4x!QGSeh*A3}cn9`a-MjNrpuj390tIB}vw zkQ_fAB)83>$B-!vmgLxS<2{(!Y-BOR%;im-IS)>&B?ywib~+JCVWgzX35`OPE@j%( z=~JjtrA{q4sDcEnSu0eqV4(z7Y>lMq&Y;AcmHCY`_P?rSka( zkqZYZuqn(qWAR2Da}*DqV33GH6e6w?u!m-r+Gie6795DJCbH4-sa!l{W*Wg>*<&Db zqRiz=Xl!DJoNjDthnaR5X{b97gUY3gZN?yzpLW=sPr@$+^3J<$@@!{M3vJp%6B45& z$ENu-8FQOynF7^d#FliJNv9oXV%!a%d(6n?}kLHM*cgieaS)MTucFA!-jt zkrj+uNB*QqQ6(s~>WF(!7JJbLF|94`;Fz0PfoAcQm zbBdiX$DGX}IiCrsoIl%~=Ge%wq&Y=JA(cwK=ah3H3aK26QX!Q}`TAYI|KN39dtI+R zo{#7Ke!HRd9?fNz97nt+VCoy&T`mS2lxUafJcN~BJzf=%Rjfrs$&ue|UsulEJ9nJf z>R?#1A6TgOZwqZx}$oeBB+K2MM82Q`l0_w zo8nMjR{CgS(ac2jM!D9*q->!C{pI^CPZ_lVQ(KMyDVA;fn>6K>>iiHD%DI~GA$7Z7 z;(uwoW5*8D_Fj1YFa5`BiL0j%ZrOn2j<6Gb1!r0w4wWjExi022d!J*O`Htt!>RBC) zL9!XWg}|R3MY*h1?9{TOsi#RqrPUYTgOp1%8p2y*6nXviOsP;dW+{6zTy(dL{oQM}u|RW%bSUE}X@LX~vC| z3$;}pLof6btj4W1^>r$*Bb*C^6oOFm_wTEJRFb*Kp$i|Qfu)ed9Q_2Cd1-LAlAC-{ zszUj~HdaKr&Px07$G6MZc0^<|w52zVPMMAGQz%xu>1kOnYEwdNhE*+vt&@n#M|p5< zG6}QSaye|PDqDj?FEt)nQ#+k0nA+Z^Ra<8*QHIIJCMioNB8lo(IxlpeQgj?NVrZ)N;v?V)4AKEI&95A6KJt)CAhO1noLWtpr%d-R*oCj#c z+CI(3CRD{0GjztLo_nw)V4UCXcCw|Z{*tZ5g%lfR}L6Hst+D^ToS(of{Wx&{M#5;<|;?O_NPQaMM+&;s!)RcvJEERr>n(P93`&_E@Kv zbw0<`Y|GF0$j82`vNh&Z7RR;*9*R{XpW>nkUOtJdQjeB~Y>)q$xAAsnYlh^i7aAF= z+Pm|=VfQ1Qj%BGTD0+=oy=q?xHgmxBopE_h(AvPc!%-*rMR{-RYACg7M*%s@~UJGx)BdmE$qEkhv$7#=A+T@tMK*@qip_hOg7$jP};7$ z??D;nM1s^gwS_sd<{F239aq{=e)p+X?Nm`L(nwnAZjNOz#2aR)kI@JzmOa0)w zyR1qG4{8t!J#%^F*fOJV)1ho!l=RC=DY!5qv^smqafd8te8GnQ1;+L2Q%F(rFAd&ycUc&q5M6;k5X}?~mqdNs1MCI(iFhAtJ5!%$K zhFqVxERpBr+OPS)P+40QXMafG+{_vY;TDm5xhN*uD2T@i-XS{A+b7IG@K3g-g&pSy z=~phU^3uxZq-OQ3QRwF2m5fo62LF|!q*S%4(eGiC+=ix`=hecs6kPMuqti%6^CS`R zb?(k0k+r_7!+O+1t$V@3?3hgM2gs)~yi;1P_rW@%*Bz{)&-4%;kY+C7t!9}@@oSoO zSj7N?8m337_Czw~=P=P;+rzf<3$IN2o0+f$oovNL7t$}wiROETS8U=uufj0iaXN?HA8(t_B!=`Gg zB4qYB!Y%?5kesH-{jKU^WO>$q|CKEa5M1?~pM ztwJP{?r;45b@^8vW>}R-bb)X{9d6}YA)A($(!wnmC$%465^xzWI8*f?xd@q895V^Y z!^?D1D?j-VKB~iFM4;8WFoz|@6)$OZkxs#xqBNY~Hx@L#ou0f@AA!h<93#kQA$WS= zW#O2zZsr&)PfIdS@FTNexK^prR8OVP1(liJuKQ@a`W#J7!?f=iQ}N7EvC9b|Gbt}W z&2{LI1l27hN&kA_{t#*pGcN*GVcWB5Q&}5%l^t~?V^QApIfkYYguHkpyyw#TsI4hQ zri}9w*5p%$xy_`?mq55esADnQCdsxiKRh5-~MDymi0i% zxhn3YmZR$sXcE=x^j@LOqP+MeOK0rR>9TyiR0v6*e6&K6M1b@rA^wZyI5#c==iZrd z>lP!cdONH1!htjuvSk;;+9)TvJJ(6Hd;@bY?!a1bZAg9BI=8G}x(i~5gC3?*DDW4< zMJ$Fi<(BLjv@V^KmquYA?grqDJjQthJMR5q4VM;@B)zN@5ey#}26mf*-T(>4-K#1z zw)@qdzl<_^Ae_TN7}dd|F(R9wzEL-TQ)r}uu$7c$k@(kN&pPsA=UH|bZepLM$Kr4)HrjT z>wFc%DTz%$U5r#1FV8DE!_Ep=%5(@fJ6~P&>&{s6$LiWTRk;^Bwn;D(9FHovLY2js z1KB6wtcRi<_De9Y6vpUGsO>hxV%y-gig*rEvNb?_FVapV(c9m{xJT4Sx#)p~&9*3F}L_psQ6kMG^F;1W>C;k*V z83)53hYxSh6%d4Z0<$Rc9|eAwIU$-9zE)uxgN2^72&5%a1SaZc;m#6@PfR*4(ug>8 zo3rGEh}49$^q{lk=PC4rbNDy0VuZb}uk-%(QNeU)#r4Y(Y?e^3f=ZE#>J=BYw&^cO zb2`O2-HjcDedvf9Sh>ZFVHNx{aO!hZ+&pH{Knn+li9=#pwLlWr3!fJ zue;wHAb|-E)bt1{0&Czht#!IN?AdF9Rp+P*2}Zb!b0Whj{62FzJ?-lMOUVvnL$2f( zj;6XLJmz0@5}{uv1IZh+IQ1sh_upDCo{?y8wZq`Fg_ zujzlD3Nvay9g#y;VaQCzO+utGQed=14KeDz09Y~nJpve+g&Lg zTs_;x$B{Xe^V})JT(**;8_V6+Se+xpZB0{t{N)kJ<@rpEi!Mag&bu)&$^9e23sh2= zxUVvjq*Rv9U5ci*xHl%!xSjL4TMbmgsg1|uHDZxjYP7kd7oxL?8r?l-lmsES{(X^tiYidRE{4D<4_J*XoR4c!d|=LqFijSgK0& z=dW?YAYT)JK4*4BxsmjHD)n;d z3}1Pwu#g#c1oJjPUTZ`qV~OFc^Y7E^wY+BaZx&M1EE>^;eF4A1rp z&xsAs%?M}4ZYX?W9x`u*7d#0s)C%V-@yL1>e&OH7g@1??SU5{7;-Yy(nPWt5&h+C4 z#i|vb=;9vXEy81BO4tfo9=z!iVkbe zi2UpCYgeDEcJ@_j=JZrs#Le32R;_zAZzEg3d~A}5>ePz5V;*%)i8(3u1}^OVS?p6P zII5=N6I({M>!?)pEXqD1*9Gk--gAxm@6!ffbgx!)zj^e4WAvb3^i!>9t2Y9?`5}F= zTf^s`4A(}FK8v1s8~yBw`S}>P7J-;4t0KW_H4*`4kd$+dsV4bEHO$nRLH*pV0b9|z z7%7j=!pxJ6KTm0i9j;FYX5pn9)zOy5u*)gj1{u|1c==+^=gX5gji|Sw&vFHKC<#?L z(sS3Pt8^Y|Kxp3pj^^st^ws*wtP2{vzf~$eJE~!mvUNB#l<85OC$k33(DTT|8U@># z0v`>WZor+syb&mPgfe1PZV4b2hrcMYK2vic#kGR zxuM0Ok<4#u`G4>aJ+hn8V>l1dVI3k=(2ZnnI0vA}0b~F`=sCJ#%Z}nU4Le6ymjG#; zhN7wNhv@y?*QRu!CrGe;jphZ?_z6I>fr?2mC0T}Mn2z8!O&yqUa0URUg4!B^s@pVa z1gN771O+e@0Y_87H)$jT%b}@Wj*~)xTBg5=P`0Jnz#?XG|ACCJ0r6-~bS% z@=LHGuW80ML0Q~Lse_0)hkXrfOzKuv&pLSauyUT>F%Mipfnv3J`9?<0O;*-#1T|En ztm`DK0HDiw?#nH&H%2t?E@ax}pnW>Wje z@BgDxs!A|!FA!snaPNxf2`X{SJWtK7ub9<$u{-2L!+L{flK74?FOmCL39RlupD@4r zf3ZX#t(1nLka}ochiXcI@!c`;n6nirL%x5WA&=d=kow?4s>0RONB^bvJWqZ6F7?UR z)T2&6M=-7T{9vnWn#WTYW;^$wXIgA{S}Zj!Dk*HgBWLK;!PDFWf!(JC7vuV^-zRJw z?cQf6Kg^>2=`!0uS!#BVdaf+s?{pY_GB;g(8;GH*hkQARD9)7w&<}->Km-7ov7erS zr;7nV&iTe~B$)4@|LFd7u_WN+pQjat`45NwZnhptx--_H86Uzx-_Bl7r(}JW__uWa zpG?cY{}mRx)YjD8|F^N0BeMZ``}Obg2k3_|uOanZIXv(!6eg--wY@qNXnBpnE1?^` zv5g&I3M;#`hVRt(r5_~h1Pv6F661@3T__?l#F#N{lb+?qz4 zOh0VbiCj?7k8(R_xZeLlL(ycCH}-5&@l=1?W^4SeOXakz!_T?HBFP8sSDZ6)W^T1b zSF6s9CH~4%-2C;epQ=IKCONY#3&hg&8L^)qp1mU@ZF|+PqaN|;)x-1OzI={*Z5Y~% z)jPB09aIbR-qLtg`oXFIGo6X+McB$|jve%&nok2 zDA$lmHH+eCqdBYD0q>HE^jAn&5K$k_EqDaJ)V9FTN7LK4OGX5~70OQ-!SnR&2~umz zS8{CB9yDrnWI2zPqM!B^m_G5^oHU;j4Unun9$fmmJm6!+;dq5?)dPlL9Zgl~GVfsK zGoP5z>zA#Z7ctzZu)Xi$+(WOos-k5c`;gDPaiw!d)ki zk=d;JF@+UM^T0+2p9PTjNa!OB+#xayfA#gsdBghz(Py&ivTK9Goo!VQR6gF+JJ`ye zQVZj7R4v9d)(RDBoOZGc1VcLU!SIPW2W{20$mUKv$RLujGN1M_5vx`oYsVAmk!Vx&SsC0eNT%wMbp|(&uD}x@yZNw=;!g|esy|)!q9#Q)Q{zwn2`)5Rg{!_zs@mw1 zv%(xCfs+XZ7rS;WaSFYHw;srp5QXgRopl*P*V~+wrP{YTTY4Y9VO4$jMVKl>vKz#SeV0pB-iG_*^ye|D#h#_Z{O;6mFYb@FTl4w}wbQuAYY*V}wa0bZ z=>lm>LgR{EsiIC!cl5?$@&F_*j;6_7Kb>H z$ADFpc|2}0SdaV(33WUUiR2`Kd5q;`FWr1wo*&~1foI@4Rcint@MMrcySQOSx6ZkU z{NV@az#_pOn!J#4pHN~8OXfH6Q2amzikM*+xr*J!j@s8hnx_1XUg3=SAJI- zG{&dg4^uWeiXTK2$v#QyJr0AEh;M_vBQ+@c?>Th8sWypUV35?tFl%@X%QdG?sTWW= zk-hDl%U$*k#C837`tC)AthL<1-y?9V9%54do@{tGfzGgJS|Y@ARfCT>M%@51T`&?mO4B^D`y6$F>!R?1%DZOvDm=)A z<>SBNxn)_6LNRbjQ9j{T^8U*I4mLsv=A5jftb&!Y4bb>gC@drm%V)7GYs^gKRvNw2 z3UOohY@uet_wKYI5A&>zN9)Y)=kVNGAO1l6A#}l`td13{$!mPCLvUCWULuezrn;|_ zr~2NOPpWEzD;!kfcMp(1ZZD2D{0I+Y%*5Bg`b2+VgkpGNE6)6x*PO*bs#d@^_@*+i zKD0Is?`h(1>3*eaCd92krkC;sgsPvbcv!&vcCYEAm5Z?&PjN-Q3}RkDHrNdjb>N@P zMGwMy@HL)IfK*UPOP15W-`t(P+w*BEP2TiV>XHcBfLWbV-S<xeCgYpK=UR95q)Q7)c^LDkOBhs^Y5b5-}pNtfE@)GWhlieTq$KlRJ(mPr1O4U9T@ zlg0aJ4Lk22b@+GbF5HpaM`-#ROY&bvsTuLt2IyaP`6ZNR6bijDI!r6P>5Yg@14Qp% z%G6US0mqlvVFT8ow%Y1KeR&dc(N|umU#rWj5C4Dp+(E;8J@4*oHNa#yXn3jXEKdta8d2{&xzaEH)&GDMt^K@dq1hfDRbI+8S=^)N4nRbCH}Fu*UYRg?=&S_ zzJ|afG+(T;6taL5NESgd;ac9NLbg|ztM6Dsxvb*N9oxIZ@a3I7nB-~mFwr}_JmS{r z{`t+3%HmQjVFw4|bd{O0OJ|&NG^06dXNB{?F>H!@eaz}7$Hs}6z^D3IuWB!Z%NeEI zq8R5N(%v&@050ez-QbBsX%aIP+i+w-T)h0i6iWQ><2eUpRX0M1+L_|L0jRT?lp|}a zgKyMUc3m74^fJ4FA;ivF_D{n0@#MN7pW$XBX?-OBi5X#fuhdM~O1P1HSU~Vy1>ZKr z_S;LcrFSWO#qRm5TKOVUAq@1!)L6Pg-{}KeI}9P1e)thiz{C ztB5>nK7}bB`zfth^*?gT9woau6k{s)y+5xv$?=Lap>9LMHsqHiTdgL)72Yb@79j3Koo0P>KkX8Z|W(kN47!+*+Y^5rT?7HfEI2z z$>t4k>c!|utc9EGZ(}E8+|>TvQ^{hgZvVj*!L=6$>(%8|GqJd7^*w&# z*~xozFBH~n{)^~^{l%k%Yls`Y@R#U@Xi@9OoKK3*kPw>kfc?YcM~49^P%G%y3zep3M64_f?4}xFH&+ETirE0{oEQr7Yq={9RzTzZ{V`5`yg6u1bPv zV7*mq5cq(Lssmd4mq=7>((DVfm^u_l*kq9tU3dkJhFCbc>zPB)yP4?XcYieLk}H*` zvPaBSrpd^Pm9BnD_`9ec8*Y`p+x{n1aTT=(CxsxuO|iqbL?`+atkkbykN$X3gw%q= z0|zq=5;vRJK2uF{BB=CUtT*akFZVZ5=`GB<#H$A8V)toxFFL4#g^}|k@e}%*B60C$ z5`{n;n5;pGpoNB~cB{2E-A~4-|IUG*Ufhev(TzQjF|j3(9&J{OLd13!tcb0DQ+-QR zX%PQCWnkhYR(M4}VU>_Xa5W)Iw_Zh?KX+3?8%@hz#*_xkx+^~vBH0r+sMGwx!Xmza zHLjDSw27D<`DSdr9;BDUuRt2;g93tyX5_Lr9?fKh=ITq9wpltR{k$6WL|mrsB5j{_ z;^R&~W#I*Ju|N+#Ysm(yia{nig1=634DpBVjFU>smV6o*=@d*Sv8Pv07x^svN`4Q~Yx|aii}RvsbYOj%H>B|pc6dQSx(=+qM_pkvGRTDk*1jWluUTg8X#j8_$P&` zA8sdT^**={*?B;e-{M#{`b0+7&`tXJFeL4OOWKg-ubTu7odGG8F~u!{ArnkW1Z%qy zvO0Z9QXzZ5*QAa2ak`FXwBB%)tk=l|>b0Z0>yre;z@Ow^zR{DXlGo2%YS9S|xLwvK zL!>KS51~gWTg2g~ik_c0^dkTc`=uaq$>IXb}UnXmddW8&{y6m9K%AOr0iPTD34 znY|}t6iLh$5-U7U&e3fA$Rv;Fnd6r1@y|1SPKX=fJvv$qo;zKX2)o9v}!KNk-R z!4>kWL7v5w5J|vI{-dooOaZKxB`+S1+@veFyw?~33}}+YM1j^LSwEYq>haPRYrTsq zcG4<#Dvgc-Po{;!8zl-q1U@C+n605aRV)>6A}0F#m=CD!-_VY5n2HgUpNk+3Gd>+K z8he%soq!#x5Zv%#!5u$>s1`&cd~6UKNydbD>ns!F0vi16E82l#PC&^mV!^q9iW;Dp z{}hgTgSy>c)Q4TkQnaQGSglFNmx!r}It}lR21XD>SRUdA8mEz_AzEqE4bMX$;uoE$sx6YInH`G`H|i)F2uZ5#6_#yGKAOM078@bwz*6 z;Qi;7@b`ndtQKw$ExeWVM{Y6N+T$MN(jHx$3AbQ3CMt$-t7zHD$=x2kv=$R4tuk6G zQ}G3NSl9WR_l{PkZYzkpklaPgy7R{FgYJMH({-->Qt+*U+uOX(Zx{H?GA*5Y{eIg< z7`Ts#z0qx_3)5n()>wi(cJ1YOZyqJ9q<5l{eodnQf_z>7#Eac+YCR-%_Zm?`D&Xh`fNz zYkB?~O1CFN`t(4wP_*#HXR3~VyQNgv4I*y#5?-Qhh6{3>PwoF}zg(o<^7iv#6X(wNjmKq& zpw72;fq54MVc~1frr}!DhQIP>RF&Wl`LBJq9bXKP;Q)XV+t2f3CrfW_E|5Q(3>fSM zg34nE@P47KAj-2?tB%FnGfiraS?~i+{iUeMInZ09tRU}D1V{RIc|X??C3hTWt#}3M z3(9e+`m(5GwcW0=eB%wMLy4~x5!70nyhWmjbQ&r6KXH}p;)pH=wHH-MoseuWLR-hj zH6E?+vo+K>lO&o8viUvmLaZJ<6BYp2h#Kb8#!)&B2?TRqV3u z{X%OJuf6kW;yRr~K61!jks#dGHS6c$^t$69MUQh7t*;V;ca{G820pvnOFQf&7iJAj ze>etZJjmXeFI8LKK`@y=JF9$=p zT)(wu^pzvF*l+125#Fk&m?>hWeb;>CTMdhZ#nEvASueB6%Z3nh3Ev9|N{@}!wt9nj zTSJ;3wiDT9OTH0e1riP^FE0M@yzSecZU{Ml<0H|(Yw{Kdk>+M?0fD`zp3)jvzWX7= zuU+#(^rOirdHf|ZU`i@(RN`@>@gzsFrCH&#UY2H-VF-~2PJFz7h;S0j6o&PZ?7umG z(^LBDX-v)R>6JJZ*Y8u-ubUNRAyyLg)hcq#@UoEsx$#Hj3+-c#;6ZbUaZ9g^y@3s` zwDQP;G7NhDRP%NhL+K>#i*Q%TQsk|C(c+WWE?U*TUYpd@1NvxZm3W`uP^+0t=o6*% zx^`r$k;zCWISWWHN}sHukH^?c&peA=-0dHC8PF@^oDK*u_`}a%1?1a_7CGBTYA5g^ z`feZeHQ0x57SpG3kYm1p4&$Gy!r)>qM^C}% zJc*$2&^_%tC;WhO>VMoiPK1OX0LgKq|2EE%;z(j_D?X<~f*zAAE178X>t~;n%6@LB zW!}LI`c0KfzXHwVEw1 zWCCF=bHNwPuz)le@#?H$|92QkmTZjMiGhW+c~SzKP&i`|gGLm2;7FKmC?o=M)kq+f2zkZ2?7g>E^E#4>0=E{+y>Ti0Ulw2LXpdv)&V1p|wj z)};Hr0>C)1qi&em>^ty)?x`B1$F$r6X^U(=RQ)O&HcLDKmrz<^<)6BqJ!aIl(%d5U z9}{Ju1;0L74fhfCQVS+#%eI%um+K@xy}%;ImgTgkF)~lxWF7O=8d$$Yt~W#d`nzHs zU91;!GkOYP?d+9vQB$IR*QE4Nu_L=Ni{XxJllHtDC81mYEkDM$;w-+f#WWCNA+D%9 z;x2i6_ze#?QZy7mJe?PifjSmC-p1|sDEU|0hR|~zi-+e3i7y}3pAMZmnA}kpVP3so zk!ND}^d`L*GQ#xg+9v2|S|sqjjtK1X(Kil#opW*QxcBlC(ExO%S~)St+xN(NNPT24 z_+Ln%#M`WwrKmx8f$i?MBci?Kaa@(!;w9@6V)NMy{yigsx`p%&T_$Mkik!ZGc$3*@ z*l#AMv?hq6l1R;FUlv2Kh62Et4~0}et^C}Kl+cXs!PKOsAEca!@X?;6xx zZekT8j)^N#!rrZ^!@GapcaE=1zv17BFE;wcY_t@5TqdjZgcX%d7FU}!yKK1DTpeZ} z4C8*!kaPCRuU~E!5kKh`UX5(>&lCAkc=G&Ic7n#(Ydw@p1E1B}x^)F^hX@=I^VoQA zt-mJ*wB`Q&oqqT#Rm@6m{25E(4q_^p0MzLT|F$fdJ!>m+caQ3wBP;)t-`FstZ|%Ic zc6X$5Ti1{Mm@e~E$(BZMVi!-Fohwr0Dwp3k?!8i>;JyL7It%iu`25gYi3#)Kot=SG zxHUoDRmda#=u_vHT%x*ee$Iu8_dFbwo~hT&qZJ>%rp`!7m>esvg@r}+}+}?jI9cY zN&kmd-AOG`B@drVn13%;acZ8s`c+V+daW9Dsq!j%xH0IeY~{|IU=?NmfZI$14#D@{!sF@j(g{CQ$kz%!)2-N@gET%(lg#Zmobi2 zSt@B`)rT)LemDnjK;<6R5Gi$7XR~ZMHz$-`=ah1`QJ)n7Ws6WDl!%f8toO$<+`WA|*F2`-9(=cDQ{ z0v5#$6$wtjjt6LF-t>SD^?|S zb@E(x*L{G_eHXwW3N}5;1}xDj=kcXv)1zKg@^X^iR(3}2(7LNI6BdJ{Mxw`PCw-*In}}Z ztH6}U?YyQPopn?GV38_L?o81&sUm!Y-6>wzFJ7IBnR`SENvJDbf3?xA{rVyKL1{5D zyzhTEvs9TTLWCg|IW7s@MQ4R-I)3SlPmh8SS`=iTv4J&#OAQfgSvP)cgB$rrsu_;L z69O(TBubXDu(vqyG)}gX=d*)v8!!b#BK6xR^dTBE*QCkVM1{XYc+jy z4jLzU=R*2G=5>`%|s1ZG63#h@*PBuQk@tLTpLur^AQ6k3QPoCJw(h zlyHFnb=TmKlN9g@xIe+8y93T^L&kdyRp_rkF$Ev2a5oDRCjABB*CRbmHgqz!3OR>xLIcfEB3cbrn=5C8k?Nm zRX%udq|ZcnAsok%)&}=155-rCxv95K&gWDRi$ZFBJ@bSz?s&FG_?<~)gXarTh8Bg# z{X*_^B2xWx66dFj)jrfqxA!Lm38b4eTO21GAW8-w$As%!|ILl65dV!N+GoeHm-Oo? zGOez>ooR!F@3(jic$!&uWi0hqNI|=W=w>V5L(G=sgYCA6q)6dk_{Wi(gmZoVe#zp` zUbrR^Znrv=c*XTY1J|tOYeBmn*70I8Eg{FW@UVW@wawVov61d zpX&QXiZ=$DB+nE%m(_i^Jrw(sY9m#S3q%2r0u+7%?_Q@1-s@eE= z6U4P!0YXlh5?1{`1~@|KFAp-bN;e21hwOaCj1zP3Z@m;<2Gc?x@9{xb3Pj)X<#duF zkRYTAlP;yA{?=9@mPq-*w>NO&(#u#BELXB@iFaCC!!Pf@-&--=w_y8qOWa{!pN(`x zuf$KTfdlEts!Z#JTb+y+)cz8rxZjD|7hmO%^=C-ROfKTSa^V87OWMLSa(lYPd(+ny zkstjw=u)6Tu*44d7Zw2sfLQkbNGcXfD=sw&z436_w}zkFAk=N!TFW-z4@GNSRF1|u zF|E4}eN8%4VO0GH7+hn0^v4g~V@yB2El}&E+>Jkaq{+Z|n#YDKgALm{{Vx~>e?P%9#-H$G%y?e!#D3u4kjC@j_oZbQU|AKb(b3 z=#mcyq*q+D4uAAZgwiFZKR;BvuJdm?RrI2!k=^Kky4JJsPnrFMLI$D1)eXG4b5i@aF(DM9K_-a?OVMfi+Ev$QvH8Z+7&=jHCw2= zg>YEFhW2pKXjgujJ0j;vA}tycz6j%C0Wo(id0rJ>0sr?s6U@15Cx<60$J-QY0(X3! zC2>LjjTb{de1=!BnUtn=k47GYRUUb|;;A~oNxC}v#B0g`9|ND!9l!okF=HF>_uAIMDl`)h6B)uQk`cQ_i0znx2u3>ouXIhZua$Jye;t`{q-g4Cy+3OUvzQ)(~BzF zktyF2T@o(c+Y`*Kli<_zQR0VHmU!2bE)Dab=3jV}x@$gT!@8H@&UUrD3e2)zM9)(D z_Fby2CCU$<;(`%^e>c7BVy0IIDF4Q_yX0gYB!9tjO8>nW5{S}w_bZ+iItP@_2iOxs zxo8}mGPjQTs=>V62kI>3wAd-mfK7P0z$#H(lwoKN;IRdQGG=Y+vt+&fRc$8qiCu~n zcNJ;N+!nli^Q;pxBU+AM5DE0qAHSjKW)O<3 z<8$*2%Uz>_>m=|`^`2D7{?HRN0ce|pVMYkDz9Xt<+32G)97Gqf&7AoX7$wii5Gp#B!Uz8BLns1dx%^5MqGz4pB_!rp0H)NEqd=H9aP+6CbuHN zeRem4Eg}_QSaea&>AvYxD@}ilT5Sn-*6EzZ96~q1rr?@l#xgq1Uu3`c;KqGPy<8DA zP~3LOr!0W0CY(}MsaWNy??<<-)Jl;C>lu}&HqgTL`iV7xCm%zDqgMVP zOAYUoeU2ldo)LH&2}r+fvUIBKCHw5YFsct}uf&SDOTBQ7n*)KEV8DF< zvHF)@d<`W`!!K#QD8DX6yc71Hgw9l>SRg)Tq>-yT0EPdq=K(l7y z(l@I@reghx8_gzHdI}XQs%0UczGYR%h5yXfY9!~IxYYnnAFL>;e1dUDxr;Nh2|0)g ztn@98SR=GDt0Bd{#@j|Py0Yf2@NF2IaP&sd;l_# zB3!VhH#}DoqS8R37?3~B^nL+Lm)3onhVQ~3{m(+=0C)c?ik9+8ThS2-7ZjsYO2wK> z{}jm%FL76;hTBB2yzv)hY&0JR@Dl0ZFj1`px{&^|&bpzN)jEynk?1c5rr5f~(rl1{ z9cKqc!tV?0o~}HObm3O{Dtf!@E%QNkIaay?Ak@90dsp-J@oZTJUhw0E zoIu#}hAG&3MdD}~q8ccTU*<;#yy+H?(z{q!#qG5%FWj#OGOd4AH$M0Q`)s0vET&Ztk5}(&@zWZ zSdx}n4~*Y988LM<-T@J?0P$D>=}^f>7bwCX&uDIx$bO+A#AkHiPnZaqbcrX=rJaSx z)7%M8@cm_Gf+@~A@pA zb&|2OUMurHkK5C7Vm4Y;pJ8A}pPgCa=E*s9HwKEd=c%)lS9%Mdvv+ z$y2p-Dl}YO3gtbtex1DB*m1EhO7Yhq*{IVVlkt`u*|m8~rH@#)fL&}hi0;E3W7HAF z?v;7_OU#LO4PNl!rbpWCxcbCZb3z6t;p8!G@jS-(z0a9K>tE;ZfW9NIyvALSr;qN> zE;m=QIuj2PmTZ|x?2~lb)P9^&P<3$D|6l52-e$FV*Cjl??bD}+%TSdUfB$9UF(h6D zy&qMqr{<<`7p63MFFfPPe)+|n{_0N0WM1LdkB%sijvaFBKZr5c^Br%cWr77QGKh)S zzW_eEIcHcMqp?6M)-#q0JfbcnwVf9(RNM&J6;te+DPXdW=#o9en0c+aqVPNNZZz=V znUa%+s$>V(6JnxACLtc=FmwAexFStgAQ2*bz@E0HhRrMXi*l{^UC@;x53&5}x4(N9 z-$8t1c!G5rB%#S`El$d^!ypvtCRYS1^dS7HpuDky=uz!{v3ydyWO)0EUh+UiWmNl! zp)cX?n;%3v*DO*&=gcCdu@a0rc9iJ6vIDljsRTyWU5{k*s9Ju^L=Qa$B#VAEcZt*It+G&f6S>TgUFxLU+Ff$G)I83r!tERYy^Yfgf6a@dGM+U=C69 z6hSPt3`}_f7#~0a2bRH|R{TzW@atfuL{mG1m~J6yBgZqk!8&G?t#$0d$x7tL9=Z*L zb9kfN-WJlgudygw1Gxq%#83t|fG!Y;>tU{VK@eX!qH>XI%1@Y>qRD(NDf5w>wq!Cy z(J5pfE_4Js;&HbTE@U6uXk9x>*g}z^Wif1QWB(g%$B#T*;4S-j!VQG;J3I(D3WSCW$=eN= zVykSvDp!(t3PwgDhBpXADn%5?fsn{6QdDaxP6QnkgAuxUQV}8Xu;S-Jx1ue&Fc7|& zMJ%9^E^QVBMqq&ve6EoJb_uK~IYNsk=Kn|#TkL~R4(VgSN+B<2{J?$!Ian+x04Rkx z0|pH!pq8X~v1L%wlKcpT5`=(|Sa1M3vil1`cp3&$nsQ$4TSd%32t7Lq1Q=)V0aP*| ziXizSIPMyVUV?^8g3N*g5r9*?0277_q#zHHav(AzC>~Gn;|L8Xf-|_oH2HKbg#3`_ z2=_q_a%_Vf`)Efy5F4LfF_?K>0C}%}Jt) z1*KeoK!(uHPLZ7hDG?8$lEsK7gp2D8#3%p(2uW~8qwHy0kvQ3|qBLwEv$y~`cSk_d zAf$XQjSeX^$PZvpfe8kShQ4A~zW+esAOL5Ira~ks)Jk%X5@tvU$`nGSR@@)}d623= z47V4U$xJv7X@m?A;ta?rW31t|B|iwok6-X33<{>e0fu86Hbyc4KcMR|tqGpI@*@fX zr~(El6(3MRvarN0u{kNL70U*~RqeE)W>;cZ+y+93f-8lFWF-|zR0TxEx)5*O;08xz zrHKM*)@#v0jf6539U`(8LTu}lhpLDnyv^0J`Vf~Ai^aHGR4UVO6d&BMP#|#OKzRvL zQtI;KNP`_sSGzlhMHQsLNC-evNVAxV0X2I=-Pk3DfRHdyuYWZguOgO_h{@CpGx{wn ze-lzZ#t}po9AFwPSyLPU3jZWH{NTU=6eD4@I3fT?z}SU{mtkeLA`byT!-qfR9xZG1 z8mX}Ij8x2Gg=AJBAR0*+bBL>w5TY0Rh=(VTa03{q0LN3|28fX5ARl*e$lH>fk!3=S z&1LSg1%dJvd6io#o3ppTa7MIHENg;r`MfCrRDrcZ4H;-6r3t(9i2a46;>`;fjkwp7 zqEUrL*6ewsiNb>!b)#RPx6l00gex?;ry~G^O8pav!DWGHDf+CcS0zYRK}edGP+K65 zXt!87otI4GQZJn5X>@Y*u7Swn0AbKWT|tcMWa?EB2Z+S0=k>F&h`8b;PItJ>?F%Z& zRz_)1=ZYV)Yt;T#SpTIn%4YvIl|T?99-LqS2p|vv3N*4Nfbaz{pamTVop#z#u{MV) z$HiVkVi}p>1n7gb`tbNZ^^&K~EGiHA z$_yj%)@ZzTfX_h7t6mv~fP8Bxv->$L!x=~Tz~d(mEoEGw5r)`3EE;iEK@tu9XAQ%! z3Yh>4z7Pus5dRA=V{-!(K=>zt`4AP+GTQ=u8$&;uwi0uV3(6u<#}0A#+k5ri-baIdu zm`ID!kpBtRP!8RoiFAmI-QbJ6$PI634a#7La=3fS5R7t|36!u2uBZuyzz49v4Wwud z(C~)A_=$%I4bupU)?kRZh>CIu3!IRNfQXH7xCzk!4e8K`(GZB`kPhka4Dl!qzc`JJ zfQ!wbh;rx*{n(G52#|Nk3v~#GyqFG0$bnl1IUtBCMbQOgMi3)7LnX*6FyLa~#!po@ zM8j4TVSoctK@7&g42N12y4f z2yu4>aSb@20yYs*ukby`f)k>Z5IW=}xgdt4LJrK(Sj@121L08|g_SXqm0QV`UCB}W z!2ePAV3l6!QT!m50`XXEQIuw;Gp6#5c}Dm|2d$hK$i$g zpEB~H23ar<>mUSKAOxQQANOztS74|7;HG9^23PQuq_PjDKm)3P z5Q2IMV1cMt0HTvB1k#`t(m(^IfDdrMsgQXOh#&-g3JQb@rziTTk;)!wYX7Kc3N|!q zqv+-mtEmw>Di9|~2z%3`v?&#VV4GIa2Vy`7ys!_=@BgtJe=`J@4r6jNHI zP?SaUG*GzZrBbGMWLm9DX{+Z-5ZNFNAZiir399Ovo(kci($IzM0T0q34fz0;_{t9Z zpsx484$|NX>lz;tDh+fg5ci<2(tr$ADI@Bt4G0mi20E{2IS$gWs19+l@QJSotFHaJ z4$^=NQaKRxfD8@$ump>)lDd$&DuOu*bwMVqvI#lY5JbRo4aBIcAkq}P5D)vH8b}ZW zVt{2qRIdCmoQ&f_Gud`jIv`3&5LpV8SIDK{7Or>)Q49exRA{F0;s3BJs}=PMwqr}S z94NMBTei3gH@a#Oy!vzvVOx5GMf?OgNmgW@z=H3jYqD}$@emAYpa_9L3QFmu#A&ry z(X>^{IZSvhR69jbxGhqs5L*j6mNgJSinf`nxtq(mo$I+@(Xwm%vLpy~x-zqL8?^&5 z3IE}%MJ6jJk`Wp*6&fN$g{!pd#I#MMxHkbZjGGgrusKy5n^%h>c{irqxlfiWLRz*B zo9Db@NDiB)ozlBaYxBHC@x0foz0oU%`5?WHbq-&9c--q)0ujCG;1%fWBwi7{{IE8% z>JZU84%h3x??4XvYQ1Rb4$w=z7C{f>%e{>g!0y`)-+-3i%l{7LdpgnUya~(?=-a-I z6~Xb)zVE9Q+`GT~YrgKg!R5=o8w|e;v3V5iyu(Ef8ce`qD8b^g!eF}(86gm+$+i#S zwyjGNusN)$D-eDVZBX~Ra~nFe8=O0Qt;37By8E;a;tQV833?^96oR{t8)dkawF^PH z%YqPP00_MRMp`y+V>54s@d|{OSYe_Gxy%T!P#FB+ikZw!t!#Lz({N?u5^!92q&&t^Ny?~9c-raAmMqI-3&VADqw-P1 zJ}kF5>7!*z#D<$JH$25y8pJ_tt?0b82x$~f8x$JxL%H(AMpSoJ3%PTfos$bWRVWZh zAr-Sg4cEX8@4yf6FhZ=zO}acbWBkR9%m}GWPK4adA*>KAM9KouO#(4*aIDA)d@k=K0h3ZLOk-t>ixpvbjQ3(U+-Xe7-Voe<;%B(A_s zG#w@aA;(}@E`ujFR_PKtozg(ULOlJ;Wpu`>Q~!9s+z`P$csk7wws6VOJT?`bJaD`= z(j2c1Vbmv`JlwR0D#WIYRnk$7w%t5K-y9#|><~Okvr$VoNoy6cA_=0>E3#X;v-{4s zo2}PE&m3aUgfqK2sn4`Ey#4H)y4A%W63|)952G*&HgQ^}Q!a{?$%+LdizSuqFbz=& z7Ms_+ily48vsjtDSk`;nh_&0|qF84{+b%&yseRjwRorA0y|E44XT;n!ecP!$4Xdr% zWTe2G_u910$fxt#xUE>?vfF2b%#D@Fn}>KsQQXDN54p`)iG|FLwOGL2yv|MA%rM>C z{a94#!BNTHwQUi!&E19p-{M`{;7#6T%>T^@(U30DyJ5r+evMf;9M}UPk%TQEhK<;v z)y|B4&W?S=KpEMTE!mZgLs1N_nvJFZ+`C`IYoA>Z>f{Ke{kbtN<1HH>w3L4qij!eB$LS5ECxuxYY+`aM($%*n8gCPM*6S zUZqlw&z4=~`<&V9oaO(_6#voXI00k`Aw)wc6tKYHXKv}2j_H}6ZfTz2GPq7U_T!`* z``S5RaY^lD-p_uIa-* zBOWZ5g%>6lJuY4$zQpeAvc~B;E+940Pje3B4^HY4ZtbU@&Y+X$yrSfbJ;bdJ&$uhk z%K5Z{F5(J>*|#pP5v3E2-s@jZ5Wudt&yMe5p#(~x1~i}sLqOjKEsDwL?E&%-YmS;Rub7xIdaamNh|DF1bBhNAXibjR=AS8ez=`b z=?xX-vYsn%K&rs#s!MYB4)H_35K15gCqM&Ipak4R1AxZw zG%)Z>F9omQ0bM}!S3g29?EeOI)9DV8S}eF@^Q;KW0yiwLwb+vFo6~}aD?~iZ50W+? z)UZT6&nw?I6?TDTgPSXEzjn(qogd?NvVvto1cLwZDgt#M>xN_-5945oWRwHy{?rF8 z0#H?^Z45#8VT<*{J_Kp33DeLzh{ec-F%5;c4UCWruZ_u@&-w+S)>?rMqwOHA;2_oh z5Y7->oL~(y0eFGn38Nqpte}ze(Fs#A40i(zwNETdB!r_N3Bn@J6w(PF;j_Hr3xog& zjxY-?0tnmRBBQVfEVy>Gp#1aU2`%#bEu#H^;2^Y+{hXj14CN6+0YeQ{{G0#{!tM;U zzxx2ej~}{4j`;Bs$p0@Mut0ze25LylQNvN50(C-|kYBD`8a*c5_fh0Xk|j-^M43|M zN|r5AZgUw^=1iJ3ZQjJ0FxNI_{MwOg*DhgDqV9~AL+7g#tXN86@!AAU;j>}x_>r^a zj$XP~=i;GLwse;*W>&Ao>eSR1ELf~Ik)!8sr$A<9(V^?Lbl4_-?!d-+x@nu)Sb%%= zV$13kzmTuU_1*cE8(UthY$>HuSqALgfdDgr@ZgK_n6d=H!8QxuRSg`($Xg{ zNy73=GtWdbO*PldubZoaN{1hD5_&A1$M{JnPN9CfN+6)#1wh;4qbzVA>`WO;&@I8JNgfPavLlYS&Tu>O!WqfqSZ}E=Jmgcrk%&*@h9{c2 zHQ}|lW}9!u8P(nfZnfY;4Q3`JW^y41rfGPoO2FPM8-gpymHB}jJ&?cjV#de%&+X6W}7w)5yQzl*C_MJMV}Jh zuUd%(#e^7HOyXnBd_|LTHKBwNO}fw|P>;|FCXX|`5eS+t#@^_aLfC{!lS1}Tc_e6F zm_j2dkYS_{r=MR_6MlYY#NEfwM?d|VUB5;Vepb;)lW+?OS9~+s#&e9;Y++;%#|K&j z3|e3afpmirl;~4Cy6`_P8SoiusGdlGAOHcVOnejDMj^(4z%|vcBX?6@2-if9b^uHy zVN!|P7A3+n?E@X7;Dias5Q<#vL1KF_AD6I#j6I025YTu<4@W{gB>W&FP7~iAZ2u98 zJqYhi+t>poBGv^bYQzu+xWJuqp$6VDA{UGhl_vJU5k{zig=b6?9WX&dc5NdUEYn0T zmZyngg(4IYTg=#yF}AT`tPp1G9#1GXv{pqBjWszON$x_RqV1y_0@?=anlzwD{zO1Q zQ6xIbaizgHavxq}lh$;kH8Q1RZW!VdjAj-|0afvkuY6Jz_do|T?x73(V1yJjK?itDZ68~fbjdVNm zk>&ikP=+?tp${dHBp*6aidNL37sY5sHM&ubcGROE1!+h{I#QCB)TAdxDSjf9QkJ&V zr6!f=OJy2D2F}!`ANfh1bh=ZX_B0*m0BTT!iZOBsRj5QQ>QIqNRG|9Ar%#3IQR78a-Pl9{vRM$FJy4KaMcg1U7 z^}1KS_SLUC1(V^3LKHCt#VCh0%3uwvSjINiv5iG+WFM_W#zmzdbApZ#rD! z78jc&Y;0jMNm%Bp*16AxZgizPUFufXy4S^ScD1`*?haNXm{jhj#57*-?n%6i-Bf#) zdtRYJIss(ckGD4`?d0OOXEJSru1VF&5J1r7Ev1{!pM2LFucLLs(+fj`n<3N$d| zD`+siDGXr;l-Pk3_%VbNFk%W)5cC)@Fa#RVnGQ4{hZJ^j0)Fga2Wr3oKG(cvMO$nK zW7vbAhtOn2d%(_W7y={ijDf|F;{;{y0uX#jgIf=wHGnoWBX;0{eVo7ppHB4-+`NYq zEQS$75OfzXP-ZC%LD8dD(@Jrf>Rc!R2q&O{uW6tJeoz7$9_aQ7j7=9Iki!9X27(7X zFgbPOQVAFk!VvbL1aS9~AN+pB4#Mqg17o|mv4%Ab!o34Z+matAP(#1@G436>YX}R_ z1P#8u10^Uy3K)PQ20YO5c@taWfPOd)K7Q>QJHP|sR{ysLhEQ;WH|g1XkU}nU-USDE z`Pt#(Rv})|g<5N(9S(SftG7YU@tL`dzk3DkdPwwjMKX?3n1+*UZtxxCa_C~jfD-!W z%kfG1cgz5u_`t{vHMB#1Tnu6v*;ZpDy`sjQ&Ur7FK2DwI5lK=gBlWhp$#NjlwrS4TOKsIKryrkau1t|_FY?sTB^{D320IRS-h@=Q`4%`d-t*0pR5ZCGsNXK<{RJn&p#yVxcF(9 zC|c3tt10xgzx{Zz?u!Z8_a5{eJd0JnOk?uzg#T$W{F0zwyac8^nJ}bZmqZlx`E^gh zOQ+EHZ;EvJH;EVX2%%uVp@<1J0KD?4vLoX@ib6iN;fU2(jo`ToQTvDjoC)?59h%X= z^)rd#%f6c6zz-zB44jFVlL8tTw(`M%E^xCt!vHF4z>o?R5XwFK0Kov9k`UBE`k;Z| zIROm7fO{GOexo!8Z~!x!L6!=X?BhX*!oitvLJyRQC*-pF2pTtH2AA2IPE!IkXc-$c z2}Te*1M~>TSP8Zvh= zF+?d0bPp-)L7B+Gk>Eiq%!x{p33AwhaY8_StF~zAf_qX4S-VAM@U$)3LNLO!LZAVD z7=v86McR=9z)OjAP{A5ggGyV18ry+qAO|JTpLSS+DfqH#AEz;fFGWMl*nUo1(E*OK~*@0I80#rdroMItW zT#_gR6;>39d=VX4bcuG59rzf6JO6pci5mil*$F``2{8IXK=Zg;QvzR8gF8}#ee1Yq z69{8UiFTj?AuuC{v@>5ifji;{S_-&IqX9a&f<>c*mYjl)TY~X1N|)dwA&`P4Py%K9 zH;qijHiS3?Jb~;HJBULakMp>PGe`nM+Q0vY_k{@I2d;2CZb z#z+D)F7ll(+6GG42V2;hXaAssv7sF_BfLSJOG=QRF(`zlqyv2e$N#9f-dVLWB11D$ zg0YD@FuSGx?2VS#2Qh*fXJG^(s3By?osj4cX!xR67zPNXgvBtX9+ID2D1>p@h7cV| zXA!(@xV9}Rn)p+bDV)L9{0}L4j*x(u8k2&zbcrMh8kk&(0f{;SgOSX0FatrumB_r2 zAf=W#(hPKvJxD(v-4KhBu>W8{naEL=&^DF;ulrEGff=8%nFb0xP@IuT`PjgZ5*^_} zQ2Bd~YGH;lqfAg4Q}l^bjoJgM6vkMKwIY+m_H#nrOo>Pl2|i&U3-r@VnU5@mMcSl^ z5Y)-Vu`Mj^!T%wLY5#zRZ{P=ZfCI;v(mEZCyoqQPwDVQJ=WKZcPcJ&(0E&cJ8bv`_yjfX{S;Qz|hf3jxdr%+Q zEI@kgzcc|^DE|@IQuWz|l|Ou)7Zu_O;Is)bqNAwnA8x7Bi4h`S;=2Qz?&??T#9!39L{h_J=LhvkxjZc>xg~W z!cEj zwk^SV(HA8Qn=NXY@iC*;lmc>a$cf3r!<>?FT23|S2|4myl#qsFVBAwM18IoElBpTV z9g32H+>sC;#oR)HNXBsC(%;lg@N%s0BCJ47u1WE(p(vc{t+MDSaUb+Fr)8 z-Y5Ib?*CP+LqT8lLa(7%uJRI|>-CsG#i^js63iOk}8rqY!W%r zCEC4@Aj+3c!=Yj^BSUPJI=x+&$itzbnhT1Od^iSE=wE4Y+yaTZ3C<6`WkejZiD{?{ z@!_Hs&O)?3RfaXc(2b7`eBoQIzxAu(W2Fywb;VSb;mV7WtXmAw1zJ_wzx~^iBPQZ@ zHP!Ut;S7|J%+c9VdE0`O4-v+XiG4CD!D4yE*oK&5bSERxn&R3c| z<2ROxG=9EQ%84b0W8({Bq9wle=!V<0Ram{_Ku$wBw&8{nSv_`%xiJr`fe$+tB|LJzws1BBnXgV9h@D zJ*X`PiG7fr<$BSOP#o{&-0>YR3ZuU#&gO9SW(@PZ$LL?1J)w3MRtdS~i*g)+Q<!Uc^)apxi>?4Vx4tlge|;69bC`otO26cH13G|t8UTBucNl~%Fo-~t>O^J7amRhC{G%ae2 z!jhj5o;`?4w$nF#)6;6P2}b>6qE=r1gMS7oAqT=ITU_Yu9+}HKvINz&2N# z=;LzHk5jS|NZmSr8z+?@FNq_65+z3oCtvYH z3W0zC03rDV1quND04x9i004jjRsn|qAOHfc01`n}7{LN4Lr*MnvNUhKhrmWyHhop3_-*=m-c%sL8g_wI@fqR6CdyScUj--2|vV44fem^LHkhOx0 z#)D;EgM@~MlbnZ?q=%fSh^V`XrLl^RlZ%Uti?GIzW?hf}dXbHglarK_!QhpdotC4m zma4s%u+NvXz?c7nm_Z_#yUUoz?V6REnya*%cygPYoSvVdpNxN?pr4?~-=UL`qQlXn zqokv)x1+SYq@A6lyvU{8<)){prnI1@)$yliT&dajso&|Uw9%`ksjJ1)tKjCWtgWoH zxvav?tlZ_Tz0Ix6+pW~%uCB7KyTq>9->&5FucV-{lZ~;cX|cMtvaN=*tgN%h)U({= zw6nCd!^*VG+O*^CwbbCYwz{^y^0wICw{2m#I|;hHw7S{hy4>r!;a^Ul-E&$F)4osrSl&C;l#)6LD()6~=1)zj_!)ARn*`Tx}2;?&~h)aLQk z*V@(U^w#40*w@+F$i&*ew%X z|Kr)b(|ihO_51Ap|LyMb z?)vcZ?(Or!x%2h=^z`-g{PXqv{r2VK_vp#^^6mNS+WGhS`}Oqv?(6*V0PICJXU$+PFec-8QfiboU~vU3Gjrd+xdVZ2#% zaLpo0bYNA3M2q1WWeglYsxb?q!&Au{ziPOSfs5C#t=qS7OhJOL(;6K?*Zo7+lrF;K79} zbR1chD!q(%&QCgAm1YsDWDE}>X|HETRPPK1xjty}`=82rGx2`3PC(TkII>0Z9p)<+U6FgqQaNj1tFIns|dwC1Q-?$0(J2 zgGW>jjv~t~)Wo&hZUf?>+9=Y*p@}GIq!Ux5;&w8bk17m zoRiW!eTJ#%qKr1`=%bKED(R$@R%+>`m}aW!rkr-_>8GHED(a}DmbxiesHUpws;q`( z>Z`EE|0?UOR{7cLt+={s4?p(wx~o%Q&3Bbmw+hRuvAMoU?69^b>+G`;Ju9uV(N1e^ ztJPksEvngW>+M`Fr3xXhyt>n?JLsmXF1o(9>+ZYo`l@cc^vauVz4+z}@4Wi<+b*zW zx|8TY>10F23@dPZJn>9Av{r2K#TZALjv5FQ;PJ;Ghb;2QBo}}H0ttwb zO~x#@EUR`f$86Zf2pC}V%{b?*^UgdQZ~y`g96_piwi%Qm@W4K3z&`e0YO*Y);IQn z|AGfK6(MR;HwZ-|kvW8StvIbKp;OH{#Z*H`HQr?T)j(XMbIT|sI`od=2c0B}B%t$C zI;iQ$a+z5!6__PDc74?}&ThwmFatk3&;=7rAOHab4xll^?+!qKK=BSR0m0ceo87<@ zRevQ7lc0=J3WRPBgr`Bk3=$16z(@iHHs04#z9is}-pwGAykia=wL~LHEx?#VKls4Z z0tflEh?0dU(TK(%L;(yq0Aq0o6xC9Kv>H6f$Vy4U96?F}4rEZHbJVB?KRzdyLGZ&I zgNUE^j3AJAz|VAW07Eq32aIlnuNIp!MjV(F221cwO4S$zHOK@CF<1f@gusOp|D-{P zSyTf{aFHFy$i{#eAYcYDz#Rf6&;{MipbK4?0VHOihAU=~30Xt~6RL2xyuD?5e2a%H zkU|aFl;U&*dB+mK&=wWe0t{e)g8>II2snrW4)X)U=%VqC9}F-HV2}hLC6R?J^f4NF z?4Bq@@jh&T;T>S;#?m&)$xeFmll}Nc5b$G(cvvD1$Uw-r&>;(cl;VO*DFrepNtYF7 zL3}G5hzSP*hi_|zu}Q7nOvaNuJt`d2_ef?*Km_(3=B_&@dm(j0gsog~CJh%9Il zlqgN9N>_RqZzKmaVsL_s-;h-z{t%sHZ^e#H-U|CB-&*Lz3+OS{+u zF7~s!G;LzdF+bBKE>l3E25r;?jwi z=K={BfB_2-uLNeWfb}u}ci_cm1N8Zpcu=Dl_?7KVe(R9L4lK0*t{82Zo;TAiG zW)F_>gX88ixi!ycIL5Kvju*6{srbi0)(Fvp+!1f8!T~2svXYm~Q~$P*01*FC?Y2dWEjS@S4K#!u`-b6 z?g=U9FbhDd0jRIJ_}S2owzQ{BZ5PjC6tkE`F$_DG{MoOxFtkVffDw)O0ZxB>T*572 zSlVs`XxNuS3Q@#Bh^Nf37@6URgK$F@X^aA(IjXk62Tt&U8~osTDN#Q!a}B^%dDi{7 zMntnP$B3GC38H8V`cCQ<|Eb$89@HM!)OdxpJR=GS{~|;ny9;XiiZ-ZzsPQ{P~ zY;U2C+M>f7-Z%#})FJfK^8E3Te^oq?Aqx%CrPLbfJDeiV`OYWM9Xa2KI)?1|(wiP@ z=4h_!SI_#^yT0{~KfUZ{Py5>2{`R=fz3z9<``-Kh_rMRn@P|+Q;v4_?$WOkcs+{NM zJAchwd%pCiZ{;{r|N7X^zMP}4{qB4J`)Y?-|DVE-7zmO7{CzQgTlj(g_PhW6WfxpR z?D1du4;}t1jmJCi&;S1WU!_LiNFM|^n)Nxipac8>22TeDwcu`ukWk&gSP^JAh=5V% zuw~%z13v%^Mz91Y^?%O6ejqr4Bv^vgu>^>q1^n;>I*Cb$?P*o06Rg;E$8lE4DBpaU9MM-(6l zM$je?pap}l1T0{LO0Wb!U<5w^NfZD{SZD?vzz?FJfnb1x88?N6@q~7mhkCe&KhRL* zCJNo411t~?Mx_I7Q9so6O4JZqwXh71|FsNH(hY#vNCPoZ{LnvmxQBj`iJI7nf?*Dn zs}g$MvN2#xiD9NvwJ=9>!~%ohgM-in zS4fMu&=&sVf^gu2OJD@;$bm+%f67>o@5hV<0SpfS27)*cj#XKV^;zyiceOwP{x~p_ z@P-7zUmrAS+EaJ~F$iDC0v=F80rCS`pgs3jf@%gz@Ms1_FbF@;1ihpLd}IWK^o|a- z1d`B#9;F3vzz5z?#F48|L_37pbn}v0Y%^msf1LKxq_M0M-Pxu8CeRVU<54CfBJW4`*3iasF$>v zb^(M`hDntjU`2bBYhPTiG)ZhVdPz1>-pN#|zO2C6101kp^1Ugv+X2602fd~)4lA=YS)wL7W-+5G@VTNT=t_tr5QA`0-~&S#C5eogLW@<6(Xdn}(G7T% z1;F4`h64Cg^Q$hN5TnkyO+{#kK+O7RCsmeO5wfd zwEC-DW)IY1LFxbwz(5U|g(EJsQJUDKlCY8Bigw@1tyz|=>-wpjS`LK459Ls+yV|Ga zaH?E39gX#N(SQu)h791dK?UV9>q9#K8h!!$v6RZEvs#z`M zLg0{Di^Y&F|AROm3$i&|7w3r&`OpcUP!F~`6P!v8n}7`~+Z_1FHLLcfJNvXyD>IZ@ z53S$>xr!6}fDL<~3+x%OQTw(3cME!yvHVa!2N9$OQCd9Z5NNv)+XD=N@mL6PKnrOQ zCgiWyfo1gIv*UmTTR;yy5e|Nk3VhhC=lxtqyx0MgU}5|KtH_{Kf%$CcR1bl!Y<=_W|a1Mw&z5gc(ZIJ~^$37T05Lpln zOCUc+|FD{*^FO$xMl5p+34YKB^dKFPO1&Lse+sd|H3`CP zp}BO_4@3-5Ef$E(3s#>Mnd4-$M2(W3N#zz= zW$P8g1wM!nKod1lErg4=$q>y-6wqiDyK)bkN`7$sYzN&*d;7CKfDa)O4tszN?tGJo zA~1P}Cxp`{0@I6yXE=SrTM|JVVxbI)5C%}d14_^ie8301;0w(#4)_4D|GLHJ|Je*a zFb-OhwQ+#A6Rn38fev303s6u27f{q0kO3Xg4vT;ZOq~X4un4}u3>iFy&}w~fX_r?W zIM5o<5y8{Wah~01bwF*2?G(i9pnE{n~GR0dYOobY0t+fY-Zl4+Y1Gr#nD+1j>Zi z7AT2FhU1L-vqF?iR3@Z9qF}$kumpN!P~SVl?bD=vqzSiR27H8{eS%T&|5FMxY>a|* zK%?^mZ{bLg#DJoZNalM{Kt(u{L_(jvx8vXg+wdj5u$HP#o6pb#MGf1qE!%Rv)V5vQ zPR$47KyaK047YSie*{3)D2aU>lSTznAryu}6>>l&NWmMPaPf4TMOtp5f|XlRcR-B? zCRCn1I*ded0-?kO5m8*|zi`kNCe+=*ZNlLL9X^}R6YM3&tP82V-<=o_Rp8bD4&VY# z+XZgmY0wD{9TD29$Di{(_A{i3Ma?aQvy8!s{GbDbm_j?61>Fp!2L*@F-Q0S#1Q|-V zDh@x*Z9Yh)$Nb>K3CKP%nvqtSRCnM=Z&64tL{jk+zDqC==wng`|FpRc&QviPrGLae zIX=Fjfql=PSmoU0VnVTcK`~vfDhx)47Ggn;WF)lhAdaQt3bnkMQY8-tR%6K@zbK^}q{h zP~cA83DO3~iGEZY#MQc#ir63!bgMmOyAYYB5a3hT0>SzVp+D`D9ecYASkNf@P!3`c z4q0~jCKwOd5D6r31dosiZr$%)X%YLt5^ zi#7-wKa602nHyNk+@NUvM2;j`(&R~$CF$kcvIpZ!m@#F}q*>GE&6)cM1xwk}=TD$P zg$^ZJ)aX&9NtG^T+AkfkFC?T^d2}Je2~aq1?&GI#5hk!<(_oR;)GSecCZoYwB5BYd zNg73(gOdeV7KNg+EUEiWFC2u?B#GkpZV;F(fc2VN5-m&NEatMTMZBaNKQp!9h!SN) zlICuM!GMvpxto!0dIuqdL$Ea7xL`t#%pyuQ|CqyR&z^kO`yD-e+k8ONTHN??n1f(Xv+c&&cNsf43fYwXCyG-h=`wPbcjZi zQdHZluESQ-ETY6(TMLecaQg@t88L$6G7DRiguj!3YsZIo;uCVntxrEE}HPb#T~2*Vp9b807zG+Oy;k+I6TayI2Wzsgo{5=VcF9C)ptv2X zx0l|D#<+LP$u-Er%)uMEy<_UF-j$f~0iTD#DMAxbbhw3|QjGY4Jb1zxgr41^t45Y< z)G@l6YQU++oom2B1{tVJHyt{*lY)5lTiIbJ^`6}BM{m3N=_W|M>&7UWXxssZAHZzK zNN;uO4)U^xsF}O=;$OO~RCO@=9V2%_!$_dXJOw7mcP{IGc)!hgsP^g2aRVlP|2yHR7j;#W)4vjk`&cQqJ!uloj$&PdH)IT$NjpW&-=O#7A+_a zmkp8~@r99sRh5fT^-q}xDqnVZaEBWt%ryjZw+3^K8iDo(Sko<)x@R;w_j(4`F9%Ma z(vk`^&QT_NOA+T9F*(LyI!eAdxH`hjwHm25iYv(P9)uHr0iVouLJZ)JQa1oO%9Mrv zx;VU<1He9ilqJE8jWD~6@Csr2NbNJ>9sjikedL9vCe07#rK;A+4SCDNe~*-XS0Ci{ z8m-O>u~&quoz;hJ+OaTiRbDe*PN-xK9}Z=aW6v;&Num-TvK$%20f!0!WaBvy))fbD zUS&z7JJIBGKy|r7D>zFCM?0=z&WQoGW^8-8=gc`=EiRuP6G7e6TnIOdgou!!!bACw z)WZ->RHP?K6EuOF0_JJOF32dRR7wy?a@ku*F3CnEO8N8z{LJx>>JDUDe!@n90YD6liJmTR5F6Pi)Pns9*E` z4iUVo*~iD<3=QX9ZoG^rO!e{q6(M6;viE=4s6!PMoqpmfk869VP1FJZ?H_PM{a@iw zQ`jWc_oScJmv;T~D)jDZtDjnjeV?-K9je5IwqNSl?XOcnk&gZ=_T&?vB;NMy5D)!~ zeB-b!&J`)=^pI2>$%8hO8LB_UGHhGnTeK`QWA?t{H1zkce)tcNcQpBe{q`9W6vhv^Q1^?n>w;;vY5tXF1 zq4L@3#+^?{$v@TJ_KbaS-d8K!>1ey4)6+1ElkE&Gv+6Hjt;xChp?Y>sWxLyp@fqy< z@55g6(2pDdQ9Q9Uv$cD5V$W%G;tNePxp(mY*7B4pUzwH9t}+P)kMwQ#9De+f_G((k zU)E)3Qm51a@KkBmRFuZ=wOrYo4aqEMLaf%sBORxtz9C-QH`w#RJ6Yb&5|6b^X;+V& z-0+kQ>jLQ)Rf}Y5Ip1Py;uS8lJSMJqyg6-uJbmiMgEGt3xSPfWCn{neJ-cFlPRE$` z+3gKgyQ@U+Ujhj0YkBOIMD34TO_vuk4M(Dn{5&lDRx+3oUNG{#W8=oYz9&bNCihIw z=gpcNaOPdK9bFsSOd5P^nsv=q-NA3I6?J~@4^ek^x~G1xdjsLuo@no>o2y;MD@sy@_CT=ujAlD;N*T5;ZWH zC-l0q*K)iBIi4uQ^2a==3EX)YL107g%Jt`~jYz@)}Lh&zh zj5{+_J#Qyh&hr9L)5$0KEv9I>TsfU`K3TzEjP$3d`LlA9KRNDO<0aBNbZ;BPHai}r z@1dN|AMv^$^HC$d%v^7=H#1WrmQ(c~vBIZqFE6CmszLDKq0R0Uz777SQKg9cUGc87 z(^ipMZ(^Aqs=?{XY~3l;0O7I|%euD6cI2&hTiuHjiS@8kS&V<&}SM8mf+H6-oIE{jxQx6TUUzcEs&&FWYFSWT`4&leZdwTm_ zt`4|d{_AoH!ryAhv0{R++q!nyw)<>CZpORb`pa{~B0K0XddEZUW<-y7+vgE02kRXr zs2%sLUHaV4KHavw#tz>)HY~sl+&NNqD0B3|Uz_2g(bzSfq&>f{8^)wSln)A!ZO~}J z=!n|mZ6JPR3(T7h(!c_hmO0aDz?ns$+9qe;GI+M<@$4MeV2$fp$RF;33Z>3&*`(CP z4nOQ)R6c4p6x`jE>aB23xhPgV8Z-_$STE@78LLL(rUVot5CE@O)vhJhux$k@s z8JbGrdv(JuboM27^I7`PxY~!oYm~<(Dt`x_j4MBhV&-UwIU4YBz&oIZF?YZ4@$6qP z^dBS^;Fd~mevnm`2*{I2*HDO~^wI=g0sKT(-e4SN@T;=1uEN1@9-nMI{nK0?UY97o z-Qkzv8D~tS%>6<aA9 zi&UT9*_l@O3bW zoApnD=7ZOt`HQ5>u@Daxgsd|1-daoPQKZ#!ePWAr*}WG(gT1-1{$Bs9D;G+z$Uj`gey6 zxQ7geh72WyJUAXQTpTiTc5eBuL;0CGn_Y7f>5Q?@Ay58=j7x`3sE1A(gg(`LmAEc^ z8X7vC5c>RhsE~wsmK*x=O6csp(7DH<)33bLo`$~p7rG^u4x8KUzhDsdc6ZpKd)T|s zu%(2s_s7GQi^EpVzP=-xbi5n(>2cWSS7EE4!@m3rTayl7|M&V-`|I`H;osfEe}sl_ z{0Msp4cs#J|8O?^w}RX!0z#-Nl^J(-7Io5zB*|C>3bi`_e{`$K9 zXiDXdcH}I=44N3SRmQV1<^msyHJO}kfw|=$vZ8Usmh3QBZw#a^ZqVD$*{06PmO*5V zLD@`T!8jMW6Qmdml8prs$AO29@$z9HVnCE)H*#v2OP}UQd;*AKxuEs!s5yd2=349o zJuu-?*Vvk_f` zTx1wV<%k=oVfwCN4FvY09t^`$I2k2{Tn`xSQH`w}qqz5c^i?}Uzb!;>p1Nl^`SQ KSe)KjbS^2bmOUGh`W^abj((l7;UT}5F2 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�LS#N9@03*Twty#V0tws3^Vw^21dBtH-s$#|_K^Mohtg zJS9p@$TVokx;P< z5XN8$4VuYS+?^}{yRu=Xv&*>|P0;Xb(9~?l67sIsI~)H0+`trl%aeSU3H!Yr{ji8! zp%EO*vwXrB$IpK(&}PZfUhL9Uh{<|6z3hR<+N-w6`m9cEIqHn7N?@yg|E(m0LOhzZviIL%Eh5Vk-97SI6Nj5=1z zwY4^j6Tz?w>x!o=fVt@n;87XPoh{do*xgOm+wNfutSt~Xi{UbXqh*k(LZIOya@~Q< z)7;(Q7NV{p`nA#B60>UHos^u7p;?|AJ{~P2r@d8Uc6VdD4A}${{-p3hP39392B?$-> zJ`xuWpi?f2W=<1mzT9(t$qpgD4#v-}A;Ey7 z(vAaypw_ZIGueL1;d|}u0oGZE6BybABesADCO+)q{m(?O3gT|7=1#mD1g766stc)BF z^R_4RFhTS5{@-Gsid&&-N_g_RJ0UxIs?8 z^3d#rPLqI6U$7q`1Z-K|@;LF0;e8T?ju&D;0v_=Bpdb38Kl-F!`lb*17isV;q0ynx zblWZ)DHC;`*7%Bl5MPjY=#}>Vj!WQ{7l;4{l5mB>Km5dB{KkL$$S?f1AZ{vw2!YTA zI1v5PKmF8S{nmf|*dP5Yfe63%vG1_=(N7z|lOj2R17M3|A{ z!ifhhM%*~kqcMpZH7e|wG9*cuF=ftdsH>n&nmKju*e=qWk0np0Tv;mKzlnkRRjilsUAK!B5B^(JspW`p zQLkp*+BN3VpS>mpDx0D5z4zh0_dzDiH4))hn{ZTIKJ=jY$QZF~QY@@t7D z^ol{DAQn@?AR3U#;)?*Q1294gD}-u43yT_rGbI*8W(kEr#0kO{kU=5C=O#pPMHbD% zu*IM7b7+zm3$hQ!*J{LZM;uk;@u|~(M9oJbi{y_;Ba=)INhO=q?>Z-=JW@v~tK5!B zE3*_1OD($`l1eYb%n?d4%OtKmGt;DtOEue63r#oUOp8r9>zwT-`SR3rPd@u>%1=J; z3)G-K1>Mt7KnKPDGf_t6Lp0Av9VN6;N+Ydw(nB%T(^5(my{=P6KV1}3O?Lv-)J{>o zG^bOMO4Zd>?|PNhS!Iot)J5&obuKt}_4QX^gB4az8HY7ixvLr@^w=mj{WMeOV1q2R zWx-_Dzdy;eE=a1X?Fz15%K~*=a?3UMTy)b_7f>?8z4qOjtc7>pWZk{*-rbI}X%HFh zrFXjM{2hcTBj=|u9@-66tf*?SK zMurD*gU}B$aN~dG)&JRD3;kQSa9c`0;uUvK7 zSxpde{TE|2s z72F_~(&cb&CxtTq_Nj+H^E(a6`UfuiiRwB86jTHI7cY4Q@JbPs;I$^?uL_2VP8syo z2K$5mz=p7*VN!_&1+^3l6sAyxD^wveN;pCe(rYOe@d!nf!jO^#Ll-sVVGlpzLyYVY zh(p|n0MrV2B2G$CibDM1WRnWwQoz`d zI;2sJYpjDpCLux$#?VbOoJbF=n8k~5(TWWLVjlHak&EEOBDw%YL1H1sf*gV<8i@rZ z{-8*g{85q^@#7>dsY8W`krH>9L{eq7<4?L=k;b%Ysk>B(#(zF(=s+N}v!Ky@X{exh2X{juIJlkV6^|k%?6Q zs`6i~l+PAtX-qDD6PyX5#2UEp24s{X7BsquSH>yHX1)`MpV8qB>vlU(-G6OCMsd5O=jt@o-*NKJmu-b>wuFal<347(20yg2(z8Pd}UB-7)STS!VZai z<3SN>EQRJ|Bn|gAmiL?~* zD@s*rL_9HxNq9k~YB+WH$XI#!z#^UTlqOVbow$Nnhuy3Hj|}Ca zJs(=f9mX?{2Jys907;OVgtZ`q-LmYs+KV9~tuB_o+ExFmx zGGr-DEyx{6kxy}g)~f>f>M=@-jK99Y4veq^DGSj=L1M8hy;}gp(w8@6Brkd3SxU`H zk;p@ouqzi!jA3H%+nszM2Ayo6L6p!tU2q1Zd5f6(I0K+e5yFe6cM2xML3gdDy^+#xrDq ztf%@r;O#P?Gwy14AX&bwVL#iHN!;NMX-ES*D^iPB)S?#0pvW-Td<*5IHou#9OIuLuOYKE^9a3^7Qf#H`IE(zaq$XVr~($Eus6J6VG1b9^bBVxL>=rL z2Rod>&hoWGH63A9f^XSMg|O(N6)Y1}S4-@C`9M>UYY>nbHMqbXJ7cQST$!|3CJjz* zLvF-v=(05R#Tv`lY0_59Ueb>aRp3tLIqry1@}-18#v=;(J*eX6c-de0*cq%GjG=F_KIPR0&^L5K|OZAioI4F~SN~ zuzvOZJv6LA&gw*hSL+d&c*H4Gp^8_~1zzBVP+~kQ;DSB~JSzZ$`l7Qss6K1rqe|)~ zX9B(TV7@bOJm>O0UCEZ$dln%YH()Y|^DDjcI+;eu1R9})Nf4R!8;D_$zrC72J8Gzc zScKikFZz3hM-U9000pJOKS)@E1MCC(dO$k>11mU#JV3(JdcZc)D6G<)gYW~LXsc%-6!9yFQh)?Ls6A?#F~Kqj_6r98dz&{^xCLAQg}8$^T&M*a{3zOs zqVVe|8hR;YfP_OJLNGXkI$#7wSfl#l0xp2UG_t-nYON`(LMy?*GweQ2Sr>ExK~3yL zPyEDG0Yy<9#dT3VWFUnflL^?fiB;^jJBo-{aD+d=zPsXZTQ`$H=tEN&^l4) z2~uDt$WVnl%8IUt1x*O192zTj`v_#{1XDn~V<0|xa|L*Fg*U7>Re(Pq5fgFUM%E^CVaZcGwO6f6rA$0Tu=w!)+;GR38Us)ER; z^UExUIt@TF2u?zVW7vf_I|YE8LH3#_5lp-h1fvE7IKTtE>U+XRw7x|=r)W$gifp6w z!lX*%f-~R)aO_BrERv`wyJbOx$59BuP=(IoJ!AktSKvJ`YzRtVCLEH8NctpLii}to z1*lpCs1gMo!UbJ`ySEDlx-`a&$jO1+qk_-`Ys`Z<7)+o9N}=pYD5Nt+Od~wovo`vJ zeA-Kxh(!w9k&VQ}sq7$`=$#R03OzuEB0vT#7|kQXf=f^VWcUFyAOzHGD>_I^hUm+J zi^qZ+EnN@=Q@~A7(1lBQ1>dAYPzVP9P*4TEL^~UV&8?cpq0F zq&}pyCT%REh+u^zn1LB!f@&E$n!An~JBp6^Ho5pl%$y9Ji834E3n&8)g~$S_1PVQ9 z1y{fV@=A|ezyhzF7K0eem{0}QRDmqO0zE*`B0x=Ka0M0kfzSK^Jx~E45GR|oqh@-) zf=~rfPz6lDgjX2OS5SrEL`NX>%UXJ=*h@}mBFw>jgMh;`qGTn#m9ZOArJs5QO{?1XnNvo^Y3~R0Tb# z1ps^m;q=Y_>%BtS&F*r)fGoEgs>@oS!bmMn8%$B#TZxxaEx%Jp!X(NFoJUa#$|q#V zX{^Tj!mk}l)&3dFAT7!>7?X@FND-lCu~llJOn;?Ej7xs>dP}ZxJG|_0z)i> zGrXsJQi!qa1QT%88xWcQrKmAbb1@~Tv0;<6nfWb?nHj%;R$Yjm7TW_21HYi)f;HfS zMp(}ts|yJEjW6ICYJH5GO)5gr13aZUYpo7Yz=CZJ9MR|&o)FL~T2Zme2=*I3HM2K8 z)QDFg1WbUEcEyEpbqIM&yrtYMVNTchSf zhBM5Qhb4(Zn1U(5KX7Z8&}$eqtdXjSJpECN1B6PLjTbSE5mOwK#q|=;YX}n630k-( zrR5=Y)kRs*gNNmL?8r0Sd0$^h5Z}dM-YYl)2WWKB?NM@Lh!{kML|_9p&;vq115hvnOel;;NCY!r15scDT}Xr?fQ8tV zJ$F1Aw(UDp(g|n^$~3|yMf#^mSc8`Bq~?9x@vwqIu&U{;-Z>(P78nHdG=n$27&CYU zOOi?P6<>E#SH;taM<9gtjbAh{gje`b^<@M2z=ZTog#OJ}I|3jnas)-PsY)UVRuJGv z^e0M4KN2j3IiM;kdf+VK12quDm!)0{)*zA?vO!RUfw|&>5R6AC0z;_4E0Wjn)x}+a zh4Brdv4S`M9a06ltS3>x1mc4QT|h@&z}h|vCraucK-4PTBZysSTOLLvm>@GnxPxB8 zl`3&QVXELMP7^q}n9#J`Fb1o66JIm-+%~o$om@Yg@Z4X3g`3PiyZWr1n!S-+%X9PE z*~6pUn@yW2TW+>yvdOMUYKk@Xf`*K$XaV z@}mvMi0`f=C;@T5Y$v8H1tbi(<5i;xKEGHbTVyEe#WqKqxIFExanjR_rJ2_MF-MLB z4{`zeiy}WpOWJPw6T@(_tV)XT_DfOO^d>1kjaW#;IDk8kAa$lGe8D4m;xr4 z@x}#mqot3%W(^jULMdkRkEDu1(d;?DBso9M4}T>pY;y4phR&7UADZ3W7A5=kyGK+b zBqxZzE(AMc;3?p76tRLfxC6y8`;hST?K*xV<@;QeuT3<;2DD-xJLk7gF zLiw2Wy)*YzERsz!m|19dcju8_0Yd>jZlU<}l73s*dYtgrZX#59`kvV^5P2_-~71CEc9OfUsmK(93)`6p2bPuOF# zsHe0GC)mn%e%B#0hRK+}-$a0gpaF%#sNW0=)SBM|K>a-;BEy0}!Zh-Bx>YBWEF)d$ zYk%8sM{g2Z5P7VJ5jgq5V;8qQ*D1KrcU5I(vmaqozyx^{h5Z8ssx<>W5QUcJP*D&C zLI}yaPjS;atyW*ONxUbGhkE{25*0)SSg`uT*Afi!lW|JM$(q9dBL`n*mW6kYNh8J+ zlK5hnAlLXqSDPe3N8p1mg71J^%Gqpvb07R4Sp@7yJj1X36$#hB&p`^5sH+a5EQs!Y zUj16~{bRsqOWx{84T(XL@?p3`drPx4o8voV<1|yV00anFut;SZ#j2B?I(6bCJk%%{ z#E23j>e3afRG~9x)}&E{>?6pKB1e)eY4Rk>lqy%2T%<0)W~CeEBXck=A% z^C!@tLRr>CsVfVzS0rmvQlzLN)QM83Qk_UsS5>JYAML^N2#X%1SqLG^DiPVSipOZ} zI_CBmthZ^gMl5Sp*Rf!_K!Flf3)ZVws%ixTRZEpBP=o#ds(QsqRIFHbCNH#u?9W59 zdM#qq$kF4_(4u)3vSLNeq?tuWvu^GBHSE~3L$5A*^khYlP%CQgt(CX$S26T}G=l}1 zo=3>An6az*Bi3WJ@V;&Pmax@e&aVy&CMs~PSGD|t(uMf%E5D)y>VlOCSt*6`>m0iC zvFdJQu{t5!_<1&fqm{M>AAhJ8Ac6@hxFCZKsHqlNGVNDxh0ofdif zq#%7tDl#0JG{OhSj4&yt`+~&er1d@;ru zi)0G8Dk-%aZ)YNFma-XYm#vR>p-WY?F0u&!%XHjAYi2~l$UKpaACZC#EAb`7kV1+s zTGStWr~#6Flg5zbr9~}WX%U+gp)Y{9{*kN3X{)_9 zm!cr!wrz?bqYAOdW;gPWKH}}{$}HQxw^k4dEtOjr_AFl#e)anl7fu?#3W{xUmQBxsyfr$0BPL z?cP}Rjpk|<(xvjrJr%Eah6f=|86SU71mw3`lG5>%sFPVXfoE6zI{4v>Pn7JiB*N7m zwbwqT+`UuSE%0~?4|rYQ_Xb^lAnOnRvTev~X7ez3RtUu9At8y9-h^^vx{thPe6La6 z_Z%p}369Tgm_P<5E=Ur((XCik$w{)9N5A9^ZYs|jVc`6yt(yfSVzC&YLK3HtKY+_| z{G(uO%(gll^00?#g9UU@!n?XzQ-XtS!+2pOFy*P-asBOBHaB%bi$P#~y1IMT6>3<9D`hUme%fIb=gyS^FhN3A-2)l?vifpHadl`mcbnyzT;AIyGq0AX3(}((qf`#d# z%L0+nKs)wChY@5YEMqwvJf=kdkG_LQ5zJtQVC?cZpdgMJ2!RDc5aI`*_<jbCu@Lc z3TTE3By_{y``TC+67Ex)CbSDP1Io#e@sDoKoFDVR7)BN10v4bU2t@lLicvsf4R7ef z8MyFT$dJ`i=D4)~(=SxXglY7psgEZ-9{kXWMY?Z}D z!I%y%SVXN_$f6U4c*7g&5Y9Thp%C>!AVtjd7m&bBr6_5qRkNy9mE4968nmZwZW+^b zDRghlGRYU^WL7<)EJiZ_ir7b35edZAAt6q^15~G16j>lc5w6QC@7sv*YLlCukli5C&=lw{tVytH6@^ETsgNKg zQ$q${hP`Ln4m0_6OI9W27VFp$Gj_77kkHCrp`8w*5|aDe;%45Pm$C>o#fMYKQtR-C zosmp-x{$>@({Kk!ZtF5ku_rgV&}u`>NBpq9+~sZ%k;7+r zV_H_&nn!47C1JhHut?>g!HO8t696Hi3f^8>7rTf>I8!}JyqYpyyAa%dyr70fINGp$ zPHB=iZ0KE!kEX~N1h9iWtHX9s#8QFM-6VaMiY4!hAwrI(e}Kq+u`F8^31D4dfeYz; z2Qd^q1cCVfz=uJ62c*5JNh}WW1TXL*4F=w>pby0Bc~7trPVtCx5DOh+Pfv?gM%h_K z0_OVZ;W&gy;;hKR)AV9!jEDJYEe<0JQpn;ZY8ZqcCZUS&M7-m*z{N?#?S(09fx}6b zH@#ENw$)Gq8FxrSNc5dd5T9t$BO6>v29D{RCsc3Oo=A88GSFZMM0Rg8OvL3>+x#Ho z5JqDHptl?H`(L&^}v~_=FNWTS()<@4%!n7TE6G9 z6(!C8?L^vyx@h&WKMfUH@b%V(6|}Aaulg@ZX$@;Q%}6ylb`ur+D`dX%KE3Pfe$ISN zf;$dzmh`V&exwM%!}(csPQ1^jN%Vx)YOejh`sp{QHnD)j8NhG`)Q|*PC?R1M%)q21 zVquY@T9P6IerXh*h)GO3&S8;Z24q^gTm6)BvY3DF5N#}vWaVW5{OJl-wd9iYv=-Tgi0E00VE_1 zYi$T^^;qz&-?Bv3(di{<)IiLd)3vLzvBIxNA zB94UZxPdO|QWgYc7A!#(2&6$CBtj-66C8mENPt5=Bt$}_2+ROQR-{Enq8WOlNZv$k+#Qf85Xdy1;4~pB-cN~u5gvZTBP>@Uz(R9~!X&W49;WB|C0dr{Sgs{owxt_bK@wDeT+St3(xn85Ko8`lUhXAd_N8C`rCuI^U=F5W z<|SbY<`i6`_Gu$Gj-+GaL`kNkvEU$?Ra;9w2ji)bJn}#yhyo2H0tD>;BpdKR6=1># za7YYb!XBUi8^A#3`CI*vm>`zeo=C)70bOl6C3!qlV!Q$@sKO=G0$*?wCfFTsB!(#P zMFu58BH+$f9oQuXn{-Ymbx!9R$iQ4)Km}X?ch;p`PUK;Rr+AJhd6ws4CczV==Mz`~ z7py@x8c0Y!rhN8K{PbI2UByu*o+!Fx5j=t@aHbK^fE4V36og<5RL%&P!5|o443LP) zv=J#{CM=3tL%{{nLFLCu*6awiDXOcFllRhbwLMeN4 z0T{R^W5(xvW~pHfkLl1%c+KANNm7`el@n9}8yG<%4ATVcfe|1D3dkQ1z``J;fFiWO zF6;t9InzN=j~439VjP1g1Vdo(1!DBqUmymJs9+1_rssX3Lj^{91Q;eH0wz=yNSsek zG(scvL635PkOnDtdg=v$00_)Ll%6W8rmB>30jpAJ7-$3^971DiDXli3Zs?<;GTw<{ z=B(7=_kG!Yz=9JP!NwVw6g)x|G=~}J0wxr}7f`|yFaaMxf+^f7Jx0acblz<#s(Snd zM1_ZVD3?I|MU6njFZc#7m|FtX1jyCGI1&At;f&d5ftG|+J z4^V-s4(z~Efx#ZE!M3WazUmuP}ZjIBm+)E~$y zmO|`fN^I!uT!bdu{TzoOAkz^dMRQP~9;Dz$ObbhNf&>Hr;0CS$q`)!I$jcsXW>%W~ z&_zBXi|E{jqs=+5gQ#DNJ^E$a4bsa|8) zwyx{GE*FHs*n&YAylUCL!5@@i|EaAcvhA|b4POYtEhq-?KB)J}Br^QcM-T#~BoQd+ ztzA5V5$vQBNP#X80vjNM7D&Mt48jpe0000k0gNx;0ssy8REC`5&E*pS$xL3jNL~zs zD^5h^uImC}u1NToC?LlEPTohHLh`C8=aPi%KmsFBLF%F|2=u_%!ma~Y1XvWo52Wu=9@b1n*2yG>-I!uopnw^if+viC3DN)xxJL-^ z!4v!~;2MAe^e_Pg001n&Bjg3lrec${<51rJlunV%R4}Df)bD0^>E$8={{H61K`Nv| z)OzUe#`zcjZqq5K!YQ1BDNs})fI$x=u+*9WmCmjkzcC!o?gY;<9oKOLSFiFHVR8TEyFhKFK^;Z7+7f3*ANa*h@+j3tZ0|0--C}_eWw80wK zK@UW2)tUeZm;e==f$dhX9XGQxH!~h<1X4{iIHB$C`tb|`a$QVOo4o7XAhJtd<`SFY zxk3?zwE!$g0Sy#ElC%IO8$jR&Kqtfha{vrL2B5DI;}1y40uU)sBvr-X26QVov2qDj z#F@t{@YZw)UAVFb^*|Iv3+3clYI@9#7gtqLIb9lz!YJ5*6`bxGn?Mg>V>FkvNtd() zpR`KnF;c|=xquTNUo$ofpf-lDTLgv`DJ zC=@~)+`%Nsf+m#08zjMACP5f%)JpfYU;FiNP4hI@mr`MHAI~%z)-?SL&)ec>+Ue>X z#w2`!1TQ2&JO=;)_^<#B01CYS#pIGqecmcIH-Y6>m{fZ_(pNM4WhloJh#REX)EWOu{UTLc65F zBxI0#Py!zqpnDpi*jA}~S`-+_IHX59bk{hglM8i^(sk?j28%Z2$%%1zxAEyge};t~ zh@Tz+fgTJ}7QpRI|H3iw!V?HU_>Qlv2k|7x#gV*mP8cp zRJ1wCD0H(sJIv5FGsOZWECM9#M<1-gBH*b&jDk_6yU33`$*cRJST`#iw!2dwkK@fv z+jPBaMlDFeAjrZJY(WcP01e!LA_RjId^aHobPGbuBkToYnVn2l8i0F|ZE}nJA`5T* z4Kp1yR5-Z)%z`O6LaZ9q9PojM%fhL}N6C*p*;hJU(Z?aAyiBjW)wTT1abd;Ayjj%3 z4-5h!^yeU$0Ud~ff);@uc*3d+eB0)8_uYq<x_>^o(1#<4{^*aS+gB{y(~q{Y z1no}}H?_#Q5>B4##X^(6vCln)ELPV)K zoj7#}9?HZDnJ#1t88&qI5Mo4$6Dd}-coAbpjTI!xeWlEJRS)N?j z5@t-9DNW9_d2^*goHkX}`sFg^uv)cr)e2TL*sz+%hA|E1G-=Xd!(igVbu=a}qAYcF zt%n>S`N|hSeXH6u60^_uG`xb6oxo+3iwR;zD-a2*)IzmWNWMILA2^The7;$2b zfWPjP`O;4SZ8btzO~7i5D-{jAXJg`FC>AUbk{N)(drb4f)lUAJSC{bQvuNGK935GrzH>(Bz zlvi|l1-+nfc?GtVw2}=xuLgvqlup`ugOLV>n`Ffbi` z6w*is6LZ8e)8y(>@V*o8m}A~MMm3XQTxryxPU`HJpMKhpwqUG!70sOn9EFlY1icFn zM0J%?(Sov+P|{$99hO*!D87$QccRklZMUf*&UA`dHve&PaFbtraXB z@x;5v65g>LfBf;Xvnw+qn$-l*=Cm=h(O=t)%6IL6U6VWRSC1UZbk|hZ)AZI+Cvr1b zWI^Tcy=+e$_uO^g{p7{Jh8+0dUzT}h5N`rD^P}d5c3FIv2iT`ybit(mE7Id$%0(Bc zDo?7JBt~yVKF1ueK)VV*ocDE!!+r6C1{NOv_=B|<8C5hVQEd||_wHtwAfl`$_ajry zP(qc19Rn7edDBU51dE#mEqkW1SWG77s=HxEK;Mc*De_R4^nDP7>GNIVH|UIV23wR0) z^5MEFNCDfn> zNK8SBeQ+PkIN45jf}~)OdE=QrM5ag7PZxW51v2!o5LL7i8TYK8ge;RY|8eMyuLR0L zm1Riru%;#7>)xBD(iy5$FekdeXiSjVNA?(Th@yCpQjYO0Uc{mgjDVyyr?{3rh+qaO zV8RS?aDxeMcH z(TP$xlBF%RLm&QtfhB|>1Sv>?3vS?o96*StcUZy{rXYf~7=#y@H0owKYb-F5X^opA zB`N!tl7|$*4Ex+FGJp^af%4OSSiOn;n7R-Zeo=*bP@x&HAXa3U;SyTCgf1SDg(46l zpmCfhOy<~Dw!#&* z7C=#ihurqU{7mkDkC#TBA;U)up-)3Lx)UY7sDMW+aZBvzqF$ih~QUmT`=YL zvlThzdPzK$!+2o|N;o22!bx-#58WV>p>L9hfJA25DQ$K=I~?V77vU;$!@xW+-~4AzOs;q`YJ* z4a;mSHdu&tiPwXS5R|Y5&4@{|t5;I2i_@bnXsh2YN>?ZNWhue%hkw0<5eK)5b9Or+yhezfqPaGHyb{nrNkG3 zC-SXXxM36ok{Tp50SR+jp%7BjL?5Q$g*NbE@{uUSACV%=um~#z> zhy)}=51iJ=xDew~1L|Yk`ben7U0sJZ*ohxDYS$gK%nRf4Kg8rNY94yx)FEQAgt`2O^*?1UJ^U<6A*Mh0yA z1r&_?3y@(C^lt=O;1QHy0Fi+PMj#6u<^vpz4i+K?vLFkf3IYaU0tmqg^uP$tEdy>V z3y|R4w7?IPz!Xd&2$UcNmS7401|bNxzy-E|0^9%s+~5YbAP5Gb1(;w7Xn+T&UwoDm3}}4MhyG3 zZ|#tQ%NXK|l8=qLqdU+9)7Gz+EKcGwAOr9(16p7N_>bHqa3Of$%<%66N-+i&&=V)% z!QOBGoFD*s00xku7CsOeMll0ufCf4s1iXL}I^Y9BAP68J14f_|kpULY>;sTt%{*}g zzQ7mnfD%$b2}3{xFdzc|5{nwIF$E|9143X1n1By%>Ka`j0{#FJr17Rgz#2P1v6est zTp$H*KmHpse#Z?X z5@wKWfCwQ2zAqW;2MZpd)y#kp`{@I!1@CT16@m-7Q~?x%3r9+B`e-YabU_d7M-O!3 zCFbr-4A0{vEhi%FBv=FP7Ge+vVYg6&5cYr%1Md~~zzht*wx9~RiZTlbp#tj%tg@gM zG_0R4L4~&953Jw_te^*uzzeouA%NhwZ0pMsA)i1Y5eC5x7QqX0iVtRh4{*x7)L;$7 zNe$Y7vf!}~)Zh^R%1I5Tpbd^-3i@C!>v9VI;0OehviOn@)*z>jfb$%4rbNJ;zS0ZC zsSO5G4fwzdW?&5r^9j^|3Cf8NdSDHSOd?xTSR!uvKuI>6%FS5qpEL}tC^5904C5xk z+icS8YAEK;5B<={Jk-5)RMY?eun%Ji1791Rj+B;?21kR0q#z(Al7f^@9*Eezjt&+rt>ol z%ND)R7}crFLbg&hpP?%@GZ%h-F{?IKVNRQ7i4D+BTE{f+HI)m6$S|N974JU(?(5NI z)PMgqI5}BYB;fFuTy2@#x@d0^wB1)3M$1)BZM0eMN3q^1rR4F_;gVA& zspt2dh6p~cCb7DA+ji$G(}OJMz2r_#W-g|+8B)#eCC_}!nO%AkttiHz7?|;WFUDlN z+|Hx_7jS7KwMv@wkWvtlCGrhwKYQ69sclHqHeTg4E|ZmiH|W9}?LyurZ0tZacXwBx z90f@zZx0;@t(H|6jK`ekFjxqFD8V*zXV>Lo+!=$jw+)?I6)zhkXWUeHsej49TWh~E zOP??0a4@H;ZJk78=cREGTdI2>d?9&T&4y;qbxr9;B#j)FW_A|rg@L)^!c1Zssa~K! z^%~*hL%U@|9&M744oq9cQYM-UofMU z^gdb#STs(a+_q)CWB7zb4|PTh^)s^F;d9mCb0YIM#M4}~8A!o5D@hdDYk9j>}(0@L?<)U`CyX^S2{j1kww_CRkgIPRo$-CoN(D*A} zhs^G|cMjw4cm`fE<-(z5a7;2EoL1?*Td#O`;Jb8@jo)eiD`-taVpwldSc?Q261Wg zuLg1Q&4lHH?!})|KmWMS(uyut3iDKgA&C1>p)yuT3*>$S=;z)KU{rFN#U)% zU0Z*%yt(%FzxN(eq=#=7DJi_a-a|???*Gyq{zr7U^ZtLi4o|+F%#KrBhd;l4{k8P! z_xd8mb$EKT_y3UPkTTEv|HFeKTU78d=ksICmxC};dVGK$2Oi0v!LBG>HW=l)ZNEI+ zTt1Zc-^vzyZKU}$aF>GjfzH;dp+rSx=+}@h>l69G7GCUn=fK3%|tc(Uk$6 zw~6Q!x>j1FW>0tPB-LSG^Fqx}njO|Pqs4|D4J$ptUv{&vHdkv#fj|FZhTq}8`jjP` zsW@KIg_bAf+ocktu9kOWd9vPb#=Ba#UJ|vEc#ON-c4n$A>KtBlw||&x`d_le4{u)d zbbNkGil#ej(z_Z@H=HTvIMLe`xXEn_mo(|?{`x_m5k5cB*YoZ3>a$y?mx)x8$6vN* z>e7TGBmc@4#~xgM5J?S2sy}-B^6AB|$6sH-h+#C)?GkF_$-~tsb^5vJPeDxx! z7+g&WG4w@LAUHyC5=&EPL*xZ92vFSsVHBMr{F(R=osy)Lir~P9Ncg{ zCTW`zb$t>DB!O86!TmmxgmxrXrH9Wx43iE&kc3lw z=N*k(eIf^wIGVh`>CqN0pQe8_ZKS|$2IA3ODWy`=^EvyQlmh-;PJd` zuFvs;$HV&L#hV?Uj+gv~B)%;N&G~#=3Eryzwophs-90igcMv{V#k2aJ#2};yPSMtK zdne2hj<68TT-}DO#yt0i@9&H5?s?mtvz7d@U6JeiV~6tl{A2e~nw;K;rXlqvH1l_# z3@&_-P}9fWZ#)^FSg1d~&zCqvR_p<1vEx%GTu8#|Do`s1Uq^TIBkE) zw;@YBlt(?4_e7c<5dPVp{Ew5od452qx}j^%JE4#D13>;8#$75H2>Vw_QxS@N%J zvEVSP+Ne_WuWYgVFuN)F-7$yA*oe_OKk-qe(IL@rVblDAv()<2(2!h10arlLeA73| zV89t|aelat?^fRTajzVF#%qKd|D%x?m(5xWS8q-#JTsX1liXUgZS+#<_I7+s^=|IY z=4)mD?f5%Yq9rwjTl619PG7**ErNdhdWel+oWyZhDp2-|G`%w?W0aZX>F-r*TQi!m zGl248MZ(wz@XINZ)n!se0}?9+)5)QhB^R}Y&aZ9Oq?TB!VeZu!DKXCEFCNKU=&SJ- zC(o4FYUV1vs`1qAPKZU{&eph5D&5gB8!Xfw!*-#@)bV(h;g2Q8g>A;t^NJONJTrsc zZCmTU?u6>t+n(3e>TL5fUbj!YtG?W|%eS=qy1O6WaOcH`OZ(lLxx3lQ;qQv=+ZTH@ zn-diM@zv-i+`z@G%jRwUtg+tqmgAho!i&(?{KdZ?c}Soar*bx%vPOy- z4ZUsik;j77Uj@9a-HlpL|42PfFY?(iaY2UW{E8G{tZa?2X8~g0ub^ow$^H9OL z_ELLaZw0ZH9hr*m#({?0=fBuLk~HgCx+WG}zqB$o|2Td_ZAGP!)8TbRM_*>h=i^PW z#lyt(KJn7e(*?VBTuNVVr1u#`6vw{p1Nozmf0y2``BDjf=}O+ecO7R1T7y4m>t9l9 zw0HQajfAB*tCLBgui`liYO| zo-2GkxN61qHmQv*UX#H)VP|@UU(6;x_nntpTQvQcuRzdv|GAJhs+Xzu#!n zmeiXMe~)44o}5>bs|XX>d1}rsl7v_I51^h}@qk!Kp-{>ZAvdnVNu)A7c&@zbvl>I^Eq@GHZDGCrf%KX+$M+&>mB zm+<*K-L)ugC7RH=P)%aNiDP69Y`w`XCcbTmF<;t=`L8_M^)4 zE=n7iGhM@aCWk9dzdD3Z7lJK#=w4>#aw$qa-TK7lz*+EAHTHV!=#bv@RQ%iU1Qk|; zv9Ld1$~b>->%T-&W&SZo$y_5k3bZ|=D;s}!v9%e3>&z|k{n`-r`~RcI_i6V_jYT@Y z8Eoq*+eB4w;lO8x6e7?0!@>9+e}=r?VUBvGleFZ|8Hj_Q>vT2*+DY8K$W!-?7aa*B z7Ja*(k6gE49M4q~OPazghu>R0AjtEf)3&wC`QF|gQJ(O(sC%oucljl-@S&uz&{6G2 z_+>rKH)=^wFAtYzMoi`{T_g4v_8dLD{CoGydwK}<8$+xxmrM{!=uO9yQ~TLuR7KPH z_hRRK4e;T;BqP0Fm23A6pX+da*W3Kfm#+A$PzI03+&^u=M<~qRr`l#B%tSynA}M?Q zEE)&~HaRbh_lqy$Hz!s7q;PC`IF3#nmm)4?5{IF1aQZ@LJ8{8Mus{+`CL`k+HdFx? zQP70Q!vK`P@aKn-kZPv4*VTj%?wucwgz!c}Pza?w4q`56KqL%VdVeAV$OfX3xQM$_ zF`6eL^F#N$OGSTBwkFa&jE9-@@+cdiz!3~B!G^dy39$ljv{R64rcl@v`r4t#*pROC z3HwvL?u~V8b0%hm4890`kAqge+>Ag7WBkj^5D}EF=;p=k)9Yb$Yj*>juy@(q#9E>+ zP2LYBz@mu21;yxCEWXeWcAXe&1V9R%AXf;9R+HyL+rq*tIAVjNMR50}c-1Y3!VAzG zUDgTbaN)gr25D?by+ijsRznI~VvIBSKUpI}Nzf=KXjl`xkOapQU|~&&ut-Qa7V6Xl zHj;v>Q#PNaphlArWa&Nn0GK5eI%O*fgSwrQn=chR|2DY6Zl3Gl;S7U z!e*$Gz&cntMH_!$0D#RwKi)_ZJ23n(DER%9&G2evI>;Fw&;;+)5^~4DqDbjMkr0z6 z@cJxdFqW6UEZM46^Xo2I)PWW^F;rt#=4J+zNObaFmm z<^=HqaCM!Dg;cqm(lPGS5!S?9rK^5Er$o zpcB!A@cEvAaL&s&gVfsqkkI^+F5o1AhlKD(T?GtCfJ_(S(!3*H3O<84w_bye0AQ|> zkO(DMniD*h1ZUdGe6637t3d=80Jcp)?*jUsC+D{WALgcz^^F?{>MJ0B@NZ_21%WA@ z3Zaz%4In|1{J|!oh!y!J_ zcEn~b$EU1PDRPxVm9qrEcujkK`S9?D)enQ>_Q8{ ze)qC0sw$g0*pZgg>}!p=4#$~YrtJNC8R`Zkxz;u$o1ZqOfU2QDDtfa3ja#TY>koNK zO9|8gt0SnpQlRJE5`wQ9izr7mHuQzq+cQ6kpZyTA3#eyJhu!Sv=&h)y-n@{# zaMJZww6)YM_G}F}x21Hu`EmUfeq~X#^+H2dli+1ev_&_fKBNb2$eg?0J-9}Lfcu4* zcAlHk=^YDf`vIR7Zcv^+>lDdI>hZjgQ77r#Eq(wiw*y9&q93U+KRV60H`feiujoFx z!hc5$Ej!sK>ncNkr;q=a#OA8ndf8<;sa7-fs{f{N34p? zejj?69c$Atq4KnFA4K!o@jGXaiCJY7wGw5g@x2{)unNp$5*lyna{-+$Jp`B5s1wp4 zGlheBF;Klo)nUe~Gv7hyi2>)O8~F~%v$&41$qvDr{U}@D`52m76`j3Ly28%b^<^MO z8vNB3P!C6g!#F%hkU~~FdFARo|YyHNbST-|S zjWuwzN2tF;QUN1jIC4!Ow=%7X9av^+Q%k}#`u zJwcU5bHi>rU#iAz(h?1pQ5jU|bKZ<|8c>3CAIoE@zq=9AWkj143e6{|T&I@6Z?e=I zR024%wn&0?EM9O(-r61o>w~e?!Orz6x1|Czx!?1Av?sWMc*auIz zdq^$S@67YfT@hqb4^A^^ALcVYWOx8S)Em)#)YIG3P$Wj|UMiUCK~(Fv37}r~A3*4S zfy01tp>WiTMJ63pM#uHq2IU?H&+J$Oc+@E=A*3l`W*C~ZpUm{3q(~UHl@E<7g<3Tg zgPKPW)YD|j@(qdR0&(D-LZJ^k1_;q*3$k}_Y{qu_vFl6{R0lCMKAObat1^lV;wSnu@5#G48`V`6y}w< zM|S9Z*YPt(pFEr;twF&bCs{O}4i#A)_X4L~wQ}Q6INr*4I>4UN~d;YFw5h7EZ}+F0Qr1u*5+mFZ7&| zoK-x8cS`3pjvHKZ!=4aKyV(kAexp%dc-9vcL|QC3Sgk)+PRqhoSj=8^AKXe`SFB1F zy8lXs%jsBU>f#fGdIRS=ZO#Mk=qP7Mz5YgE&00Pdy)3Q-_+At0L#d=zfl$UF`~47< z6E9$V&xez8kA5|~gRu+l^Bo?y3JtuPxTcuv?}rxY<5YB5MftyD3ZV^capPABIhNMIAcR1*@7)Bd(01!%>>KlNcGQx_gM!$U}r!Jjy!7|eZ@ z;&I+q2WX548BQb`2f`E7R8C?OqS<%owb|C4KQd_~c%=bcpc_#s0_X0AiYBC*IzfyQ zQp>LaX+(Hy2~WOnzc>SDU?S!G*B}dzNneH5R&Rou6TL~@o((`7ZI?o-ulP@y&L1sW z`i0ynsn-+g3L~4XYv6)hTQWnOFB^6WsNaIfaG#OSJ|S=`077#ffb8Cz@@e-Yq!f4Z zsT?+%pW}Qi>FyY{wM*T=E*5PU@(Gy^;kgKXYd2Hi1a+sR+4jL84KQt~x+Jg)*G|h4 zWw$tO_-w&ToKWd`%Yi5hCKgU61`>McoLe<{)&uv!!l&RL?u4v4l=SDxKpsw(i;H#! z4Y5>@<4l3V{Nh5>cSvWrCkB>G1#gT#{L`*(Z@r8_Ny~R|$X>kWLzhX*^C?sMndTFO zSn0t_~vj6Qzo1s@^EpQR;MC*Cq`JY{!QuQgnYq{tStz`lI( zBNz=l0&&HB-j9)6i9yh$!e(lnB3rz`XVgleFA2OlsRCE0Hx05xtVAoy34}}Xg?tSa zT|0xQsPkTYO!I*l&FDN)ndPgq+h!F8*^)OFXLqKQ4E)i_o)%>j58+>K7TC_Zzr<@Q zn3d_veOM^xo}$PWUw>N4xQo8;dG$-Bro2sByl4C?;UeSk8>2-n2`{e5dJp>AE>DWv z51(z+uCiY^yisubv#(~WXN!AO6z3=}cR<~mvEQmuN{GN^BY6~mVu^m+^y&5IdA=W> z+aGW8sPyqV^71dA_-{UU7qwjX4;g9TNs#vy&f?wMoYg{4XL5Z4Cf^LEor`#Vo_rqd z8F)|fm;CWZVZ)cDj!)Hhlq$Y{-g+BxF@IhB5Eo~h*t3oWGin2LP|l!z4G4d-Y3T?_ zcn`YYu>DAtLFI^0RV!|LUi+bN&E~^1_hwvmSfT^WRAN{bw4amV%InX!&3B!m;GxM* zAk4jw{vbM2sY88%Ov?ZRp~4`U7-K2qc^%QZwicneiGHngHXz@xsRF#gtmL&G~48?D4$T87&vI7NBXcyeS`rOg~L0s4ihQ=%lAN zqLM^}d|VhM&$ew=K;jBE_L1YD@cqTeHN@i$0!fp@l7*69JU~+fp;v@RE-?`(+LP^ts55~`h=uC z(`R&*)_%#fku3CBQ7c&}@=aq((09#H&#IYrc*+E})5)t=rRlWWvG$9Ovr|LQ@el8& zXDpo0c#+3O5-~GZ!akK3tVX2>?GsO43!RK=q|2sawHY|x6E%2Gyh1C81ZT03GqMzg z6TQ~JB>!clJVE_KMRq&XRrgQ5#(?ZEChb)D2}LcB{8ahzi?e2z%gdQ1hcT2x*Knv; zoi*FfJIlAekzw4S=T%By&a>PWPYF zb9SwfRXnv%Equ7Lk(~2oGCJjwz{3Pr{66vg?H>k(IZuVJ#T6ejsIOvAkv2Yz%EQ;F zZ_TNI`I>G%rE!Ri|AvLPc!|lT)0ptdNJ?+=BA9uTw3YKt32ay_HEbRXDcE@O4Wpxy zJ)`}TYAEaXF!)UHcE&G{__%lDQfFkd&T@zA6Bv3;;wda1R1q^kb;l`^?q~&6e4;I^ zYnEtX?*yjE7Oe%LyjJ9q5P>p;WQY`RdZ!kc%1>90fdqzxoGDB02PmU7M*r?2Az?Bf zqx3tu-=5JC(>fQUlBp7OH%X}Ud0f4jS$dMI0FB5xR$SLSL%?}Kh|9mgILKX4nq1+b zsFbe!sT2|5^o->(CiDEgHH2gQGc+dhIZZM^MFS^UFtiX1Cto%20tD@1(a6w^W(D15MoN$B#9-tBQ(EmXIG#CQnW4Opb^8Vzg z_Pcz>N)H{A8J*5$=$VT|Uf>A=&p&{N5`t+|7Z#|XSW*Q9GXhHj@#9s;ZQ^Xf{7$q& zIEE~~LXmu}6RHtSmR17S2^OYHj7}7?s_B!qydifGuNLnND?GvRRZ*EIPptyCOsT}# z3Demb0{|EyY#f>Z7?YgOBmsEdBP?8Zc&(n#4*!5HT}F+ZCZOsAKf4(f^Byx0q4kc6 zk4}gyLDH%@>E0N>?v}LwW9L)9k4eMa-J#EEw28%yU@Wz$R0c!I1wpBM+E$xXFg5YL zz>QFPE~6ZnY?JeuNa>Ml@*B;~&z%`x)X-`8QuXs;z_h0G1AZxEHk(4<5^)y#0`ku0 zf2ZLWI${fN(iYj=~tSM1qwsj@~Gpb)W)bKZ4K<*yOZN^=G73EO%2-iKJ$tIyYCd zWx&Igp=YUib*6BNk7un<6>vc%ErR*yYh9RS=L7=v!R*0Jcn&Py#fB>SjJ$>;&(XIh zYA3f?gMm#>;2X*C)J?{2ATqP2mnt(L?|o*C%gY46ugUb=>2Ml=3LzEyOok=l<|2O{ z?Xji(2Sjtr>bCgj?DjATH+^Hhe(SjLHNdx1gWU@gH}Hu}XYHqXKeq`l_A&K|x=sIH z_$1`)(-@L*m7GrCQB=IZJQ;koiKllSFb=;pkf)`8h5@@q!$tLsvZG}g6}6Hbt}KOK zSdC*25Klr*hzD0C*o$wTi{ffSUYplu?WT&6lv?Y6^BxP;0x_5L>=v!dzyk6I5JdR* zF$f`2@k1MYC8$$i-qlajRW|E0_c?5U2tjkx#XeZg=_2DAD9w31T(t?o zG3iH_H0*TRIr0l-;+2VE>Rs(e1@vwhy=U+u_PZn3Ub?-t+u;00*tDOCe)aKi01G3mluI$VEEt3eJndA4~QFBK))b@XGy4QjzLw zA$SksFkfZ3aLeLhX!d&B%dzm6Ra#1j6ox%tH^xnR<^;`!7x(Y9>8-u@c2qGBa=6_& z^jjvVU}KZE>@sm#PUHno&+_j--$Kv35QXbLB)-E|Gt=>%xyXu7{OZ7XL7?I@qe0la z7bV#pG!9>wZcovj;ai_@bVJR#XbmUo?qfwt&PQ$AP&Dj&X~5t+7XKgbeIkBV;dvyl zzp&R~ImJDh6TVNEM$qzv-DcC!AM0T>3pMy<3R&0vBXINK{jYVzjPVVJpG%Fy8=U=p zP2<~3t}6o{lhE)keMi!=d&Eza+kKMSbLAAJDVsb{M3jxj>Bh*DpTBSYtS4Q38_(b7 zCnDw4A7`QR!2(`sl?G!E657V`Vl-o#Kq=V%>_`nEu!6{9lYb@)gx-VPv zB%LEXQxBjq-ezEz)>7Ng({cuDda$#G(d9;In~UpYE5_@rM(y*dn{zyvhi4s)M9X^A zwkqPQmcSzOV95ck&wkn#Mcv(ziZ8SV)u?hkouhRy^n0LORnL4`)4EpE^PwAqj*p&? z!&53SXOk3>;^?I2QJQq6?j%O=o{aMQ8Zi@lgsh?}BMlQ{SOW7{W>6+2aZ!5k@TdTUZcucb&uUk!#(g?jWx(KPszADz2!<#vnkihKUaEd3WKi;Qe z0&vDyYT*L~t~?~Dv@1f@Af-Bym2e@0P$$zWh$p2g1hTN!Cd|_|N}JWMhS77&;Z=4q zTLH=v#OGC{NaKB~GXQm(09^RHG@eAwg{``;ZIIQAD6wsdlB1YdeS}E+o|z?$XR^quo~F56R8DqQj+)dTCMd;Bjv12-Ykv*Z6X~a=Xaelg za*g8mY#1(Ub!M%KXzr`0v0W@sjK7o-f7J8j>G=3yXbTrFUZAO+K0q-FtDGL6upg?Z zg<-)NrD&Nc4GWLO+F)N489!eaQ|-Z~1tX?T0_{Aob zi+~GS2Fofov+yU#ir1Bp802TUhUH8?Evw@;8H~NoEV{4<@Q)o!)8&RDj~+4jx5A(H zjye5^KX!fjsbciN2!6AGC>EF<59e3#N5lZSflF0a#nfXatK$6%_Ej3Ei18}b&k{-0 zAVkRse?s$z9)u2D`)0gC=j8V+4P$gP0MIYSSMd{C+Cy+&eDVFlQ>4!HL^!pb)+C-y z$GDlA(*Q1AP4#3u$6-n=O88uYAMQSXydYp61#iXs;f_qV@MSM+e;>^_?PyD7cRxq#>dm1 zJW{NWr`4Z&c`5z^ZMm@&?xJ8k{XP|FfeN`##q1XkJRu5o zLRIxEUL{YJ?vr60$q=Rkzko5>;Z#XE8XF#4NFImxT1FSH*bs|_@kV3IB$c~ABhOIb z&amN7SnAlCc;s*Rx&V9}X99QOnniP6I*IXwie7)Q!Wj3oOQnpNXT^L8L^H`Q&N%I7s0DDVc}B-2(El`q zpS7{A`mKMiSS>jS-g={lN!oyH^(Y^R{#ed?s?woa8m)Sesie3vPICsmTyG-{o{zyO zul7yUU&A|hFFd=rC5kt08XQZh(0JQ^ZH?O@4nw`6=CEn(@a~$!dmo3bdk)(v4m-sT zyY&tq`W!yKaQL+1u=mN~^KXZJddCB9$3qFnFKUkOSMZVlMb(Y|?^NAIUtxJ`@xV6O zkREy6n+j^?iXm;3kg>Mq9X*HG|Fnz^Z)F-?4WfjMU0kl;3QG^TeeZ9-IQik7?DjiF zeWB4Ap{<)?WrLK2aYXG4O13yQtthsVoRD3Ul$4yDl9AjznNdf|EUNj7*EPS$PEP)t zExzrSlartOY&-AiQazF7)?SKriH-}S8F?ydiTc$8FeOYcByQv(IWYaLkr%i@i!wm+NcC@K6) zfgHVzlIek{G3 z`8Q#l=D$2Yw@hL9%JNo*p8ls|{H7?0!tt#-Y5#-rt!(_0Fn(vR_3oPfyAKEdR*dg? zQu@WaTRXd-Pd<$F{tNW|4H+;0?^xgGdcwiyFNb@dj=CFCW6i-9CIS+D<= zsuLXMuiOJFKo;yeH#FgHBkNjMS>kAKFpVcLJ{&JZyNfbwqPEFJmH6S|^_JRKbvCVD zE2HgobB#`Bw1V3k=QMb)#ve1SJ%b_7YD@5qYYMtwjxx?71E47)wix0GFc}>YS4F`Q zlk{Vq%^O1me!~)@g?A;T^1OWQ39=6fxVwA9YWkUpSYEjz(F%k8VeRNbx>OzGug>o% z3FH4zb*cBxL(eIOJ0BzuMf^k6ec75UH+=99RX5-2{q|p~F6s2_v2#v63IsVef37_R@bm|3W`VHC4oT^aK+QIg*c@c zi8_(u<^BY=|cxW zJ0TYeL_?KsnCY0ri^x(|g5;WG;Kp)fywg<@$+QqATwWn#GSLNL6wD$fw}=^;_Jc=* zR-0v*mTN#MvFjcLq_lIlux7JlkY^n%-|n;ER;~A!fJ)OWmY6Cxrdztr4je%tatMDW zZ!pFDY^Nz)#7N&PI9o;CFN*m{2$CU2L2oM)qvnDdBB|%*d8Aq%o1@*mFMadsCgc}A zzV~H0TSH(j8{zZ5uDs6S)YYvr;PTyFjiGE8Gsinx0t!tRM6m?WMe}=+AebT%`6|P1 z@7#ci=AZHep>H20Rw{BSHKVFP@JE8C=E&xUCPrG9l%*=)pPxE&+kPYqL{$^xWHQ1% z_6AsQ{pxQ%*ZAvjWXtnFPi{Z_*U_xbWv%Vmjsa5o^4-tBzrEoc#X573FfD%HzQx3$ zyWR2m&(Hm#vllf#JbOU+b+XlX`sdfT&y*fIl1K%k0EnY!9QJ8b_>Ob>GE5)20Let~ zIejv%dLxc)oCsAIrmRKmM`Mtsa4nexRKY&J#?aCL6vxRTRKY~n;L^~J>E~FSyyg3W zQ_DUW;K>r<^`DuoI_1f(4NI?Kl2ir7#2<20P{rUBl3n&L!3RWN)6uPzu}&h(qN6Gz zG0Gm6wBtuQ(QUOiU_0v?qwy&AVZqSReQKA@&c|ovN*ztp%Xkv>o}~n(8(9kIv(#6k zTE<+deko=NM+VgAbsh=i=TK1%@xeE8`gv!gYh&oU3V@C4>xfSuuS zVJmXbKxH*8XYg^ckJ&CB=5$gL#tSshuKhU7B_XS%;ta-JIKJc!8&%2Vj*Po0f61Rr zu9ACb@WRXXOTqkjm3+qnTi$O|c1ueLoXK3<*TG%RgUdw&#E!aEkSUX*d>w4QkAp|9 zQbWn-Gz5sJ$*|lZ zg$-Sojst0!5`i#dH>SK7;%=z2t1r+Mtwj2I_cbEY0l>3X8`pbT*V*2fEo*y}BH>L3 zvW-3s&Uu_KsB@N!fANi14#Q|Q_~s46<=O7Xox@hK{4&kY^hTLl2ujZZA-ben>MSzl zrn>HoEi384{fzhE1NshP86QIjdQ%o|>glc}tfndmlsZW&jWJWaa?erVgHq;3I-X-u ztzJIfTl$lnJg2k@r2Xv1d!_t{BIxkbb!J_CFcJ;=*3kzmp~Q2MM(`v&D^mjj_m(c> zB;X{MhXD~UE9U~vwIQFIxRI#Q;(~0qd3HYaK+^qJI)~#nrEMmyXSBS`_n|Yo5F(Wd zGvdKSXb*Gp%G}!u+XRI22aI^qGSxsgQuM$3WLL6B)ZOeA>rotAUkK3aE=oV2$$pyS z=Fk!|JC2gSKJen!AAvNr^$n%#Y-2p+z>=?>Td7A^2O`u1iO#CqYAgl(agso>g3DGC zyn9L^{79G2m}uZ#F^&3uC|3KkR+@2OHc!5|>O%hxb%-)Q(JemfDw)>6N!vX0(uJ>A ziqo&qZNFkm_^Mg)E75ws0Am&`*}Yr$Vf}!E|H*y7vUkfU7x%K}N;ml`)0K~1YAW;M zC3gr4%b$er|K#hxf2L{5crRdSe;H-a5%!w<^PLZeY$p@nq^oFe#SZtV9UXV{IeQ}Q zo%-qhwly`G_F~Ci*)_i%hMz7l`Xwxdy){$Sl^h5~iRiCkw47+llQ_2gmu!|VpZY4; zaBFzwJLE0}i9ydXsb>)Q+c!lnc7-ut^ZCxf&os(BP}4Ztva!}rFN*6QwoVL`j0@YE z&9zQZoxRhrHF?z-zbGoLtgx{+_8MAx2|(ed)&+MDYw z=ehA*bF`dZKaTMO*VF>Pg{_=lA;;Yngn2yhc#Asxb_6ath<>U9^FKIfoW~x{+5ghu zNGln-rGCgi-eWEL^xIvpH<+S}XAZ<3EWn{kY(_375}>iny7RdL4N;RfZ)JK?bump}aGBy|2*%aLGG z6&Qgc-`;<9hkXjVByhh{=l(nA`{0ASRXV}5<+oXJph-P+DK?O8%4$IyHzj|TZQHiK zLu1e>3}qH7Opc_*fsWjbg*|Y_#}SUKkz5|C3#=%4rzlY~q`)vB?iWS==B!+OL)FGz zB2Pmu9#EPL5JTaS=@GB8qMcwKL)Ld55rT&-kZkER*8WIuR#e`ck$rWbb8g^uJ=akf z%oG#U6?=Od6v(D&OP|N=5sY$+k2b7!G0t&6V-#juppQX@E#dm95rN>jIYR=AFxQwY2Zn5DI?c+G%)szg& zAVqe}d^Mmj%x2&TWN)R+1ZL5dW^$4<*XJY5px4WFRT;XhGW?TG3;=*V8;*b0faHJY5vHb7~t%=jK^7dY|VN5of#1ZfTf=5aVH?p&OQX>gVXb6Vslm% zQ@t1R;@Yu01OfC4Tz%Dk-U+v;;|a!JpBHzQyrnu_$(xEF+ro4>{&dJUrb~#Tu~}KEA4HH ziGDnjC1}9Ddli^NTpG;J^fX8r{$Apvn^qb90E#O~Yku%CA#ZOdci(_`*Ns>~$s?5# zQ^~~9$p@jw#HR1wH%ENaJXKjjf$t}5iv~azyW!~wFr<`zAdj`ktvb1*r=MsyVALDNcN47*DoYL2GJg;pD`VSgtMle_&nlNf z{E>Wm<*}Cl{3!ECca_SOy28*p&_ZCD!42`i3P@S$Xk_&+8>-an;Z{s-VO8xSxpp=b zI9qvhw^pzxG|ZW|?$Y;1B#zYn#qt5=D-dUpjl2GQLH!$AmPOGjaoYMC(fZMlhEXhB z7}Hd>LCB6PygHQ))+jZ1tz8yuc%<8~;M^b{qM13u+_Mn(#I?C7ra9TG=}kfty+HG* z6OHmB+ASY&=*|bLGzg!HJ*ZFA_$izq9TxMV_7V4$R`#$~Y(XpiYy)KNo}@GKVo#N! zt)V~|aK7N-#Y@Sup_=ke%)K>$oKlOXT^kK;DP&PYr3V1K(OK59{Y>qTZ?s$)E55?v z#l)FeTTNk0%lHrC*rbcd1CQI@J@!F#xP&!w;oG3jG*8)_?0Nv%rGhWYk3_2UGNL{7Ee``Lc$XMS{8B`?!mEh>;t|VVO#Ag_x#z60`fy z-Zk5*PL9%MyFR|tEV@f$%;HqpgPUE8%zc?EeJd)Dg(^Di$xVwr4!hp|Ul*U?y)`>c zJ0zTG7M8jiynCHhx?AKs*n*I^64566EnA$VQo0_n>P={oMwjVh;bxl4OQim!rvsej zjdd;ZS#;h+^xH(EZI$*noMhUAX#Tb?u5=n75(yL2uf9tLEjKq?64;$-q@vKcJ_t2z#725kLA06%{Sly+OG1pg3+Y zncUp9>nnWp?25*7XXob*@??)9HG9QMs~>$3uAvKZL-yq7PHWHimPBwfRsN5L?8rlo zYeV0?d6iG)gvRawAA=BWo0d32dY1i2PWVV((MUm2I>f*411GwWYjo79&>1yaXb-U1 zr+n$M7uA%!uB#nRb1hD4tj&Jxarjtg(O7pl+_wqpgY_nHjrXgLlPEDf?D(+JcvmD{ z&+>TCAk@@}W?J>dto@7E;V#Wif5GjW>i;Z)PK)lxo0)iX0@-)QbNP}#j}_CW{p;6O@7asa=$WHd-Vx9 z^1-VEuolY2;Y zq4nmK+t&h$0W=YzSnPhF4eSY+rIcNEq&K~H4|Nt|!KMRz!OwloXgEXl+D6cv^0x|z zd7V$G4@a9_ExY{7avnToNi5ZzAFRW`+JNY@Yd*1oxmnY`gf)0RNkf7wE=Kp3N6%W{J0-anR2olTY=M zeFJX;H{K2~y#@1}JxW>Sl}56nkO&inS}ARD0fd$-f~jPU8i|S{|NtzCUY) zpmi<=lguXhds(Of0`loT9fW!fvbG9urX{10WbB5VuQHNnZO2UW=r>A&VWR-6Ghzx1 z5Robk$U-N01Qt@fM}{ zlip2*(y{Mj-r+c_h4-=8yF|P8Ze(@c+!ruxKt_;Y#ZvHa5)8r%3pka6yS||tm3qgo zG2`O1^k(WM7Y_2vRa*chs+QgTMSw;&vJXB6FdwQOupQ%5UKft zN{Ld?l)V9^+{m>tZjE zwCp{*IJ&PgdUUl}@>Q+X6iHb1NjNpL4j~~eYIk2MBiYS5df<&Hr`sg6X)k1J z7!@CzKzcy?x!P-(dCz$uf%&}K^8CR@Oyv`0N#<71Qk+*xmLMmjq9X0~w&s;#>wM1( zkORzx-*a;PDh%|QRo9k|PkolVZht6|Gg$qYLk2gP%X`jYt(tuo9$i()|FRO`z*xjE zk11GLXuq}fW<|wU26p!96`^>H_!lt3u0-{M&H1Y|zl-v-hI@rgn|CXeL+G-E-}`Qi z$$?ncy#aMT?~#tr92BY!&TnZ1La1Z+&{M&tLbMF!!MwDFMyBs$&reK?vaR{jzDJ0! zpSZ+YPW~uMeG%Ll0~2p4H0e(Gqb&S5Aq$|61mSh5D40etb|*>L z_d6f+r&$=xSz3)~v@4++BLWF^#X#%ige{C=F6dIGtdN1xJ^jl1X9 z+C|5VByOwNcyRv@^6s;#>3`w#csfaFN$5TF4xt))LX#qp(2FP_C@Ki3C<0;<5(qu? zuAz6NDq^83MbIE12%s3cTtN;s`NH^ZSlx?P1%73Z;=j1-_c44!&W!zvxE~LG)M$sRG1aLQ_x}?; zfA=4*+T z86U4k@A1+4Q%!GUds_pN2I8=_&=OzvE%7%F*(O)7n>VTr7VRbcjv5;5_*k`Ilh(jF zsq-R8IC!~^N3BfjiWtHwEc536fvYxkcBr5G9WSBMeR|Xza5Sj(`<`g4iVID!9W2^G zg3M*?PZ$To*95l>Q_Gyx_#Ca}PGSb{4y;t#34 zC}HTvu4vYgt9cL1543m>DjT9#VW%z$un83vD#LGew6mqjC2#H=SS95|RIei~phFKL zBh{jNfY)};s}th~ToQ7Ix%>0vr8g;xe#N7ef_3TpGFq?@ZzH9C$q{ix&J^5$b-yYk zRKl^w154a~m2_B%8P*=ds@rMsZX4i(I*5-up;|4MCX@C=1riT5q#f>hRz0Ib&xVl) z=gUsA9IFM&bet{2h*F`5K z2y>OHtM;VXY$nPuBa!pAUOJsNptevnXE7kKkgGVr8`3i9nQqDO{vmGL~d_K)RPlBihCv)Z6HJ;~<&!7DC7#rj<{H1rX$njF` zAtPOGcdb#^2_l6ZhoRvH@B)|iwYI`&XdeoN9tr3fQu-AwrdrSrieci|dVz453Mx`-0! z{~M%kq^j&&*-vZB*!KVxEbE~_0wCmpeidul5k(EjE4`lVS89I2S# z(^%zwNwLa*au6?{q$F`9%#vMjtd1}!ch%PQ;EE#alGNKHnM!uGuH|a6134Uzli!-k zKeF7G#pU>)E_tl)uuQy4Zr7bj4a{>z&M|mHHsVtup0zyg)c%>;Op!YNKVdN@)g@Cm z)T@7qpQi52V?|H4*_Jt=g7g%Y$-6)HJW8Y@=pyT3BahN=yQB(+5cuTE)b1-t{_Rav zKD-9P9Li=J@l+O{Eoa`#sQ*%a;<6kYM@2l19woh4hA9!E zk}BEh@@rY7v3juZSF55J@k(?CZdfKBo?;Oiiva!Hponah)P3QV(Lju`B4B5P+AVHHSi-h$ba*(^v(r%=~YB+_sdoH!)F@1cKxRI?VK}UNi^|eG9MVXidbnS#+10T8f)a)dMfbC+51zU1YHx8 zKHbhWyFQv-BDEhJ!s@k;X$w^0R(2B(!GkwSK*^}0sI+pvul-V076;^DuQxPlsMIWK z&-EBwP-rLb07$+cBnPjQ<0PsO4r)8n|6#p==~j7hHoXr1P9Rz zg_!h!9X7#aW@jKrwR)UpLMeOGo^DKsJ1Jz?R}XJsn!I(gJbVc)^=hZ$c)rww$>JvV zkwamPh+i~>hDxH?6wOTqBFYA-acIg+urA?2^Hzl)(l#(&b0R1!L4yD62jph4xN|i# zBn+;n%5RV2<*-K-cWHj!diFgJ{8T}-84v*t(d~g?!k8MH4;(B<&NnwdOXV$!I~a3V zW>0>9-tM^_z35;I;93wGLhhF!_b?9P?IkeuNfyM>o5@&Dl^ZisPah4mhO42NM-KC( z$Co$Bw$?gkUv5SuW3lFCV@Jaznbr35tEtstJh$r8V&g^I2;wMu`bth$I{sF2nSG5Z zu0|AIIci^r%T;z{GKP`$Mke}kR_!R}Ut+qlB|59RuJ(h&!w#k<3Vt#dsj&l692;rF z-!5tZE5tZ9GsUR&4qCgQk!ky0O3AIVy526whrWXC@u`i6QleGSu3NdSZ4eE+tYV|y zW3s~cL;LF|^e>GQ$Mck(u=!)0l6io@;S?jLN?H&Zwoj*y1|m8F5cWl4d(ZXY_fN^h zZ#VeHPt4F+{0p*w=f|HmHy5FJ)hj@DfSg8a=59`E*Za{lF&JM7w=i8iC>C|im-*Th zo|f+XeWJD7`zEbOWZ}cZs=WFJacliuu*FxM+v|LWKizQcg=W`Ukz= zg}@p>@C*_ngLL?Jwn-0(XOhFy4d(ku;wxuzzv2iYi?5t=DO1a>AR5z2n1$cN_j~HL zo{a{KAoUQovo)Ah}tZS4y$Glk5JdiJ}=uW|M+ox~i5x zQT+xG?QzwZbk$sP)%xhF{q2b;DM0qmCi!ZeTq^&qm85oooIoV-s(i-D9Rb zBTF9HD;e9H_iRi#E{>(i!dwL*lA8kJ19!EtCj960MC_C<>k8yW+V-W>#A0ZUZx4jD z$^OAWqV`7$r*AWe{RAAqgY55dsoX2J#VhXaoQ?*nmqSXkW+SrMY(H|G2XOVbho|Mi0iaSW@HULgy_8GLPY*0=2`nmat2?5AmRMXpTkM z#sS(V@*tBA%&9o|t{ZdlWp$w9#=X(61=W;T%9U$Be00{-a@o+(^cgto$!8WmOc`1o< zE5tdyxfdWbtG%5QB<7i{QXb&$+Cf-5ZtX9&j04kLwk%Z_MVq#Fs zg9e2M?e|mA)3AhPcIt8sP4ol!sHhGtlh#k&tDORuSCd`>|%0 z>Ia*kShZ{=&m=?dv}V0zbNw;m&;jv*?oHDXuK2Ii<`M&mfX$ z*ds4cD%9tjZ!(`bQk)N_x2G5}UNx_>{db_rhAS{85Kf`+u{U@^3r0B5qXQ2}y}EP_ z0eMFRkwDAFyF-q-+fX2CB)ZMKxIQ*WaUNvuefq|k_Yfja`QJBJZC8U;oa?*9#iOAx zeBk$T0FnS8dn&+Xld^lDd3MkaLAq|6_G17;&I+VUfLwo?DnAP1!zb$5(RE1>H5^zD zk%+USDZs;J;dgN;8g3LM6ABWLTo1a?eCufs?*#!5ai-Y7vYPmHMqA2}HpHHD63``y zg2VzqDwI!UscT8dO+mVinZyug%o8u6CA-8r19kMCX~FT~HXaCv>g~V5kcTIZ*HT}o z-%AptY1q*$_J2(VRiAl!Co^JKYkfY`VuV{!-o!+DIj1u%h4{`X32yZ=h|d=A!TBnH ze}i(Dj{?W@@T3?`byWs6_$@#<(`0{m<{~ncPY%WU2QK;pj7Kq^} zqZ8@dJc)4THULfmF)7ozeof05g|?5*Vv`jq)=N0e3=~t}`@B9YN_*$nC-%0{+`vq= zu-^v54Y0r31C+ui`t(~JnDxKrR)DM&`^?*LWecQ3q5Ga~Ph@_v&x&sHexN803lQ!1 zE)wAPbn`1(_hTMXpwVv%!_9jVpRxFY3o~sZJ}$A&`&=~lz1g*efb}d$)B(Q-d`>g@ z#C`nAg@`_0F{h5Wj+dYMH;tw<^l=%H@4gp!U$}VUM^n#4#I=i0=Aql$n!hFB%vhf2 zx{Ftisv)<`%W1C>b#%K6dnwmqygwr^?fqaX{K(vxg4r|p ziz>6RKzTdHL2n{Or=LH*KO%1MN=tAL zL}VWNc`DJ>n{LLU+Vqet*fb4_G2G|Z;N$q`XVX4M=Ie42bx{mm6`Fm3Rz&j$VQkRk z(aZC|pC0Cq@8jcne4fq!q50zzE%BGt*wj6pSRJl`_@^#El|7w9;*t0kVJ1i6RS(^p zlj!d4?#l<>a%4g5e=Ya@?Nftq^;#LJGff-G4ySoa>$x{mb>6?sNE=CLakKrdo$#dJ z3X6rQ9G*GwhdD7|wLg4L{7|+R&$Eev%l<}4ldqi6`+D!JA9(}V-LwDr68{W%cJzb( z97OPqW#;@!`7)RB)$0oU(&X>x?qC$O+uKJEeOZ^273@scuD`3eL(BMfcI{w-0q^5E zb>nu*<$`!c3H%+^T z?$7JafI|K23Eg&#i>)WPbPf)@{j(SBb|ncD$|J@MMu+a5%=vcd#LDX570h_sW2WEy zu7SFMo~i)nK!?|E*~hjgXcS144HOdvl7*NWDA2dh>Vk?)!a?B?N5yM}2x}(DnysD8 zs?u+IoXCEecFFIN#nVGgqVt8RegqmvUqBZi=oo6klR|rTI`(55AY>W9CrTA`77<4= zHSjcB^eolx%D3y)H=d({#o*UYAm!~2Ii-m4Jd+_H&ZaD(mWM&+W0S!X$`*ZHF^Au# z_t5=NbJp+_!XN%lA;?~+vESLgksWG9PgBC6dI&q>+s)cj)lSikY~%@~S77O%6q=k# zHI*`Gc||D+9r~&NdtwoJ?`D8sNWIyi#S7oO_LBSGkxI}5g1ow$j?+9}KMtbe#s2OD z7d@9ea+Nq$6gpN1c-*8S9p-iATXJgcb?&?Xv|6tt#2{&^SKNEQ9(r~Kt7 zKcxB*6)zyZ9++^hV?X8P_q!nlyJ!4#bENAtUCP?)N@c@z+ZFOcWlmB3G0TV91q#tx zCGtt4O0>w!Ek%5N$*Etw_Mq=t^UpA$VWl6xVMV%R7{Xk4 zgH(*A@hh6UdyZoj?8fyi8#~Cy1~kTpgCzyW*jZUJdTL*Kazco#Z0w}F@JW(w5#PCc z>E}D-_6M<(F`B3LzN$Q_b|};hfA>{&rrtIC1t>N06p^G<2^SQ61+xx0@U93I44M&< zX6MbOxN=$sn!Mjwz9Qoo1NRR7gUhlE-n`XZ*Jv$4Vh{ ziJB&J46z-VMU)!1g{#&lrs}Gpk*?Xq8mK7WLF6M(7&v&~NweEI(Uys5qF9xD{TZiM zT?6vt`6-?k6rfx)?v>mkd_xsVy$d(beg5>vWM`AyWDfb|k>iU2<+rrR+hd+|!{%P# zRwA1(hiD^n#D3#jV}PD{gIwdN`gBNPfGib45DMk+^2^1{(fL-oeUQAVH4|Kt!NC1G z4u$2Fu*Yv-Kf%O$M~;L}Us|R@QIR+hm-Hy!5+WQ4usW$dUe5!O$RON@OVi;%xO_T0 zovUhW83@NhjKm?r%b`>*`R7x91y0{@RA=fPZ{XoF`3V>h1~uMNDh==5eI3J(=qj`( z+hJ^uew%I2Qw(gMJK=e{W#kAkuHzN!aOByGMOa!u)K~!M?g5m|_)c9BHUv($kxQSA zvajJb^CbycRKEqE3Q^GmS3`6RuUYx%lR42&YPmVOazgq|x|)K+$&Q_?rzCQryiGjU z`D*gQ1T6bG3JT`*Y)0#7(s_Re>9?Nb3#qZcG<#N3n*=Yx41ANZ8@6OF6x(`5IDRiF zN$p7GT52he`?)+0l^7uCu1&Uh=FaLT3q2Qj>;K|dQlvNB0#N%G$}EtJ$g8n5@r=)LJ2&MSO>wZ$Y^nXGX- zI{xbje^lT$Qk~QW;^{;Se7&G|@kBSr=k#5JIsZ5_58c9Llp}xaMz(`wVI_}% zT=hf*Voppj-D>BEJN|7=>6u<@+96QB+S;RS;}6##*Eqai)4ghEm7q|`l*wT$owfg* zV&}=xs5$IzBkEB!#T4~vYfjg^VXALTGFti0`ex$uSipAi=$`BMrT6qdJM+gb8vlIT z)c5zk{GKaGTYf})`?tJF@D*a;9c}Kvgl~_{0brGWAf}CS!~_TusPBjBwo&=wu@L$F zL2TDHn(!SgOs{@`_iS6D^lvQON@Wn8(?(Y^l|{O35JL7>2xWI6P$Zz^znG3IFj>hw zOxe)Gz|_UiCfI~@&h9APF1o}yJd5Oa*451`!0uh@cxeM{<@~@vicRsrO z?#0C1OGH9k)ju>Rp>cwysZLAD{SVNo9!M#uPfyFpQIN_xACc4kC^t86pXU67a@eg! z_ZCa@^7lnfS$So-8)-j*ebvJFYEj|U&Vh=iu1aNz%JY$x*DC%oIz5l7+iusCm;GDk zG-RbV)ztix#=iYuI;XXxrM+t(=(G$iww^!T8h`G3*X@0y^AFJ3XFB^v=l=69OOt;k zvsZ6iE890Zy&*omU7fuH_j^aC_uJXMldo=T3*O%U8lKn(I{P}OFEVK0$*cbkbcXx? z4>V`&!NY$<&c7_q`0~!fv%&wJ6I`4Yd-tu zKl$u`+S&X5W_Mv`dhx~DKl$v;|ME90>r3yxya@Ju8DRA+pDGC@D2hs-qh3z9A>)l!8lq6x=n9 zmG?=<_Oj&CAP?*QiC;T(|C{M3J`;G$SAOuETz>bltW+tJN4miZ3_1C-eMJAP(z2i? z5rl9!DVz35*hhayF4+B|!^<*@n`%cU{=;-KW1&H-!yTz|>6p%Kg1AYQ!up4QbWRcC z0(4^L)B696UuRs@e66*kyZR~pZp1(F>z=K(|HQBVpG>C^Nu&KIe*N-KQt$hJn2t;= zQ2fuon2y5*0353H57VhV-+$^s&68!ipy$p4m8-kfCoGj7w30jpRn8Y$|5M9Kk?~=X z5Q?G%RvJ3^E1Qg{5JjgTR#doCJU8rESrTuTWtrB(A_c@s8wKy7AT%tgP6s0*O zgmgw9XM;whlY;GY#P5fa(iDfiLC_9%%JCA#Q8^_`QQ`B|8VLb{gP9^L^T#qx9L89D zo;*J5?4kBq@|gy)^{Q*@_JKtjZWA~wFYU=1nv+{ShbHJw>w*ekDLAWQMSXxJxFd}H zj)%Vsu1r6uv$slP2As8CE$4X)e?>GE9+uCfARRW^+I=k1Zu7#5Gwa^B3v#M6g1s<)8TV$Mf~# z5}My;+`YoT&3d0``S$d%Ua;LyVQm=-J%V~A-jbx_D1NBOI(WlHG zv^jp@^Y1U5gW7j5gt$cf`8I#z`k(LrVmiyo+JAS}3nTvSZq!}>`}4!UnU40}?rrg} zHsy{{vp82d-SjtvTU`yvXCss?lSOoLF~C@##VVY(w66eUD6 zK|}&Gxv5~;Hg#^kO&V(;oBz;eKcp9BCsluR&zWhtAoz(IHIxs)toA`st>L$W0(kd? zmrYQ9^k-V>F=H%ISl#crhq@KlMmSl!lfe$98h zdQw5x^?|r{;-=`%X0!ra`p4)&V`EF<3oNJ_oR(^NW0l1Wvyl}U8>Qj4 zvsv-ML`mww#PxP;^m%J}&t+g{%yKUKpZK+^1I?W%eECp~%pMa?wB62UDJW>1FdEJ1 zn#%A(gNWt;BrO_cr&3~vs<@_13u zv>6P-P~0b!2-}C6t-s_+wbyF+HaJ1;gHm>PkK=FB5N9pjN~FokCW|NcY%Zxy%XdTU z%`99WHI?aITYj!=(Xipdf_#++f3qXDoaLNXI$!Yz^2Wkso0MhUB`?t8U{iXDoUZF$ z#V0g&&j$>+^)t zVXbjFAC!V``^OIo@ahTx^t!w#vFhEtKOzPSi=acG$Z;ZX-|I%I&DkTv+%#~>kGPwJx@JyQCG>OU zoj@szn_*oaOpl94za7r_8JgW9DjILv$Mf)9SXun{^-GuQ0wP-HLma=itead$k8FQ= z;XL2tckxqS%k5p3mYDL5s#H=Il#hWIl=a#dU?-cuZSZP{B_*%j*pY}#hHVpI=&=Jq~M|IOh={99YscOtKR+C zGBodXOLjn>e_Y3W#x`^|>|S*2i&+VNA*VHR=hI^P^`4MYLf$o}y|3ynzt;};$vty< zxpG?m&&x6C)~>zVA0=9&wiws`tnc;iW?f%eKlk}>*Hps2F9~@;&;SoPn zcjZA;0y;b4MQ6m}x!9{0FV&V`X5 zTzT{Aibgv~9S2MWxnKk?;0ER>3c~YK#}uncA26*LdJMXQ|M_9JpIXN^2y<}socyr z-I?5587|P&D#gUL&f_FyJRN+He2x$MY$oyM%ChQ0mi-|k9aB8#VBse+seZW<-d#eIGJBwbj$~lMIK|G z?99`7mbclRt9v7VRWILb>cT=*f$3NQ@O6Pbtnm17di16IZm)uhn1Z!)d9uXZD@Fy{ z_`Fe@Z2uX^mmaeV4F^F+L9sp|zv*Dr4YS-7hy1reg>Q?ztJ8B3MM@1>t9C`cg2i30 zv#vZS8XYP0pcj$W&$+G~s!%QcsRyyb?ytr{?)acCwiUYtmy)TaZO^XsULrQXJ#sAt z1!?er5L38-v`~BV2MD22)grE2WphSmNRe`}Jz_a5u>7T%`N~P5#gvj+g_1Y7EQ=bgVNianp~Q9C7BG`_j&tqr?lpio8)VFe7;|Nk*>E*(-!_m4ht2nsjS{cG7*_}` zu*>Oes4wR0m`ofk{j35Z8;?;9X)z*!MxKk1~Zq>f$s~r}qoqtx7#A{rQYhcs1MQeCzhZ?g+ z%c5gwr|O!3UeqtK+F;+>76t6pLTzB5L?m}!`Oi5jAZ(aOC zUBb`0!^faH!^%K? zcrZ~>zbPZNWoe`-?Vcl#(9`*MvH-=ZiYfgf{ZSQ3C2pSZIQ=kVq+}+o0?FG5DdC4k;ZRL|)cJ zo!dp7JBuUH&g#5Q!5K(&PGxrsM|Jb7bJs0*L$kVDM^U#2O)D0itWKd?PlcYm(95%8F~anIG1B-L)OOEW z=!PsUiDVr7P%EJc5i*}V&ix!O5^#UoNNVI6G{ z&pi^PUWm&A2h$=z2v{z>EKGkHYR!IN*9MNSfSnA$Df_iinnlY1=nBHkcI=JTfT~u` zxRFHnzCb?h?ia)1%8f*J;E$UG(EbK4Wj@acW^r0HdP?x5twZI z2v}}gqb^xpBB2fGwFp)MK!N4pZ~!oz!WGVeDpAgInF-MjqbdVNAbVuk)!$=K@(ADQ zN8>zGaGm{|skQd0s8a~}hnRz|kI`E&D4NR?3udsuB-CsS8_r-oQ9UeloHQ~XCThOa z*)t_$ZT1))2)`mfBQk)9Xfv(=j3UBO=SzE1W$(gQraLIp5F&I`^6?cU3_(pi!G#Rx znmK5O;g;m`4uHp?26AzTs{mL=IP@wTZkr}_FlPcDIDH{}3bN7`>oi!lq}`Y+eXP6= z)!)(q7**OdByko<{UG1uvoa?@Cjdf?C~o66h<^Z7355{iz(^dZ5e}gd46;FqUC`u4 zX|`8fMhQw`h#Zg_TZ~JxPqF=8I(gxG_H5R`5_XSjd)NILhghge4)>(^*57yP;5g33 zWZ+G1$V64OXmHzbAmJ>q0SBgpjef`kDed?JcQ0qxIB zG$n%6tUDnqjU~N9f8tQIehV1+KDlCP@}>~^kWt>+5~*GJ1YPPPr%Y*}`qG7VhQ=eF zttUbiqzPfas~W!$@+Dga_shSrQ<92y{(5S1{!}g#d0ZJ?X^gwJCa83`U9dFY3;2sE1 z+r-2L49XGb=xxv|=r`|mps+J_ZlB&s1%3=QuR8f+?V0(_7M>5wt)i2^KXvpY_+>X? z6UZ&4te-HCrk+|oSgRdGjI2kDT(Ny&EGmxkS2Lv7mQ;729qU~d=45~E_2$y zEh7W-T=UMhH2Q40&|NYDvUe2gMfiB;=ZB%K?Lf%^&)XPK*`%5Cc(XIM_``z)0+LHx zY&`@0>&|2SGpN(+Ut=))3z*22Lqa2ZUn;@I4(eFzWpD%qnt(&v^NV#$Z*!5sUWF%& zC;_|v;1gWX-2R0u9p%YS9ikS}sT?j)Gu-az_lb({F`Vxm0U-Ey!w5IH#%7d44%i6Q zg?*3Cl54+oRC=?rF2NtQ`Vnm$feFjRbUUN2Zi<#U&ACVZxRU)tQ%0gi09nDmW5_LZ z%>~6ykh~Iys%m``V-Agx!8G-WCZUjp{J$P;jUQXw6^sx997VB*jDK&9NLM0)U4C;` z#+h+{)X5*jiQ2|{Z)Rh($+ZRG*}uM)iLELaHS-OB;mG=&QZ=Y74xd zsp$7KY@pi3zsBK}yYNi5#tCuV^~kh|#uMK#`ZET3b9bpwex>v;N<;R^+~DxI?b*>9 zrZX~&!|{j4 z^;tT{&XBhK_v6>sDkV~pVbDW^Ig%-Y`u8J)HEb9Qp%K$CmpZwQO?sh6JxUr!>m3$b zyTA77#puPLC?bR*+rPaZzvd_3%1;#hB7bjo9Aho4f}~ms16ukM-2i1Nr>Q91(W+j@aoGejkENIg69a2+$1HAD5pP5uJETAD?$-Kx zT%FFp)m#+ZjBN5#Jz&b^dtaAYEvI769E1omw7HQL2My3AdzQ5pnCP!l1E`M?kJ=rA z1YGj>5BZ?7T0wc0D86^(C!|YZq)PA=UqRRX_;q)k<3I^Xw+4gM&C0}QynUR!e`yU& zrI^`yQxz2JXJ|NqQ7)e%n~mvW&&$!ir=ne-$~iqw_3-3=nd&@7)mW*=(A0De$OfZz zpR!%24Q8-#j3scMoCtMTIQ3=rfV|BHiTUL6fU8voEy0xe96015GAO#myA#Ni_<1%R zN0Z+eVD`z)yQH*suP>w{&ft&wV&{}h!+LOV>rxQGULc{+egZIuC zFpghKe7b8Ymu4IJ$TIj=)kby0pBvTg4(JU-s&w|AVut>AmX)y4;aDsAYgFOb50X}I znNK7kB?`%?(<%`}fwQ8zFBhFzHQe&XZ)y0>gAK>_|B7V4I_)F4d*ej;eWkdlzs$AK zaGEeglpnQKABY(}XRNk(*S2z)Zl2yImx*hJTO}L5hy*fK{$go#oy__yrbNl{GTHkP zb9eW*@O%pm3T|jV%(w3is2F;(h6f_Wn1G;Y?Zcd9qzG#V^xc{77 zG#u`^t;f4a4=3{dsBSwVtaF^chwSt?rY2-!aBJ%Ir@kN8I$!>Ij8*e-wRboxVf%qd z1(BDfVFR7C<|NGy<^thtLHl0>DUspx3})c5hxLB`HUwr5W`!woyR6p=#$!B2b$f`S z??TS#r#0$K874i9pa5WkSKw(>Wt%?`@ltguG^egI`u-OX~BKnn%r3jnD zcsoji9K?gr1t^$GSgs}5eo$}dg3xK$j2ujYSu&*8SvF)MJ@kdtoc6R5naHnkmW)e`CHmi+ql!jiM0R@Gy=r;KMC z@+o72k1!arXSCAG*b|n=djz@(_x;>Dk9pr8e{yc=ezS=^$4`Do;D&jJ_elYGpn=Go z$t_xid)Isa^4NTjN9%j;)->94QFjd=_!DJxD(AUMzERn*hoYA=4sW5G0u}PWE*$bDXOyB=@(o?; zhzP5W*~KNx4>$X36e=s#P<>BSU8W3}hj{V+e-Hn_KD#U`ZShTuu65q%Sd?a;OsCDthX|?{`R(yY8sV_@TrNl>74sD?Dk(zh+43 zGO*T!C%FmzFhks1`*Q)X(%0wf%>JAtC6`Q_V51xC@4ih8yESy=csCR*AW~KDt=Vz4 z+rBZ*Etlh=Wv^-}acKF5*7~wNX_O$VJCh{IB;-O77exA(os|g{aAog7<6oQ_YCsqN z#n*;6(W@V+VHJ>~g0HZoLqKGJ@ANTy%iD`)&>uH^Uo<5cs5=0Q&5V^aT>=@0kEZ8B zx{1P|AI^KUi7K%9c`lwPQp!N`xS>ik@g&mns$7_OT5@4M3{yyy2u7t);X#~df|tge zUa){ECZLVuyD;B2Dwj9qm0;v06piz#^tRs{lQ)+hU;g{0+>N*qSaNZy+eYFU_T*Dc z9$T&Kj3v81*lI=9Qf&d1EM7!dNG13uD>zR#!ah%c-?qqAyEE;FD|iD57bH~}%fu_Q za*AvUG}!rE;Yj@Jf~!EzpT8IT`{Iy?u)jGO2{9$<^RhxT@#$y#FKMGA!c760(xX>} zq`p?bkg+!|K2J%OY+kam-OxT*V20{-x4uTK|F!gm4}|J^0g69ixg5TCaqx}#56c6l ztC#maql>O`@#k_vJkMpQE?A#XI2A(JKWYnr(OPE;x0;-f|CfEExR z9^RwRGmWAKk^m5;d4k6Ce%>OWz+ns8h9#dH@nsx}C!29DhanEo%pBFa9CT-|eepmI ziQ(bRz~TwebpYQy04oW&U&_2PjWD!thX)~uGe{p%86T`jp$b)FcyN>3ipH|AFSEA) znlg$RvR9*RjwkjGt3l#roj|mJOM}=O2M~W6HQrp4;e+lUEumY zZK|s(!|Ck2(l+|JT~Kim)fQrb3IO?x(t;;IA?~(^;vb}KSarbf*Rc$ISXN{e3S1?|D4pqIMg6pT@`$5Kd+It}A2OflF?e8?x zC(*1DYC-g2_Td%AISzJN{Q6S^ujR=i|C}He$pm{ z`kw9_N_2XcXuknD`2p_eU8hr2hbD-L!4qXR_wN}bf(MDSloi-l)v=(%6;#bp-P>hO z?8s6s9~N|sY9y9(l)G*s4DQ8N-6H@TK%yO{rWE#hN?VLpwQANIW2P5dyuJeaao`&0 zmh)*bNerH@UE$!f1C%4E%Ei1C_7DVuy#L)IUV? zx-RFbo{*zLs}pCv?aJ5#AAUNOu&0Wb1-0H!N#{e=g!Y+Ew&8oFKk4lWxjf#_(JGUO z>URpdDqwvlw?}{{dm7=>a31GkaU1-(sXwA_71%_~DL1p(CqlXEkNRy)gt&{aV0|pz z%xp$WUYn~%y<;BaPjt6~YT4M)Eh9}#*^u>Ba1IEXQvz{tg5)5P9Z!U`<`WOLr06@% z>N4FuYXmHWcpNBzaeEezoy5{}RzNPpo5i17cpJlCQb#=J^Vdh222MmJsk`{xE1v){#K{rq0PUUy3r|WuRNpk6>s%+-;C*u zFgEXL6o=7@3&%=UIZvaPysokaMk3q4q-L^WW__m+k#~6qZb5dkp#u$`iK3zj8QvAU zb5knHdv0wsl4xSaCP;7-tQ~Moz6a!{2xt29T+a8-n=SM%!c4c*Z1yj7hvw<@fHbfm z1uRf?S=2}6S>DHIFV!JLcw)wTurh#URjGXAJXMP0b5$`t_nS|BIWs&5`!p2n5LxEH zqG?AW3b93|8NO|^g#>}&hyfc3hxW6)sUyFt%O~X$afxjiekG#^dM6KbY|zCc88|!W zDh?VwT;$bLje{qWHp)8!WC@Xri4?zE{+hqj6(`=JU=2Cek;)iE^?=l2CkVH!D?@nd z+5Patv$44x|Yq1j9abz!@twWF|rb zEL~d`ZT+?c6Ne)NnBSo~Gy6W;^~6rEga8x3Tz z)=dnJ0S!xXDXcfFJViSPOfHcgSuLT#kC&`3Aq|-`ZujVax&zlpN1DKHN^M$AbSw~)Fbpe(_3|p5Dvf3 z2sS)|y&(k;KhBJJz2rnZo^Jy`afZ3%Tb!@jc!CsAv?IJ{c@udb4>Zqnv01NH|F!cr)Z&LMkhGFeA z87x!5SWHGm@J9~_(*t^Sn4%L&Rqp{Bi&ASWsj{$DXxDPhkyF%A`TFApbNgdM0jHi? zKc=$lWRLXA+N$12$e3d}r3$+x_V-OrI|=uTI_P9214IRi1UNqpXaPW~in+>*m!dkr zKwv>kI|%L#@QD;Tm4oIcx7(JOo!|v z4`kl=-5Zd+|GJ|c4qS->S|iF0)s1RMFFei0>j?ss@~DghGe zHZ8uQtOo3Sxw#+g|5Y>*;_d=(UNDGNI0nLN^&DMoABcYF?Fd@gf9lfLOY-OUwt4vi z4{QaX5P@G$2cFmcr0^H5N;FXUK%mM2N3waq@1~|&9ocUr@oP63`xJp`O*|_LEWtv? z(3WN_=UykGiI3|)-L+GDi@2{9np)&2$bFYAbO}PQNY(@ZowC?0Q+_D zhv@`b8bo>=kDN}{0hB3)8l2k#M-11YEU?f#SmYr#+F>y^GLXQUy%?ilfO|vGjYH!? zyzhlnW7Vss0nY5AVHv+3i>Ol;M@xQ+2KD7JKb)TC(jMTiwK3(ajq&skCE!{Jn0%rd z)fOvl7?5!v2K?)NasTnYB$YFMC(Qmjb=nSfG0eh^WP3HxKRhuYzBDMUj^lc9dV1l7 zeRxVLQA>lPc&WBFDa!j(;uAQ8_fKZOsxv)3Goz56m71E9Tkxl-e_A*1AGuqoD#J0m z|K{{LE&ZhU%HpER+E$L&t#0Y&^z;7<=5pfsCjY?PhL*aa#m3yM|9ITP;(z-2JtLfK ze%r){e>?e;@BhPaU;oMD|C_=8w}C(RN8J8j{eEM~sRl#gHknafG;pL~2qp2S}$sc$krym7SBDN6RnZyvZV0^XPb@O00H* zay716r995?-V&8@yHz7N^9IsM0Cp6A*o|QV6-P5mB+|hc-QN((9Fp{S^B${wE0($G2OBI&oxxNuJxvLS`Ifd^Zp zP?o876b)WsT&M}wuKR_|?~ZPKCpUIeqSN)U;@9*qKlDTM>ILxa{Z>wz!OBk(jkQ*f z?y)`grtH)go~7C;0ly*tX6Z%D)tDUb>g|4h$+L_}`u|yavU0lj0!8glmi|z~%0e8n zZ-p6sNbr=U#_y%F#rRb9g2hA>ulf?zL~gcz`9-lsXh z)vqL=0gFY0r90}&4?WXwEN6I^lrLxcT<%=X!uExwNL4DUJ;=r_myZBz068K4sqSKN zZdAgDWkrNQAOWLO)nI|&+D|ZoY}z@Ii;1Q*ghCuVS*-);bORj5es{Hl_d zN-8lz3u;~o7eP0a8zl=gG@p+U&LyhU6}VOQB%IPzT-~2Gf9BSs$(f2?^K-9iCNKML z)K7a=`kfEH`EjFho}{_iw3P0<*}PIxx!JPb@Nx4gt50*Q^~)>Yt+w6e%ExUnq?#=> zr0=`7C6lR8aS$qe$LYvvFJwKjGc`W{T8RWJCW4cs)KPQ1dLl znrXk^hjhPI-*Buh%5onH1LLt!{R3XLPg@9{g8Vvm#LM*di}8c?k=9TgcK_EG!rOZ* zXb08L(JD>{x=*~ooV9>Bm~iVLqs3jZ&!O{Vv7itbPXGG{ z3L8xIrH@$|cfnWGC3x{6r^>9vtJGM%Re4aA%xDx<(&sJ<3(z$=kN-@4YuCseuP2iL{ zSHfq9`yx_xX2xIa;DJj8mg@k_Amk7=Ww%gCq+DB%mq<-SdK!Ey>#Nm)BdEbq%2U0y zR<57eQW?%YDtD*a!|zT?{dA!}vmgX%Y3 za)j5%ylr}kd@Zldjm(}*R*zfLWmUonp%++4o0@{2&p1r|g_yvGlZAbt?bJwR@s{2V z)eCEAH?**^NKTCP*ShC6>PUt4Z#J1gMLApD*2<` zO%H!ne6Mly9psn$E~{3GsHA^l?DtIV zmMLh4GU_*wb|0BF8+ZNk_pssn=AR!B1y;EDTCV@46%5jR#yIzUeL^X#*7Kvms#?%( zLhj-E8@98Z7b|ZUR;lDyx^0X)^kZK|5mFf*r3v~Si(o;ZfgWSC?jiGIdO$Ly8N)7g zbBgPl8ck@ZE4A71x%%VHp!dm!&!roF;aTYM?+s1;oEUx9kGCu5Pc?u0MDSE7u*X?k zYQOzv9eefX z0%EMG@0nosRFpKG1B51i$3gG9c>_Rpt9j!`7cy zu3(dbWk;>M^~dV)G6f#Tm0!JaVCYTn`)^G#rn0t=pU(O(KCb>dpD)JgN2QhfH+J*N z-7R>4{q(5-9Nu7MjW_RS^i zPMc=96CHrukSh3|On@Fxx|c&&Lx3Wp>1x0(aA|xWh^)0*1D2gvQAKenqamscSrQT# zR1-3+swIN*2KSS->8n#Q%wn51-PCnItA) zpd}(i3QASpj;MuDz>EibLE)FWd9EHOrqOY^Sg4JvkO7D%3lw@5A!b}A)USAih=~{o z2Af_NGiMR*)1wuc5N{~~V+(1b!bv5pt+fb&3JNothsipG`IL!AmdfX#dANwA7!>E@ z2;IQmzH1?sI(5MdWbZvq%9)2a(s+7K5p|HfdZIV=n#ip2P$^6ViKY(jW<`= zLWM;!RN=%}F9+Bm6!;JVCQOzN(YgJ+$dsl6M+1B%2r$Jx!b=2vT`f{xUf|9rFc=a? zWW*}vllzl^@Fo}($5lfBexvb~FmbikuQXEngnchQTslXB;7BER1JzCV;C~GfgH^$*f=-SW-qatagw8+KsH^HJJo; z%`VC@IlHX>@}t?z6c4-X8Q%EoPcnOJfM?CwA`|I>im6k3662JdH4$hRDraalY5uj) zl-b5nz=|oVEmWtOB0(p&hWu*-HQqLi=%$Py~2vWNs>iY&BnR&C33{`ofQh_QxQB$_^isois z{$5fOdt0V-ilSpB{?I8P@w;T072rSsy~LRRC1E=XLmeXv|=s2ST6~oO_hos=XXKMjaXru_rZTBR~L<6 zxJE0?1F@mO3|`NGYT2_20)x~zBqXP)T;Kf>UPDsrL)9ke@pc8=Iu`0jucXjIbx!OR-@rVG!sy6I zws*}JK0btIh|CW-s*FOS)sSfZ8mK!K*yMfh;p+Ug@4d>dPE;n->1U~2QS!**7QC5= zq;B|4ZoLXrfUOb>TuSCNWdSu%2@$k!m3izWOj14W=9?R3n{UK4TVV6C+>aSx1yGP` zc#YXPU%%H4_XBue-UjY;)#V(Kbg8WStKd=0KqHA&(~7Ud>iapL^|k!yKf91^EXtOv z-gh`g25a+xnItzVxl&wW)NcxfamqTYP15j*@;A~Fl`^iJGKEx;kUjyQGV zko5;G>iO>g9X=iM2AoY%MX^}WMX>N8YL|Mpkl+-S zfstB5Z0#g)=>6yIBs83R%jh`j?4fuTa@A#=VqCu;zM1y#y|CXG0!zk5=(&CXx}io4I6+ee3# zFHOqf7j+rrdb*Bm5dcXS!jyG8;GGX>^lIFAs4IxwpNtw>Fc@939%c+;<0+jIM$kZc z=w!{X7!shi4snf-q|kE*L2V`T&#*f^KI?tzVBYrDVF48Ir4_~%2Yur#(4o`cOXstq zrwpN*bJU>$^5a#`ARGqt+4@-)JvTyMSc%?Q%px=}YF+0At`2jN1;#aMhQX|X$s-_8 zBovN;|Bi#Y(6|#~fg;P>FqiSy?qFqkZhetMwUNSY=ohEtlh#lZqN*ncr(^Rm;7S8f z6lf4E0(xlxCj*Qqk;J=4fm0apNi^6F12j>=XU6$8Q3q70;OY6vbaX69B+avIED`k_ zj06i|#y^gaCt{%xAM##{&`l3EPn*ctL6Ik4CWOluG~3|9=vi!_j$!zbmr5whLyTcC z3dF-0?u~r93AT5M1wutSwj%jl<#}=AJY-r}8z$NqHKk(roH+inA1UMJ1b4qelm_#l zFr&hDult+1B}K+SUEFb@w;a4@js^^CG~*+ZVnp5FHdsQ*`9pKpF3iO-=1QovL$WYq<-0u{(Qr#0{Mzp{G%R|KgLbae(;?m=~Pe z)l%5095txuAYyyFFtd7D^Mb~2gk6CGhyG&foDzOkJXfOn7xT5^Y&VkUAd{(h7_KbG zcUTvw&0K&RPj9-gZ?mD0bZ?5P(BeVS4$a>}b4L(^#$2apZ}sNnV{AmP>mU-I$SC3$ z%+B+XrWZw%cx{Cg`2FDYyYDUu$$zVw>PPdAqTX#hZ7@Faa^fu9slCS2P+X4%W>+I9 zV0+iYd|dW3^@6=YLh^d@y#q8RaXc;JH76JYKeoy5@wx0mu7ETW9N;HtI;u%Ka-hVy zGs3lHlU78LS{X^L*ctV6kz2$$1HL#*$A{n%8fB%_~*=p_zk`t81*dBX=5E z^pMf=CgpWXV&(^R)0Ua3Aa~J_Jj0bWB%p zfrjiyi(+EGk;Oa~@81dsMl0{G8maF>M@r-MPH&W~t;-3W0l;8?RmKXx!s??3!juAn zO$=Ce-|IG(x-t^Hf)h@>NoXNJP5qE@=s50}Zh<)%2B?n`>6E&&j0BSk0yUorFw2^x z$`EKsJhTZ`8HXM(r+%VVy|qasREvyJ{{~YHAlueUybMsmqZdQZKmr($B=xQB86Z(^ ztjP5n4!Jf#pU~364lLE4yayx9*4=9A{t;@+uDC)%jkJ9Lkp5AFzW`(+kS{ZJcoV*~? z=6hH{Ad%6CM1cpv?e2W(#8DpCn2Mb+F)pXKeHpiIP Date: Tue, 9 Jun 2020 10:43:24 -0500 Subject: [PATCH 52/65] Updated the Writing documentation section in CONTRIBUTING.md (#68434) * Updated the Writing documentation section in CONTRIBUTING.md * More changes --- CONTRIBUTING.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bf659345d387..959c12af90463 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -661,18 +661,23 @@ To build the docs, you must clone the [elastic/docs](https://github.com/elastic/ repo as a sibling of your kibana repo. Follow the instructions in that project's README for getting the docs tooling set up. -**To build the docs and open them in your browser:** +**To build the Kibana docs and open them in your browser:** + +```bash +./docs/build_docs --doc kibana/docs/index.asciidoc --chunk 1 --open +``` +or ```bash node scripts/docs.js --open ``` -### Release Notes Process +### Release Notes process Part of this process only applies to maintainers, since it requires access to GitHub labels. -Kibana publishes major, minor and patch releases periodically through the year. During this process we run a script against this repo to collect the applicable PRs against that release and generate [Release Notes](https://www.elastic.co/guide/en/kibana/current/release-notes.html). -To include your change in the Release Notes: +Kibana publishes [Release Notes](https://www.elastic.co/guide/en/kibana/current/release-notes.html) for major and minor releases. To generate the Release Notes, the writers run a script against this repo to collect the merged PRs against the release. +To include your PRs in the Release Notes: 1. In the title, summarize what the PR accomplishes in language that is meaningful to the user. In general, use present tense (for example, Adds, Fixes) in sentence case. 2. Label the PR with the targeted version (ex: `v7.3.0`). @@ -681,9 +686,9 @@ To include your change in the Release Notes: * For an external-facing fix, use `release_note:fix`. Exception: docs, build, and test fixes do not go in the Release Notes. Neither fixes for issues that were only on `master` and never have been released. * For a deprecated feature, use `release_note:deprecation`. * For a breaking change, use `release_note:breaking`. - * To **NOT** include your changes in the Release Notes, please use `release_note:skip`. + * To **NOT** include your changes in the Release Notes, use `release_note:skip`. -We also produce a blog post that details more important breaking API changes every minor and major release. If the PR includes a breaking API change, apply the label `release_note:dev_docs`. Additionally add a brief summary of the break at the bottom of the PR using the format below: +We also produce a blog post that details more important breaking API changes in every major and minor release. When your PR includes a breaking API change, add the `release_note:dev_docs` label, and add a brief summary of the break at the bottom of the PR using the format below: ``` # Dev Docs From 7c0f838aaf196d94fcbdc09b840f2cd0b974f843 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 9 Jun 2020 11:48:37 -0500 Subject: [PATCH 53/65] [pre-req] Convert Workpad Config and state to TS (#68615) --- .../canvas/public/components/router/index.ts | 1 - .../components/workpad_color_picker/index.ts | 1 - .../workpad_config/{index.js => index.ts} | 19 +- .../workpad_config/workpad_config.js | 169 ----------------- .../workpad_config/workpad_config.tsx | 175 ++++++++++++++++++ .../workpad_header/view_menu/index.ts | 4 +- .../plugins/canvas/public/lib/create_thunk.ts | 23 +++ .../canvas/public/state/actions/elements.js | 2 +- .../canvas/public/state/actions/embeddable.ts | 3 +- .../state/actions/{workpad.js => workpad.ts} | 34 ++-- 10 files changed, 231 insertions(+), 200 deletions(-) rename x-pack/plugins/canvas/public/components/workpad_config/{index.js => index.ts} (63%) delete mode 100644 x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js create mode 100644 x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx create mode 100644 x-pack/plugins/canvas/public/lib/create_thunk.ts rename x-pack/plugins/canvas/public/state/actions/{workpad.js => workpad.ts} (54%) diff --git a/x-pack/plugins/canvas/public/components/router/index.ts b/x-pack/plugins/canvas/public/components/router/index.ts index 5e014870f5158..fa857c6f0cd3c 100644 --- a/x-pack/plugins/canvas/public/components/router/index.ts +++ b/x-pack/plugins/canvas/public/components/router/index.ts @@ -11,7 +11,6 @@ import { enableAutoplay, setRefreshInterval, setAutoplayInterval, - // @ts-ignore untyped local } from '../../state/actions/workpad'; // @ts-ignore untyped local import { Router as Component } from './router'; diff --git a/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts b/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts index c6dddab3b5dd1..abd40731078ec 100644 --- a/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts +++ b/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts @@ -5,7 +5,6 @@ */ import { connect } from 'react-redux'; -// @ts-ignore import { addColor, removeColor } from '../../state/actions/workpad'; import { getWorkpadColors } from '../../state/selectors/workpad'; diff --git a/x-pack/plugins/canvas/public/components/workpad_config/index.js b/x-pack/plugins/canvas/public/components/workpad_config/index.ts similarity index 63% rename from x-pack/plugins/canvas/public/components/workpad_config/index.js rename to x-pack/plugins/canvas/public/components/workpad_config/index.ts index 913cf7093e726..e417821fd4f67 100644 --- a/x-pack/plugins/canvas/public/components/workpad_config/index.js +++ b/x-pack/plugins/canvas/public/components/workpad_config/index.ts @@ -7,28 +7,29 @@ import { connect } from 'react-redux'; import { get } from 'lodash'; -import { sizeWorkpad, setName, setWorkpadCSS } from '../../state/actions/workpad'; +import { sizeWorkpad as setSize, setName, setWorkpadCSS } from '../../state/actions/workpad'; import { getWorkpad } from '../../state/selectors/workpad'; import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; import { WorkpadConfig as Component } from './workpad_config'; +import { State } from '../../../types'; -const mapStateToProps = (state) => { +const mapStateToProps = (state: State) => { const workpad = getWorkpad(state); return { - name: get(workpad, 'name'), + name: get(workpad, 'name'), size: { - width: get(workpad, 'width'), - height: get(workpad, 'height'), + width: get(workpad, 'width'), + height: get(workpad, 'height'), }, - css: get(workpad, 'css', DEFAULT_WORKPAD_CSS), + css: get(workpad, 'css', DEFAULT_WORKPAD_CSS), }; }; const mapDispatchToProps = { - setSize: (size) => sizeWorkpad(size), - setName: (name) => setName(name), - setWorkpadCSS: (css) => setWorkpadCSS(css), + setSize, + setName, + setWorkpadCSS, }; export const WorkpadConfig = connect(mapStateToProps, mapDispatchToProps)(Component); diff --git a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js deleted file mode 100644 index 45758c9965653..0000000000000 --- a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import { - EuiFieldText, - EuiFieldNumber, - EuiBadge, - EuiButtonIcon, - EuiFormRow, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - EuiTitle, - EuiToolTip, - EuiTextArea, - EuiAccordion, - EuiText, - EuiButton, -} from '@elastic/eui'; -import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; -import { ComponentStrings } from '../../../i18n'; - -const { WorkpadConfig: strings } = ComponentStrings; - -export class WorkpadConfig extends PureComponent { - static propTypes = { - size: PropTypes.object.isRequired, - name: PropTypes.string.isRequired, - css: PropTypes.string, - setSize: PropTypes.func.isRequired, - setName: PropTypes.func.isRequired, - setWorkpadCSS: PropTypes.func.isRequired, - }; - - state = { - css: this.props.css, - }; - - render() { - const { size, name, setSize, setName, setWorkpadCSS } = this.props; - const { css } = this.state; - const rotate = () => setSize({ width: size.height, height: size.width }); - - const badges = [ - { - name: '1080p', - size: { height: 1080, width: 1920 }, - }, - { - name: '720p', - size: { height: 720, width: 1280 }, - }, - { - name: 'A4', - size: { height: 842, width: 590 }, - }, - { - name: strings.getUSLetterButtonLabel(), - size: { height: 792, width: 612 }, - }, - ]; - - return ( -

- ); - } -} diff --git a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx new file mode 100644 index 0000000000000..7b7a1e08b2c5d --- /dev/null +++ b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent, useState } from 'react'; +import PropTypes from 'prop-types'; +import { + EuiFieldText, + EuiFieldNumber, + EuiBadge, + EuiButtonIcon, + EuiFormRow, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, + EuiToolTip, + EuiTextArea, + EuiAccordion, + EuiText, + EuiButton, +} from '@elastic/eui'; +import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; +import { ComponentStrings } from '../../../i18n'; + +const { WorkpadConfig: strings } = ComponentStrings; + +interface Props { + size: { + height: number; + width: number; + }; + name: string; + css?: string; + setSize: ({ height, width }: { height: number; width: number }) => void; + setName: (name: string) => void; + setWorkpadCSS: (css: string) => void; +} + +export const WorkpadConfig: FunctionComponent = (props) => { + const [css, setCSS] = useState(props.css); + const { size, name, setSize, setName, setWorkpadCSS } = props; + const rotate = () => setSize({ width: size.height, height: size.width }); + + const badges = [ + { + name: '1080p', + size: { height: 1080, width: 1920 }, + }, + { + name: '720p', + size: { height: 720, width: 1280 }, + }, + { + name: 'A4', + size: { height: 842, width: 590 }, + }, + { + name: strings.getUSLetterButtonLabel(), + size: { height: 792, width: 612 }, + }, + ]; + + return ( +
+
+ +

{strings.getTitle()}

+
+
+ + + + + setName(e.target.value)} /> + + + + + + + + setSize({ width: Number(e.target.value), height: size.height })} + value={size.width} + /> + + + + + + + + + + + + setSize({ height: Number(e.target.value), width: size.width })} + value={size.height} + /> + + + + + + +
+ {badges.map((badge, i) => ( + setSize(badge.size)} + aria-label={strings.getPageSizeBadgeAriaLabel(badge.name)} + onClickAriaLabel={strings.getPageSizeBadgeOnClickAriaLabel(badge.name)} + > + {badge.name} + + ))} +
+ + +
+ + + {strings.getGlobalCSSLabel()} + + + } + > +
+ setCSS(e.target.value)} + rows={10} + /> + + setWorkpadCSS(css || DEFAULT_WORKPAD_CSS)}> + {strings.getApplyStylesheetButtonLabel()} + + +
+
+
+
+ ); +}; + +WorkpadConfig.propTypes = { + size: PropTypes.object.isRequired, + name: PropTypes.string.isRequired, + css: PropTypes.string, + setSize: PropTypes.func.isRequired, + setName: PropTypes.func.isRequired, + setWorkpadCSS: PropTypes.func.isRequired, +}; diff --git a/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts b/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts index e561607cb101e..0765973915f77 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts +++ b/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts @@ -14,13 +14,11 @@ import { State, CanvasWorkpadBoundingBox } from '../../../../types'; import { fetchAllRenderables } from '../../../state/actions/elements'; // @ts-ignore Untyped local import { setZoomScale, setFullscreen, selectToplevelNodes } from '../../../state/actions/transient'; -// @ts-ignore Untyped local import { setWriteable, setRefreshInterval, enableAutoplay, setAutoplayInterval, - // @ts-ignore Untyped local } from '../../../state/actions/workpad'; import { getZoomScale, canUserWrite } from '../../../state/selectors/app'; import { @@ -75,7 +73,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({ }, doRefresh: () => dispatch(fetchAllRenderables()), setRefreshInterval: (interval: number) => dispatch(setRefreshInterval(interval)), - enableAutoplay: (autoplay: number) => dispatch(enableAutoplay(autoplay)), + enableAutoplay: (autoplay: number) => dispatch(enableAutoplay(!!autoplay)), setAutoplayInterval: (interval: number) => dispatch(setAutoplayInterval(interval)), }); diff --git a/x-pack/plugins/canvas/public/lib/create_thunk.ts b/x-pack/plugins/canvas/public/lib/create_thunk.ts new file mode 100644 index 0000000000000..cbcaeeccc8b93 --- /dev/null +++ b/x-pack/plugins/canvas/public/lib/create_thunk.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Dispatch, Action } from 'redux'; +// @ts-ignore untyped dependency +import { createThunk as createThunkFn } from 'redux-thunks/cjs'; +import { State } from '../../types'; + +type CreateThunk = ( + type: string, + fn: ( + params: { type: string; dispatch: Dispatch; getState: () => State }, + ...args: Arguments + ) => void +) => (...args: Arguments) => Action; + +// This declaration exists because redux-thunks is not typed, and has a dependency on +// Canvas State. Therefore, creating a wrapper that strongly-types the function-- and creates +// a single point of replacement, should the need arise-- is a nice workaround. +export const createThunk = createThunkFn as CreateThunk; diff --git a/x-pack/plugins/canvas/public/state/actions/elements.js b/x-pack/plugins/canvas/public/state/actions/elements.js index 47fbc782f90d3..e89e62917da39 100644 --- a/x-pack/plugins/canvas/public/state/actions/elements.js +++ b/x-pack/plugins/canvas/public/state/actions/elements.js @@ -5,10 +5,10 @@ */ import { createAction } from 'redux-actions'; -import { createThunk } from 'redux-thunks/cjs'; import immutable from 'object-path-immutable'; import { get, pick, cloneDeep, without } from 'lodash'; import { toExpression, safeElementFromExpression } from '@kbn/interpreter/common'; +import { createThunk } from '../../lib/create_thunk'; import { getPages, getNodeById, getNodes, getSelectedPageIndex } from '../selectors/workpad'; import { getValue as getResolvedArgsValue } from '../selectors/resolved_args'; import { getDefaultElement } from '../defaults'; diff --git a/x-pack/plugins/canvas/public/state/actions/embeddable.ts b/x-pack/plugins/canvas/public/state/actions/embeddable.ts index e2cf588ec20a9..a153cb7f4354d 100644 --- a/x-pack/plugins/canvas/public/state/actions/embeddable.ts +++ b/x-pack/plugins/canvas/public/state/actions/embeddable.ts @@ -6,8 +6,7 @@ import { Dispatch } from 'redux'; import { createAction } from 'redux-actions'; -// @ts-ignore Untyped -import { createThunk } from 'redux-thunks'; +import { createThunk } from '../../lib/create_thunk'; // @ts-ignore Untyped Local import { fetchRenderable } from './elements'; import { State } from '../../../types'; diff --git a/x-pack/plugins/canvas/public/state/actions/workpad.js b/x-pack/plugins/canvas/public/state/actions/workpad.ts similarity index 54% rename from x-pack/plugins/canvas/public/state/actions/workpad.js rename to x-pack/plugins/canvas/public/state/actions/workpad.ts index 167c156dce998..47df38838f890 100644 --- a/x-pack/plugins/canvas/public/state/actions/workpad.js +++ b/x-pack/plugins/canvas/public/state/actions/workpad.ts @@ -5,26 +5,28 @@ */ import { createAction } from 'redux-actions'; -import { createThunk } from 'redux-thunks/cjs'; import { without, includes } from 'lodash'; +import { createThunk } from '../../lib/create_thunk'; import { getWorkpadColors } from '../selectors/workpad'; +// @ts-ignore import { fetchAllRenderables } from './elements'; +import { CanvasWorkpad } from '../../../types'; -export const sizeWorkpad = createAction('sizeWorkpad'); -export const setName = createAction('setName'); -export const setWriteable = createAction('setWriteable'); -export const setColors = createAction('setColors'); -export const setRefreshInterval = createAction('setRefreshInterval'); -export const setWorkpadCSS = createAction('setWorkpadCSS'); -export const enableAutoplay = createAction('enableAutoplay'); -export const setAutoplayInterval = createAction('setAutoplayInterval'); -export const resetWorkpad = createAction('resetWorkpad'); +export const sizeWorkpad = createAction<{ height: number; width: number }>('sizeWorkpad'); +export const setName = createAction('setName'); +export const setWriteable = createAction('setWriteable'); +export const setColors = createAction('setColors'); +export const setRefreshInterval = createAction('setRefreshInterval'); +export const setWorkpadCSS = createAction('setWorkpadCSS'); +export const enableAutoplay = createAction('enableAutoplay'); +export const setAutoplayInterval = createAction('setAutoplayInterval'); +export const resetWorkpad = createAction('resetWorkpad'); export const initializeWorkpad = createThunk('initializeWorkpad', ({ dispatch }) => { dispatch(fetchAllRenderables()); }); -export const addColor = createThunk('addColor', ({ dispatch, getState }, color) => { +export const addColor = createThunk('addColor', ({ dispatch, getState }, color: string) => { const colors = getWorkpadColors(getState()).slice(0); if (!includes(colors, color)) { colors.push(color); @@ -32,16 +34,20 @@ export const addColor = createThunk('addColor', ({ dispatch, getState }, color) dispatch(setColors(colors)); }); -export const removeColor = createThunk('removeColor', ({ dispatch, getState }, color) => { +export const removeColor = createThunk('removeColor', ({ dispatch, getState }, color: string) => { dispatch(setColors(without(getWorkpadColors(getState()), color))); }); export const setWorkpad = createThunk( 'setWorkpad', - ({ dispatch, type }, workpad, { loadPages = true } = {}) => { + ( + { dispatch, type }, + workpad: CanvasWorkpad, + { loadPages = true }: { loadPages?: boolean } = {} + ) => { dispatch(createAction(type)(workpad)); // set the workpad object in state if (loadPages) { dispatch(initializeWorkpad()); - } // load all the elements on the workpad + } } ); From 91e4fd46f46e6fc2df229bb51ad9e7cf432ea0c4 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 9 Jun 2020 11:54:37 -0500 Subject: [PATCH 54/65] Enable exhaustive-deps; correct any lint warnings (#68453) Co-authored-by: Elastic Machine --- .eslintrc.js | 1 - .../workpad/workpad_app/workpad_telemetry.tsx | 16 +++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index c33f4de15b919..3cac46e7d2605 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -91,7 +91,6 @@ module.exports = { { files: ['x-pack/plugins/canvas/**/*.{js,ts,tsx}'], rules: { - 'react-hooks/exhaustive-deps': 'off', 'jsx-a11y/click-events-have-key-events': 'off', }, }, diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx index 47b461f22ad65..3014369d94857 100644 --- a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx +++ b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx @@ -69,6 +69,7 @@ export const withUnconnectedElementsLoadedTelemetry =

( ) => function ElementsLoadedTelemetry(props: ElementsLoadedTelemetryProps) { const { telemetryElementCounts, workpad, telemetryResolvedArgs, ...other } = props; + const { error, pending } = telemetryElementCounts; const [currentWorkpadId, setWorkpadId] = useState(undefined); const [hasReported, setHasReported] = useState(false); @@ -87,27 +88,20 @@ export const withUnconnectedElementsLoadedTelemetry =

( 0 ); - if ( - workpadElementCount === 0 || - (resolvedArgsAreForWorkpad && telemetryElementCounts.pending === 0) - ) { + if (workpadElementCount === 0 || (resolvedArgsAreForWorkpad && pending === 0)) { setHasReported(true); } else { setHasReported(false); } - } else if ( - !hasReported && - telemetryElementCounts.pending === 0 && - resolvedArgsAreForWorkpad - ) { - if (telemetryElementCounts.error > 0) { + } else if (!hasReported && pending === 0 && resolvedArgsAreForWorkpad) { + if (error > 0) { trackMetric(METRIC_TYPE.LOADED, [WorkpadLoadedMetric, WorkpadLoadedWithErrorsMetric]); } else { trackMetric(METRIC_TYPE.LOADED, WorkpadLoadedMetric); } setHasReported(true); } - }); + }, [currentWorkpadId, hasReported, error, pending, telemetryResolvedArgs, workpad]); return ; }; From 45c81ce1ab778488d839000ade4e1eae8181c342 Mon Sep 17 00:00:00 2001 From: Spencer Date: Tue, 9 Jun 2020 10:41:41 -0700 Subject: [PATCH 55/65] run page_load_metrics tests in visual regresssion jobs (#68570) Co-authored-by: spalger --- test/scripts/jenkins_visual_regression.sh | 3 +-- test/scripts/jenkins_xpack_visual_regression.sh | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/scripts/jenkins_visual_regression.sh b/test/scripts/jenkins_visual_regression.sh index c6fefd45b005d..a32782deec65b 100755 --- a/test/scripts/jenkins_visual_regression.sh +++ b/test/scripts/jenkins_visual_regression.sh @@ -11,8 +11,7 @@ mkdir -p "$installDir" tar -xzf "$linuxBuild" -C "$installDir" --strip=1 echo " -> running visual regression tests from kibana directory" -checks-reporter-with-killswitch "X-Pack visual regression tests" \ - yarn percy exec -t 500 -- -- \ +yarn percy exec -t 500 -- -- \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$installDir" \ diff --git a/test/scripts/jenkins_xpack_visual_regression.sh b/test/scripts/jenkins_xpack_visual_regression.sh index 96521ccc8f787..e406bb3e6106f 100755 --- a/test/scripts/jenkins_xpack_visual_regression.sh +++ b/test/scripts/jenkins_xpack_visual_regression.sh @@ -13,9 +13,11 @@ tar -xzf "$linuxBuild" -C "$installDir" --strip=1 echo " -> running visual regression tests from x-pack directory" cd "$XPACK_DIR" -checks-reporter-with-killswitch "X-Pack visual regression tests" \ - yarn percy exec -t 500 -- -- \ +yarn percy exec -t 500 -- -- \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$installDir" \ --config test/visual_regression/config.ts; + +cd "$KIBANA_DIR" +source "test/scripts/jenkins_xpack_page_load_metrics.sh" From 14410e0c79bdced1e402c3a303729f7328207efb Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Tue, 9 Jun 2020 13:47:00 -0400 Subject: [PATCH 56/65] [Endpoint] Re-enable Functional test case for Endpoint related pages (#68445) * Improve Policy test service provider - Added `getFullAgentConfig()` to Endpoint Policy Test data provider service * enable Policy List functional tests * Added Policy Details Tests * Add test ids to policy detail Max and Linux forms * Added page objects utilities and moved `clickOnEuiCheckbox` there --- .../pages/policy/view/policy_details.tsx | 14 +- .../view/policy_forms/events/checkbox.tsx | 17 +- .../policy/view/policy_forms/events/linux.tsx | 1 + .../policy/view/policy_forms/events/mac.tsx | 1 + .../view/policy_forms/events/windows.tsx | 1 + x-pack/scripts/functional_tests.js | 1 + .../{host_list.ts => endpoint_list.ts} | 43 ++-- .../feature_controls/endpoint_spaces.ts | 76 ------ .../apps/endpoint/feature_controls/index.ts | 13 - .../apps/endpoint/header_nav.ts | 55 ----- .../apps/endpoint/index.ts | 11 +- .../apps/endpoint/landing_page.ts | 29 --- .../apps/endpoint/policy_details.ts | 225 ++++++++++++++++++ .../apps/endpoint/policy_list.ts | 46 ++-- .../page_objects/endpoint_page.ts | 17 +- .../functional_endpoint/page_objects/index.ts | 4 + .../page_objects/page_utils.ts | 30 +++ .../page_objects/policy_page.ts | 59 +++++ .../services/endpoint_policy.ts | 163 +++++++++---- 19 files changed, 522 insertions(+), 284 deletions(-) rename x-pack/test/functional_endpoint/apps/endpoint/{host_list.ts => endpoint_list.ts} (84%) delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts create mode 100644 x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts create mode 100644 x-pack/test/functional_endpoint/page_objects/page_utils.ts create mode 100644 x-pack/test/functional_endpoint/page_objects/policy_page.ts diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index f4c4b36ce153f..d1f7da91bd6fa 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -68,11 +68,13 @@ export const PolicyDetails = React.memo(() => { } ), body: ( - + + + ), }); } else { @@ -116,7 +118,7 @@ export const PolicyDetails = React.memo(() => { ) : policyApiError ? ( - {policyApiError?.message} + {policyApiError?.message} ) : null} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx index e5f3b2c7e8b7e..9ceade5d0264c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx @@ -5,23 +5,25 @@ */ import React, { useCallback, useMemo } from 'react'; -import { EuiCheckbox, htmlIdGenerator } from '@elastic/eui'; +import { EuiCheckbox, EuiCheckboxProps, htmlIdGenerator } from '@elastic/eui'; import { useDispatch } from 'react-redux'; - import { usePolicyDetailsSelector } from '../../policy_hooks'; import { policyConfig } from '../../../store/policy_details/selectors'; import { PolicyDetailsAction } from '../../../store/policy_details'; import { UIPolicyConfig } from '../../../../../../../common/endpoint/types'; +type EventsCheckboxProps = Omit & { + name: string; + setter: (config: UIPolicyConfig, checked: boolean) => UIPolicyConfig; + getter: (config: UIPolicyConfig) => boolean; +}; + export const EventsCheckbox = React.memo(function ({ name, setter, getter, -}: { - name: string; - setter: (config: UIPolicyConfig, checked: boolean) => UIPolicyConfig; - getter: (config: UIPolicyConfig) => boolean; -}) { + ...otherProps +}: EventsCheckboxProps) { const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); const selected = getter(policyDetailsConfig); const dispatch = useDispatch<(action: PolicyDetailsAction) => void>(); @@ -44,6 +46,7 @@ export const EventsCheckbox = React.memo(function ({ label={name} checked={selected} onChange={handleCheckboxChange} + {...otherProps} /> ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx index d0ddd5cb6fe2f..d7bae0d2e6bad 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx @@ -73,6 +73,7 @@ export const LinuxEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx index e2d6b70d33415..37709ff608857 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx @@ -73,6 +73,7 @@ export const MacEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx index 23f33cb6fd86f..3c7ecae0d9b4e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx @@ -113,6 +113,7 @@ export const WindowsEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/scripts/functional_tests.js b/x-pack/scripts/functional_tests.js index 4392299a78e72..c120e1f780761 100644 --- a/x-pack/scripts/functional_tests.js +++ b/x-pack/scripts/functional_tests.js @@ -6,6 +6,7 @@ const alwaysImportedTests = [ require.resolve('../test/functional/config.js'), + require.resolve('../test/functional_endpoint/config.ts'), require.resolve('../test/functional_with_es_ssl/config.ts'), require.resolve('../test/functional/config_security_basic.ts'), require.resolve('../test/functional/config_security_trial.ts'), diff --git a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts b/x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts similarity index 84% rename from x-pack/test/functional_endpoint/apps/endpoint/host_list.ts rename to x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts index 029953f113a9c..c5338e2a35765 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts @@ -13,68 +13,71 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const testSubjects = getService('testSubjects'); // FLAKY: https://github.com/elastic/kibana/issues/63621 - describe.skip('host list', function () { + describe.skip('endpoint list', function () { this.tags('ciGroup7'); const sleep = (ms = 100) => new Promise((resolve) => setTimeout(resolve, ms)); before(async () => { await esArchiver.load('endpoint/metadata/api_feature'); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts'); - await pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.endpoint.navigateToEndpointList(); }); it('finds title', async () => { - const title = await testSubjects.getVisibleText('hostListTitle'); - expect(title).to.equal('Hosts'); + const title = await testSubjects.getVisibleText('pageViewHeaderLeftTitle'); + expect(title).to.equal('Endpoints'); }); it('displays table data', async () => { const expectedData = [ [ 'Hostname', + 'Host Status', 'Policy', 'Policy Status', 'Alerts', 'Operating System', 'IP Address', - 'Sensor Version', + 'Version', 'Last Active', ], [ 'cadmann-4.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.192.213.130, 10.70.28.129', - 'version', - 'xxxx', + '6.6.1', + 'Jan 24, 2020 @ 16:06:09.541', ], [ 'thurlow-9.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.46.229.234', - 'version', - 'xxxx', + '6.0.0', + 'Jan 24, 2020 @ 16:06:09.541', ], [ 'rezzani-7.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.101.149.26, 2606:a000:ffc0:39:11ef:37b9:3371:578c', - 'version', - 'xxxx', + '6.8.0', + 'Jan 24, 2020 @ 16:06:09.541', ], ]; const tableData = await pageObjects.endpoint.getEndpointAppTableData('hostListTable'); expect(tableData).to.eql(expectedData); }); - it('no details flyout when host page displayed', async () => { + it('no details flyout when endpoint page displayed', async () => { await testSubjects.missingOrFail('hostDetailsFlyout'); }); @@ -108,22 +111,21 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await (await testSubjects.findAll('hostnameCellLink'))[1].click(); await sleep(500); // give page time to refresh and verify it did not change const hostDetailTitleNew = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - expect(hostDetailTitleNew).to.eql(hostDetailTitleInitial); + expect(hostDetailTitleNew).to.equal(hostDetailTitleInitial); }); describe('no data', () => { before(async () => { // clear out the data and reload the page await esArchiver.unload('endpoint/metadata/api_feature'); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts'); - await pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.endpoint.navigateToEndpointList(); }); after(async () => { // reload the data so the other tests continue to pass await esArchiver.load('endpoint/metadata/api_feature'); }); it('displays no items found when empty', async () => { - // get the host list table data and verify message + // get the endpoint list table data and verify message const [, [noItemsFoundMessage]] = await pageObjects.endpoint.getEndpointAppTableData( 'hostListTable' ); @@ -133,12 +135,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('has a url with a host id', () => { before(async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory( - 'endpoint', - '/hosts', + await pageObjects.endpoint.navigateToEndpointList( 'selected_host=fc0ff548-feba-41b6-8367-65e8790d0eaf' ); - await pageObjects.header.waitUntilLoadingHasFinished(); }); it('shows a flyout', async () => { @@ -168,7 +167,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { '', '0', '00000000-0000-0000-0000-000000000000', - 'Successful', + 'Unknown', '10.101.149.262606:a000:ffc0:39:11ef:37b9:3371:578c', 'rezzani-7.example.com', '6.8.0', diff --git a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts b/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts deleted file mode 100644 index 27fabb515757a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getPageObjects, getService }: FtrProviderContext) { - const pageObjects = getPageObjects(['common']); - const spacesService = getService('spaces'); - const testSubjects = getService('testSubjects'); - const appsMenu = getService('appsMenu'); - - describe('spaces', () => { - describe('space with no features disabled', () => { - before(async () => { - await spacesService.create({ - id: 'custom_space', - name: 'custom_space', - disabledFeatures: [], - }); - }); - - after(async () => { - await spacesService.delete('custom_space'); - }); - - it('shows endpoint navlink', async () => { - await pageObjects.common.navigateToApp('home', { - basePath: '/s/custom_space', - }); - const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.contain('Endpoint'); - }); - - it(`endpoint app shows 'Hello World'`, async () => { - await pageObjects.common.navigateToApp('endpoint', { - basePath: '/s/custom_space', - }); - await testSubjects.existOrFail('welcomeTitle'); - }); - - it(`endpoint hosts shows hosts lists page`, async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts', undefined, { - basePath: '/s/custom_space', - ensureCurrentUrl: false, - shouldLoginIfPrompted: false, - }); - await testSubjects.existOrFail('hostPage'); - }); - }); - - describe('space with endpoint disabled', () => { - before(async () => { - await spacesService.create({ - id: 'custom_space', - name: 'custom_space', - disabledFeatures: ['endpoint'], - }); - }); - - after(async () => { - await spacesService.delete('custom_space'); - }); - - it(`doesn't show endpoint navlink`, async () => { - await pageObjects.common.navigateToApp('home', { - basePath: '/s/custom_space', - }); - const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).not.to.contain('Endpoint'); - }); - }); - }); -} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts b/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts deleted file mode 100644 index da0919d7c39f3..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ loadTestFile }: FtrProviderContext) { - describe('feature controls', function () { - this.tags('skipFirefox'); - loadTestFile(require.resolve('./endpoint_spaces')); - }); -} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts b/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts deleted file mode 100644 index 48cdd6aec5b1a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'endpoint']); - const testSubjects = getService('testSubjects'); - - describe('Header nav', function () { - this.tags('ciGroup7'); - before(async () => { - await pageObjects.common.navigateToApp('endpoint'); - }); - - it('renders the tabs when the app loads', async () => { - const homeTabText = await testSubjects.getVisibleText('homeEndpointTab'); - const hostsTabText = await testSubjects.getVisibleText('hostsEndpointTab'); - const alertsTabText = await testSubjects.getVisibleText('alertsEndpointTab'); - const policiesTabText = await testSubjects.getVisibleText('policiesEndpointTab'); - - expect(homeTabText.trim()).to.be('Home'); - expect(hostsTabText.trim()).to.be('Hosts'); - expect(alertsTabText.trim()).to.be('Alerts'); - expect(policiesTabText.trim()).to.be('Policies'); - }); - - it('renders the hosts page when the Hosts tab is selected', async () => { - await (await testSubjects.find('hostsEndpointTab')).click(); - await testSubjects.existOrFail('hostPage'); - }); - - it('renders the alerts page when the Alerts tab is selected', async () => { - await (await testSubjects.find('alertsEndpointTab')).click(); - await testSubjects.existOrFail('alertListPage'); - }); - - it('renders the policy page when Policy tab is selected', async () => { - await (await testSubjects.find('policiesEndpointTab')).click(); - await testSubjects.existOrFail('policyListPage'); - }); - - it('renders the home page when Home tab is selected after selecting another tab', async () => { - await (await testSubjects.find('hostsEndpointTab')).click(); - await testSubjects.existOrFail('hostPage'); - - await (await testSubjects.find('homeEndpointTab')).click(); - await testSubjects.existOrFail('welcomeTitle'); - }); - }); -}; diff --git a/x-pack/test/functional_endpoint/apps/endpoint/index.ts b/x-pack/test/functional_endpoint/apps/endpoint/index.ts index 296ee45ff181c..199d138d1c450 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/index.ts @@ -9,12 +9,11 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('endpoint', function () { this.tags('ciGroup7'); - loadTestFile(require.resolve('./feature_controls')); - loadTestFile(require.resolve('./landing_page')); - loadTestFile(require.resolve('./header_nav')); - loadTestFile(require.resolve('./host_list')); + loadTestFile(require.resolve('./endpoint_list')); loadTestFile(require.resolve('./policy_list')); - loadTestFile(require.resolve('./alerts')); - loadTestFile(require.resolve('./resolver')); + loadTestFile(require.resolve('./policy_details')); + + // loadTestFile(require.resolve('./alerts')); + // loadTestFile(require.resolve('./resolver')); }); } diff --git a/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts b/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts deleted file mode 100644 index f2a55df56421a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'endpoint']); - const testSubjects = getService('testSubjects'); - - describe('Endpoint landing page', function () { - this.tags('ciGroup7'); - before(async () => { - await pageObjects.common.navigateToApp('endpoint'); - }); - - it('Loads the endpoint app', async () => { - const welcomeEndpointMessage = await pageObjects.endpoint.welcomeEndpointTitle(); - expect(welcomeEndpointMessage).to.be('Hello World'); - }); - - it('Does not display a toast indicating that the ingest manager failed to initialize', async () => { - await testSubjects.missingOrFail('euiToastHeader'); - }); - }); -}; diff --git a/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts new file mode 100644 index 0000000000000..25fb477b5a99a --- /dev/null +++ b/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts @@ -0,0 +1,225 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const pageObjects = getPageObjects(['common', 'endpoint', 'policy', 'endpointPageUtils']); + const testSubjects = getService('testSubjects'); + const policyTestResources = getService('policyTestResources'); + + describe('When on the Endpoint Policy Details Page', function () { + this.tags(['ciGroup7']); + + describe('with an invalid policy id', () => { + it('should display an error', async () => { + await pageObjects.policy.navigateToPolicyDetails('invalid-id'); + await testSubjects.existOrFail('policyDetailsIdNotFoundMessage'); + expect(await testSubjects.getVisibleText('policyDetailsIdNotFoundMessage')).to.equal( + 'Saved object [ingest-datasources/invalid-id] not found' + ); + }); + }); + + describe('with a valid policy id', () => { + let policyInfo: PolicyTestResourceInfo; + + before(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + }); + + after(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }); + + it('should display policy view', async () => { + expect(await testSubjects.getVisibleText('pageViewHeaderLeftTitle')).to.equal( + policyInfo.datasource.name + ); + }); + }); + + describe('and the save button is clicked', () => { + let policyInfo: PolicyTestResourceInfo; + + beforeEach(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + }); + + afterEach(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }); + + it('should display success toast on successful save', async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + expect(await testSubjects.getVisibleText('policyDetailsSuccessMessage')).to.equal( + `Policy ${policyInfo.datasource.name} has been updated.` + ); + }); + it('should persist update on the screen', async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_process'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + await pageObjects.policy.navigateToPolicyList(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + + expect(await (await testSubjects.find('policyWindowsEvent_process')).isSelected()).to.equal( + false + ); + }); + it('should have updated policy data in overall agent configuration', async () => { + // This test ensures that updates made to the Endpoint Policy are carried all the way through + // to the generated Agent Configuration that is dispatch down to the Elastic Agent. + + await Promise.all([ + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_file'), + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyLinuxEvent_file'), + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyMacEvent_file'), + ]); + await pageObjects.policy.confirmAndSave(); + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + + const agentFullConfig = await policyTestResources.getFullAgentConfig( + policyInfo.agentConfig.id + ); + + expect(agentFullConfig).to.eql({ + datasources: [ + { + enabled: true, + id: policyInfo.datasource.id, + inputs: [ + { + enabled: true, + policy: { + linux: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + file: false, + network: true, + process: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + }, + mac: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + file: false, + network: true, + process: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + malware: { + mode: 'detect', + }, + }, + windows: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + dll_and_driver_load: true, + dns: true, + file: false, + network: true, + process: true, + registry: true, + security: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + malware: { + mode: 'prevent', + }, + }, + }, + streams: [], + type: 'endpoint', + }, + ], + name: 'Protect East Coast', + namespace: 'default', + package: { + name: 'endpoint', + version: policyInfo.packageInfo.version, + }, + use_output: 'default', + }, + ], + id: policyInfo.agentConfig.id, + outputs: { + default: { + hosts: ['http://localhost:9200'], + type: 'elasticsearch', + }, + }, + revision: 3, + settings: { + monitoring: { + enabled: false, + logs: false, + metrics: false, + }, + }, + }); + }); + }); + }); +} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts b/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts index 11b1b8e718ff7..9f87f884b327e 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts @@ -8,15 +8,15 @@ import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; export default function ({ getPageObjects, getService }: FtrProviderContext) { - const pageObjects = getPageObjects(['common', 'endpoint']); + const pageObjects = getPageObjects(['common', 'endpoint', 'policy']); const testSubjects = getService('testSubjects'); const policyTestResources = getService('policyTestResources'); + const RELATIVE_DATE_FORMAT = /\d (?:seconds|minutes) ago/i; - // FLAKY: https://github.com/elastic/kibana/issues/66579 - describe.skip('When on the Endpoint Policy List', function () { + describe('When on the Endpoint Policy List', function () { this.tags(['ciGroup7']); before(async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/policy'); + await pageObjects.policy.navigateToPolicyList(); }); it('loads the Policy List Page', async () => { @@ -34,10 +34,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const allHeaderCells = await pageObjects.endpoint.tableHeaderVisibleText('policyTable'); expect(allHeaderCells).to.eql([ 'Policy Name', - 'Revision', + 'Created By', + 'Created Date', + 'Last Updated By', + 'Last Updated', 'Version', - 'Description', - 'Agent Configuration', + 'Actions', ]); }); it('should show empty table results message', async () => { @@ -47,13 +49,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(noItemsFoundMessage).to.equal('No items found'); }); - xdescribe('and policies exists', () => { + describe('and policies exists', () => { let policyInfo: PolicyTestResourceInfo; before(async () => { // load/create a policy and then navigate back to the policy view so that the list is refreshed policyInfo = await policyTestResources.createPolicy(); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/policy'); + await pageObjects.policy.navigateToPolicyList(); await pageObjects.endpoint.waitForTableToHaveData('policyTable'); }); after(async () => { @@ -64,26 +66,24 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('should show policy on the list', async () => { const [, policyRow] = await pageObjects.endpoint.getEndpointAppTableData('policyTable'); - expect(policyRow).to.eql([ - 'Protect East Coast', - '1', - 'Elastic Endpoint v1.0.0', - 'Protect the worlds data - but in the East Coast', - policyInfo.agentConfig.id, + // Validate row data with the exception of the Date columns - since those are initially + // shown as relative. + expect([policyRow[0], policyRow[1], policyRow[3], policyRow[5], policyRow[6]]).to.eql([ + 'Protect East Coastrev. 1', + 'elastic', + 'elastic', + `${policyInfo.datasource.package?.title} v${policyInfo.datasource.package?.version}`, + '', ]); + [policyRow[2], policyRow[4]].forEach((relativeDate) => { + expect(relativeDate).to.match(RELATIVE_DATE_FORMAT); + }); }); it('should show policy name as link', async () => { const policyNameLink = await testSubjects.find('policyNameLink'); expect(await policyNameLink.getTagName()).to.equal('a'); expect(await policyNameLink.getAttribute('href')).to.match( - new RegExp(`\/endpoint\/policy\/${policyInfo.datasource.id}$`) - ); - }); - it('should show agent configuration as link', async () => { - const agentConfigLink = await testSubjects.find('agentConfigLink'); - expect(await agentConfigLink.getTagName()).to.equal('a'); - expect(await agentConfigLink.getAttribute('href')).to.match( - new RegExp(`\/app\/ingestManager\#\/configs\/${policyInfo.datasource.config_id}$`) + new RegExp(`\/management\/policy\/${policyInfo.datasource.id}$`) ); }); }); diff --git a/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts b/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts index 7f78bd6b804f7..3234169e7265e 100644 --- a/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts +++ b/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts @@ -7,11 +7,22 @@ import { WebElementWrapper } from 'test/functional/services/lib/web_element_wrapper'; import { FtrProviderContext } from '../ftr_provider_context'; -export function EndpointPageProvider({ getService }: FtrProviderContext) { +export function EndpointPageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); + const pageObjects = getPageObjects(['common', 'header']); const retry = getService('retry'); return { + /** + * Navigate to the Endpoints list page + */ + async navigateToEndpointList(searchParams?: string) { + await pageObjects.common.navigateToApp('securitySolution', { + hash: `/management/endpoints${searchParams ? `?${searchParams}` : ''}`, + }); + await pageObjects.header.waitUntilLoadingHasFinished(); + }, + /** * Finds the Table with the given `selector` (test subject) and returns * back an array containing the table's header column text @@ -31,10 +42,6 @@ export function EndpointPageProvider({ getService }: FtrProviderContext) { ); }, - async welcomeEndpointTitle() { - return await testSubjects.getVisibleText('welcomeTitle'); - }, - /** * Finds a table and returns the data in a nested array with row 0 is the headers if they exist. * It uses euiTableCellContent to avoid poluting the array data with the euiTableRowCell__mobileHeader data. diff --git a/x-pack/test/functional_endpoint/page_objects/index.ts b/x-pack/test/functional_endpoint/page_objects/index.ts index 8138ce2eeccb3..5b550bea5b55d 100644 --- a/x-pack/test/functional_endpoint/page_objects/index.ts +++ b/x-pack/test/functional_endpoint/page_objects/index.ts @@ -7,9 +7,13 @@ import { pageObjects as xpackFunctionalPageObjects } from '../../functional/page_objects'; import { EndpointPageProvider } from './endpoint_page'; import { EndpointAlertsPageProvider } from './endpoint_alerts_page'; +import { EndpointPolicyPageProvider } from './policy_page'; +import { EndpointPageUtils } from './page_utils'; export const pageObjects = { ...xpackFunctionalPageObjects, endpoint: EndpointPageProvider, + policy: EndpointPolicyPageProvider, + endpointPageUtils: EndpointPageUtils, endpointAlerts: EndpointAlertsPageProvider, }; diff --git a/x-pack/test/functional_endpoint/page_objects/page_utils.ts b/x-pack/test/functional_endpoint/page_objects/page_utils.ts new file mode 100644 index 0000000000000..daf66464f7e1e --- /dev/null +++ b/x-pack/test/functional_endpoint/page_objects/page_utils.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +export function EndpointPageUtils({ getService }: FtrProviderContext) { + const find = getService('find'); + + return { + /** + * Finds a given EuiCheckbox by test subject and clicks on it + * + * @param euiCheckBoxTestId + */ + async clickOnEuiCheckbox(euiCheckBoxTestId: string) { + // This utility is needed because EuiCheckbox forwards the test subject on to + // the actual `` which is not actually visible/accessible on the page. + // In order to actually cause the state of the checkbox to change, the `

@@ -19,7 +24,16 @@ exports[`CertStatus renders expected elements for valid props 1`] = ` class="euiFlexItem euiFlexItem--flexGrowZero" > - OK + OK +
+
+ for 4 months +
+
diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx b/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx index e7a86ce98fa3c..ea0a49a4a6c5b 100644 --- a/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx +++ b/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx @@ -5,45 +5,95 @@ */ import React from 'react'; -import { EuiHealth } from '@elastic/eui'; +import moment from 'moment'; +import styled from 'styled-components'; +import { EuiHealth, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { useSelector } from 'react-redux'; import { Cert } from '../../../common/runtime_types'; import { useCertStatus } from '../../hooks'; import * as labels from './translations'; import { CERT_STATUS } from '../../../common/constants'; +import { selectDynamicSettings } from '../../state/selectors'; interface Props { cert: Cert; } +const DateText = styled(EuiText)` + display: inline-block; + margin-left: 5px; +`; + export const CertStatus: React.FC = ({ cert }) => { const certStatus = useCertStatus(cert?.not_after, cert?.not_before); + const dss = useSelector(selectDynamicSettings); + + const relativeDate = moment(cert?.not_after).fromNow(); + if (certStatus === CERT_STATUS.EXPIRING_SOON) { return ( - {labels.EXPIRES_SOON} + + {labels.EXPIRES_SOON} + {' '} + + {relativeDate} + + ); } if (certStatus === CERT_STATUS.EXPIRED) { return ( - {labels.EXPIRED} + + {labels.EXPIRED} + {' '} + + {relativeDate} + + ); } if (certStatus === CERT_STATUS.TOO_OLD) { + const ageThreshold = dss.settings?.certAgeThreshold; + + const oldRelativeDate = moment(cert?.not_before).add(ageThreshold, 'days').fromNow(); + return ( - {labels.TOO_OLD} + + {labels.TOO_OLD} + + {oldRelativeDate} + + ); } + const okRelativeDate = moment(cert?.not_after).fromNow(true); + return ( - {labels.OK} + + {labels.OK} + {' '} + + + + ); }; From ee5284e7fd6c04d24416fc04f8362c2bc0046982 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 9 Jun 2020 14:24:47 -0400 Subject: [PATCH 58/65] [Component templates] Table view (#68031) --- .../plugins/index_management/common/index.ts | 2 +- .../component_template_serialization.test.ts | 94 ++++++++ .../lib/component_template_serialization.ts | 86 ++++++++ .../index_management/common/lib/index.ts | 5 + .../common/types/component_templates.ts | 39 ++++ .../index_management/common/types/index.ts | 2 + .../common/types/templates.ts | 5 + .../public/application/app.tsx | 6 +- .../component_template_list.test.ts | 174 +++++++++++++++ .../component_template_list.helpers.ts | 95 ++++++++ .../helpers/http_requests.ts | 52 +++++ .../client_integration/helpers/index.ts | 15 ++ .../helpers/setup_environment.tsx | 45 ++++ .../component_template_list.tsx | 75 +++++++ .../component_template_list/delete_modal.tsx | 128 +++++++++++ .../component_template_list/empty_prompt.tsx | 43 ++++ .../component_template_list/error.tsx | 38 ++++ .../component_template_list/index.ts | 7 + .../component_template_list/table.tsx | 205 ++++++++++++++++++ .../component_templates_context.tsx | 63 ++++++ .../component_templates/constants.ts | 10 + .../components/component_templates/index.ts | 11 + .../components/component_templates/lib/api.ts | 44 ++++ .../component_templates/lib/documentation.ts | 16 ++ .../component_templates/lib/index.ts | 11 + .../component_templates/lib/request.ts | 31 +++ .../component_templates/shared_imports.ts | 15 ++ .../components/component_templates/types.ts | 17 ++ .../public/application/components/index.ts | 1 + .../public/application/index.tsx | 18 +- .../public/application/sections/home/home.tsx | 29 ++- .../public/application/sections/home/index.ts | 2 +- .../server/client/elasticsearch.ts | 11 + .../routes/api/component_templates/get.ts | 34 ++- .../index_management/component_templates.ts | 10 +- .../apps/index_management/home_page.ts | 17 ++ .../page_objects/index_management_page.ts | 2 +- 37 files changed, 1436 insertions(+), 22 deletions(-) create mode 100644 x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts create mode 100644 x-pack/plugins/index_management/common/lib/component_template_serialization.ts create mode 100644 x-pack/plugins/index_management/common/types/component_templates.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/constants.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/types.ts diff --git a/x-pack/plugins/index_management/common/index.ts b/x-pack/plugins/index_management/common/index.ts index 3792e322ae40b..4ad428744deab 100644 --- a/x-pack/plugins/index_management/common/index.ts +++ b/x-pack/plugins/index_management/common/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export { PLUGIN, API_BASE_PATH, CREATE_LEGACY_TEMPLATE_BY_DEFAULT } from './constants'; +export { PLUGIN, API_BASE_PATH, CREATE_LEGACY_TEMPLATE_BY_DEFAULT, BASE_PATH } from './constants'; export { getTemplateParameter } from './lib'; diff --git a/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts b/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts new file mode 100644 index 0000000000000..eaa7f24017a2f --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { deserializeComponentTemplate } from './component_template_serialization'; + +describe('deserializeComponentTemplate', () => { + test('deserializes a component template', () => { + expect( + deserializeComponentTemplate( + { + name: 'my_component_template', + component_template: { + version: 1, + _meta: { + serialization: { + id: 10, + class: 'MyComponentTemplate', + }, + description: 'set number of shards to one', + }, + template: { + settings: { + number_of_shards: 1, + }, + mappings: { + _source: { + enabled: false, + }, + properties: { + host_name: { + type: 'keyword', + }, + created_at: { + type: 'date', + format: 'EEE MMM dd HH:mm:ss Z yyyy', + }, + }, + }, + }, + }, + }, + [ + { + name: 'my_index_template', + index_template: { + index_patterns: ['foo'], + template: { + settings: { + number_of_replicas: 2, + }, + }, + composed_of: ['my_component_template'], + }, + }, + ] + ) + ).toEqual({ + name: 'my_component_template', + version: 1, + _meta: { + serialization: { + id: 10, + class: 'MyComponentTemplate', + }, + description: 'set number of shards to one', + }, + template: { + settings: { + number_of_shards: 1, + }, + mappings: { + _source: { + enabled: false, + }, + properties: { + host_name: { + type: 'keyword', + }, + created_at: { + type: 'date', + format: 'EEE MMM dd HH:mm:ss Z yyyy', + }, + }, + }, + }, + _kbnMeta: { + usedBy: ['my_index_template'], + }, + }); + }); +}); diff --git a/x-pack/plugins/index_management/common/lib/component_template_serialization.ts b/x-pack/plugins/index_management/common/lib/component_template_serialization.ts new file mode 100644 index 0000000000000..0db81bf81d300 --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/component_template_serialization.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { + TemplateFromEs, + ComponentTemplateFromEs, + ComponentTemplateDeserialized, + ComponentTemplateListItem, +} from '../types'; + +const hasEntries = (data: object = {}) => Object.entries(data).length > 0; + +/** + * Normalize a list of component templates to a map where each key + * is a component template name, and the value is an array of index templates name using it + * + * @example + * + { + "comp-1": [ + "template-1", + "template-2" + ], + "comp2": [ + "template-1", + "template-2" + ] + } + * + * @param indexTemplatesEs List of component templates + */ + +const getIndexTemplatesToUsedBy = (indexTemplatesEs: TemplateFromEs[]) => { + return indexTemplatesEs.reduce((acc, item) => { + if (item.index_template.composed_of) { + item.index_template.composed_of.forEach((component) => { + acc[component] = acc[component] ? [...acc[component], item.name] : [item.name]; + }); + } + return acc; + }, {} as { [key: string]: string[] }); +}; + +export function deserializeComponentTemplate( + componentTemplateEs: ComponentTemplateFromEs, + indexTemplatesEs: TemplateFromEs[] +) { + const { name, component_template: componentTemplate } = componentTemplateEs; + const { template, _meta, version } = componentTemplate; + + const indexTemplatesToUsedBy = getIndexTemplatesToUsedBy(indexTemplatesEs); + + const deserializedComponentTemplate: ComponentTemplateDeserialized = { + name, + template, + version, + _meta, + _kbnMeta: { + usedBy: indexTemplatesToUsedBy[name] || [], + }, + }; + + return deserializedComponentTemplate; +} + +export function deserializeComponenTemplateList( + componentTemplateEs: ComponentTemplateFromEs, + indexTemplatesEs: TemplateFromEs[] +) { + const { name, component_template: componentTemplate } = componentTemplateEs; + const { template } = componentTemplate; + + const indexTemplatesToUsedBy = getIndexTemplatesToUsedBy(indexTemplatesEs); + + const componentTemplateListItem: ComponentTemplateListItem = { + name, + usedBy: indexTemplatesToUsedBy[name] || [], + hasSettings: hasEntries(template.settings), + hasMappings: hasEntries(template.mappings), + hasAliases: hasEntries(template.aliases), + }; + + return componentTemplateListItem; +} diff --git a/x-pack/plugins/index_management/common/lib/index.ts b/x-pack/plugins/index_management/common/lib/index.ts index 16eb544c56a08..c67d28da2c24b 100644 --- a/x-pack/plugins/index_management/common/lib/index.ts +++ b/x-pack/plugins/index_management/common/lib/index.ts @@ -11,3 +11,8 @@ export { } from './template_serialization'; export { getTemplateParameter } from './utils'; + +export { + deserializeComponentTemplate, + deserializeComponenTemplateList, +} from './component_template_serialization'; diff --git a/x-pack/plugins/index_management/common/types/component_templates.ts b/x-pack/plugins/index_management/common/types/component_templates.ts new file mode 100644 index 0000000000000..bc7ebdc2753dd --- /dev/null +++ b/x-pack/plugins/index_management/common/types/component_templates.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IndexSettings } from './indices'; +import { Aliases } from './aliases'; +import { Mappings } from './mappings'; + +export interface ComponentTemplateSerialized { + template: { + settings?: IndexSettings; + aliases?: Aliases; + mappings?: Mappings; + }; + version?: number; + _meta?: { [key: string]: any }; +} + +export interface ComponentTemplateDeserialized extends ComponentTemplateSerialized { + name: string; + _kbnMeta: { + usedBy: string[]; + }; +} + +export interface ComponentTemplateFromEs { + name: string; + component_template: ComponentTemplateSerialized; +} + +export interface ComponentTemplateListItem { + name: string; + usedBy: string[]; + hasMappings: boolean; + hasAliases: boolean; + hasSettings: boolean; +} diff --git a/x-pack/plugins/index_management/common/types/index.ts b/x-pack/plugins/index_management/common/types/index.ts index b467f020978a5..81a06156dd291 100644 --- a/x-pack/plugins/index_management/common/types/index.ts +++ b/x-pack/plugins/index_management/common/types/index.ts @@ -11,3 +11,5 @@ export * from './indices'; export * from './mappings'; export * from './templates'; + +export * from './component_templates'; diff --git a/x-pack/plugins/index_management/common/types/templates.ts b/x-pack/plugins/index_management/common/types/templates.ts index f113aa44d058f..006a2d9dea8f2 100644 --- a/x-pack/plugins/index_management/common/types/templates.ts +++ b/x-pack/plugins/index_management/common/types/templates.ts @@ -49,6 +49,11 @@ export interface TemplateDeserialized { }; } +export interface TemplateFromEs { + name: string; + index_template: TemplateSerialized; +} + /** * Interface for the template list in our UI table * we don't include the mappings, settings and aliases diff --git a/x-pack/plugins/index_management/public/application/app.tsx b/x-pack/plugins/index_management/public/application/app.tsx index 10bbe3ced64da..bfd99de6949e5 100644 --- a/x-pack/plugins/index_management/public/application/app.tsx +++ b/x-pack/plugins/index_management/public/application/app.tsx @@ -5,10 +5,12 @@ */ import React, { useEffect } from 'react'; + import { Router, Switch, Route, Redirect } from 'react-router-dom'; import { ScopedHistory } from 'kibana/public'; + import { UIM_APP_LOAD } from '../../common/constants'; -import { IndexManagementHome } from './sections/home'; +import { IndexManagementHome, homeSections } from './sections/home'; import { TemplateCreate } from './sections/template_create'; import { TemplateClone } from './sections/template_clone'; import { TemplateEdit } from './sections/template_edit'; @@ -32,7 +34,7 @@ export const AppWithoutRouter = () => ( - + ); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts new file mode 100644 index 0000000000000..830cc0ee6a980 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts @@ -0,0 +1,174 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { setupEnvironment, pageHelpers } from './helpers'; +import { ComponentTemplateListTestBed } from './helpers/component_template_list.helpers'; +import { API_BASE_PATH } from '../../../../../../common/constants'; +import { ComponentTemplateListItem } from '../../types'; + +const { setup } = pageHelpers.componentTemplateList; + +jest.mock('ui/i18n', () => { + const I18nContext = ({ children }: any) => children; + return { I18nContext }; +}); + +describe('', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: ComponentTemplateListTestBed; + + afterAll(() => { + server.restore(); + }); + + beforeEach(async () => { + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + describe('With component templates', () => { + const componentTemplate1: ComponentTemplateListItem = { + name: 'test_component_template_1', + hasMappings: true, + hasAliases: true, + hasSettings: true, + usedBy: [], + }; + + const componentTemplate2: ComponentTemplateListItem = { + name: 'test_component_template_2', + hasMappings: true, + hasAliases: true, + hasSettings: true, + usedBy: ['test_index_template_1'], + }; + + const componentTemplates = [componentTemplate1, componentTemplate2]; + + httpRequestsMockHelpers.setLoadComponentTemplatesResponse(componentTemplates); + + test('should render the list view', async () => { + const { table } = testBed; + + // Verify table content + const { tableCellsValues } = table.getMetaData('componentTemplatesTable'); + tableCellsValues.forEach((row, i) => { + const { name, usedBy } = componentTemplates[i]; + const usedByText = usedBy.length === 0 ? 'Not in use' : usedBy.length.toString(); + + expect(row).toEqual(['', name, usedByText, '', '', '', '']); + }); + }); + + test('should reload the component templates data', async () => { + const { component, actions } = testBed; + const totalRequests = server.requests.length; + + await act(async () => { + actions.clickReloadButton(); + }); + + component.update(); + + expect(server.requests.length).toBe(totalRequests + 1); + expect(server.requests[server.requests.length - 1].url).toBe( + `${API_BASE_PATH}/component_templates` + ); + }); + + test('should delete a component template', async () => { + const { actions, component } = testBed; + const { name: componentTemplateName } = componentTemplate1; + + await act(async () => { + actions.clickDeleteActionAt(0); + }); + + // We need to read the document "body" as the modal is added there and not inside + // the component DOM tree. + const modal = document.body.querySelector( + '[data-test-subj="deleteComponentTemplatesConfirmation"]' + ); + const confirmButton: HTMLButtonElement | null = modal!.querySelector( + '[data-test-subj="confirmModalConfirmButton"]' + ); + + expect(modal).not.toBe(null); + expect(modal!.textContent).toContain('Delete component template'); + + httpRequestsMockHelpers.setDeleteComponentTemplateResponse({ + itemsDeleted: [componentTemplateName], + errors: [], + }); + + await act(async () => { + confirmButton!.click(); + }); + + component.update(); + + const deleteRequest = server.requests[server.requests.length - 2]; + + expect(deleteRequest.method).toBe('DELETE'); + expect(deleteRequest.url).toBe( + `${API_BASE_PATH}/component_templates/${componentTemplateName}` + ); + expect(deleteRequest.status).toEqual(200); + }); + }); + + describe('No component templates', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadComponentTemplatesResponse([]); + + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + test('should display an empty prompt', async () => { + const { exists, find } = testBed; + + expect(exists('sectionLoading')).toBe(false); + expect(exists('emptyList')).toBe(true); + expect(find('emptyList.title').text()).toEqual('Start by creating a component template'); + }); + }); + + describe('Error handling', () => { + beforeEach(async () => { + const error = { + status: 500, + error: 'Internal server error', + message: 'Internal server error', + }; + + httpRequestsMockHelpers.setLoadComponentTemplatesResponse(undefined, { body: error }); + + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + test('should render an error message if error fetching component templates', async () => { + const { exists, find } = testBed; + + expect(exists('componentTemplatesLoadError')).toBe(true); + expect(find('componentTemplatesLoadError').text()).toContain( + 'Unable to load component templates. Try again.' + ); + }); + }); +}); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts new file mode 100644 index 0000000000000..8fb4dcff0bcea --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { BASE_PATH } from '../../../../../../../common'; +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, + nextTick, +} from '../../../../../../../../../test_utils'; +import { WithAppDependencies } from './setup_environment'; +import { ComponentTemplateList } from '../../../component_template_list'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${BASE_PATH}component_templates`], + componentRoutePath: `${BASE_PATH}component_templates`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(ComponentTemplateList), testBedConfig); + +export type ComponentTemplateListTestBed = TestBed & { + actions: ReturnType; +}; + +const createActions = (testBed: TestBed) => { + const { find } = testBed; + + /** + * User Actions + */ + const clickReloadButton = () => { + find('reloadButton').simulate('click'); + }; + + const clickComponentTemplateAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('componentTemplatesTable'); + const componentTemplateLink = findTestSubject( + rows[index].reactWrapper, + 'componentTemplateDetailsLink' + ); + + await act(async () => { + const { href } = componentTemplateLink.props(); + router.navigateTo(href!); + await nextTick(); + component.update(); + }); + }; + + const clickDeleteActionAt = (index: number) => { + const { table } = testBed; + + const { rows } = table.getMetaData('componentTemplatesTable'); + const deleteButton = findTestSubject(rows[index].reactWrapper, 'deleteComponentTemplateButton'); + + deleteButton.simulate('click'); + }; + + return { + clickReloadButton, + clickComponentTemplateAt, + clickDeleteActionAt, + }; +}; + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + return { + ...testBed, + actions: createActions(testBed), + }; +}; + +export type ComponentTemplateTestSubjects = + | 'componentTemplatesTable' + | 'componentTemplateDetails' + | 'componentTemplateDetails.title' + | 'deleteComponentTemplatesConfirmation' + | 'emptyList' + | 'emptyList.title' + | 'sectionLoading' + | 'componentTemplatesLoadError' + | 'deleteComponentTemplateButton' + | 'reloadButton'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts new file mode 100644 index 0000000000000..8473041ee0af3 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import sinon, { SinonFakeServer } from 'sinon'; +import { API_BASE_PATH } from '../../../../../../../common'; + +// Register helpers to mock HTTP Requests +const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { + const setLoadComponentTemplatesResponse = (response?: any[], error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? error.body : response; + + server.respondWith('GET', `${API_BASE_PATH}/component_templates`, [ + status, + { 'Content-Type': 'application/json' }, + JSON.stringify(body), + ]); + }; + + const setDeleteComponentTemplateResponse = (response?: object) => { + server.respondWith('DELETE', `${API_BASE_PATH}/component_templates/:name`, [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response), + ]); + }; + + return { + setLoadComponentTemplatesResponse, + setDeleteComponentTemplateResponse, + }; +}; + +export const init = () => { + const server = sinon.fakeServer.create(); + server.respondImmediately = true; + + // Define default response for unhandled requests. + // We make requests to APIs which don't impact the component under test, e.g. UI metric telemetry, + // and we can mock them all with a 200 instead of mocking each one individually. + server.respondWith([200, {}, 'DefaultMockedResponse']); + + const httpRequestsMockHelpers = registerHttpRequestMockHelpers(server); + + return { + server, + httpRequestsMockHelpers, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts new file mode 100644 index 0000000000000..c1d75b3c2dd9b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setup as componentTemplatesListSetup } from './component_template_list.helpers'; + +export { nextTick, getRandomString, findTestSubject } from '../../../../../../../../../test_utils'; + +export { setupEnvironment } from './setup_environment'; + +export const pageHelpers = { + componentTemplateList: { setup: componentTemplatesListSetup }, +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx new file mode 100644 index 0000000000000..c0aeb70166b5b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* eslint-disable @kbn/eslint/no-restricted-paths */ +import React from 'react'; +import axios from 'axios'; +import axiosXhrAdapter from 'axios/lib/adapters/xhr'; + +import { HttpSetup } from 'kibana/public'; +import { BASE_PATH, API_BASE_PATH } from '../../../../../../../common/constants'; +import { + notificationServiceMock, + docLinksServiceMock, +} from '../../../../../../../../../../src/core/public/mocks'; + +import { init as initHttpRequests } from './http_requests'; +import { ComponentTemplatesProvider } from '../../../component_templates_context'; + +const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); + +const appDependencies = { + httpClient: (mockHttpClient as unknown) as HttpSetup, + apiBasePath: API_BASE_PATH, + appBasePath: BASE_PATH, + trackMetric: () => {}, + docLinks: docLinksServiceMock.createStartContract(), + toasts: notificationServiceMock.createSetupContract().toasts, +}; + +export const setupEnvironment = () => { + const { server, httpRequestsMockHelpers } = initHttpRequests(); + + return { + server, + httpRequestsMockHelpers, + }; +}; + +export const WithAppDependencies = (Comp: any) => (props: any) => ( + + + +); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx new file mode 100644 index 0000000000000..41fa608ef538b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { SectionLoading } from '../shared_imports'; +import { useComponentTemplatesContext } from '../component_templates_context'; +import { UIM_COMPONENT_TEMPLATE_LIST_LOAD } from '../constants'; + +import { EmptyPrompt } from './empty_prompt'; +import { ComponentTable } from './table'; +import { LoadError } from './error'; +import { ComponentTemplatesDeleteModal } from './delete_modal'; + +export const ComponentTemplateList: React.FunctionComponent = () => { + const { api, trackMetric } = useComponentTemplatesContext(); + + const { data, isLoading, error, sendRequest } = api.useLoadComponentTemplates(); + + const [componentTemplatesToDelete, setComponentTemplatesToDelete] = useState([]); + + // Track component loaded + useEffect(() => { + trackMetric('loaded', UIM_COMPONENT_TEMPLATE_LIST_LOAD); + }, [trackMetric]); + + if (data && data.length === 0) { + return ; + } + + let content: React.ReactNode; + + if (isLoading) { + content = ( + + + + ); + } else if (data?.length) { + content = ( + + ); + } else if (error) { + content = ; + } + + return ( +
+ {content} + {componentTemplatesToDelete?.length > 0 ? ( + { + if (deleteResponse?.hasDeletedComponentTemplates) { + // refetch the component templates + sendRequest(); + } + setComponentTemplatesToDelete([]); + }} + componentTemplatesToDelete={componentTemplatesToDelete} + /> + ) : null} +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx new file mode 100644 index 0000000000000..bf621065842b5 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useComponentTemplatesContext } from '../component_templates_context'; + +export const ComponentTemplatesDeleteModal = ({ + componentTemplatesToDelete, + callback, +}: { + componentTemplatesToDelete: string[]; + callback: (data?: { hasDeletedComponentTemplates: boolean }) => void; +}) => { + const { toasts, api } = useComponentTemplatesContext(); + const numComponentTemplatesToDelete = componentTemplatesToDelete.length; + + const handleDeleteComponentTemplates = () => { + api + .deleteComponentTemplates(componentTemplatesToDelete) + .then(({ data: { itemsDeleted, errors }, error }) => { + const hasDeletedComponentTemplates = itemsDeleted && itemsDeleted.length; + + if (hasDeletedComponentTemplates) { + const successMessage = + itemsDeleted.length === 1 + ? i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.successDeleteSingleNotificationMessageText', + { + defaultMessage: "Deleted component template '{componentTemplateName}'", + values: { componentTemplateName: componentTemplatesToDelete[0] }, + } + ) + : i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.successDeleteMultipleNotificationMessageText', + { + defaultMessage: + 'Deleted {numSuccesses, plural, one {# component template} other {# component templates}}', + values: { numSuccesses: itemsDeleted.length }, + } + ); + + callback({ hasDeletedComponentTemplates }); + toasts.addSuccess(successMessage); + } + + if (error || errors?.length) { + const hasMultipleErrors = + errors?.length > 1 || (error && componentTemplatesToDelete.length > 1); + const errorMessage = hasMultipleErrors + ? i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.multipleErrorsNotificationMessageText', + { + defaultMessage: 'Error deleting {count} component templates', + values: { + count: errors?.length || componentTemplatesToDelete.length, + }, + } + ) + : i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.errorNotificationMessageText', + { + defaultMessage: "Error deleting component template '{name}'", + values: { name: (errors && errors[0].name) || componentTemplatesToDelete[0] }, + } + ); + toasts.addDanger(errorMessage); + } + }); + }; + + const handleOnCancel = () => { + callback(); + }; + + return ( + + + } + onCancel={handleOnCancel} + onConfirm={handleDeleteComponentTemplates} + cancelButtonText={ + + } + confirmButtonText={ + + } + > + <> +

+ +

+ +
    + {componentTemplatesToDelete.map((name) => ( +
  • {name}
  • + ))} +
+ +
+
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx new file mode 100644 index 0000000000000..edd9f77cbf635 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiEmptyPrompt, EuiLink } from '@elastic/eui'; + +import { useComponentTemplatesContext } from '../component_templates_context'; + +export const EmptyPrompt: FunctionComponent = () => { + const { documentation } = useComponentTemplatesContext(); + + return ( + + {i18n.translate('xpack.idxMgmt.home.componentTemplates.emptyPromptTitle', { + defaultMessage: 'Start by creating a component template', + })} + + } + body={ +

+ +
+ + {i18n.translate('xpack.idxMgmt.home.componentTemplates.emptyPromptDocumentionLink', { + defaultMessage: 'Learn more', + })} + +

+ } + /> + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx new file mode 100644 index 0000000000000..aa37b9ce5767c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiLink, EuiCallOut } from '@elastic/eui'; + +export interface Props { + onReloadClick: () => void; +} + +export const LoadError: FunctionComponent = ({ onReloadClick }) => { + return ( + + + + ), + }} + /> + } + /> + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts new file mode 100644 index 0000000000000..84ee48d14bb8c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ComponentTemplateList } from './component_template_list'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx new file mode 100644 index 0000000000000..2d9557e64e6e7 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiInMemoryTable, + EuiButton, + EuiInMemoryTableProps, + EuiTextColor, + EuiIcon, +} from '@elastic/eui'; + +import { ComponentTemplateListItem } from '../types'; + +export interface Props { + componentTemplates: ComponentTemplateListItem[]; + onReloadClick: () => void; + onDeleteClick: (componentTemplateName: string[]) => void; +} + +export const ComponentTable: FunctionComponent = ({ + componentTemplates, + onReloadClick, + onDeleteClick, +}) => { + const [selection, setSelection] = useState([]); + + const tableProps: EuiInMemoryTableProps = { + itemId: 'name', + isSelectable: true, + 'data-test-subj': 'componentTemplatesTable', + sorting: { sort: { field: 'name', direction: 'asc' } }, + selection: { + onSelectionChange: setSelection, + selectable: ({ usedBy }) => usedBy.length === 0, + selectableMessage: (selectable) => + selectable + ? i18n.translate('xpack.idxMgmt.componentTemplatesList.table.selectionLabel', { + defaultMessage: 'Select this component template', + }) + : i18n.translate('xpack.idxMgmt.componentTemplatesList.table.disabledSelectionLabel', { + defaultMessage: 'Component template is in use and cannot be deleted', + }), + }, + rowProps: () => ({ + 'data-test-subj': 'componentTemplateTableRow', + }), + search: { + toolsLeft: + selection.length > 0 ? ( + onDeleteClick(selection.map(({ name }) => name))} + color="danger" + > + + + ) : undefined, + toolsRight: [ + + {i18n.translate('xpack.idxMgmt.componentTemplatesList.table.reloadButtonLabel', { + defaultMessage: 'Reload', + })} + , + ], + box: { + incremental: true, + }, + filters: [ + { + type: 'field_value_toggle_group', + field: 'usedBy.length', + items: [ + { + value: 1, + name: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.inUseFilterOptionLabel', + { + defaultMessage: 'In use', + } + ), + operator: 'gte', + }, + { + value: 0, + name: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.notInUseFilterOptionLabel', + { + defaultMessage: 'Not in use', + } + ), + operator: 'eq', + }, + ], + }, + ], + }, + pagination: { + initialPageSize: 10, + pageSizeOptions: [10, 20, 50], + }, + columns: [ + { + field: 'name', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.nameColumnTitle', { + defaultMessage: 'Name', + }), + sortable: true, + }, + { + field: 'usedBy', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.isInUseColumnTitle', { + defaultMessage: 'Index templates', + }), + sortable: true, + render: (usedBy: string[]) => { + if (usedBy.length) { + return usedBy.length; + } + + return ( + + + + + + ); + }, + }, + { + field: 'hasMappings', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.mappingsColumnTitle', { + defaultMessage: 'Mappings', + }), + truncateText: true, + sortable: true, + render: (hasMappings: boolean) => (hasMappings ? : null), + }, + { + field: 'hasSettings', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.settingsColumnTitle', { + defaultMessage: 'Settings', + }), + truncateText: true, + sortable: true, + render: (hasSettings: boolean) => (hasSettings ? : null), + }, + { + field: 'hasAliases', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.aliasesColumnTitle', { + defaultMessage: 'Aliases', + }), + truncateText: true, + sortable: true, + render: (hasAliases: boolean) => (hasAliases ? : null), + }, + { + name: ( + + ), + actions: [ + { + 'data-test-subj': 'deleteComponentTemplateButton', + isPrimary: true, + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.deleteActionLabel', { + defaultMessage: 'Delete', + }), + description: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.deleteActionDescription', + { defaultMessage: 'Delete this component template' } + ), + type: 'icon', + icon: 'trash', + color: 'danger', + onClick: ({ name }) => onDeleteClick([name]), + enabled: ({ usedBy }) => usedBy.length === 0, + }, + ], + }, + ], + items: componentTemplates ?? [], + }; + + return ; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx new file mode 100644 index 0000000000000..6f5f5bdebd6d0 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { createContext, useContext } from 'react'; +import { HttpSetup, DocLinksSetup, NotificationsSetup } from 'src/core/public'; + +import { getApi, getUseRequest, getSendRequest, getDocumentation } from './lib'; + +const ComponentTemplatesContext = createContext(undefined); + +interface Props { + httpClient: HttpSetup; + apiBasePath: string; + appBasePath: string; + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void; + docLinks: DocLinksSetup; + toasts: NotificationsSetup['toasts']; +} + +interface Context { + api: ReturnType; + documentation: ReturnType; + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void; + toasts: NotificationsSetup['toasts']; + appBasePath: string; +} + +export const ComponentTemplatesProvider = ({ + children, + value, +}: { + value: Props; + children: React.ReactNode; +}) => { + const { httpClient, apiBasePath, trackMetric, docLinks, toasts, appBasePath } = value; + + const useRequest = getUseRequest(httpClient); + const sendRequest = getSendRequest(httpClient); + + const api = getApi(useRequest, sendRequest, apiBasePath, trackMetric); + const documentation = getDocumentation(docLinks); + + return ( + + {children} + + ); +}; + +export const useComponentTemplatesContext = () => { + const ctx = useContext(ComponentTemplatesContext); + if (!ctx) { + throw new Error( + '"useComponentTemplatesContext" can only be called inside of ComponentTemplatesProvider!' + ); + } + return ctx; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts new file mode 100644 index 0000000000000..3e763119fa9fb --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// ui metric constants +export const UIM_COMPONENT_TEMPLATE_LIST_LOAD = 'component_template_list_load'; +export const UIM_COMPONENT_TEMPLATE_DELETE = 'component_template_delete'; +export const UIM_COMPONENT_TEMPLATE_DELETE_MANY = 'component_template_delete_many'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/index.ts new file mode 100644 index 0000000000000..e0219ec71787f --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ComponentTemplatesProvider } from './component_templates_context'; + +export { ComponentTemplateList } from './component_template_list'; + +export * from './types'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts new file mode 100644 index 0000000000000..351e83c6c0cb5 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ComponentTemplateListItem } from '../types'; +import { UseRequestHook, SendRequestHook } from './request'; +import { UIM_COMPONENT_TEMPLATE_DELETE_MANY, UIM_COMPONENT_TEMPLATE_DELETE } from '../constants'; + +export const getApi = ( + useRequest: UseRequestHook, + sendRequest: SendRequestHook, + apiBasePath: string, + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void +) => { + function useLoadComponentTemplates() { + return useRequest({ + path: `${apiBasePath}/component_templates`, + method: 'get', + }); + } + + function deleteComponentTemplates(names: string[]) { + const result = sendRequest({ + path: `${apiBasePath}/component_templates/${names + .map((name) => encodeURIComponent(name)) + .join(',')}`, + method: 'delete', + }); + + trackMetric( + 'count', + names.length > 1 ? UIM_COMPONENT_TEMPLATE_DELETE_MANY : UIM_COMPONENT_TEMPLATE_DELETE + ); + + return result; + } + + return { + useLoadComponentTemplates, + deleteComponentTemplates, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts new file mode 100644 index 0000000000000..dc27dadf0b807 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DocLinksSetup } from 'src/core/public'; + +export const getDocumentation = ({ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }: DocLinksSetup) => { + const docsBase = `${ELASTIC_WEBSITE_URL}guide/en`; + const esDocsBase = `${docsBase}/elasticsearch/reference/${DOC_LINK_VERSION}`; + + return { + componentTemplates: `${esDocsBase}/indices-component-template.html`, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts new file mode 100644 index 0000000000000..9a91312f83294 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export * from './api'; + +export * from './request'; + +export * from './documentation'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts new file mode 100644 index 0000000000000..97ffa4d875ecb --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { HttpSetup } from 'src/core/public'; + +import { + UseRequestConfig, + UseRequestResponse, + SendRequestConfig, + SendRequestResponse, + sendRequest as _sendRequest, + useRequest as _useRequest, +} from '../shared_imports'; + +export type UseRequestHook = (config: UseRequestConfig) => UseRequestResponse; +export type SendRequestHook = (config: SendRequestConfig) => Promise; + +export const getUseRequest = (httpClient: HttpSetup): UseRequestHook => ( + config: UseRequestConfig +) => { + return _useRequest(httpClient, config); +}; + +export const getSendRequest = (httpClient: HttpSetup): SendRequestHook => ( + config: SendRequestConfig +) => { + return _sendRequest(httpClient, config); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts new file mode 100644 index 0000000000000..863b00b353c49 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { + UseRequestConfig, + UseRequestResponse, + SendRequestConfig, + SendRequestResponse, + sendRequest, + useRequest, + SectionLoading, +} from '../../../../../../../src/plugins/es_ui_shared/public'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/types.ts b/x-pack/plugins/index_management/public/application/components/component_templates/types.ts new file mode 100644 index 0000000000000..0aab3b6b0a94a --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/types.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// Ideally, we shouldn't depend on anything in index management that is +// outside of the components_templates directory +// We could consider creating shared types or duplicating the types here if +// the component_templates app were to move outside of index management +import { + ComponentTemplateSerialized, + ComponentTemplateDeserialized, + ComponentTemplateListItem, +} from '../../../../common'; + +export { ComponentTemplateSerialized, ComponentTemplateDeserialized, ComponentTemplateListItem }; diff --git a/x-pack/plugins/index_management/public/application/components/index.ts b/x-pack/plugins/index_management/public/application/components/index.ts index e6d836c0d0501..7ec25ed5583b7 100644 --- a/x-pack/plugins/index_management/public/application/components/index.ts +++ b/x-pack/plugins/index_management/public/application/components/index.ts @@ -11,3 +11,4 @@ export { PageErrorForbidden } from './page_error'; export { TemplateDeleteModal } from './template_delete_modal'; export { TemplateForm } from './template_form'; export * from './mappings_editor'; +export * from './component_templates'; diff --git a/x-pack/plugins/index_management/public/application/index.tsx b/x-pack/plugins/index_management/public/application/index.tsx index 8da556cc81fcc..5d1096c9ee24e 100644 --- a/x-pack/plugins/index_management/public/application/index.tsx +++ b/x-pack/plugins/index_management/public/application/index.tsx @@ -10,9 +10,12 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { CoreStart } from '../../../../../src/core/public'; +import { API_BASE_PATH, BASE_PATH } from '../../common'; + import { AppContextProvider, AppDependencies } from './app_context'; import { App } from './app'; import { indexManagementStore } from './store'; +import { ComponentTemplatesProvider } from './components'; export const renderApp = ( elem: HTMLElement | null, @@ -22,15 +25,26 @@ export const renderApp = ( return () => undefined; } - const { i18n } = core; + const { i18n, docLinks, notifications } = core; const { Context: I18nContext } = i18n; const { services, history } = dependencies; + const componentTemplateProviderValues = { + httpClient: services.httpService.httpClient, + apiBasePath: API_BASE_PATH, + appBasePath: BASE_PATH, + trackMetric: services.uiMetricService.trackMetric.bind(services.uiMetricService), + docLinks, + toasts: notifications.toasts, + }; + render( - + + + , diff --git a/x-pack/plugins/index_management/public/application/sections/home/home.tsx b/x-pack/plugins/index_management/public/application/sections/home/home.tsx index 9d4331d742a25..0ddf4fefce466 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/home.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/home.tsx @@ -21,9 +21,16 @@ import { import { documentationService } from '../../services/documentation'; import { IndexList } from './index_list'; import { TemplateList } from './template_list'; +import { ComponentTemplateList } from '../../components/component_templates'; import { breadcrumbService } from '../../services/breadcrumbs'; -type Section = 'indices' | 'templates'; +export enum Section { + Indices = 'indices', + IndexTemplates = 'templates', + ComponentTemplates = 'component_templates', +} + +export const homeSections = [Section.Indices, Section.IndexTemplates, Section.ComponentTemplates]; interface MatchParams { section: Section; @@ -37,11 +44,11 @@ export const IndexManagementHome: React.FunctionComponent { const tabs = [ { - id: 'indices' as Section, + id: Section.Indices, name: , }, { - id: 'templates' as Section, + id: Section.IndexTemplates, name: ( ), }, + { + id: Section.ComponentTemplates, + name: ( + + ), + }, ]; const onSectionChange = (newSection: Section) => { @@ -106,13 +122,14 @@ export const IndexManagementHome: React.FunctionComponent - - + + + diff --git a/x-pack/plugins/index_management/public/application/sections/home/index.ts b/x-pack/plugins/index_management/public/application/sections/home/index.ts index 3a29ef4e58555..b53910748aedb 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index.ts +++ b/x-pack/plugins/index_management/public/application/sections/home/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { IndexManagementHome } from './home'; +export { IndexManagementHome, Section, homeSections } from './home'; diff --git a/x-pack/plugins/index_management/server/client/elasticsearch.ts b/x-pack/plugins/index_management/server/client/elasticsearch.ts index 65bd5411a249b..b51f7d924dba7 100644 --- a/x-pack/plugins/index_management/server/client/elasticsearch.ts +++ b/x-pack/plugins/index_management/server/client/elasticsearch.ts @@ -10,6 +10,7 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) Client.prototype.dataManagement = components.clientAction.namespaceFactory(); const dataManagement = Client.prototype.dataManagement.prototype; + // Component templates dataManagement.getComponentTemplates = ca({ urls: [ { @@ -60,4 +61,14 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) ], method: 'DELETE', }); + + // Composable index templates + dataManagement.getComposableIndexTemplates = ca({ + urls: [ + { + fmt: '/_index_template', + }, + ], + method: 'GET', + }); }; diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts index 87aa64421624e..f6f8e7d63d370 100644 --- a/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts +++ b/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts @@ -5,6 +5,11 @@ */ import { schema } from '@kbn/config-schema'; +import { + deserializeComponentTemplate, + deserializeComponenTemplateList, +} from '../../../../common/lib'; +import { ComponentTemplateFromEs } from '../../../../common'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '../index'; @@ -20,9 +25,25 @@ export function registerGetAllRoute({ router, license, lib: { isEsError } }: Rou const { callAsCurrentUser } = ctx.dataManagement!.client; try { - const response = await callAsCurrentUser('dataManagement.getComponentTemplates'); + const { + component_templates: componentTemplates, + }: { component_templates: ComponentTemplateFromEs[] } = await callAsCurrentUser( + 'dataManagement.getComponentTemplates' + ); + + const { index_templates: indexTemplates } = await callAsCurrentUser( + 'dataManagement.getComposableIndexTemplates' + ); + + const body = componentTemplates.map((componentTemplate) => { + const deserializedComponentTemplateListItem = deserializeComponenTemplateList( + componentTemplate, + indexTemplates + ); + return deserializedComponentTemplateListItem; + }); - return res.ok({ body: response.component_templates }); + return res.ok({ body }); } catch (error) { if (isEsError(error)) { return res.customError({ @@ -56,11 +77,12 @@ export function registerGetAllRoute({ router, license, lib: { isEsError } }: Rou } ); + const { index_templates: indexTemplates } = await callAsCurrentUser( + 'dataManagement.getComposableIndexTemplates' + ); + return res.ok({ - body: { - ...componentTemplates[0], - name, - }, + body: deserializeComponentTemplate(componentTemplates[0], indexTemplates), }); } catch (error) { if (isEsError(error)) { diff --git a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts index a33e82ad9f79d..64bf03a043b55 100644 --- a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts +++ b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts @@ -61,7 +61,10 @@ export default function ({ getService }: FtrProviderContext) { expect(testComponentTemplate).to.eql({ name: COMPONENT_NAME, - component_template: COMPONENT, + usedBy: [], + hasSettings: true, + hasMappings: true, + hasAliases: false, }); }); }); @@ -74,8 +77,9 @@ export default function ({ getService }: FtrProviderContext) { expect(body).to.eql({ name: COMPONENT_NAME, - component_template: { - ...COMPONENT, + ...COMPONENT, + _kbnMeta: { + usedBy: [], }, }); }); diff --git a/x-pack/test/functional/apps/index_management/home_page.ts b/x-pack/test/functional/apps/index_management/home_page.ts index e985e338122e7..cca0a5d1ad1bd 100644 --- a/x-pack/test/functional/apps/index_management/home_page.ts +++ b/x-pack/test/functional/apps/index_management/home_page.ts @@ -47,5 +47,22 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(templateList).to.be(true); }); }); + + describe('Component templates', () => { + it('renders the component templates tab', async () => { + // Navigate to the component templates tab + await pageObjects.indexManagement.changeTabs('component_templatesTab'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + // Verify url + const url = await browser.getCurrentUrl(); + expect(url).to.contain(`/component_templates`); + + // There should be no component templates by default, so we verify the empty prompt displays + const componentTemplateEmptyPrompt = await testSubjects.exists('emptyList'); + expect(componentTemplateEmptyPrompt).to.be(true); + }); + }); }); }; diff --git a/x-pack/test/functional/page_objects/index_management_page.ts b/x-pack/test/functional/page_objects/index_management_page.ts index d12186f2e2189..9bfcd79671b4d 100644 --- a/x-pack/test/functional/page_objects/index_management_page.ts +++ b/x-pack/test/functional/page_objects/index_management_page.ts @@ -44,7 +44,7 @@ export function IndexManagementPageProvider({ getService }: FtrProviderContext) }; }); }, - async changeTabs(tab: 'indicesTab' | 'templatesTab') { + async changeTabs(tab: 'indicesTab' | 'templatesTab' | 'component_templatesTab') { await testSubjects.click(tab); }, }; From 5d8de7a162a28dd987804e15dd33eac185df2070 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 9 Jun 2020 21:40:05 +0300 Subject: [PATCH 59/65] Use Search API in Vega (#68257) * Use Search API in Vega * fix PR comments * fix PR comments --- ...-data-public.getsearchparamsfromrequest.md | 44 ++++++++++++ .../kibana-plugin-plugins-data-public.md | 1 + .../vis_type_vega/vega_visualization.js | 44 ++++++++++-- src/plugins/data/public/index.ts | 1 + src/plugins/data/public/public.api.md | 46 ++++++++---- .../public/search/fetch/get_search_params.ts | 18 ++++- src/plugins/data/public/search/fetch/index.ts | 1 + src/plugins/data/public/search/index.ts | 1 + .../search/search_source/search_source.ts | 15 ++-- .../public/__mocks__/services.ts | 10 +-- .../public/data_model/es_query_parser.js | 41 ++++------- .../public/data_model/es_query_parser.test.js | 26 ++++--- .../public/data_model/search_api.ts | 60 ++++++++++++++++ .../public/data_model/search_cache.js | 48 ------------- .../public/data_model/search_cache.test.js | 71 ------------------- .../public/data_model/vega_parser.js | 4 +- .../public/data_model/vega_parser.test.js | 18 ++++- src/plugins/vis_type_vega/public/plugin.ts | 2 + src/plugins/vis_type_vega/public/services.ts | 14 +++- src/plugins/vis_type_vega/public/vega_fn.ts | 4 +- .../public/vega_request_handler.ts | 33 +++++---- 21 files changed, 289 insertions(+), 213 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md create mode 100644 src/plugins/vis_type_vega/public/data_model/search_api.ts delete mode 100644 src/plugins/vis_type_vega/public/data_model/search_cache.js delete mode 100644 src/plugins/vis_type_vega/public/data_model/search_cache.test.js diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md new file mode 100644 index 0000000000000..1923f0e2e4ea1 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md @@ -0,0 +1,44 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [getSearchParamsFromRequest](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) + +## getSearchParamsFromRequest() function + +Signature: + +```typescript +export declare function getSearchParamsFromRequest(searchRequest: SearchRequest, dependencies: { + injectedMetadata: CoreStart['injectedMetadata']; + uiSettings: IUiSettingsClient; +}): { + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| searchRequest | SearchRequest | | +| dependencies | {
injectedMetadata: CoreStart['injectedMetadata'];
uiSettings: IUiSettingsClient;
} | | + +Returns: + +`{ + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index e818fb009fb19..bc1eb9100e85c 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -40,6 +40,7 @@ | [getEsPreference(uiSettings, sessionId)](./kibana-plugin-plugins-data-public.getespreference.md) | | | [getQueryLog(uiSettings, storage, appName, language)](./kibana-plugin-plugins-data-public.getquerylog.md) | | | [getSearchErrorType({ message })](./kibana-plugin-plugins-data-public.getsearcherrortype.md) | | +| [getSearchParamsFromRequest(searchRequest, dependencies)](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) | | | [getTime(indexPattern, timeRange, options)](./kibana-plugin-plugins-data-public.gettime.md) | | | [plugin(initializerContext)](./kibana-plugin-plugins-data-public.plugin.md) | | diff --git a/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js index 6d6eb69e66792..485390dc50a79 100644 --- a/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js +++ b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js @@ -44,7 +44,7 @@ import vegaMapImage256 from './vega_map_image_256.png'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { VegaParser } from '../../../../../../plugins/vis_type_vega/public/data_model/vega_parser'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { SearchCache } from '../../../../../../plugins/vis_type_vega/public/data_model/search_cache'; +import { SearchAPI } from '../../../../../../plugins/vis_type_vega/public/data_model/search_api'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { createVegaTypeDefinition } from '../../../../../../plugins/vis_type_vega/public/vega_type'; @@ -205,7 +205,14 @@ describe('VegaVisualizations', () => { try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaliteGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaliteGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -227,7 +234,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -243,7 +257,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaTooltipGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaTooltipGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -285,7 +306,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaMapGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaMapGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); domNode.style.width = '256px'; @@ -324,7 +352,11 @@ describe('VegaVisualizations', () => { } ] }`, - new SearchCache() + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) ); await vegaParser.parseAsync(); diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index eb3f937a4168b..301ff8d3f67d8 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -358,6 +358,7 @@ export { ISearchSource, parseSearchSourceJSON, injectSearchSourceReferences, + getSearchParamsFromRequest, extractSearchSourceReferences, SearchSourceFields, EsQuerySortValue, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 7054575e8ef9e..bd3ec0d3f2294 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -30,6 +30,7 @@ import { IconType } from '@elastic/eui'; import { InjectedIntl } from '@kbn/i18n/react'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { IUiSettingsClient } from 'src/core/public'; +import { IUiSettingsClient as IUiSettingsClient_3 } from 'kibana/public'; import { Location } from 'history'; import { LocationDescriptorObject } from 'history'; import { MaybePromise } from '@kbn/utility-types'; @@ -641,6 +642,23 @@ export function getQueryLog(uiSettings: IUiSettingsClient, storage: IStorageWrap // @public (undocumented) export function getSearchErrorType({ message }: Pick): "UNSUPPORTED_QUERY" | undefined; +// Warning: (ae-missing-release-tag) "getSearchParamsFromRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function getSearchParamsFromRequest(searchRequest: SearchRequest, dependencies: { + injectedMetadata: CoreStart['injectedMetadata']; + uiSettings: IUiSettingsClient_3; +}): { + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}; + // Warning: (ae-missing-release-tag) "getTime" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1851,20 +1869,20 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:379:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:402:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/fetch/get_search_params.ts b/src/plugins/data/public/search/fetch/get_search_params.ts index 60bdc9ed6473a..f2ad243ce72d0 100644 --- a/src/plugins/data/public/search/fetch/get_search_params.ts +++ b/src/plugins/data/public/search/fetch/get_search_params.ts @@ -17,8 +17,9 @@ * under the License. */ -import { IUiSettingsClient } from 'kibana/public'; +import { IUiSettingsClient, CoreStart } from 'kibana/public'; import { UI_SETTINGS } from '../../../common'; +import { SearchRequest } from './types'; const sessionId = Date.now(); @@ -53,3 +54,18 @@ export function getPreference(config: IUiSettingsClient) { export function getTimeout(esShardTimeout: number) { return esShardTimeout > 0 ? `${esShardTimeout}ms` : undefined; } + +export function getSearchParamsFromRequest( + searchRequest: SearchRequest, + dependencies: { injectedMetadata: CoreStart['injectedMetadata']; uiSettings: IUiSettingsClient } +) { + const { injectedMetadata, uiSettings } = dependencies; + const esShardTimeout = injectedMetadata.getInjectedVar('esShardTimeout') as number; + const searchParams = getSearchParams(uiSettings, esShardTimeout); + + return { + index: searchRequest.index.title || searchRequest.index, + body: searchRequest.body, + ...searchParams, + }; +} diff --git a/src/plugins/data/public/search/fetch/index.ts b/src/plugins/data/public/search/fetch/index.ts index 39845ec31bfaa..ab856d681ba12 100644 --- a/src/plugins/data/public/search/fetch/index.ts +++ b/src/plugins/data/public/search/fetch/index.ts @@ -20,6 +20,7 @@ export * from './types'; export { getSearchParams, + getSearchParamsFromRequest, getPreference, getTimeout, getIgnoreThrottled, diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 53686f9be9b4d..1b5395e1071c5 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -44,6 +44,7 @@ export { SearchRequest, SearchResponse, getSearchErrorType, + getSearchParamsFromRequest, } from './fetch'; export { diff --git a/src/plugins/data/public/search/search_source/search_source.ts b/src/plugins/data/public/search/search_source/search_source.ts index b926739112e0e..a33cda964bd1d 100644 --- a/src/plugins/data/public/search/search_source/search_source.ts +++ b/src/plugins/data/public/search/search_source/search_source.ts @@ -77,7 +77,7 @@ import { filterDocvalueFields } from './filter_docvalue_fields'; import { fieldWildcardFilter } from '../../../../kibana_utils/public'; import { IIndexPattern, ISearchGeneric, SearchRequest } from '../..'; import { SearchSourceOptions, SearchSourceFields } from './types'; -import { FetchOptions, RequestFailure, getSearchParams, handleResponse } from '../fetch'; +import { FetchOptions, RequestFailure, handleResponse, getSearchParamsFromRequest } from '../fetch'; import { getEsQueryConfig, buildEsQuery, Filter, UI_SETTINGS } from '../../../common'; import { getHighlightRequest } from '../../../common/field_formats'; @@ -204,13 +204,12 @@ export class SearchSource { */ private fetch$(searchRequest: SearchRequest, signal?: AbortSignal) { const { search, injectedMetadata, uiSettings } = this.dependencies; - const esShardTimeout = injectedMetadata.getInjectedVar('esShardTimeout') as number; - const searchParams = getSearchParams(uiSettings, esShardTimeout); - const params = { - index: searchRequest.index.title || searchRequest.index, - body: searchRequest.body, - ...searchParams, - }; + + const params = getSearchParamsFromRequest(searchRequest, { + injectedMetadata, + uiSettings, + }); + return search({ params, indexType: searchRequest.indexType }, { signal }).pipe( map(({ rawResponse }) => handleResponse(searchRequest, rawResponse)) ); diff --git a/src/plugins/vis_type_vega/public/__mocks__/services.ts b/src/plugins/vis_type_vega/public/__mocks__/services.ts index 1bf051232e4c9..4775241a66d50 100644 --- a/src/plugins/vis_type_vega/public/__mocks__/services.ts +++ b/src/plugins/vis_type_vega/public/__mocks__/services.ts @@ -16,10 +16,10 @@ * specific language governing permissions and limitations * under the License. */ +import { CoreStart, IUiSettingsClient, NotificationsStart, SavedObjectsStart } from 'kibana/public'; import { createGetterSetter } from '../../../kibana_utils/public'; import { DataPublicPluginStart } from '../../../data/public'; -import { IUiSettingsClient, NotificationsStart, SavedObjectsStart } from 'kibana/public'; import { dataPluginMock } from '../../../data/public/mocks'; import { coreMock } from '../../../../core/public/mocks'; @@ -34,22 +34,24 @@ setNotifications(coreMock.createStart().notifications); export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); setUISettings(coreMock.createStart().uiSettings); +export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< + CoreStart['injectedMetadata'] +>('InjectedMetadata'); +setInjectedMetadata(coreMock.createStart().injectedMetadata); + export const [getSavedObjects, setSavedObjects] = createGetterSetter( 'SavedObjects' ); setSavedObjects(coreMock.createStart().savedObjects); export const [getInjectedVars, setInjectedVars] = createGetterSetter<{ - esShardTimeout: number; enableExternalUrls: boolean; emsTileLayerId: unknown; }>('InjectedVars'); setInjectedVars({ emsTileLayerId: {}, enableExternalUrls: true, - esShardTimeout: 10000, }); -export const getEsShardTimeout = () => getInjectedVars().esShardTimeout; export const getEnableExternalUrls = () => getInjectedVars().enableExternalUrls; export const getEmsTileLayerId = () => getInjectedVars().emsTileLayerId; diff --git a/src/plugins/vis_type_vega/public/data_model/es_query_parser.js b/src/plugins/vis_type_vega/public/data_model/es_query_parser.js index 066c9f06fc109..387301c2c7de9 100644 --- a/src/plugins/vis_type_vega/public/data_model/es_query_parser.js +++ b/src/plugins/vis_type_vega/public/data_model/es_query_parser.js @@ -17,11 +17,9 @@ * under the License. */ -import _ from 'lodash'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; - -import { getEsShardTimeout } from '../services'; +import { isPlainObject, cloneDeep } from 'lodash'; const TIMEFILTER = '%timefilter%'; const AUTOINTERVAL = '%autointerval%'; @@ -37,12 +35,11 @@ const TIMEFIELD = '%timefield%'; * This class parses ES requests specified in the data.url objects. */ export class EsQueryParser { - constructor(timeCache, searchCache, filters, onWarning) { + constructor(timeCache, searchAPI, filters, onWarning) { this._timeCache = timeCache; - this._searchCache = searchCache; + this._searchAPI = searchAPI; this._filters = filters; this._onWarning = onWarning; - this._esShardTimeout = getEsShardTimeout(); } // noinspection JSMethodCanBeStatic @@ -59,7 +56,7 @@ export class EsQueryParser { if (body === undefined) { url.body = body = {}; - } else if (!_.isPlainObject(body)) { + } else if (!isPlainObject(body)) { throw new Error( i18n.translate('visTypeVega.esQueryParser.urlBodyValueTypeErrorMessage', { defaultMessage: '{configName} must be an object', @@ -167,7 +164,7 @@ export class EsQueryParser { if (context) { // Use dashboard context - const newQuery = _.cloneDeep(this._filters); + const newQuery = cloneDeep(this._filters); if (timefield) { newQuery.bool.must.push(body.query); } @@ -179,34 +176,20 @@ export class EsQueryParser { return { dataObject, url }; } - mapRequest = (request) => { - const esRequest = request.url; - if (this._esShardTimeout) { - // remove possible timeout query param to prevent two conflicting timeout parameters - const { body = {}, timeout, ...rest } = esRequest; //eslint-disable-line no-unused-vars - body.timeout = `${this._esShardTimeout}ms`; - return { - body, - ...rest, - }; - } else { - return esRequest; - } - }; - /** * Process items generated by parseUrl() * @param {object[]} requests each object is generated by parseUrl() * @returns {Promise} */ async populateData(requests) { - const esSearches = requests.map(this.mapRequest); + const esSearches = requests.map((r) => r.url); + const data$ = this._searchAPI.search(esSearches); - const results = await this._searchCache.search(esSearches); + const results = await data$.toPromise(); - for (let i = 0; i < requests.length; i++) { - requests[i].dataObject.values = results[i]; - } + results.forEach((data) => { + requests[data.id].dataObject.values = data.rawResponse; + }); } /** @@ -222,7 +205,7 @@ export class EsQueryParser { const item = obj[pos]; if (isQuery && (item === MUST_CLAUSE || item === MUST_NOT_CLAUSE)) { const ctxTag = item === MUST_CLAUSE ? 'must' : 'must_not'; - const ctx = _.cloneDeep(this._filters); + const ctx = cloneDeep(this._filters); if (ctx && ctx.bool && ctx.bool[ctxTag]) { if (Array.isArray(ctx.bool[ctxTag])) { // replace one value with an array of values diff --git a/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js b/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js index c519da33ab1c9..fd474bef73b8c 100644 --- a/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js @@ -94,28 +94,36 @@ describe(`EsQueryParser time`, () => { }); describe('EsQueryParser.populateData', () => { - let searchStub; + let searchApiStub; + let data; let parser; beforeEach(() => { - searchStub = jest.fn(() => Promise.resolve([{}, {}])); - parser = new EsQueryParser({}, { search: searchStub }, undefined, undefined); + searchApiStub = { + search: jest.fn(() => ({ + toPromise: jest.fn(() => Promise.resolve(data)), + })), + }; + parser = new EsQueryParser({}, searchApiStub, undefined, undefined); }); test('should set the timeout for each request', async () => { + data = [ + { id: 0, rawResponse: {} }, + { id: 1, rawResponse: {} }, + ]; await parser.populateData([ { url: { body: {} }, dataObject: {} }, { url: { body: {} }, dataObject: {} }, ]); - expect(searchStub.mock.calls[0][0][0].body.timeout).toBe.defined; + + expect(searchApiStub.search.mock.calls[0][0][0].body).toBeDefined(); }); test('should remove possible timeout parameters on a request', async () => { - await parser.populateData([ - { url: { timeout: '500h', body: { timeout: '500h' } }, dataObject: {} }, - ]); - expect(searchStub.mock.calls[0][0][0].body.timeout).toBe.defined; - expect(searchStub.mock.calls[0][0][0].timeout).toBe(undefined); + data = [{ id: 0, rawResponse: {} }]; + await parser.populateData([{ url: { body: { timeout: '500h' } }, dataObject: {} }]); + expect(searchApiStub.search.mock.calls[0][0][0].body.timeout).toBeDefined(); }); }); diff --git a/src/plugins/vis_type_vega/public/data_model/search_api.ts b/src/plugins/vis_type_vega/public/data_model/search_api.ts new file mode 100644 index 0000000000000..c2eecf13c2d51 --- /dev/null +++ b/src/plugins/vis_type_vega/public/data_model/search_api.ts @@ -0,0 +1,60 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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. + */ + +import { combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { CoreStart, IUiSettingsClient } from 'kibana/public'; +import { + getSearchParamsFromRequest, + SearchRequest, + DataPublicPluginStart, +} from '../../../data/public'; + +export interface SearchAPIDependencies { + uiSettings: IUiSettingsClient; + injectedMetadata: CoreStart['injectedMetadata']; + search: DataPublicPluginStart['search']; +} + +export class SearchAPI { + constructor( + private readonly dependencies: SearchAPIDependencies, + private readonly abortSignal?: AbortSignal + ) {} + + search(searchRequests: SearchRequest[]) { + const { search } = this.dependencies.search; + + return combineLatest( + searchRequests.map((request, index) => { + const params = getSearchParamsFromRequest(request, { + uiSettings: this.dependencies.uiSettings, + injectedMetadata: this.dependencies.injectedMetadata, + }); + + return search({ params }, { signal: this.abortSignal }).pipe( + map((data) => ({ + id: index, + rawResponse: data.rawResponse, + })) + ); + }) + ); + } +} diff --git a/src/plugins/vis_type_vega/public/data_model/search_cache.js b/src/plugins/vis_type_vega/public/data_model/search_cache.js deleted file mode 100644 index 41e4c67c3b2ad..0000000000000 --- a/src/plugins/vis_type_vega/public/data_model/search_cache.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ - -import LruCache from 'lru-cache'; - -export class SearchCache { - constructor(es, cacheOpts) { - this._es = es; - this._cache = new LruCache(cacheOpts); - } - - /** - * Execute multiple searches, possibly combining the results of the cached searches - * with the new ones already in cache - * @param {object[]} requests array of search requests - */ - search(requests) { - const promises = []; - - for (const request of requests) { - const key = JSON.stringify(request); - let pending = this._cache.get(key); - if (pending === undefined) { - pending = this._es.search(request); - this._cache.set(key, pending); - } - promises.push(pending); - } - - return Promise.all(promises); - } -} diff --git a/src/plugins/vis_type_vega/public/data_model/search_cache.test.js b/src/plugins/vis_type_vega/public/data_model/search_cache.test.js deleted file mode 100644 index 92f80545ce1b5..0000000000000 --- a/src/plugins/vis_type_vega/public/data_model/search_cache.test.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ - -import { SearchCache } from './search_cache'; -jest.mock('../services'); - -describe(`SearchCache`, () => { - class FauxEs { - constructor() { - // contains all request batches, separated by 0 - this.searches = []; - } - - async search(request) { - this.searches.push(request); - return { req: request }; - } - } - - const request1 = { body: 'b1' }; - const expected1 = { req: { body: 'b1' } }; - const request2 = { body: 'b2' }; - const expected2 = { req: { body: 'b2' } }; - const request3 = { body: 'b3' }; - const expected3 = { req: { body: 'b3' } }; - - it(`sequence`, async () => { - const sc = new SearchCache(new FauxEs()); - - // empty request - let res = await sc.search([]); - expect(res).toEqual([]); - expect(sc._es.searches).toEqual([]); - - // single request - res = await sc.search([request1]); - expect(res).toEqual([expected1]); - expect(sc._es.searches).toEqual([request1]); - - // repeat the same search, use array notation - res = await sc.search([request1]); - expect(res).toEqual([expected1]); - expect(sc._es.searches).toEqual([request1]); // no new entries - - // new single search - res = await sc.search([request2]); - expect(res).toEqual([expected2]); - expect(sc._es.searches).toEqual([request1, request2]); - - // multiple search, some new, some old - res = await sc.search([request1, request3, request2]); - expect(res).toEqual([expected1, expected3, expected2]); - expect(sc._es.searches).toEqual([request1, request2, request3]); - }); -}); diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.js index f541b9f104adc..cbfe2a6ede4f2 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.js @@ -46,7 +46,7 @@ const locToDirMap = { const DEFAULT_PARSER = 'elasticsearch'; export class VegaParser { - constructor(spec, searchCache, timeCache, filters, serviceSettings) { + constructor(spec, searchAPI, timeCache, filters, serviceSettings) { this.spec = spec; this.hideWarnings = false; this.error = undefined; @@ -54,7 +54,7 @@ export class VegaParser { const onWarn = this._onWarning.bind(this); this._urlParsers = { - elasticsearch: new EsQueryParser(timeCache, searchCache, filters, onWarn), + elasticsearch: new EsQueryParser(timeCache, searchAPI, filters, onWarn), emsfile: new EmsFileParser(serviceSettings), url: new UrlParser(onWarn), }; diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js index 1bd26b8713044..a40ef31260b6f 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js @@ -78,9 +78,25 @@ describe(`VegaParser._setDefaultColors`, () => { }); describe('VegaParser._resolveEsQueries', () => { + let searchApiStub; + const data = [ + { + id: 0, + rawResponse: [42], + }, + ]; + + beforeEach(() => { + searchApiStub = { + search: jest.fn(() => ({ + toPromise: jest.fn(() => Promise.resolve(data)), + })), + }; + }); + function check(spec, expected, warnCount) { return async () => { - const vp = new VegaParser(spec, { search: async () => [[42]] }, 0, 0, { + const vp = new VegaParser(spec, searchApiStub, 0, 0, { getFileLayers: async () => [{ name: 'file1', url: 'url1' }], getUrlForRegionLayer: async (layer) => { return layer.url; diff --git a/src/plugins/vis_type_vega/public/plugin.ts b/src/plugins/vis_type_vega/public/plugin.ts index 1bce7ac92e564..b3e35dac3711f 100644 --- a/src/plugins/vis_type_vega/public/plugin.ts +++ b/src/plugins/vis_type_vega/public/plugin.ts @@ -28,6 +28,7 @@ import { setUISettings, setKibanaMapFactory, setMapsLegacyConfig, + setInjectedMetadata, } from './services'; import { createVegaFn } from './vega_fn'; @@ -96,5 +97,6 @@ export class VegaPlugin implements Plugin, void> { setNotifications(core.notifications); setSavedObjects(core.savedObjects); setData(data); + setInjectedMetadata(core.injectedMetadata); } } diff --git a/src/plugins/vis_type_vega/public/services.ts b/src/plugins/vis_type_vega/public/services.ts index f2fddb41cf72b..7d988d464b52b 100644 --- a/src/plugins/vis_type_vega/public/services.ts +++ b/src/plugins/vis_type_vega/public/services.ts @@ -17,8 +17,13 @@ * under the License. */ -import { SavedObjectsStart } from 'kibana/public'; -import { NotificationsStart, IUiSettingsClient } from 'src/core/public'; +import { + CoreStart, + SavedObjectsStart, + NotificationsStart, + IUiSettingsClient, +} from 'src/core/public'; + import { DataPublicPluginStart } from '../../data/public'; import { createGetterSetter } from '../../kibana_utils/public'; import { MapsLegacyConfigType } from '../../maps_legacy/public'; @@ -34,6 +39,10 @@ export const [getKibanaMapFactory, setKibanaMapFactory] = createGetterSetter('UISettings'); +export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< + CoreStart['injectedMetadata'] +>('InjectedMetadata'); + export const [getSavedObjects, setSavedObjects] = createGetterSetter( 'SavedObjects' ); @@ -48,6 +57,5 @@ export const [getMapsLegacyConfig, setMapsLegacyConfig] = createGetterSetter getInjectedVars().esShardTimeout; export const getEnableExternalUrls = () => getInjectedVars().enableExternalUrls; export const getEmsTileLayerId = () => getMapsLegacyConfig().emsTileLayerId; diff --git a/src/plugins/vis_type_vega/public/vega_fn.ts b/src/plugins/vis_type_vega/public/vega_fn.ts index 6d45e043f7cee..a9c915fcfb636 100644 --- a/src/plugins/vis_type_vega/public/vega_fn.ts +++ b/src/plugins/vis_type_vega/public/vega_fn.ts @@ -54,8 +54,8 @@ export const createVegaFn = ( help: '', }, }, - async fn(input, args) { - const vegaRequestHandler = createVegaRequestHandler(dependencies); + async fn(input, args, context) { + const vegaRequestHandler = createVegaRequestHandler(dependencies, context.abortSignal); const response = await vegaRequestHandler({ timeRange: get(input, 'timeRange'), diff --git a/src/plugins/vis_type_vega/public/vega_request_handler.ts b/src/plugins/vis_type_vega/public/vega_request_handler.ts index efc02e368efa8..ac28f0b3782b2 100644 --- a/src/plugins/vis_type_vega/public/vega_request_handler.ts +++ b/src/plugins/vis_type_vega/public/vega_request_handler.ts @@ -19,14 +19,14 @@ import { Filter, esQuery, TimeRange, Query } from '../../data/public'; -// @ts-ignore -import { SearchCache } from './data_model/search_cache'; +import { SearchAPI } from './data_model/search_api'; + // @ts-ignore import { TimeCache } from './data_model/time_cache'; import { VegaVisualizationDependencies } from './plugin'; import { VisParams } from './vega_fn'; -import { getData } from './services'; +import { getData, getInjectedMetadata } from './services'; interface VegaRequestHandlerParams { query: Query; @@ -35,12 +35,11 @@ interface VegaRequestHandlerParams { visParams: VisParams; } -export function createVegaRequestHandler({ - plugins: { data }, - core: { uiSettings }, - serviceSettings, -}: VegaVisualizationDependencies) { - let searchCache: SearchCache | undefined; +export function createVegaRequestHandler( + { plugins: { data }, core: { uiSettings }, serviceSettings }: VegaVisualizationDependencies, + abortSignal?: AbortSignal +) { + let searchAPI: SearchAPI; const { timefilter } = data.query.timefilter; const timeCache = new TimeCache(timefilter, 3 * 1000); @@ -50,11 +49,15 @@ export function createVegaRequestHandler({ query, visParams, }: VegaRequestHandlerParams) { - if (!searchCache) { - searchCache = new SearchCache(getData().search.__LEGACY.esClient, { - max: 10, - maxAge: 4 * 1000, - }); + if (!searchAPI) { + searchAPI = new SearchAPI( + { + uiSettings, + search: getData().search, + injectedMetadata: getInjectedMetadata(), + }, + abortSignal + ); } timeCache.setTimeRange(timeRange); @@ -63,7 +66,7 @@ export function createVegaRequestHandler({ const filtersDsl = esQuery.buildEsQuery(undefined, query, filters, esQueryConfigs); // @ts-ignore const { VegaParser } = await import('./data_model/vega_parser'); - const vp = new VegaParser(visParams.spec, searchCache, timeCache, filtersDsl, serviceSettings); + const vp = new VegaParser(visParams.spec, searchAPI, timeCache, filtersDsl, serviceSettings); return await vp.parseAsync(); }; From 5260c32706316c80982cde3e5921187e6a24e3d0 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 9 Jun 2020 12:50:33 -0600 Subject: [PATCH 60/65] [Security] [Cases] Attach timeline to existing case (#68580) --- .../cases/components/add_comment/index.tsx | 32 + .../cases/components/all_cases/columns.tsx | 274 +++---- .../cases/components/all_cases/index.test.tsx | 16 +- .../cases/components/all_cases/index.tsx | 694 +++++++++--------- .../components/all_cases_modal/index.test.tsx | 140 ++++ .../components/all_cases_modal/index.tsx | 56 ++ .../all_cases_modal/translations.ts | 10 + .../public/cases/pages/case_details.tsx | 2 - .../public/common/mock/global_state.ts | 1 + .../public/common/mock/index.ts | 1 + .../components/flyout/header/index.tsx | 8 +- .../header_with_close_button/index.test.tsx | 30 +- .../__snapshots__/timeline.test.tsx.snap | 51 +- .../components/timeline/index.test.tsx | 14 +- .../insert_timeline_popover/index.test.tsx | 30 +- .../insert_timeline_popover/index.tsx | 35 +- .../use_insert_timeline.tsx | 2 +- .../timeline/properties/helpers.tsx | 51 +- .../timeline/properties/index.test.tsx | 477 ++++-------- .../components/timeline/properties/index.tsx | 39 + .../properties/properties_right.test.tsx | 4 +- .../timeline/properties/properties_right.tsx | 69 +- .../timeline/properties/translations.ts | 7 + .../components/timeline/timeline.test.tsx | 24 + .../timelines/store/timeline/actions.ts | 3 + .../timelines/store/timeline/helpers.ts | 1 + .../timelines/store/timeline/reducer.ts | 22 +- .../timelines/store/timeline/selectors.ts | 5 +- .../public/timelines/store/timeline/types.ts | 7 + 29 files changed, 1166 insertions(+), 939 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx index a57fae8081bea..a830b299d655b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx @@ -8,6 +8,7 @@ import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; import React, { useCallback, useEffect } from 'react'; import styled from 'styled-components'; +import { useDispatch } from 'react-redux'; import { CommentRequest } from '../../../../../case/common/api'; import { usePostComment } from '../../containers/use_post_comment'; import { Case } from '../../containers/types'; @@ -18,6 +19,12 @@ import { Form, useForm, UseField } from '../../../shared_imports'; import * as i18n from './translations'; import { schema } from './schema'; +import { + dispatchUpdateTimeline, + queryTimelineById, +} from '../../../timelines/components/open_timeline/helpers'; +import { updateIsLoading as dispatchUpdateIsLoading } from '../../../timelines/store/timeline/actions'; +import { useApolloClient } from '../../../common/utils/apollo_context'; const MySpinner = styled(EuiLoadingSpinner)` position: absolute; @@ -46,6 +53,8 @@ export const AddComment = React.memo( options: { stripEmptyFields: false }, schema, }); + const dispatch = useDispatch(); + const apolloClient = useApolloClient(); const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( form, 'comment' @@ -62,6 +71,28 @@ export const AddComment = React.memo( // eslint-disable-next-line react-hooks/exhaustive-deps }, [insertQuote]); + const handleTimelineClick = useCallback( + (timelineId: string) => { + queryTimelineById({ + apolloClient, + timelineId, + updateIsLoading: ({ + id: currentTimelineId, + isLoading: isLoadingTimeline, + }: { + id: string; + isLoading: boolean; + }) => + dispatch( + dispatchUpdateIsLoading({ id: currentTimelineId, isLoading: isLoadingTimeline }) + ), + updateTimeline: dispatchUpdateTimeline(dispatch), + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [apolloClient] + ); + const onSubmit = useCallback(async () => { const { isValid, data } = await form.submit(); if (isValid) { @@ -86,6 +117,7 @@ export const AddComment = React.memo( dataTestSubj: 'add-comment', placeholder: i18n.ADD_COMMENT_HELP_TEXT, onCursorPositionUpdate: handleCursorChange, + onClickTimeline: handleTimelineClick, bottomRightContent: ( export const getCasesColumns = ( actions: Array>, - filterStatus: string -): CasesColumns[] => [ - { - name: i18n.NAME, - render: (theCase: Case) => { - if (theCase.id != null && theCase.title != null) { - const caseDetailsLinkComponent = ( - - {theCase.title} - - ); - return theCase.status === 'open' ? ( - caseDetailsLinkComponent - ) : ( - <> - + filterStatus: string, + isModal: boolean +): CasesColumns[] => { + const columns = [ + { + name: i18n.NAME, + render: (theCase: Case) => { + if (theCase.id != null && theCase.title != null) { + const caseDetailsLinkComponent = !isModal ? ( + + {theCase.title} + + ) : ( + {theCase.title} + ); + return theCase.status === 'open' ? ( + caseDetailsLinkComponent + ) : ( + <> {caseDetailsLinkComponent} - {i18n.CLOSED} - - - ); - } - return getEmptyTagValue(); + + {i18n.CLOSED} + + + ); + } + return getEmptyTagValue(); + }, }, - }, - { - field: 'createdBy', - name: i18n.REPORTER, - render: (createdBy: Case['createdBy']) => { - if (createdBy != null) { - return ( - <> - - - {createdBy.fullName ? createdBy.fullName : createdBy.username ?? ''} - - - ); - } - return getEmptyTagValue(); + { + field: 'createdBy', + name: i18n.REPORTER, + render: (createdBy: Case['createdBy']) => { + if (createdBy != null) { + return ( + <> + + + {createdBy.fullName ? createdBy.fullName : createdBy.username ?? ''} + + + ); + } + return getEmptyTagValue(); + }, + }, + { + field: 'tags', + name: i18n.TAGS, + render: (tags: Case['tags']) => { + if (tags != null && tags.length > 0) { + return ( + + {tags.map((tag: string, i: number) => ( + + {tag} + + ))} + + ); + } + return getEmptyTagValue(); + }, + truncateText: true, }, - }, - { - field: 'tags', - name: i18n.TAGS, - render: (tags: Case['tags']) => { - if (tags != null && tags.length > 0) { - return ( - - {tags.map((tag: string, i: number) => ( - - {tag} - - ))} - - ); - } - return getEmptyTagValue(); + { + align: 'right' as HorizontalAlignment, + field: 'totalComment', + name: i18n.COMMENTS, + sortable: true, + render: (totalComment: Case['totalComment']) => + totalComment != null + ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) + : getEmptyTagValue(), }, - truncateText: true, - }, - { - align: 'right', - field: 'totalComment', - name: i18n.COMMENTS, - sortable: true, - render: (totalComment: Case['totalComment']) => - totalComment != null - ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) - : getEmptyTagValue(), - }, - filterStatus === 'open' - ? { - field: 'createdAt', - name: i18n.OPENED_ON, - sortable: true, - render: (createdAt: Case['createdAt']) => { - if (createdAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); - }, - } - : { - field: 'closedAt', - name: i18n.CLOSED_ON, - sortable: true, - render: (closedAt: Case['closedAt']) => { - if (closedAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); + filterStatus === 'open' + ? { + field: 'createdAt', + name: i18n.OPENED_ON, + sortable: true, + render: (createdAt: Case['createdAt']) => { + if (createdAt != null) { + return ( + + + + ); + } + return getEmptyTagValue(); + }, + } + : { + field: 'closedAt', + name: i18n.CLOSED_ON, + sortable: true, + render: (closedAt: Case['closedAt']) => { + if (closedAt != null) { + return ( + + + + ); + } + return getEmptyTagValue(); + }, }, + { + name: i18n.EXTERNAL_INCIDENT, + render: (theCase: Case) => { + if (theCase.id != null) { + return ; + } + return getEmptyTagValue(); }, - { - name: i18n.EXTERNAL_INCIDENT, - render: (theCase: Case) => { - if (theCase.id != null) { - return ; - } - return getEmptyTagValue(); }, - }, - { - name: i18n.INCIDENT_MANAGEMENT_SYSTEM, - render: (theCase: Case) => { - if (theCase.externalService != null) { - return renderStringField( - `${theCase.externalService.connectorName}`, - `case-table-column-connector` - ); - } - return getEmptyTagValue(); + { + name: i18n.INCIDENT_MANAGEMENT_SYSTEM, + render: (theCase: Case) => { + if (theCase.externalService != null) { + return renderStringField( + `${theCase.externalService.connectorName}`, + `case-table-column-connector` + ); + } + return getEmptyTagValue(); + }, + }, + { + name: i18n.ACTIONS, + actions, }, - }, - { - name: i18n.ACTIONS, - actions, - }, -]; + ]; + if (isModal) { + columns.pop(); // remove actions if in modal + } + return columns; +}; interface Props { theCase: Case; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx index e3f4fee15ce68..bbb96f433d3c8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx @@ -151,8 +151,22 @@ describe('AllCases', () => { expect(column.find('.euiTableRowCell--hideForDesktop').text()).toEqual(columnName); expect(column.find('span').text()).toEqual(emptyTag); }; - getCasesColumns([], 'open').map((i, key) => i.name != null && checkIt(`${i.name}`, key)); + getCasesColumns([], 'open', false).map((i, key) => i.name != null && checkIt(`${i.name}`, key)); }); + + it('should not render case link or actions on modal=true', () => { + const wrapper = mount( + + + + ); + const checkIt = (columnName: string) => { + expect(columnName).not.toEqual(i18n.ACTIONS); + }; + getCasesColumns([], 'open', true).map((i, key) => i.name != null && checkIt(`${i.name}`)); + expect(wrapper.find(`a[data-test-subj="case-details-link"]`).exists()).toBeFalsy(); + }); + it('should tableHeaderSortButton AllCases', () => { const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 32a7c4078071e..d27f383fb94e3 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - +/* eslint-disable react-hooks/exhaustive-deps */ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { EuiBasicTable, @@ -72,7 +72,6 @@ const ProgressLoader = styled(EuiProgress)` z-index: ${theme.eui.euiZHeader}; `} `; - const getSortField = (field: string): SortFieldCase => { if (field === SortFieldCase.createdAt) { return SortFieldCase.createdAt; @@ -83,368 +82,373 @@ const getSortField = (field: string): SortFieldCase => { }; interface AllCasesProps { + onRowClick?: (id: string) => void; + isModal?: boolean; userCanCrud: boolean; } -export const AllCases = React.memo(({ userCanCrud }) => { - const urlSearch = useGetUrlSearch(navTabs.case); - const { actionLicense } = useGetActionLicense(); - const { - countClosedCases, - countOpenCases, - isLoading: isCasesStatusLoading, - fetchCasesStatus, - } = useGetCasesStatus(); - const { - data, - dispatchUpdateCaseProperty, - filterOptions, - loading, - queryParams, - selectedCases, - refetchCases, - setFilters, - setQueryParams, - setSelectedCases, - } = useGetCases(); +export const AllCases = React.memo( + ({ onRowClick = () => {}, isModal = false, userCanCrud }) => { + const urlSearch = useGetUrlSearch(navTabs.case); + const { actionLicense } = useGetActionLicense(); + const { + countClosedCases, + countOpenCases, + isLoading: isCasesStatusLoading, + fetchCasesStatus, + } = useGetCasesStatus(); + const { + data, + dispatchUpdateCaseProperty, + filterOptions, + loading, + queryParams, + selectedCases, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + } = useGetCases(); - // Delete case - const { - dispatchResetIsDeleted, - handleOnDeleteConfirm, - handleToggleModal, - isLoading: isDeleting, - isDeleted, - isDisplayConfirmDeleteModal, - } = useDeleteCases(); - - // Update case - const { - dispatchResetIsUpdated, - isLoading: isUpdating, - isUpdated, - updateBulkStatus, - } = useUpdateCases(); - const [deleteThisCase, setDeleteThisCase] = useState({ - title: '', - id: '', - }); - const [deleteBulk, setDeleteBulk] = useState([]); - const filterRefetch = useRef<() => void>(); - const setFilterRefetch = useCallback( - (refetchFilter: () => void) => { - filterRefetch.current = refetchFilter; - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterRefetch.current] - ); - const refreshCases = useCallback( - (dataRefresh = true) => { - if (dataRefresh) refetchCases(); - fetchCasesStatus(); - setSelectedCases([]); - setDeleteBulk([]); - if (filterRefetch.current != null) { - filterRefetch.current(); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterOptions, queryParams, filterRefetch.current] - ); + // Delete case + const { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isLoading: isDeleting, + isDeleted, + isDisplayConfirmDeleteModal, + } = useDeleteCases(); - useEffect(() => { - if (isDeleted) { - refreshCases(); - dispatchResetIsDeleted(); - } - if (isUpdated) { - refreshCases(); - dispatchResetIsUpdated(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isDeleted, isUpdated]); - const confirmDeleteModal = useMemo( - () => ( - 0} - onCancel={handleToggleModal} - onConfirm={handleOnDeleteConfirm.bind( - null, - deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] - )} - /> - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] - ); + // Update case + const { + dispatchResetIsUpdated, + isLoading: isUpdating, + isUpdated, + updateBulkStatus, + } = useUpdateCases(); + const [deleteThisCase, setDeleteThisCase] = useState({ + title: '', + id: '', + }); + const [deleteBulk, setDeleteBulk] = useState([]); + const filterRefetch = useRef<() => void>(); + const setFilterRefetch = useCallback( + (refetchFilter: () => void) => { + filterRefetch.current = refetchFilter; + }, + [filterRefetch.current] + ); + const refreshCases = useCallback( + (dataRefresh = true) => { + if (dataRefresh) refetchCases(); + fetchCasesStatus(); + setSelectedCases([]); + setDeleteBulk([]); + if (filterRefetch.current != null) { + filterRefetch.current(); + } + }, + [filterOptions, queryParams, filterRefetch.current] + ); - const toggleDeleteModal = useCallback((deleteCase: Case) => { - handleToggleModal(); - setDeleteThisCase(deleteCase); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + useEffect(() => { + if (isDeleted) { + refreshCases(); + dispatchResetIsDeleted(); + } + if (isUpdated) { + refreshCases(); + dispatchResetIsUpdated(); + } + }, [isDeleted, isUpdated]); + const confirmDeleteModal = useMemo( + () => ( + 0} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind( + null, + deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] + )} + /> + ), + [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] + ); - const toggleBulkDeleteModal = useCallback( - (caseIds: string[]) => { + const toggleDeleteModal = useCallback((deleteCase: Case) => { handleToggleModal(); - if (caseIds.length === 1) { - const singleCase = selectedCases.find((theCase) => theCase.id === caseIds[0]); - if (singleCase) { - return setDeleteThisCase({ id: singleCase.id, title: singleCase.title }); + setDeleteThisCase(deleteCase); + }, []); + + const toggleBulkDeleteModal = useCallback( + (caseIds: string[]) => { + handleToggleModal(); + if (caseIds.length === 1) { + const singleCase = selectedCases.find((theCase) => theCase.id === caseIds[0]); + if (singleCase) { + return setDeleteThisCase({ id: singleCase.id, title: singleCase.title }); + } } - } - const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); - setDeleteBulk(convertToDeleteCases); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); + const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); + setDeleteBulk(convertToDeleteCases); + }, + [selectedCases] + ); - const handleUpdateCaseStatus = useCallback( - (status: string) => { - updateBulkStatus(selectedCases, status); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); + const handleUpdateCaseStatus = useCallback( + (status: string) => { + updateBulkStatus(selectedCases, status); + }, + [selectedCases] + ); - const selectedCaseIds = useMemo( - (): string[] => selectedCases.map((caseObj: Case) => caseObj.id), - [selectedCases] - ); + const selectedCaseIds = useMemo( + (): string[] => selectedCases.map((caseObj: Case) => caseObj.id), + [selectedCases] + ); - const getBulkItemsPopoverContent = useCallback( - (closePopover: () => void) => ( - - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] - ); - const handleDispatchUpdate = useCallback( - (args: Omit) => { - dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); - }, - [dispatchUpdateCaseProperty, fetchCasesStatus] - ); + const getBulkItemsPopoverContent = useCallback( + (closePopover: () => void) => ( + + ), + [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] + ); + const handleDispatchUpdate = useCallback( + (args: Omit) => { + dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); + }, + [dispatchUpdateCaseProperty, fetchCasesStatus] + ); - const actions = useMemo( - () => - getActions({ - caseStatus: filterOptions.status, - deleteCaseOnClick: toggleDeleteModal, - dispatchUpdate: handleDispatchUpdate, - }), - [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] - ); + const actions = useMemo( + () => + getActions({ + caseStatus: filterOptions.status, + deleteCaseOnClick: toggleDeleteModal, + dispatchUpdate: handleDispatchUpdate, + }), + [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] + ); - const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); + const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); - const tableOnChangeCallback = useCallback( - ({ page, sort }: EuiBasicTableOnChange) => { - let newQueryParams = queryParams; - if (sort) { - newQueryParams = { - ...newQueryParams, - sortField: getSortField(sort.field), - sortOrder: sort.direction, - }; - } - if (page) { - newQueryParams = { - ...newQueryParams, - page: page.index + 1, - perPage: page.size, - }; - } - setQueryParams(newQueryParams); - refreshCases(false); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [queryParams] - ); + const tableOnChangeCallback = useCallback( + ({ page, sort }: EuiBasicTableOnChange) => { + let newQueryParams = queryParams; + if (sort) { + newQueryParams = { + ...newQueryParams, + sortField: getSortField(sort.field), + sortOrder: sort.direction, + }; + } + if (page) { + newQueryParams = { + ...newQueryParams, + page: page.index + 1, + perPage: page.size, + }; + } + setQueryParams(newQueryParams); + refreshCases(false); + }, + [queryParams] + ); - const onFilterChangedCallback = useCallback( - (newFilterOptions: Partial) => { - if (newFilterOptions.status && newFilterOptions.status === 'closed') { - setQueryParams({ sortField: SortFieldCase.closedAt }); - } else if (newFilterOptions.status && newFilterOptions.status === 'open') { - setQueryParams({ sortField: SortFieldCase.createdAt }); - } - setFilters(newFilterOptions); - refreshCases(false); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterOptions, queryParams] - ); + const onFilterChangedCallback = useCallback( + (newFilterOptions: Partial) => { + if (newFilterOptions.status && newFilterOptions.status === 'closed') { + setQueryParams({ sortField: SortFieldCase.closedAt }); + } else if (newFilterOptions.status && newFilterOptions.status === 'open') { + setQueryParams({ sortField: SortFieldCase.createdAt }); + } + setFilters(newFilterOptions); + refreshCases(false); + }, + [filterOptions, queryParams] + ); - const memoizedGetCasesColumns = useMemo( - () => getCasesColumns(userCanCrud ? actions : [], filterOptions.status), - [actions, filterOptions.status, userCanCrud] - ); - const memoizedPagination = useMemo( - () => ({ - pageIndex: queryParams.page - 1, - pageSize: queryParams.perPage, - totalItemCount: data.total, - pageSizeOptions: [5, 10, 15, 20, 25], - }), - [data, queryParams] - ); + const memoizedGetCasesColumns = useMemo( + () => getCasesColumns(userCanCrud ? actions : [], filterOptions.status, isModal), + [actions, filterOptions.status, userCanCrud, isModal] + ); + const memoizedPagination = useMemo( + () => ({ + pageIndex: queryParams.page - 1, + pageSize: queryParams.perPage, + totalItemCount: data.total, + pageSizeOptions: [5, 10, 15, 20, 25], + }), + [data, queryParams] + ); - const sorting: EuiTableSortingType = { - sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, - }; - const euiBasicTableSelectionProps = useMemo>( - () => ({ onSelectionChange: setSelectedCases }), - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); - const isCasesLoading = useMemo( - () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, - [loading] - ); - const isDataEmpty = useMemo(() => data.total === 0, [data]); + const sorting: EuiTableSortingType = { + sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, + }; + const euiBasicTableSelectionProps = useMemo>( + () => ({ onSelectionChange: setSelectedCases }), + [selectedCases] + ); + const isCasesLoading = useMemo( + () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, + [loading] + ); + const isDataEmpty = useMemo(() => data.total === 0, [data]); - return ( - <> - {!isEmpty(actionsErrors) && ( - - )} - - - - - - - - - - } - titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} - urlSearch={urlSearch} - /> - - - - {i18n.CREATE_TITLE} - - - - - {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( - - )} - - - {isCasesLoading && isDataEmpty ? ( -
- -
- ) : ( -
- - - - - {i18n.SHOWING_CASES(data.total ?? 0)} - - - - - {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} - - {userCanCrud && ( - - {i18n.BULK_ACTIONS} - - )} - - {i18n.REFRESH} - - - - - {i18n.NO_CASES}} - titleSize="xs" - body={i18n.NO_CASES_BODY} - actions={ - - {i18n.ADD_NEW_CASE} - - } + const TableWrap = useMemo(() => (isModal ? 'span' : Panel), [isModal]); + return ( + <> + {!isEmpty(actionsErrors) && ( + + )} + {!isModal && ( + + + + + + + - } - onChange={tableOnChangeCallback} - pagination={memoizedPagination} - selection={userCanCrud ? euiBasicTableSelectionProps : {}} - sorting={sorting} - /> -
+ + + } + titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} + urlSearch={urlSearch} + /> + + + + {i18n.CREATE_TITLE} + + + + + )} + {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( + )} -
- {confirmDeleteModal} - - ); -}); + + + {isCasesLoading && isDataEmpty ? ( +
+ +
+ ) : ( +
+ + + + + {i18n.SHOWING_CASES(data.total ?? 0)} + + + {!isModal && ( + + + {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} + + {userCanCrud && ( + + {i18n.BULK_ACTIONS} + + )} + + {i18n.REFRESH} + + + )} + + + {i18n.NO_CASES}} + titleSize="xs" + body={i18n.NO_CASES_BODY} + actions={ + + {i18n.ADD_NEW_CASE} + + } + /> + } + onChange={tableOnChangeCallback} + pagination={memoizedPagination} + rowProps={(item) => + isModal + ? { + onClick: () => onRowClick(item.id), + } + : {} + } + selection={userCanCrud && !isModal ? euiBasicTableSelectionProps : undefined} + sorting={sorting} + /> +
+ )} +
+ {confirmDeleteModal} + + ); + } +); AllCases.displayName = 'AllCases'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx new file mode 100644 index 0000000000000..a24cb6a87de74 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { mount } from 'enzyme'; +import React from 'react'; +import { AllCasesModal } from '.'; +import { TestProviders } from '../../../common/mock'; + +import { useGetCasesMockState, basicCaseId } from '../../containers/mock'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { useGetCases } from '../../containers/use_get_cases'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; +import { EuiTableRow } from '@elastic/eui'; + +jest.mock('../../containers/use_bulk_update_case'); +jest.mock('../../containers/use_delete_cases'); +jest.mock('../../containers/use_get_cases'); +jest.mock('../../containers/use_get_cases_status'); + +const useDeleteCasesMock = useDeleteCases as jest.Mock; +const useGetCasesMock = useGetCases as jest.Mock; +const useGetCasesStatusMock = useGetCasesStatus as jest.Mock; +const useUpdateCasesMock = useUpdateCases as jest.Mock; +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); + +const onCloseCaseModal = jest.fn(); +const onRowClick = jest.fn(); +const defaultProps = { + onCloseCaseModal, + onRowClick, + showCaseModal: true, +}; +describe('AllCasesModal', () => { + const dispatchResetIsDeleted = jest.fn(); + const dispatchResetIsUpdated = jest.fn(); + const dispatchUpdateCaseProperty = jest.fn(); + const handleOnDeleteConfirm = jest.fn(); + const handleToggleModal = jest.fn(); + const refetchCases = jest.fn(); + const setFilters = jest.fn(); + const setQueryParams = jest.fn(); + const setSelectedCases = jest.fn(); + const updateBulkStatus = jest.fn(); + const fetchCasesStatus = jest.fn(); + + const defaultGetCases = { + ...useGetCasesMockState, + dispatchUpdateCaseProperty, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + }; + const defaultDeleteCases = { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isDeleted: false, + isDisplayConfirmDeleteModal: false, + isLoading: false, + }; + const defaultCasesStatus = { + countClosedCases: 0, + countOpenCases: 5, + fetchCasesStatus, + isError: false, + isLoading: true, + }; + const defaultUpdateCases = { + isUpdated: false, + isLoading: false, + isError: false, + dispatchResetIsUpdated, + updateBulkStatus, + }; + /* eslint-disable no-console */ + // Silence until enzyme fixed to use ReactTestUtils.act() + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ + beforeEach(() => { + jest.resetAllMocks(); + useUpdateCasesMock.mockImplementation(() => defaultUpdateCases); + useGetCasesMock.mockImplementation(() => defaultGetCases); + useDeleteCasesMock.mockImplementation(() => defaultDeleteCases); + useGetCasesStatusMock.mockImplementation(() => defaultCasesStatus); + }); + + it('renders with unselectable rows', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); + expect(wrapper.find(EuiTableRow).first().prop('isSelectable')).toBeFalsy(); + }); + it('does not render modal if showCaseModal: false', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); + }); + it('onRowClick called when row is clicked', () => { + const wrapper = mount( + + + + ); + const firstRow = wrapper.find(EuiTableRow).first(); + firstRow.simulate('click'); + expect(onRowClick.mock.calls[0][0]).toEqual(basicCaseId); + }); + it('Closing modal calls onCloseCaseModal', () => { + const wrapper = mount( + + + + ); + const modalClose = wrapper.find('.euiModal__closeIcon').first(); + modalClose.simulate('click'); + expect(onCloseCaseModal).toBeCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx new file mode 100644 index 0000000000000..d2ca0f0cd02ee --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { + EuiModal, + EuiModalBody, + EuiModalHeader, + EuiModalHeaderTitle, + EuiOverlayMask, +} from '@elastic/eui'; +import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; +import { AllCases } from '../all_cases'; +import * as i18n from './translations'; + +interface AllCasesModalProps { + onCloseCaseModal: () => void; + showCaseModal: boolean; + onRowClick: (id: string) => void; +} + +export const AllCasesModalComponent = ({ + onCloseCaseModal, + onRowClick, + showCaseModal, +}: AllCasesModalProps) => { + const userPermissions = useGetUserSavedObjectPermissions(); + let modal; + if (showCaseModal) { + modal = ( + + + + {i18n.SELECT_CASE_TITLE} + + + + + + + ); + } + + return <>{modal}; +}; + +export const AllCasesModal = React.memo(AllCasesModalComponent); + +AllCasesModal.displayName = 'AllCasesModal'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts new file mode 100644 index 0000000000000..e0f84d8541424 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +export const SELECT_CASE_TITLE = i18n.translate('xpack.securitySolution.case.caseModal.title', { + defaultMessage: 'Select case to attach timeline', +}); diff --git a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx index 5dfe12179b990..780de303c02d3 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx @@ -10,7 +10,6 @@ import { useParams, Redirect } from 'react-router-dom'; import { WrapperPage } from '../../common/components/wrapper_page'; import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; -import { SpyRoute } from '../../common/utils/route/spy_routes'; import { getCaseUrl } from '../../common/components/link_to'; import { navTabs } from '../../app/home/home_navigations'; import { CaseView } from '../components/case_view'; @@ -36,7 +35,6 @@ export const CaseDetailsPage = React.memo(() => { )} - ) : null; }); diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 4af39ade70d25..3e84e4035e15e 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -229,6 +229,7 @@ export const mockGlobalState: State = { status: TimelineStatus.active, }, }, + insertTimeline: null, }, /** * These state's are wrapped in `Immutable`, but for compatibility with the overall app architecture, diff --git a/x-pack/plugins/security_solution/public/common/mock/index.ts b/x-pack/plugins/security_solution/public/common/mock/index.ts index bdad0ab1712ab..30eb4c63f40b8 100644 --- a/x-pack/plugins/security_solution/public/common/mock/index.ts +++ b/x-pack/plugins/security_solution/public/common/mock/index.ts @@ -15,3 +15,4 @@ export * from './test_providers'; export * from './utils'; export * from './mock_ecs'; export * from './timeline_results'; +export * from './kibana_react'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx index ab8a24889e9bf..8ad32d6e2cad0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx @@ -33,14 +33,14 @@ const StatefulFlyoutHeader = React.memo( associateNote, createTimeline, description, - isFavorite, isDataInTimeline, isDatepickerLocked, - title, + isFavorite, noteIds, notesById, status, timelineId, + title, toggleLock, updateDescription, updateIsFavorite, @@ -61,15 +61,15 @@ const StatefulFlyoutHeader = React.memo( isDataInTimeline={isDataInTimeline} isDatepickerLocked={isDatepickerLocked} isFavorite={isFavorite} - title={title} noteIds={noteIds} status={status} timelineId={timelineId} + title={title} toggleLock={toggleLock} updateDescription={updateDescription} updateIsFavorite={updateIsFavorite} - updateTitle={updateTitle} updateNote={updateNote} + updateTitle={updateTitle} usersViewing={usersViewing} /> ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx index 34a20e7215906..e5fc8b68b1cb7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx @@ -10,22 +10,26 @@ import React from 'react'; import { TestProviders } from '../../../../common/mock'; import { FlyoutHeaderWithCloseButton } from '.'; -jest.mock('../../../../common/lib/kibana', () => { - return { - useKibana: jest.fn().mockReturnValue({ - services: { - application: { - capabilities: { - securitySolution: { - crud: true, - }, +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: jest.fn(), +})); +jest.mock('../../../../common/lib/kibana', () => ({ + ...jest.requireActual('../../../../common/lib/kibana'), + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, }, }, }, - }), - useUiSetting$: jest.fn().mockReturnValue([]), - }; -}); + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), + useGetUserSavedObjectPermissions: jest.fn(), +})); describe('FlyoutHeaderWithCloseButton', () => { test('renders correctly against snapshot', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap index 4ed0b52fc0f14..4e6cce618880b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap @@ -606,19 +606,40 @@ exports[`Timeline rendering renders correctly against snapshot 1`] = ` }, "filters": Array [], "uiSettings": Object { - "get": [Function], - "get$": [MockFunction], - "getAll": [MockFunction], - "getSaved$": [MockFunction], - "getUpdate$": [MockFunction], - "getUpdateErrors$": [MockFunction], - "isCustom": [MockFunction], - "isDeclared": [MockFunction], - "isDefault": [MockFunction], - "isOverridden": [MockFunction], - "overrideLocalDefault": [MockFunction], - "remove": [MockFunction], - "set": [MockFunction], + "get": [MockFunction] { + "calls": Array [ + Array [ + "query:allowLeadingWildcards", + ], + Array [ + "query:queryString:options", + ], + Array [ + "courier:ignoreFilterIfFieldNotInIndex", + ], + Array [ + "dateFormat:tz", + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + ], + }, }, "updated$": Subject { "_isScalar": false, @@ -826,7 +847,7 @@ exports[`Timeline rendering renders correctly against snapshot 1`] = ` } inputId="timeline" /> - - + `; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx index 931623d080198..3110129867628 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx @@ -26,15 +26,25 @@ import { mockDataProviders } from './data_providers/mock/mock_data_providers'; import { StatefulTimeline, Props as StatefulTimelineProps } from './index'; import { Timeline } from './timeline'; -jest.mock('../../../common/lib/kibana'); +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); + const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); mockUseResizeObserver.mockImplementation(() => ({})); const mockUseSignalIndex: jest.Mock = useSignalIndex as jest.Mock; jest.mock('../../../alerts/containers/detection_engine/alerts/use_signal_index'); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: jest.fn(), +})); jest.mock('../flyout/header_with_close_button'); - describe('StatefulTimeline', () => { let props = {} as StatefulTimelineProps; const sort: Sort = { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx index 0a70413b7ea29..2ffbae1f7eb5c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx @@ -17,6 +17,14 @@ jest.mock('react-redux', () => { return { ...reactRedux, useDispatch: () => mockDispatch, + useSelector: jest + .fn() + .mockReturnValueOnce({ + timelineId: 'timeline-id', + timelineSavedObjectId: '34578-3497-5893-47589-34759', + timelineTitle: 'Timeline title', + }) + .mockReturnValue(null), }; }); const mockLocation = { @@ -25,17 +33,6 @@ const mockLocation = { search: '', state: '', }; -const mockLocationWithState = { - ...mockLocation, - state: { - insertTimeline: { - timelineId: 'timeline-id', - timelineSavedObjectId: '34578-3497-5893-47589-34759', - timelineTitle: 'Timeline title', - }, - }, -}; - const onTimelineChange = jest.fn(); const defaultProps = { isDisabled: false, @@ -43,18 +40,21 @@ const defaultProps = { }; describe('Insert timeline popover ', () => { - beforeEach(() => { - jest.resetAllMocks(); + afterEach(() => { + jest.clearAllMocks(); }); it('should insert a timeline when passed in the router state', () => { - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocationWithState); mount(); - expect(mockDispatch).toBeCalledWith({ + expect(mockDispatch.mock.calls[0][0]).toEqual({ payload: { id: 'timeline-id', show: false }, type: 'x-pack/security_solution/local/timeline/SHOW_TIMELINE', }); expect(onTimelineChange).toBeCalledWith('Timeline title', '34578-3497-5893-47589-34759'); + expect(mockDispatch.mock.calls[1][0]).toEqual({ + payload: null, + type: 'x-pack/security_solution/local/timeline/SET_INSERT_TIMELINE', + }); }); it('should do nothing when router state', () => { jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx index ed4d742bb8b4d..de199d9a1cc2e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx @@ -6,14 +6,15 @@ import { EuiButtonIcon, EuiPopover, EuiSelectableOption, EuiToolTip } from '@elastic/eui'; import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; -import { useLocation } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { OpenTimelineResult } from '../../open_timeline/types'; import { SelectableTimeline } from '../selectable_timeline'; import * as i18n from '../translations'; -import { timelineActions } from '../../../../timelines/store/timeline'; +import { timelineActions, timelineSelectors } from '../../../../timelines/store/timeline'; import { TimelineType } from '../../../../../common/types/timeline'; +import { State } from '../../../../common/store'; +import { setInsertTimeline } from '../../../store/timeline/actions'; interface InsertTimelinePopoverProps { isDisabled: boolean; @@ -21,14 +22,6 @@ interface InsertTimelinePopoverProps { onTimelineChange: (timelineTitle: string, timelineId: string | null) => void; } -interface RouterState { - insertTimeline: { - timelineId: string; - timelineSavedObjectId: string; - timelineTitle: string; - }; -} - type Props = InsertTimelinePopoverProps; export const InsertTimelinePopoverComponent: React.FC = ({ @@ -38,22 +31,18 @@ export const InsertTimelinePopoverComponent: React.FC = ({ }) => { const dispatch = useDispatch(); const [isPopoverOpen, setIsPopoverOpen] = useState(false); - const { state } = useLocation(); - const [routerState, setRouterState] = useState(state ?? null); + const insertTimeline = useSelector((state: State) => { + return timelineSelectors.selectInsertTimeline(state); + }); useEffect(() => { - if (routerState && routerState.insertTimeline) { - dispatch( - timelineActions.showTimeline({ id: routerState.insertTimeline.timelineId, show: false }) - ); - onTimelineChange( - routerState.insertTimeline.timelineTitle, - routerState.insertTimeline.timelineSavedObjectId - ); - setRouterState(null); + if (insertTimeline != null) { + dispatch(timelineActions.showTimeline({ id: insertTimeline.timelineId, show: false })); + onTimelineChange(insertTimeline.timelineTitle, insertTimeline.timelineSavedObjectId); + dispatch(setInsertTimeline(null)); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [routerState]); + }, [insertTimeline, dispatch]); const handleClosePopover = useCallback(() => { setIsPopoverOpen(false); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx index 0f9e64082a603..6269bc1b4a1a3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx @@ -17,7 +17,7 @@ export const useInsertTimeline = (form: FormHook, fieldNa }); const handleOnTimelineChange = useCallback( (title: string, id: string | null) => { - const builtLink = `${basePath}/app/siem#/timelines?timeline=(id:'${id}',isOpen:!t)`; + const builtLink = `${basePath}/app/security#/timelines?timeline=(id:'${id}',isOpen:!t)`; const currentValue = form.getFormData()[fieldName]; const newValue: string = [ currentValue.slice(0, cursorPosition.start), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 9e74298f3aca9..00a0e57324841 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -21,7 +21,7 @@ import React, { useCallback } from 'react'; import uuid from 'uuid'; import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { TimelineTypeLiteral, @@ -41,6 +41,7 @@ import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { NOTES_PANEL_WIDTH } from './notes_size'; import { ButtonContainer, DescriptionContainer, LabelText, NameField, StyledStar } from './styles'; import * as i18n from './translations'; +import { setInsertTimeline } from '../../../store/timeline/actions'; import { useCreateTimelineButton } from './use_create_timeline'; export const historyToolTip = 'The chronological history of actions related to this timeline'; @@ -144,23 +145,25 @@ interface NewCaseProps { export const NewCase = React.memo( ({ onClosePopover, timelineId, timelineStatus, timelineTitle }) => { const history = useHistory(); + const dispatch = useDispatch(); const { savedObjectId } = useSelector((state: State) => timelineSelectors.selectTimeline(state, timelineId) ); + const handleClick = useCallback(() => { onClosePopover(); history.push({ pathname: `/${SiemPageName.case}/create`, - state: { - insertTimeline: { - timelineId, - timelineSavedObjectId: savedObjectId, - timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, - }, - }, }); + dispatch( + setInsertTimeline({ + timelineId, + timelineSavedObjectId: savedObjectId, + timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, + }) + ); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [onClosePopover, history, timelineId, timelineTitle]); + }, [dispatch, onClosePopover, history, timelineId, timelineTitle]); return ( ( ); NewCase.displayName = 'NewCase'; +interface ExistingCaseProps { + onClosePopover: () => void; + onOpenCaseModal: () => void; + timelineStatus: TimelineStatus; +} +export const ExistingCase = React.memo( + ({ onClosePopover, onOpenCaseModal, timelineStatus }) => { + const handleClick = useCallback(() => { + onClosePopover(); + onOpenCaseModal(); + }, [onOpenCaseModal, onClosePopover]); + + return ( + <> + + {i18n.ATTACH_TIMELINE_TO_EXISTING_CASE} + + + ); + } +); +ExistingCase.displayName = 'ExistingCase'; + export interface NewTimelineProps { createTimeline?: CreateTimeline; closeGearMenu?: () => void; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx index 952a7c104e19e..505d0b8cba854 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx @@ -6,33 +6,43 @@ import { mount } from 'enzyme'; import React from 'react'; -import { Provider as ReduxStoreProvider } from 'react-redux'; - import { TimelineStatus } from '../../../../../common/types/timeline'; import { mockGlobalState, apolloClientObservable, SUB_PLUGINS_REDUCER, + TestProviders, } from '../../../../common/mock'; import { createStore, State } from '../../../../common/store'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Properties, showDescriptionThreshold, showNotesThreshold } from '.'; +import { SiemPageName } from '../../../../app/types'; +import { setInsertTimeline } from '../../../store/timeline/actions'; +export { nextTick } from '../../../../../../../test_utils'; + +import { act } from 'react-dom/test-utils'; -jest.mock('../../../../common/lib/kibana', () => ({ - useKibana: jest.fn().mockReturnValue({ - services: { - application: { - capabilities: { - securitySolution: { - crud: true, +jest.mock('../../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../../common/lib/kibana'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, }, }, }, - }, - }), - useUiSetting$: jest.fn().mockReturnValue([]), -})); + }), + useUiSetting$: jest.fn().mockReturnValue([]), + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); +const mockDispatch = jest.fn(); jest.mock('../../../../common/components/utils', () => { return { useThrottledResizeObserver: jest.fn(), @@ -48,21 +58,44 @@ jest.mock('react-redux', () => { }; }); -jest.mock('react-router-dom', () => { - const originalModule = jest.requireActual('react-router-dom'); +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useDispatch: () => mockDispatch, + useSelector: jest.fn().mockReturnValue({ savedObjectId: '1', urlState: {} }), +})); +const mockHistoryPush = jest.fn(); - return { - ...originalModule, - useHistory: jest.fn(), - }; -}); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})); jest.mock('./use_create_timeline', () => ({ useCreateTimelineButton: jest.fn().mockReturnValue({ getButton: jest.fn() }), })); - +const usersViewing = ['elastic']; +const defaultProps = { + associateNote: jest.fn(), + createTimeline: jest.fn(), + isDataInTimeline: false, + isDatepickerLocked: false, + isFavorite: false, + title: '', + description: '', + getNotesByIds: jest.fn(), + noteIds: [], + status: TimelineStatus.active, + timelineId: 'abc', + toggleLock: jest.fn(), + updateDescription: jest.fn(), + updateIsFavorite: jest.fn(), + updateTitle: jest.fn(), + updateNote: jest.fn(), + usersViewing, +}; describe('Properties', () => { - const usersViewing = ['elastic']; const state: State = mockGlobalState; let mockedWidth = 1000; let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); @@ -75,27 +108,9 @@ describe('Properties', () => { test('renders correctly', () => { const wrapper = mount( - - - + + + ); wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); @@ -104,31 +119,16 @@ describe('Properties', () => { expect(wrapper.find('button[data-test-subj="attach-timeline-case"]').prop('disabled')).toEqual( false ); + expect( + wrapper.find('button[data-test-subj="attach-timeline-existing-case"]').prop('disabled') + ).toEqual(false); }); test('renders correctly draft timeline', () => { const wrapper = mount( - - - + + + ); wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); @@ -136,31 +136,16 @@ describe('Properties', () => { expect(wrapper.find('button[data-test-subj="attach-timeline-case"]').prop('disabled')).toEqual( true ); + expect( + wrapper.find('button[data-test-subj="attach-timeline-existing-case"]').prop('disabled') + ).toEqual(true); }); test('it renders an empty star icon when it is NOT a favorite', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-favorite-empty-star"]').exists()).toEqual(true); @@ -168,27 +153,9 @@ describe('Properties', () => { test('it renders a filled star icon when it is a favorite', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-favorite-filled-star"]').exists()).toEqual(true); @@ -198,27 +165,9 @@ describe('Properties', () => { const title = 'foozle'; const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-title"]').first().props().value).toEqual(title); @@ -226,27 +175,9 @@ describe('Properties', () => { test('it renders the date picker with the lock icon', () => { const wrapper = mount( - - - + + + ); expect( @@ -259,27 +190,9 @@ describe('Properties', () => { test('it renders the lock icon when isDatepickerLocked is true', () => { const wrapper = mount( - - - + + + ); expect( wrapper @@ -291,27 +204,9 @@ describe('Properties', () => { test('it renders the unlock icon when isDatepickerLocked is false', () => { const wrapper = mount( - - - + + + ); expect( wrapper @@ -328,27 +223,9 @@ describe('Properties', () => { (useThrottledResizeObserver as jest.Mock).mockReturnValue({ width: showDescriptionThreshold }); const wrapper = mount( - - - + + + ); expect( @@ -369,27 +246,9 @@ describe('Properties', () => { }); const wrapper = mount( - - - + + + ); expect( @@ -404,27 +263,9 @@ describe('Properties', () => { mockedWidth = showNotesThreshold; const wrapper = mount( - - - + + + ); expect( @@ -442,27 +283,9 @@ describe('Properties', () => { }); const wrapper = mount( - - - + + + ); expect( @@ -475,27 +298,9 @@ describe('Properties', () => { test('it renders a settings icon', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="settings-gear"]').exists()).toEqual(true); @@ -505,27 +310,9 @@ describe('Properties', () => { const title = 'port scan'; const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="avatar"]').exists()).toEqual(true); @@ -533,29 +320,45 @@ describe('Properties', () => { test('it does NOT render an avatar for the current user viewing the timeline when it does NOT have a title', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="avatar"]').exists()).toEqual(false); }); + + test('insert timeline - new case', () => { + const wrapper = mount( + + + + ); + wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); + wrapper.find('[data-test-subj="attach-timeline-case"]').first().simulate('click'); + + expect(mockHistoryPush).toBeCalledWith({ pathname: `/${SiemPageName.case}/create` }); + expect(mockDispatch).toBeCalledWith( + setInsertTimeline({ + timelineId: defaultProps.timelineId, + timelineSavedObjectId: '1', + timelineTitle: 'coolness', + }) + ); + }); + + test('insert timeline - existing case', async () => { + const wrapper = mount( + + + + ); + wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); + wrapper.find('[data-test-subj="attach-timeline-existing-case"]').first().simulate('click'); + + await act(async () => { + await Promise.resolve({}); + }); + expect(wrapper.find('[data-test-subj="all-cases-modal"]').exists()).toBeTruthy(); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index d4c43c9929f0e..be79c0773bf88 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -6,6 +6,8 @@ import React, { useState, useCallback, useMemo } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; import { TimelineStatus, TimelineTypeLiteral } from '../../../../../common/types/timeline'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Note } from '../../../../common/lib/note'; @@ -16,6 +18,12 @@ import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { TimelineProperties } from './styles'; import { PropertiesRight } from './properties_right'; import { PropertiesLeft } from './properties_left'; +import { AllCasesModal } from '../../../../cases/components/all_cases_modal'; +import { SiemPageName } from '../../../../app/types'; +import * as i18n from './translations'; +import { State } from '../../../../common/store'; +import { timelineSelectors } from '../../../store/timeline'; +import { setInsertTimeline } from '../../../store/timeline/actions'; type CreateTimeline = ({ id, @@ -87,6 +95,7 @@ export const Properties = React.memo( const [showActions, setShowActions] = useState(false); const [showNotes, setShowNotes] = useState(false); const [showTimelineModal, setShowTimelineModal] = useState(false); + const dispatch = useDispatch(); const onButtonClick = useCallback(() => setShowActions(!showActions), [showActions]); const onToggleShowNotes = useCallback(() => setShowNotes(!showNotes), [showNotes]); @@ -98,6 +107,30 @@ export const Properties = React.memo( setShowTimelineModal(true); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const [showCaseModal, setShowCaseModal] = useState(false); + const onCloseCaseModal = useCallback(() => setShowCaseModal(false), []); + const onOpenCaseModal = useCallback(() => setShowCaseModal(true), []); + const history = useHistory(); + const currentTimeline = useSelector((state: State) => + timelineSelectors.selectTimeline(state, timelineId) + ); + + const onRowClick = useCallback( + (id: string) => { + onCloseCaseModal(); + history.push({ + pathname: `/${SiemPageName.case}/${id}`, + }); + dispatch( + setInsertTimeline({ + timelineId, + timelineSavedObjectId: currentTimeline.savedObjectId, + timelineTitle: title.length > 0 ? title : i18n.UNTITLED_TIMELINE, + }) + ); + }, + [onCloseCaseModal, currentTimeline, dispatch, history, timelineId, title] + ); const datePickerWidth = useMemo( () => @@ -144,6 +177,7 @@ export const Properties = React.memo( onButtonClick={onButtonClick} onClosePopover={onClosePopover} onCloseTimelineModal={onCloseTimelineModal} + onOpenCaseModal={onOpenCaseModal} onOpenTimelineModal={onOpenTimelineModal} onToggleShowNotes={onToggleShowNotes} showActions={showActions} @@ -159,6 +193,11 @@ export const Properties = React.memo( updateNote={updateNote} usersViewing={usersViewing} /> + ); } diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx index 58927e7b236e7..e297a3cc595d6 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx @@ -28,9 +28,10 @@ jest.mock('./new_template_timeline', () => { jest.mock('./helpers', () => { return { Description: jest.fn().mockReturnValue(
), - NotesButton: jest.fn().mockReturnValue(
), + ExistingCase: jest.fn().mockReturnValue(
), NewCase: jest.fn().mockReturnValue(
), NewTimeline: jest.fn().mockReturnValue(
), + NotesButton: jest.fn().mockReturnValue(
), }; }); @@ -62,6 +63,7 @@ describe('Properties Right', () => { noteIds: [], onToggleShowNotes: jest.fn(), onCloseTimelineModal: jest.fn(), + onOpenCaseModal: jest.fn(), onOpenTimelineModal: jest.fn(), status: TimelineStatus.active, showTimelineModal: false, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx index f9ab7fb2e69ae..a9baf73676ffb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx @@ -14,6 +14,7 @@ import { EuiToolTip, EuiAvatar, } from '@elastic/eui'; +import { NewTimeline, Description, NotesButton, NewCase, ExistingCase } from './helpers'; import { disableTemplate } from '../../../../../common/constants'; import { TimelineStatus } from '../../../../../common/types/timeline'; @@ -27,7 +28,6 @@ import { OpenTimelineModalButton } from '../../open_timeline/open_timeline_modal import { OpenTimelineModal } from '../../open_timeline/open_timeline_modal'; import * as i18n from './translations'; -import { Description, NotesButton, NewCase, NewTimeline } from './helpers'; import { NewTemplateTimeline } from './new_template_timeline'; export const PropertiesRightStyle = styled(EuiFlexGroup)` @@ -64,54 +64,56 @@ Avatar.displayName = 'Avatar'; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; export type UpdateNote = (note: Note) => void; -export interface PropertiesRightComponentProps { - onButtonClick: () => void; - onClosePopover: () => void; - showActions: boolean; - timelineId: string; - isDataInTimeline: boolean; - showNotes: boolean; - showNotesFromWidth: boolean; - showDescription: boolean; - showUsersView: boolean; - usersViewing: string[]; - description: string; - updateDescription: UpdateDescription; +interface PropertiesRightComponentProps { associateNote: AssociateNote; + description: string; getNotesByIds: (noteIds: string[]) => Note[]; + isDataInTimeline: boolean; noteIds: string[]; - onToggleShowNotes: () => void; + onButtonClick: () => void; + onClosePopover: () => void; onCloseTimelineModal: () => void; + onOpenCaseModal: () => void; onOpenTimelineModal: () => void; + onToggleShowNotes: () => void; + showActions: boolean; + showDescription: boolean; + showNotes: boolean; + showNotesFromWidth: boolean; showTimelineModal: boolean; + showUsersView: boolean; status: TimelineStatus; + timelineId: string; title: string; + updateDescription: UpdateDescription; updateNote: UpdateNote; + usersViewing: string[]; } const PropertiesRightComponent: React.FC = ({ - onButtonClick, - showActions, - onClosePopover, - timelineId, - isDataInTimeline, - showNotesFromWidth, - showNotes, - showDescription, - showUsersView, - usersViewing, - description, - updateDescription, associateNote, + description, getNotesByIds, + isDataInTimeline, noteIds, + onButtonClick, + onClosePopover, + onCloseTimelineModal, + onOpenCaseModal, + onOpenTimelineModal, onToggleShowNotes, - updateNote, + showActions, + showDescription, + showNotes, + showNotesFromWidth, showTimelineModal, + showUsersView, status, - onCloseTimelineModal, - onOpenTimelineModal, + timelineId, title, + updateDescription, + updateNote, + usersViewing, }) => { const uiCapabilities = useKibana().services.application.capabilities; const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; @@ -170,6 +172,13 @@ const PropertiesRightComponent: React.FC = ({ timelineStatus={status} /> + + + ({})); +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + return { + ...originalModule, + useHistory: jest.fn(), + }; +}); +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + uiSettings: { + get: jest.fn(), + }, + savedObjects: { + client: {}, + }, + }, + }), + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); describe('Timeline', () => { let props = {} as TimelineComponentProps; const sort: Sort = { diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts index e8b5ba68eecdf..c5df017604b0c 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts @@ -17,6 +17,7 @@ import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/t import { EventType, KqlMode, TimelineModel, ColumnHeaderOptions } from './model'; import { TimelineNonEcsData } from '../../../graphql/types'; import { TimelineTypeLiteral } from '../../../../common/types/timeline'; +import { InsertTimeline } from './types'; const actionCreator = actionCreatorFactory('x-pack/security_solution/local/timeline'); @@ -98,6 +99,8 @@ export const addTimeline = actionCreator<{ timeline: TimelineModel; }>('ADD_TIMELINE'); +export const setInsertTimeline = actionCreator('SET_INSERT_TIMELINE'); + export const startTimelineSaving = actionCreator<{ id: string; }>('START_TIMELINE_SAVING'); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts index 97ac423cee653..03e9ca176ee82 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts @@ -36,6 +36,7 @@ export const initialTimelineState: TimelineState = { newTimelineModel: null, }, showCallOutUnauthorizedMsg: false, + insertTimeline: null, }; interface AddTimelineHistoryParams { diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts index 3666968e8ab92..5e314f1597451 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts @@ -6,14 +6,17 @@ import { reducerWithInitialState } from 'typescript-fsa-reducers'; import { - addTimeline, addHistory, addNote, addNoteToEvent, addProvider, + addTimeline, applyDeltaToColumnWidth, applyDeltaToWidth, applyKqlFilterQuery, + clearEventsDeleted, + clearEventsLoading, + clearSelected, createTimeline, dataProviderEdited, endTimelineSaving, @@ -21,12 +24,12 @@ import { removeColumn, removeProvider, setEventsDeleted, - clearEventsDeleted, setEventsLoading, - clearEventsLoading, + setFilters, + setInsertTimeline, setKqlFilterQueryDraft, + setSavedQueryId, setSelected, - clearSelected, showCallOutUnauthorizedMsg, showTimeline, startTimelineSaving, @@ -37,9 +40,11 @@ import { updateDataProviderExcluded, updateDataProviderKqlQuery, updateDescription, + updateEventType, updateHighlightedDropAndProviderId, updateIsFavorite, updateIsLive, + updateIsLoading, updateItemsPerPage, updateItemsPerPageOptions, updateKqlMode, @@ -50,10 +55,6 @@ import { updateTimeline, updateTitle, upsertColumn, - updateIsLoading, - setSavedQueryId, - setFilters, - updateEventType, } from './actions'; import { addNewTimeline, @@ -107,6 +108,7 @@ export const initialTimelineState: TimelineState = { newTimelineModel: null, }, showCallOutUnauthorizedMsg: false, + insertTimeline: null, }; /** The reducer for all timeline actions */ @@ -486,4 +488,8 @@ export const timelineReducer = reducerWithInitialState(initialTimelineState) timelineById: state.timelineById, }), })) + .case(setInsertTimeline, (state, insertTimeline) => ({ + ...state, + insertTimeline, + })) .build(); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts index af7ac075468c3..a80a28660e28b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts @@ -10,7 +10,7 @@ import { isFromKueryExpressionValid } from '../../../common/lib/keury'; import { State } from '../../../common/store/types'; import { TimelineModel } from './model'; -import { AutoSavedWarningMsg, TimelineById } from './types'; +import { AutoSavedWarningMsg, InsertTimeline, TimelineById } from './types'; const selectTimelineById = (state: State): TimelineById => state.timeline.timelineById; @@ -22,6 +22,9 @@ const selectCallOutUnauthorizedMsg = (state: State): boolean => export const selectTimeline = (state: State, timelineId: string): TimelineModel => state.timeline.timelineById[timelineId]; +export const selectInsertTimeline = (state: State): InsertTimeline | null => + state.timeline.insertTimeline; + export const autoSaveMsgSelector = createSelector(selectAutoSaveMsg, (autoSaveMsg) => autoSaveMsg); export const timelineByIdSelector = createSelector( diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts index 1cc4517d2c964..aa6c308614287 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts @@ -16,6 +16,12 @@ export interface TimelineById { [id: string]: TimelineModel; } +export interface InsertTimeline { + timelineId: string; + timelineSavedObjectId: string | null; + timelineTitle: string; +} + export const EMPTY_TIMELINE_BY_ID: TimelineById = {}; // stable reference /** The state of all timelines is stored here */ @@ -23,6 +29,7 @@ export interface TimelineState { timelineById: TimelineById; autoSavedWarningMsg: AutoSavedWarningMsg; showCallOutUnauthorizedMsg: boolean; + insertTimeline: InsertTimeline | null; } export interface ActionTimeline extends Action { From f4cfa491d8a2acbcd0365952cb6a893bd534c55f Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 9 Jun 2020 12:11:53 -0700 Subject: [PATCH 61/65] Prefer using npm_execpath when spawning Yarn (#68673) Prevents instances where an incorrect version of Yarn is used from a parent directory containing node_modules. Signed-off-by: Tyler Smalley --- packages/kbn-pm/dist/index.js | 9 +++++---- packages/kbn-pm/src/utils/scripts.ts | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 93152ef1b71dc..ef2b7e7c06a25 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -55242,6 +55242,7 @@ __webpack_require__.r(__webpack_exports__); * under the License. */ +const YARN_EXEC = process.env.npm_execpath || 'yarn'; /** * Install all dependencies in the given directory @@ -55250,7 +55251,7 @@ async function installInDir(directory, extraArgs = []) { const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any // given time (e.g. to avoid conflicts). - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', options, { + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, options, { cwd: directory }); } @@ -55262,7 +55263,7 @@ async function runScriptInPackage(script, args, pkg) { const execOpts = { cwd: pkg.path }; - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['run', script, ...args], execOpts); + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['run', script, ...args], execOpts); } /** * Run script in the given directory @@ -55277,7 +55278,7 @@ function runScriptInPackageStreaming({ const execOpts = { cwd: pkg.path }; - return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])('yarn', ['run', script, ...args], execOpts, { + return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])(YARN_EXEC, ['run', script, ...args], execOpts, { prefix: pkg.name, debug }); @@ -55285,7 +55286,7 @@ function runScriptInPackageStreaming({ async function yarnWorkspacesInfo(directory) { const { stdout - } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['--json', 'workspaces', 'info'], { + } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['--json', 'workspaces', 'info'], { cwd: directory, stdio: 'pipe' }); diff --git a/packages/kbn-pm/src/utils/scripts.ts b/packages/kbn-pm/src/utils/scripts.ts index 728ac4287b1ce..6b1dc729906f2 100644 --- a/packages/kbn-pm/src/utils/scripts.ts +++ b/packages/kbn-pm/src/utils/scripts.ts @@ -20,6 +20,8 @@ import { spawn, spawnStreaming } from './child_process'; import { Project } from './project'; +const YARN_EXEC = process.env.npm_execpath || 'yarn'; + interface WorkspaceInfo { location: string; workspaceDependencies: string[]; @@ -37,7 +39,7 @@ export async function installInDir(directory: string, extraArgs: string[] = []) // We pass the mutex flag to ensure only one instance of yarn runs at any // given time (e.g. to avoid conflicts). - await spawn('yarn', options, { + await spawn(YARN_EXEC, options, { cwd: directory, }); } @@ -50,7 +52,7 @@ export async function runScriptInPackage(script: string, args: string[], pkg: Pr cwd: pkg.path, }; - await spawn('yarn', ['run', script, ...args], execOpts); + await spawn(YARN_EXEC, ['run', script, ...args], execOpts); } /** @@ -71,14 +73,14 @@ export function runScriptInPackageStreaming({ cwd: pkg.path, }; - return spawnStreaming('yarn', ['run', script, ...args], execOpts, { + return spawnStreaming(YARN_EXEC, ['run', script, ...args], execOpts, { prefix: pkg.name, debug, }); } export async function yarnWorkspacesInfo(directory: string): Promise { - const { stdout } = await spawn('yarn', ['--json', 'workspaces', 'info'], { + const { stdout } = await spawn(YARN_EXEC, ['--json', 'workspaces', 'info'], { cwd: directory, stdio: 'pipe', }); From ccb607303b4f5d76c13f941703611854f40188c8 Mon Sep 17 00:00:00 2001 From: Andrew Cholakian Date: Tue, 9 Jun 2020 15:16:14 -0500 Subject: [PATCH 62/65] [Uptime] Fix race on overview page query (#67843) Fixes https://github.com/elastic/kibana/issues/67842 by requerying during the refine phase to see if a newer matching doc has come in. --- .../refine_potential_matches.test.ts | 112 ++++++++++++++++++ .../server/lib/requests/search/fetch_chunk.ts | 4 +- .../requests/search/find_potential_matches.ts | 44 +------ .../search/refine_potential_matches.ts | 90 +++++++++----- 4 files changed, 174 insertions(+), 76 deletions(-) create mode 100644 x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts new file mode 100644 index 0000000000000..283f5fb8909f6 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { fullyMatchingIds } from '../refine_potential_matches'; +import { MonitorLocCheckGroup } from '..'; + +const mockQueryResult = (opts: { latestSummary: any; latestMatching: any }) => { + return { + aggregations: { + monitor: { + buckets: [ + { + key: 'my-monitor', + location: { + buckets: [ + { + key: 'my-location', + summaries: { + latest: { + hits: { + hits: [ + { + _source: opts.latestSummary, + }, + ], + }, + }, + }, + latest_matching: { + top: { + hits: { + hits: [ + { + _source: opts.latestMatching, + }, + ], + }, + }, + }, + }, + ], + }, + }, + ], + }, + }, + }; +}; + +describe('fully matching IDs', () => { + it('should exclude items whose latest result does not match', () => { + const queryRes = mockQueryResult({ + latestSummary: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + monitor: { + check_group: 'latest-summary-check-group', + }, + summary: { + up: 1, + down: 0, + }, + }, + latestMatching: { + '@timestamp': '2019-06-04T12:39:54.698-0500', + summary: { + up: 1, + down: 0, + }, + }, + }); + const res = fullyMatchingIds(queryRes, undefined); + const expected = new Map(); + expect(res).toEqual(expected); + }); + + it('should include items whose latest result does match', () => { + const queryRes = mockQueryResult({ + latestSummary: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + monitor: { + check_group: 'latest-summary-check-group', + }, + summary: { + up: 1, + down: 0, + }, + }, + latestMatching: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + summary: { + up: 1, + down: 0, + }, + }, + }); + const res = fullyMatchingIds(queryRes, undefined); + const expected = new Map(); + expected.set('my-monitor', [ + { + checkGroup: 'latest-summary-check-group', + location: 'my-location', + monitorId: 'my-monitor', + status: 'up', + summaryTimestamp: new Date('2020-06-04T12:39:54.698-0500'), + }, + ]); + expect(res).toEqual(expected); + }); +}); diff --git a/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts b/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts index 77676ac9a6373..2a5f1f1261cb3 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts @@ -26,12 +26,12 @@ export const fetchChunk: ChunkFetcher = async ( searchAfter: any, size: number ): Promise => { - const { monitorIds, checkGroups, searchAfter: foundSearchAfter } = await findPotentialMatches( + const { monitorIds, searchAfter: foundSearchAfter } = await findPotentialMatches( queryContext, searchAfter, size ); - const matching = await refinePotentialMatches(queryContext, monitorIds, checkGroups); + const matching = await refinePotentialMatches(queryContext, monitorIds); return { monitorGroups: matching, diff --git a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts index a3e7324086073..ac4ff91230b95 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts @@ -8,12 +8,8 @@ import { get, set } from 'lodash'; import { CursorDirection } from '../../../../common/runtime_types'; import { QueryContext } from './query_context'; -// This is the first phase of the query. In it, we find the most recent check groups that matched the given query. -// Note that these check groups may not be the most recent groups for the matching monitor ID! We'll filter those /** - * This is the first phase of the query. In it, we find the most recent check groups that matched the given query. - * Note that these check groups may not be the most recent groups for the matching monitor ID. They'll be filtered - * out in the next phase. + * This is the first phase of the query. In it, we find all monitor IDs that have ever matched the given filters. * @param queryContext the data and resources needed to perform the query * @param searchAfter indicates where Elasticsearch should continue querying on subsequent requests, if at all * @param size the minimum size of the matches to chunk @@ -24,29 +20,14 @@ export const findPotentialMatches = async ( size: number ) => { const queryResult = await query(queryContext, searchAfter, size); - const checkGroups = new Set(); const monitorIds: string[] = []; get(queryResult, 'aggregations.monitors.buckets', []).forEach((b: any) => { const monitorId = b.key.monitor_id; monitorIds.push(monitorId); - - // Doc count can be zero if status filter optimization does not match - if (b.doc_count > 0) { - // Here we grab the most recent 2 check groups per location and add them to the list. - // Why 2? Because the most recent one may be a partial result from mode: all, and hence not match a summary doc. - b.locations.buckets.forEach((lb: any) => { - lb.ips.buckets.forEach((ib: any) => { - ib.top.hits.hits.forEach((h: any) => { - checkGroups.add(h._source.monitor.check_group); - }); - }); - }); - } }); return { monitorIds, - checkGroups, searchAfter: queryResult.aggregations?.monitors?.after_key, }; }; @@ -89,29 +70,6 @@ const queryBody = async (queryContext: QueryContext, searchAfter: any, size: num }, ], }, - aggs: { - // Here we grab the most recent 2 check groups per location. - // Why 2? Because the most recent one may not be for a summary, it may be incomplete. - locations: { - terms: { field: 'observer.geo.name', missing: '__missing__' }, - aggs: { - ips: { - terms: { field: 'monitor.ip', missing: '0.0.0.0' }, - aggs: { - top: { - top_hits: { - sort: [{ '@timestamp': 'desc' }], - _source: { - includes: ['monitor.check_group', '@timestamp'], - }, - size: 2, - }, - }, - }, - }, - }, - }, - }, }, }, }; diff --git a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts index e5e3de322cbc7..2f54f3f6dd689 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts @@ -18,18 +18,14 @@ import { MonitorGroups, MonitorLocCheckGroup } from './fetch_page'; // check groups for their associated monitor IDs. If not, it discards the result. export const refinePotentialMatches = async ( queryContext: QueryContext, - potentialMatchMonitorIDs: string[], - potentialMatchCheckGroups: Set + potentialMatchMonitorIDs: string[] ): Promise => { if (potentialMatchMonitorIDs.length === 0) { return []; } - const recentGroupsMatchingStatus = await fullyMatchingIds( - queryContext, - potentialMatchMonitorIDs, - potentialMatchCheckGroups - ); + const queryResult = await query(queryContext, potentialMatchMonitorIDs); + const recentGroupsMatchingStatus = await fullyMatchingIds(queryResult, queryContext.statusFilter); // Return the monitor groups filtering out potential matches that weren't current const matches: MonitorGroups[] = potentialMatchMonitorIDs @@ -49,27 +45,35 @@ export const refinePotentialMatches = async ( return matches; }; -const fullyMatchingIds = async ( - queryContext: QueryContext, - potentialMatchMonitorIDs: string[], - potentialMatchCheckGroups: Set -) => { - const mostRecentQueryResult = await mostRecentCheckGroups(queryContext, potentialMatchMonitorIDs); - +export const fullyMatchingIds = (queryResult: any, statusFilter?: string) => { const matching = new Map(); - MonitorLoop: for (const monBucket of mostRecentQueryResult.aggregations.monitor.buckets) { + MonitorLoop: for (const monBucket of queryResult.aggregations.monitor.buckets) { const monitorId: string = monBucket.key; const groups: MonitorLocCheckGroup[] = []; + // Did at least one location match? + let matched = false; for (const locBucket of monBucket.location.buckets) { const location = locBucket.key; - const topSource = locBucket.top.hits.hits[0]._source; - const checkGroup = topSource.monitor.check_group; - const status = topSource.summary.down > 0 ? 'down' : 'up'; + const latestSource = locBucket.summaries.latest.hits.hits[0]._source; + const latestStillMatchingSource = locBucket.latest_matching.top.hits.hits[0]?._source; + // If the most recent document still matches the most recent document matching the current filters + // we can include this in the result + // + // We just check if the timestamp is greater. Note this may match an incomplete check group + // that has not yet sent a summary doc + if ( + latestStillMatchingSource && + latestStillMatchingSource['@timestamp'] >= latestSource['@timestamp'] + ) { + matched = true; + } + const checkGroup = latestSource.monitor.check_group; + const status = latestSource.summary.down > 0 ? 'down' : 'up'; // This monitor doesn't match, so just skip ahead and don't add it to the output // Only skip in case of up statusFilter, for a monitor to be up, all checks should be up - if (queryContext?.statusFilter === 'up' && queryContext.statusFilter !== status) { + if (statusFilter === 'up' && statusFilter !== status) { continue MonitorLoop; } @@ -78,12 +82,12 @@ const fullyMatchingIds = async ( location, checkGroup, status, - summaryTimestamp: topSource['@timestamp'], + summaryTimestamp: new Date(latestSource['@timestamp']), }); } - // We only truly match the monitor if one of the most recent check groups was found in the potential matches phase - if (groups.some((g) => potentialMatchCheckGroups.has(g.checkGroup))) { + // If one location matched, include data from all locations in the result set + if (matched) { matching.set(monitorId, groups); } } @@ -91,7 +95,7 @@ const fullyMatchingIds = async ( return matching; }; -export const mostRecentCheckGroups = async ( +export const query = async ( queryContext: QueryContext, potentialMatchMonitorIDs: string[] ): Promise => { @@ -104,8 +108,6 @@ export const mostRecentCheckGroups = async ( filter: [ await queryContext.dateRangeFilter(), { terms: { 'monitor.id': potentialMatchMonitorIDs } }, - // only match summary docs because we only want the latest *complete* check group. - { exists: { field: 'summary' } }, ], }, }, @@ -116,13 +118,39 @@ export const mostRecentCheckGroups = async ( location: { terms: { field: 'observer.geo.name', missing: 'N/A', size: 100 }, aggs: { - top: { - top_hits: { - sort: [{ '@timestamp': 'desc' }], - _source: { - includes: ['monitor.check_group', '@timestamp', 'summary.up', 'summary.down'], + summaries: { + // only match summary docs because we only want the latest *complete* check group. + filter: { exists: { field: 'summary' } }, + aggs: { + latest: { + top_hits: { + sort: [{ '@timestamp': 'desc' }], + _source: { + includes: [ + 'monitor.check_group', + '@timestamp', + 'summary.up', + 'summary.down', + ], + }, + size: 1, + }, + }, + }, + }, + // We want to find the latest check group, even if it's not part of a summary + latest_matching: { + filter: queryContext.filterClause || { match_all: {} }, + aggs: { + top: { + top_hits: { + sort: [{ '@timestamp': 'desc' }], + _source: { + includes: ['monitor.check_group', '@timestamp'], + }, + size: 1, + }, }, - size: 1, }, }, }, From 696d71e13a436b536b518a3e3ff097c33596417c Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 9 Jun 2020 16:37:03 -0400 Subject: [PATCH 63/65] [ML] DF Analytics: Creation wizard part 2 (#68462) * Add ability to clone job * remove deprecated creation form code * ensure excludes cloned correctly and update clone action jest test * remove unused translations * update helper function name --- .../data_frame_analytics/_index.scss | 2 - .../analysis_fields_table.tsx | 2 +- .../configuration_step_form.tsx | 38 +- .../form_options_validation.ts | 2 +- .../supported_fields_message.tsx | 5 +- .../create_analytics_advanced_editor.tsx | 7 +- .../create_analytics_advanced_editor/index.ts | 0 .../components/create_step/create_step.tsx | 13 +- .../components/shared}/index.ts | 2 +- .../components/shared}/messages.tsx | 2 +- .../pages/analytics_creation/page.tsx | 54 +- .../analytics_list/action_clone.test.ts | 38 +- .../analytics_list/action_clone.tsx | 74 +- .../components/analytics_list/actions.tsx | 14 +- .../analytics_list/analytics_list.tsx | 7 - .../_create_analytics_flyout.scss | 3 - .../create_analytics_flyout/_index.scss | 1 - .../create_analytics_flyout.test.tsx | 42 - .../create_analytics_flyout.tsx | 108 --- .../create_analytics_flyout/index.ts | 7 - .../create_analytics_flyout_wrapper.tsx | 28 - .../create_analytics_flyout_wrapper/index.ts | 7 - .../_create_analytics_form.scss | 31 - .../create_analytics_form/_index.scss | 1 - .../create_analytics_form.test.tsx | 69 -- .../create_analytics_form.tsx | 850 ------------------ .../create_analytics_form/job_description.tsx | 37 - .../create_analytics_form/job_type.tsx | 80 -- .../use_create_analytics_form/actions.ts | 7 - .../use_create_analytics_form/reducer.test.ts | 15 - .../use_create_analytics_form/reducer.ts | 12 - .../use_create_analytics_form/state.test.ts | 54 +- .../hooks/use_create_analytics_form/state.ts | 27 +- .../use_create_analytics_form.test.tsx | 28 +- .../use_create_analytics_form.ts | 21 - .../analytics_job_creation.tsx | 7 +- .../translations/translations/ja-JP.json | 17 - .../translations/translations/zh-CN.json | 17 - 38 files changed, 236 insertions(+), 1493 deletions(-) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/configuration_step}/form_options_validation.ts (93%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management => analytics_creation}/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx (95%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management => analytics_creation}/components/create_analytics_advanced_editor/index.ts (100%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/shared}/index.ts (79%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/shared}/messages.tsx (92%) delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss index 5508c021d3313..140593cb17f6e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss @@ -1,5 +1,3 @@ @import 'pages/analytics_exploration/components/regression_exploration/index'; @import 'pages/analytics_management/components/analytics_list/index'; -@import 'pages/analytics_management/components/create_analytics_form/index'; -@import 'pages/analytics_management/components/create_analytics_flyout/index'; @import 'pages/analytics_management/components/create_analytics_button/index'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx index ad540285e49f0..09aea596d81e9 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx @@ -85,7 +85,7 @@ export const MemoizedAnalysisFieldsTable: FC<{ if (excludes.length > 0) { setCurrentSelection(excludes); } - }, []); + }, [tableItems]); // Only set form state on unmount to prevent re-renders due to props changing if exludes was updated on each selection useEffect(() => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 9446dfd4ed525..e63756686a4ba 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -20,13 +20,13 @@ import { TRAINING_PERCENT_MAX, } from '../../../../common/analytics'; import { CreateAnalyticsStepProps } from '../../../analytics_management/hooks/use_create_analytics_form'; -import { Messages } from '../../../analytics_management/components/create_analytics_form/messages'; +import { Messages } from '../shared'; import { DEFAULT_MODEL_MEMORY_LIMIT, getJobConfigFromFormState, State, } from '../../../analytics_management/hooks/use_create_analytics_form/state'; -import { shouldAddAsDepVarOption } from '../../../analytics_management/components/create_analytics_form/form_options_validation'; +import { shouldAddAsDepVarOption } from './form_options_validation'; import { ml } from '../../../../../services/ml_api_service'; import { getToastNotifications } from '../../../../../util/dependency_cache'; @@ -56,7 +56,7 @@ export const ConfigurationStepForm: FC = ({ const { currentSavedSearch, currentIndexPattern } = mlContext; const { savedSearchQuery, savedSearchQueryStr } = useSavedSearch(); - const { initiateWizard, setEstimatedModelMemoryLimit, setFormState } = actions; + const { setEstimatedModelMemoryLimit, setFormState } = actions; const { estimatedModelMemoryLimit, form, isJobCreated, requestMessages } = state; const firstUpdate = useRef(true); const { @@ -75,9 +75,12 @@ export const ConfigurationStepForm: FC = ({ modelMemoryLimit, previousJobType, requiredFieldsError, + sourceIndex, trainingPercent, } = form; + const toastNotifications = getToastNotifications(); + const setJobConfigQuery = ({ query, queryString }: { query: any; queryString: string }) => { setFormState({ jobConfigQuery: query, jobConfigQueryString: queryString }); }; @@ -90,7 +93,7 @@ export const ConfigurationStepForm: FC = ({ const indexPreviewProps = { ...indexData, dataTestSubj: 'mlAnalyticsCreationDataGrid', - toastNotifications: getToastNotifications(), + toastNotifications, }; const isJobTypeWithDepVar = @@ -209,7 +212,8 @@ export const ConfigurationStepForm: FC = ({ }); } } catch (e) { - let errorMessage; + let maxDistinctValuesErrorMessage; + if ( jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && e.body && @@ -218,7 +222,23 @@ export const ConfigurationStepForm: FC = ({ (e.body.message.includes('must have at most') || e.body.message.includes('must have at least')) ) { - errorMessage = e.body.message; + maxDistinctValuesErrorMessage = e.body.message; + } + + if ( + e.body && + e.body.message !== undefined && + e.body.message.includes('status_exception') && + e.body.message.includes('Unable to estimate memory usage as no documents') + ) { + toastNotifications.addWarning( + i18n.translate('xpack.ml.dataframe.analytics.create.allDocsMissingFieldsErrorMessage', { + defaultMessage: `Unable to estimate memory usage. There are mapped fields for source index [{index}] that do not exist in any indexed documents. You will have to switch to the JSON editor for explicit field selection and include only fields that exist in indexed documents.`, + values: { + index: sourceIndex, + }, + }) + ); } const fallbackModelMemoryLimit = jobType !== undefined @@ -227,17 +247,13 @@ export const ConfigurationStepForm: FC = ({ setEstimatedModelMemoryLimit(fallbackModelMemoryLimit); setFormState({ fieldOptionsFetchFail: true, - maxDistinctValuesError: errorMessage, + maxDistinctValuesError: maxDistinctValuesErrorMessage, loadingFieldOptions: false, ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: fallbackModelMemoryLimit } : {}), }); } }, 300); - useEffect(() => { - initiateWizard(); - }, []); - useEffect(() => { setFormState({ sourceIndex: currentIndexPattern.title }); }, []); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts similarity index 93% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts index 0579283c97d61..bf3ab01549139 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts @@ -7,7 +7,7 @@ import { ES_FIELD_TYPES } from '../../../../../../../../../../src/plugins/data/public'; import { Field, EVENT_RATE_FIELD_ID } from '../../../../../../../common/types/fields'; import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; -import { AnalyticsJobType } from '../../hooks/use_create_analytics_form/state'; +import { AnalyticsJobType } from '../../../analytics_management/hooks/use_create_analytics_form/state'; import { BASIC_NUMERICAL_TYPES, EXTENDED_NUMERICAL_TYPES } from '../../../../common/fields'; export const CATEGORICAL_TYPES = new Set(['ip', 'keyword']); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx index fe13cc1d6edfc..0a4ba67831818 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx @@ -12,10 +12,7 @@ import { AnalyticsJobType } from '../../../analytics_management/hooks/use_create import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; import { Field, EVENT_RATE_FIELD_ID } from '../../../../../../../common/types/fields'; import { BASIC_NUMERICAL_TYPES, EXTENDED_NUMERICAL_TYPES } from '../../../../common/fields'; -import { - OMIT_FIELDS, - CATEGORICAL_TYPES, -} from '../../../analytics_management/components/create_analytics_form/form_options_validation'; +import { OMIT_FIELDS, CATEGORICAL_TYPES } from './form_options_validation'; import { ES_FIELD_TYPES } from '../../../../../../../../../../src/plugins/data/public'; import { newJobCapsService } from '../../../../../services/new_job_capabilities_service'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx similarity index 95% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx index 17b905cab135b..a35a314bec985 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx @@ -22,9 +22,9 @@ import { XJsonMode } from '../../../../../../../shared_imports'; const xJsonMode = new XJsonMode(); -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { CreateStep } from '../../../analytics_creation/components/create_step'; -import { ANALYTICS_STEPS } from '../../../analytics_creation/page'; +import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; +import { CreateStep } from '../create_step'; +import { ANALYTICS_STEPS } from '../../page'; export const CreateAnalyticsAdvancedEditor: FC = (props) => { const { actions, state } = props; @@ -125,7 +125,6 @@ export const CreateAnalyticsAdvancedEditor: FC = (prop onChange={onChange} setOptions={{ fontSize: '12px', - maxLines: 20, }} theme="textmate" aria-label={i18n.translate( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/index.ts similarity index 100% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/index.ts rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/index.ts diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx index 2dda5f5d819b7..8d51848a25f50 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; -import { Messages } from '../../../analytics_management/components/create_analytics_form/messages'; +import { Messages } from '../shared'; import { ANALYTICS_STEPS } from '../../page'; import { BackToListPanel } from '../back_to_list_panel'; @@ -26,14 +26,7 @@ interface Props extends CreateAnalyticsFormProps { export const CreateStep: FC = ({ actions, state, step }) => { const { createAnalyticsJob, startAnalyticsJob } = actions; - const { - isAdvancedEditorValidJson, - isJobCreated, - isJobStarted, - isModalButtonDisabled, - isValid, - requestMessages, - } = state; + const { isAdvancedEditorValidJson, isJobCreated, isJobStarted, isValid, requestMessages } = state; const [checked, setChecked] = useState(true); @@ -75,7 +68,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { { +interface Props { + jobId?: DataFrameAnalyticsId; +} + +export const Page: FC = ({ jobId }) => { const [currentStep, setCurrentStep] = useState(ANALYTICS_STEPS.CONFIGURATION); const [activatedSteps, setActivatedSteps] = useState([true, false, false, false]); @@ -44,23 +50,36 @@ export const Page: FC = () => { const createAnalyticsForm = useCreateAnalyticsForm(); const { isAdvancedEditorEnabled } = createAnalyticsForm.state; const { jobType } = createAnalyticsForm.state.form; - const { switchToAdvancedEditor } = createAnalyticsForm.actions; + const { initiateWizard, setJobClone, switchToAdvancedEditor } = createAnalyticsForm.actions; useEffect(() => { - if (activatedSteps[currentStep] === false) { - activatedSteps.splice(currentStep, 1, true); - setActivatedSteps(activatedSteps); - } - }, [currentStep]); + initiateWizard(); - useEffect(() => { if (currentIndexPattern) { (async function () { await newJobCapsService.initializeFromIndexPattern(currentIndexPattern, false, false); + + if (jobId !== undefined) { + const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId); + if ( + Array.isArray(analyticsConfigs.data_frame_analytics) && + analyticsConfigs.data_frame_analytics.length > 0 + ) { + const clonedJobConfig: any = analyticsConfigs.data_frame_analytics[0]; + await setJobClone(clonedJobConfig); + } + } })(); } }, []); + useEffect(() => { + if (activatedSteps[currentStep] === false) { + activatedSteps.splice(currentStep, 1, true); + setActivatedSteps(activatedSteps); + } + }, [currentStep]); + const analyticsWizardSteps = [ { title: i18n.translate('xpack.ml.dataframe.analytics.creation.configurationStepTitle', { @@ -127,10 +146,19 @@ export const Page: FC = () => {

- + {jobId === undefined && ( + + )} + {jobId !== undefined && ( + + )}

diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts index 9221f8c500326..01d92d8e192c1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts @@ -140,8 +140,8 @@ describe('Analytics job clone action', () => { expect(isAdvancedConfig(advancedClassificationJob)).toBe(true); }); - test('should detect advanced outlier_detection job', () => { - const advancedOutlierDetectionJob = { + test('should detect advanced regression job', () => { + const advancedRegressionJob = { description: "Outlier detection job with 'glass' dataset", source: { index: ['glass_withoutdupl_norm'], @@ -155,10 +155,8 @@ describe('Analytics job clone action', () => { results_field: 'ml', }, analysis: { - outlier_detection: { - compute_feature_influence: false, - outlier_fraction: 0.05, - standardization_enabled: true, + regression: { + loss_function: 'msle', }, }, analyzed_fields: { @@ -168,7 +166,7 @@ describe('Analytics job clone action', () => { model_memory_limit: '1mb', allow_lazy_start: false, }; - expect(isAdvancedConfig(advancedOutlierDetectionJob)).toBe(true); + expect(isAdvancedConfig(advancedRegressionJob)).toBe(true); }); test('should detect a custom query', () => { @@ -207,32 +205,6 @@ describe('Analytics job clone action', () => { expect(isAdvancedConfig(advancedRegressionJob)).toBe(true); }); - test('should detect custom analysis settings', () => { - const config = { - description: "Classification clone with 'bank-marketing' dataset", - source: { - index: 'bank-marketing', - }, - dest: { - index: 'bank_classification4', - }, - analyzed_fields: { - excludes: [], - }, - analysis: { - classification: { - dependent_variable: 'y', - training_percent: 71, - max_trees: 1500, - num_top_feature_importance_values: 4, - }, - }, - model_memory_limit: '400mb', - }; - - expect(isAdvancedConfig(config)).toBe(true); - }); - test('should detect as advanced if the prop is unknown', () => { const config = { description: "Classification clone with 'bank-marketing' dataset", diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx index cfb11856670c4..a1f0448b819d1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx @@ -8,10 +8,12 @@ import { EuiButtonEmpty } from '@elastic/eui'; import React, { FC } from 'react'; import { isEqual, cloneDeep } from 'lodash'; import { i18n } from '@kbn/i18n'; +import { IIndexPattern } from 'src/plugins/data/common'; import { DeepReadonly } from '../../../../../../../common/types/common'; import { DataFrameAnalyticsConfig, isOutlierAnalysis } from '../../../../common'; import { isClassificationAnalysis, isRegressionAnalysis } from '../../../../common/analytics'; import { DEFAULT_RESULTS_FIELD } from '../../../../common/constants'; +import { useMlKibana } from '../../../../../contexts/kibana'; import { CreateAnalyticsFormProps, DEFAULT_NUM_TOP_FEATURE_IMPORTANCE_VALUES, @@ -19,6 +21,7 @@ import { import { State } from '../../hooks/use_create_analytics_form/state'; import { DataFrameAnalyticsListRow } from './common'; import { checkPermission } from '../../../../../capabilities/check_capabilities'; +import { extractErrorMessage } from '../../../../../util/error_utils'; interface PropDefinition { /** @@ -74,31 +77,39 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo }, eta: { optional: true, + formKey: 'eta', }, feature_bag_fraction: { optional: true, + formKey: 'featureBagFraction', }, max_trees: { optional: true, + formKey: 'maxTrees', }, gamma: { optional: true, + formKey: 'gamma', }, lambda: { optional: true, + formKey: 'lambda', }, num_top_classes: { optional: true, defaultValue: 2, + formKey: 'numTopClasses', }, prediction_field_name: { optional: true, defaultValue: `${config.analysis.classification.dependent_variable}_prediction`, + formKey: 'predictionFieldName', }, randomize_seed: { optional: true, // By default it is randomly generated ignore: true, + formKey: 'randomizeSeed', }, num_top_feature_importance_values: { optional: true, @@ -118,23 +129,29 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo standardization_enabled: { defaultValue: true, optional: true, + formKey: 'standardizationEnabled', }, compute_feature_influence: { defaultValue: true, optional: true, + formKey: 'computeFeatureInfluence', }, outlier_fraction: { defaultValue: 0.05, optional: true, + formKey: 'outlierFraction', }, feature_influence_threshold: { optional: true, + formKey: 'featureInfluenceThreshold', }, method: { optional: true, + formKey: 'method', }, n_neighbors: { optional: true, + formKey: 'nNeighbors', }, }, } @@ -152,22 +169,28 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo }, eta: { optional: true, + formKey: 'eta', }, feature_bag_fraction: { optional: true, + formKey: 'featureBagFraction', }, max_trees: { optional: true, + formKey: 'maxTrees', }, gamma: { optional: true, + formKey: 'gamma', }, lambda: { optional: true, + formKey: 'lambda', }, prediction_field_name: { optional: true, defaultValue: `${config.analysis.regression.dependent_variable}_prediction`, + formKey: 'predictionFieldName', }, num_top_feature_importance_values: { optional: true, @@ -178,11 +201,15 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo optional: true, // By default it is randomly generated ignore: true, + formKey: 'randomizeSeed', }, loss_function: { optional: true, defaultValue: 'mse', }, + loss_function_parameter: { + optional: true, + }, }, } : {}), @@ -332,9 +359,52 @@ export const CloneAction: FC = ({ createAnalyticsForm, item }) const buttonText = i18n.translate('xpack.ml.dataframe.analyticsList.cloneJobButtonLabel', { defaultMessage: 'Clone job', }); - const { actions } = createAnalyticsForm; + + const { notifications, savedObjects } = useMlKibana().services; + const savedObjectsClient = savedObjects.client; + const onClick = async () => { - await actions.setJobClone(item.config); + const sourceIndex = Array.isArray(item.config.source.index) + ? item.config.source.index[0] + : item.config.source.index; + let sourceIndexId; + + try { + const response = await savedObjectsClient.find({ + type: 'index-pattern', + perPage: 10, + search: `"${sourceIndex}"`, + searchFields: ['title'], + fields: ['title'], + }); + + const ip = response.savedObjects.find( + (obj) => obj.attributes.title.toLowerCase() === sourceIndex.toLowerCase() + ); + if (ip !== undefined) { + sourceIndexId = ip.id; + } + } catch (e) { + const { toasts } = notifications; + const error = extractErrorMessage(e); + + toasts.addDanger( + i18n.translate( + 'xpack.ml.dataframe.analyticsList.fetchSourceIndexPatternForCloneErrorMessage', + { + defaultMessage: + 'An error occurred checking if index pattern {indexPattern} exists: {error}', + values: { indexPattern: sourceIndex, error }, + } + ) + ); + } + + if (sourceIndexId) { + window.location.href = `ml#/data_frame_analytics/new_job?index=${encodeURIComponent( + sourceIndexId + )}&jobId=${item.config.id}`; + } }; return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx index 295a3988e1b58..72514c91ff58b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiToolTip } from '@elastic/eui'; -// import { DeepReadonly } from '../../../../../../../common/types/common'; +import { DeepReadonly } from '../../../../../../../common/types/common'; import { checkPermission, @@ -21,7 +21,7 @@ import { isClassificationAnalysis, } from '../../../../common/analytics'; import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -// import { CloneAction } from './action_clone'; +import { CloneAction } from './action_clone'; import { getResultsUrl, isDataFrameAnalyticsRunning, DataFrameAnalyticsListRow } from './common'; import { stopAnalytics } from '../../services/analytics_service'; @@ -106,10 +106,10 @@ export const getActions = (createAnalyticsForm: CreateAnalyticsFormProps) => { return ; }, }, - // { - // render: (item: DeepReadonly) => { - // return ; - // }, - // }, + { + render: (item: DeepReadonly) => { + return ; + }, + }, ]; }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx index bb012a2190859..25e3a2808fc61 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx @@ -51,7 +51,6 @@ import { AnalyticStatsBarStats, StatsBar } from '../../../../../components/stats import { RefreshAnalyticsListButton } from '../refresh_analytics_list_button'; import { CreateAnalyticsButton } from '../create_analytics_button'; import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { CreateAnalyticsFlyoutWrapper } from '../create_analytics_flyout_wrapper'; import { getSelectedJobIdFromUrl } from '../../../../../jobs/jobs_list/components/utils'; import { SourceSelection } from '../source_selection'; @@ -286,9 +285,6 @@ export const DataFrameAnalyticsList: FC = ({ } data-test-subj="mlNoDataFrameAnalyticsFound" /> - {!isManagementTable && createAnalyticsForm && ( - - )} {isSourceIndexModalVisible === true && ( setIsSourceIndexModalVisible(false)} /> )} @@ -440,9 +436,6 @@ export const DataFrameAnalyticsList: FC = ({ />
- {!isManagementTable && createAnalyticsForm?.state.isModalVisible && ( - - )} {isSourceIndexModalVisible === true && ( setIsSourceIndexModalVisible(false)} /> )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss deleted file mode 100644 index e6c6ffafc446a..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss +++ /dev/null @@ -1,3 +0,0 @@ -.mlAnalyticsCreateFlyout__footerButton { - float: right; -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss deleted file mode 100644 index 668b35f8370d2..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'create_analytics_flyout'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx deleted file mode 100644 index dc91c955184b0..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { mount } from 'enzyme'; -import React from 'react'; -import { mountHook } from 'test_utils/enzyme_helpers'; - -import { CreateAnalyticsFlyout } from './create_analytics_flyout'; - -import { MlContext } from '../../../../../contexts/ml'; -import { kibanaContextValueMock } from '../../../../../contexts/ml/__mocks__/kibana_context_value'; - -import { useCreateAnalyticsForm } from '../../hooks/use_create_analytics_form'; - -const getMountedHook = () => - mountHook( - () => useCreateAnalyticsForm(), - ({ children }) => ( - {children} - ) - ); - -// workaround to make React.memo() work with enzyme -jest.mock('react', () => { - const r = jest.requireActual('react'); - return { ...r, memo: (x: any) => x }; -}); - -describe('Data Frame Analytics: ', () => { - test('Minimal initialization', () => { - const { getLastHookValue } = getMountedHook(); - const props = getLastHookValue(); - const wrapper = mount(); - - expect(wrapper.find('[data-test-subj="mlDataFrameAnalyticsFlyoutHeaderTitle"]').text()).toBe( - 'Create analytics job' - ); - }); -}); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx deleted file mode 100644 index b0f13e398cc50..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; - -import { - EuiButton, - EuiButtonEmpty, - EuiFlyout, - EuiFlyoutBody, - EuiFlyoutHeader, - EuiFlyoutFooter, - EuiTitle, -} from '@elastic/eui'; - -import { i18n } from '@kbn/i18n'; - -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; - -export const CreateAnalyticsFlyout: FC = ({ - actions, - children, - state, -}) => { - const { closeModal, createAnalyticsJob, startAnalyticsJob } = actions; - const { - isJobCreated, - isJobStarted, - isModalButtonDisabled, - isValid, - isAdvancedEditorValidJson, - cloneJob, - } = state; - - const headerText = !!cloneJob - ? i18n.translate('xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle', { - defaultMessage: 'Clone job from {job_id}', - values: { job_id: cloneJob.id }, - }) - : i18n.translate('xpack.ml.dataframe.analytics.create.flyoutHeaderTitle', { - defaultMessage: 'Create analytics job', - }); - - return ( - - - -

{headerText}

-
-
- {children} - - {(!isJobCreated || !isJobStarted) && ( - - {isJobCreated === true - ? i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCloseButton', { - defaultMessage: 'Close', - }) - : i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCancelButton', { - defaultMessage: 'Cancel', - })} - - )} - - {!isJobCreated && !isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCreateButton', { - defaultMessage: 'Create', - })} - - )} - {isJobCreated && !isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutStartButton', { - defaultMessage: 'Start', - })} - - )} - {isJobCreated && isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCloseButton', { - defaultMessage: 'Close', - })} - - )} - -
- ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts deleted file mode 100644 index 3a25359373aa6..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { CreateAnalyticsFlyout } from './create_analytics_flyout'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx deleted file mode 100644 index 2f3c38b6ffe4e..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; - -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; - -import { CreateAnalyticsAdvancedEditor } from '../create_analytics_advanced_editor'; -import { CreateAnalyticsForm } from '../create_analytics_form'; -import { CreateAnalyticsFlyout } from '../create_analytics_flyout'; - -export const CreateAnalyticsFlyoutWrapper: FC = (props) => { - const { isAdvancedEditorEnabled, isModalVisible } = props.state; - - if (isModalVisible === false) { - return null; - } - - return ( - - {isAdvancedEditorEnabled === false && } - {isAdvancedEditorEnabled === true && } - - ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts deleted file mode 100644 index c8e7a958f6d42..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { CreateAnalyticsFlyoutWrapper } from './create_analytics_flyout_wrapper'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss deleted file mode 100644 index 9b4559f9e2cb2..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss +++ /dev/null @@ -1,31 +0,0 @@ -/* - The job creation form displayed in the modal adapts its height dynamically - if the content changes. If a form element changes to show/hide error messages, - this results in a changing height of the modal. If you type quickly e.g. - in the job ID input field and type chars which are invalid only for example - at the end of the string, this will result in an unwanted height toggling - effect. The following CSS avoids this by 1) delaying the visilibity of the - error message by 500ms and 2) animating the height and opacity to create - a fade-in effect after that so the modal grows smoothly and doesn't - toggle its height. - */ - -@keyframes mlDelayedShow { - 0%, 50% { - max-height: 0; - opacity: 0; - padding: 0; - visibility: hidden; - } - 100% { - max-height: 300px; - opacity: 1; - padding-top: $euiSizeS; - } -} - -.mlDataFrameAnalyticsCreateForm { - .euiFormErrorText { - animation: mlDelayedShow 1s; - } -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss deleted file mode 100644 index 66fa2c02e60f5..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'create_analytics_form'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx deleted file mode 100644 index 85cd70912b41f..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { mount } from 'enzyme'; -import React from 'react'; -import { mountHook } from 'test_utils/enzyme_helpers'; - -import { CreateAnalyticsForm } from './create_analytics_form'; - -import { MlContext } from '../../../../../contexts/ml'; -import { kibanaContextValueMock } from '../../../../../contexts/ml/__mocks__/kibana_context_value'; - -import { useCreateAnalyticsForm } from '../../hooks/use_create_analytics_form'; - -const getMountedHook = () => - mountHook( - () => useCreateAnalyticsForm(), - ({ children }) => ( - {children} - ) - ); - -// workaround to make React.memo() work with enzyme -jest.mock('react', () => { - const r = jest.requireActual('react'); - return { ...r, memo: (x: any) => x }; -}); - -jest.mock('../../../../../contexts/kibana', () => ({ - useMlKibana: () => { - return { - services: { - docLinks: () => ({ - ELASTIC_WEBSITE_URL: 'https://www.elastic.co/', - DOC_LINK_VERSION: 'jest-metadata-mock-branch', - }), - }, - }; - }, -})); - -describe('Data Frame Analytics: ', () => { - test('Minimal initialization', () => { - const { getLastHookValue } = getMountedHook(); - const props = getLastHookValue(); - const wrapper = mount( - - - - ); - - const euiFormRows = wrapper.find('EuiFormRow'); - expect(euiFormRows.length).toBe(10); - - const row1 = euiFormRows.at(0); - expect(row1.find('label').text()).toBe('Job type'); - - const options = row1.find('option'); - expect(options.at(0).props().value).toBe(''); - expect(options.at(1).props().value).toBe('outlier_detection'); - expect(options.at(2).props().value).toBe('regression'); - - const row2 = euiFormRows.at(1); - expect(row2.find('EuiSwitch').text()).toBe('Enable advanced editor'); - }); -}); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx deleted file mode 100644 index 64fe736e67b17..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx +++ /dev/null @@ -1,850 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Fragment, FC, useEffect, useMemo, useRef } from 'react'; - -import { - EuiComboBox, - EuiComboBoxOptionOption, - EuiForm, - EuiFieldNumber, - EuiFieldText, - EuiFormRow, - EuiLink, - EuiRange, - EuiSwitch, -} from '@elastic/eui'; -import { debounce } from 'lodash'; - -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { useMlKibana } from '../../../../../contexts/kibana'; -import { ml } from '../../../../../services/ml_api_service'; -import { newJobCapsService } from '../../../../../services/new_job_capabilities_service'; -import { useMlContext } from '../../../../../contexts/ml'; -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { - DEFAULT_MODEL_MEMORY_LIMIT, - getJobConfigFromFormState, - State, -} from '../../hooks/use_create_analytics_form/state'; -import { JOB_ID_MAX_LENGTH } from '../../../../../../../common/constants/validation'; -import { Messages } from './messages'; -import { JobType } from './job_type'; -import { JobDescriptionInput } from './job_description'; -import { getModelMemoryLimitErrors } from '../../hooks/use_create_analytics_form/reducer'; -import { IndexPattern, indexPatterns } from '../../../../../../../../../../src/plugins/data/public'; -import { - ANALYSIS_CONFIG_TYPE, - DfAnalyticsExplainResponse, - FieldSelectionItem, - NUM_TOP_FEATURE_IMPORTANCE_VALUES_MIN, - TRAINING_PERCENT_MIN, - TRAINING_PERCENT_MAX, -} from '../../../../common/analytics'; -import { shouldAddAsDepVarOption, OMIT_FIELDS } from './form_options_validation'; - -const requiredFieldsErrorText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.requiredFieldsErrorMessage', - { - defaultMessage: 'At least one field must be included in the analysis.', - } -); - -export const CreateAnalyticsForm: FC = ({ actions, state }) => { - const { - services: { docLinks }, - } = useMlKibana(); - const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = docLinks; - const { setFormState, setEstimatedModelMemoryLimit } = actions; - const mlContext = useMlContext(); - const { - estimatedModelMemoryLimit, - form, - indexPatternsMap, - isAdvancedEditorEnabled, - isJobCreated, - requestMessages, - } = state; - - const forceInput = useRef(null); - const firstUpdate = useRef(true); - - const { - createIndexPattern, - dependentVariable, - dependentVariableFetchFail, - dependentVariableOptions, - description, - destinationIndex, - destinationIndexNameEmpty, - destinationIndexNameExists, - destinationIndexNameValid, - destinationIndexPatternTitleExists, - excludes, - excludesOptions, - fieldOptionsFetchFail, - jobId, - jobIdEmpty, - jobIdExists, - jobIdValid, - jobIdInvalidMaxLength, - jobType, - loadingDepVarOptions, - loadingFieldOptions, - maxDistinctValuesError, - modelMemoryLimit, - modelMemoryLimitValidationResult, - numTopFeatureImportanceValues, - numTopFeatureImportanceValuesValid, - previousJobType, - previousSourceIndex, - requiredFieldsError, - sourceIndex, - sourceIndexNameEmpty, - sourceIndexNameValid, - sourceIndexContainsNumericalFields, - sourceIndexFieldsCheckFailed, - trainingPercent, - } = form; - const characterList = indexPatterns.ILLEGAL_CHARACTERS_VISIBLE.join(', '); - - const mmlErrors = useMemo(() => getModelMemoryLimitErrors(modelMemoryLimitValidationResult), [ - modelMemoryLimitValidationResult, - ]); - - const isJobTypeWithDepVar = - jobType === ANALYSIS_CONFIG_TYPE.REGRESSION || jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION; - - // Find out if index pattern contain numeric fields. Provides a hint in the form - // that an analytics jobs is not able to identify outliers if there are no numeric fields present. - const validateSourceIndexFields = async () => { - try { - const indexPattern: IndexPattern = await mlContext.indexPatterns.get( - indexPatternsMap[sourceIndex].value - ); - const containsNumericalFields: boolean = indexPattern.fields.some( - ({ name, type }) => !OMIT_FIELDS.includes(name) && type === 'number' - ); - - setFormState({ - sourceIndexContainsNumericalFields: containsNumericalFields, - sourceIndexFieldsCheckFailed: false, - }); - } catch (e) { - setFormState({ - sourceIndexFieldsCheckFailed: true, - }); - } - }; - - const onCreateOption = (searchValue: string, flattenedOptions: EuiComboBoxOptionOption[]) => { - const normalizedSearchValue = searchValue.trim().toLowerCase(); - - if (!normalizedSearchValue) { - return; - } - - const newOption = { - label: searchValue, - }; - - // Create the option if it doesn't exist. - if ( - !flattenedOptions.some( - (option: EuiComboBoxOptionOption) => - option.label.trim().toLowerCase() === normalizedSearchValue - ) - ) { - excludesOptions.push(newOption); - setFormState({ excludes: [...excludes, newOption.label] }); - } - }; - - const debouncedGetExplainData = debounce(async () => { - const jobTypeOrIndexChanged = - previousSourceIndex !== sourceIndex || previousJobType !== jobType; - const shouldUpdateModelMemoryLimit = !firstUpdate.current || !modelMemoryLimit; - const shouldUpdateEstimatedMml = - !firstUpdate.current || !modelMemoryLimit || estimatedModelMemoryLimit === ''; - - if (firstUpdate.current) { - firstUpdate.current = false; - } - // Reset if sourceIndex or jobType changes (jobType requires dependent_variable to be set - - // which won't be the case if switching from outlier detection) - if (jobTypeOrIndexChanged) { - setFormState({ - loadingFieldOptions: true, - }); - } - - try { - const jobConfig = getJobConfigFromFormState(form); - delete jobConfig.dest; - delete jobConfig.model_memory_limit; - const resp: DfAnalyticsExplainResponse = await ml.dataFrameAnalytics.explainDataFrameAnalytics( - jobConfig - ); - const expectedMemoryWithoutDisk = resp.memory_estimation?.expected_memory_without_disk; - - if (shouldUpdateEstimatedMml) { - setEstimatedModelMemoryLimit(expectedMemoryWithoutDisk); - } - - const fieldSelection: FieldSelectionItem[] | undefined = resp.field_selection; - - let hasRequiredFields = false; - if (fieldSelection) { - for (let i = 0; i < fieldSelection.length; i++) { - const field = fieldSelection[i]; - if (field.is_included === true && field.is_required === false) { - hasRequiredFields = true; - break; - } - } - } - - // If sourceIndex has changed load analysis field options again - if (jobTypeOrIndexChanged) { - const analyzedFieldsOptions: EuiComboBoxOptionOption[] = []; - - if (resp.field_selection) { - resp.field_selection.forEach((selectedField: FieldSelectionItem) => { - if (selectedField.is_included === true && selectedField.name !== dependentVariable) { - analyzedFieldsOptions.push({ label: selectedField.name }); - } - }); - } - - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemoryWithoutDisk } : {}), - excludesOptions: analyzedFieldsOptions, - loadingFieldOptions: false, - fieldOptionsFetchFail: false, - maxDistinctValuesError: undefined, - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - }); - } else { - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemoryWithoutDisk } : {}), - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - }); - } - } catch (e) { - let errorMessage; - if ( - jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && - e.body && - e.body.message !== undefined && - e.body.message.includes('status_exception') && - e.body.message.includes('must have at most') - ) { - errorMessage = e.body.message; - } - const fallbackModelMemoryLimit = - jobType !== undefined - ? DEFAULT_MODEL_MEMORY_LIMIT[jobType] - : DEFAULT_MODEL_MEMORY_LIMIT.outlier_detection; - setEstimatedModelMemoryLimit(fallbackModelMemoryLimit); - setFormState({ - fieldOptionsFetchFail: true, - maxDistinctValuesError: errorMessage, - loadingFieldOptions: false, - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: fallbackModelMemoryLimit } : {}), - }); - } - }, 400); - - const loadDepVarOptions = async (formState: State['form']) => { - setFormState({ - loadingDepVarOptions: true, - // clear when the source index changes - maxDistinctValuesError: undefined, - sourceIndexFieldsCheckFailed: false, - sourceIndexContainsNumericalFields: true, - }); - try { - const indexPattern: IndexPattern = await mlContext.indexPatterns.get( - indexPatternsMap[sourceIndex].value - ); - - if (indexPattern !== undefined) { - const formStateUpdate: { - loadingDepVarOptions: boolean; - dependentVariableFetchFail: boolean; - dependentVariableOptions: State['form']['dependentVariableOptions']; - dependentVariable?: State['form']['dependentVariable']; - } = { - loadingDepVarOptions: false, - dependentVariableFetchFail: false, - dependentVariableOptions: [] as State['form']['dependentVariableOptions'], - }; - - await newJobCapsService.initializeFromIndexPattern(indexPattern, false, false); - // Get fields and filter for supported types for job type - const { fields } = newJobCapsService; - - let resetDependentVariable = true; - for (const field of fields) { - if (shouldAddAsDepVarOption(field, jobType)) { - formStateUpdate.dependentVariableOptions.push({ - label: field.id, - }); - - if (formState.dependentVariable === field.id) { - resetDependentVariable = false; - } - } - } - - if (resetDependentVariable) { - formStateUpdate.dependentVariable = ''; - } - - setFormState(formStateUpdate); - } - } catch (e) { - setFormState({ loadingDepVarOptions: false, dependentVariableFetchFail: true }); - } - }; - - const getSourceIndexErrorMessages = () => { - const errors = []; - if (!sourceIndexNameEmpty && !sourceIndexNameValid) { - errors.push( - - - - ); - } - - if (sourceIndexFieldsCheckFailed === true) { - errors.push( - - - - ); - } - - return errors; - }; - - const onSourceIndexChange = (selectedOptions: EuiComboBoxOptionOption[]) => { - setFormState({ - excludes: [], - excludesOptions: [], - previousSourceIndex: sourceIndex, - sourceIndex: selectedOptions[0].label || '', - requiredFieldsError: undefined, - }); - }; - - useEffect(() => { - if (isJobTypeWithDepVar && sourceIndexNameEmpty === false) { - loadDepVarOptions(form); - } - - if (jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION && sourceIndexNameEmpty === false) { - validateSourceIndexFields(); - } - }, [sourceIndex, jobType, sourceIndexNameEmpty]); - - useEffect(() => { - const hasBasicRequiredFields = - jobType !== undefined && sourceIndex !== '' && sourceIndexNameValid === true; - - const hasRequiredAnalysisFields = - (isJobTypeWithDepVar && dependentVariable !== '') || - jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION; - - if (hasBasicRequiredFields && hasRequiredAnalysisFields) { - debouncedGetExplainData(); - } - - return () => { - debouncedGetExplainData.cancel(); - }; - }, [ - jobType, - sourceIndex, - sourceIndexNameEmpty, - dependentVariable, - trainingPercent, - JSON.stringify(excludes), - ]); - - // Temp effect to close the context menu popover on Clone button click - useEffect(() => { - if (forceInput.current === null) { - return; - } - const evt = document.createEvent('MouseEvents'); - evt.initEvent('mouseup', true, true); - forceInput.current.dispatchEvent(evt); - }, []); - - const noSupportetdAnalysisFields = - excludesOptions.length === 0 && fieldOptionsFetchFail === false && !sourceIndexNameEmpty; - - return ( - - - {!isJobCreated && ( - - - - - - - { - if (input) { - forceInput.current = input; - } - }} - disabled={isJobCreated} - placeholder={i18n.translate('xpack.ml.dataframe.analytics.create.jobIdPlaceholder', { - defaultMessage: 'Job ID', - })} - value={jobId} - onChange={(e) => setFormState({ jobId: e.target.value })} - aria-label={i18n.translate( - 'xpack.ml.dataframe.analytics.create.jobIdInputAriaLabel', - { - defaultMessage: 'Choose a unique analytics job ID.', - } - )} - isInvalid={(!jobIdEmpty && !jobIdValid) || jobIdExists} - data-test-subj="mlAnalyticsCreateJobFlyoutJobIdInput" - /> - - - - - {!isJobCreated && ( - - a.label.localeCompare(b.label) - )} - selectedOptions={ - indexPatternsMap[sourceIndex] !== undefined ? [{ label: sourceIndex }] : [] - } - onChange={onSourceIndexChange} - isClearable={false} - data-test-subj="mlAnalyticsCreateJobFlyoutSourceIndexSelect" - /> - )} - {isJobCreated && ( - - )} - - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.destinationIndexInvalidError', - { - defaultMessage: 'Invalid destination index name.', - } - )} -
- - {i18n.translate( - 'xpack.ml.dataframe.stepDetailsForm.destinationIndexInvalidErrorLink', - { - defaultMessage: 'Learn more about index name limitations.', - } - )} - -
, - ] - } - > - setFormState({ destinationIndex: e.target.value })} - aria-label={i18n.translate( - 'xpack.ml.dataframe.analytics.create.destinationIndexInputAriaLabel', - { - defaultMessage: 'Choose a unique destination index name.', - } - )} - isInvalid={!destinationIndexNameEmpty && !destinationIndexNameValid} - data-test-subj="mlAnalyticsCreateJobFlyoutDestinationIndexInput" - /> - - {(jobType === ANALYSIS_CONFIG_TYPE.REGRESSION || - jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION) && ( - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.dependentVariableMaxDistictValuesError', - { - defaultMessage: 'Invalid. {message}', - values: { message: maxDistinctValuesError }, - } - )} - , - ] - : []), - ]} - > - - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.dependentVariableOptionsFetchError', - { - defaultMessage: - 'There was a problem fetching fields. Please refresh the page and try again.', - } - )} - , - ] - : []), - ]} - > - - setFormState({ - dependentVariable: selectedOptions[0].label || '', - }) - } - isClearable={false} - isInvalid={dependentVariable === ''} - data-test-subj="mlAnalyticsCreateJobFlyoutDependentVariableSelect" - /> - - - setFormState({ trainingPercent: +e.target.value })} - data-test-subj="mlAnalyticsCreateJobFlyoutTrainingPercentSlider" - /> - - {/* num_top_feature_importance_values */} - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesErrorText', - { - defaultMessage: - 'Invalid maximum number of feature importance values.', - } - )} - , - ] - : []), - ]} - > - setFormState({ numTopFeatureImportanceValues: +e.target.value })} - step={1} - value={numTopFeatureImportanceValues} - /> - - - )} - - - - - ({ - label: field, - }))} - onCreateOption={onCreateOption} - onChange={(selectedOptions) => - setFormState({ excludes: selectedOptions.map((option) => option.label) }) - } - isClearable={true} - data-test-subj="mlAnalyticsCreateJobFlyoutExcludesSelect" - /> - - - setFormState({ modelMemoryLimit: e.target.value })} - isInvalid={modelMemoryLimitValidationResult !== null} - data-test-subj="mlAnalyticsCreateJobFlyoutModelMemoryInput" - /> - - - setFormState({ createIndexPattern: !createIndexPattern })} - data-test-subj="mlAnalyticsCreateJobFlyoutCreateIndexPatternSwitch" - /> - - - )} -
- ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx deleted file mode 100644 index 46301a6f832e7..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; -import { EuiFormRow, EuiTextArea } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -const helpText = i18n.translate('xpack.ml.dataframe.analytics.create.jobDescription.helpText', { - defaultMessage: 'Optional descriptive text', -}); - -interface Props { - description: string; - setFormState: React.Dispatch>; -} - -export const JobDescriptionInput: FC = ({ description, setFormState }) => ( - - { - const value = e.target.value; - setFormState({ description: value }); - }} - data-test-subj="mlDFAnalyticsJobCreationJobDescription" - /> - -); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx deleted file mode 100644 index 6daa72dd805b1..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Fragment, FC } from 'react'; -import { i18n } from '@kbn/i18n'; - -import { EuiFormRow, EuiSelect } from '@elastic/eui'; -import { ANALYSIS_CONFIG_TYPE } from '../../../../common'; - -import { AnalyticsJobType } from '../../hooks/use_create_analytics_form/state'; - -interface Props { - type: AnalyticsJobType; - setFormState: React.Dispatch>; -} - -export const JobType: FC = ({ type, setFormState }) => { - const outlierHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.outlierDetectionHelpText', - { - defaultMessage: - 'Outlier detection jobs require a source index that is mapped as a table-like data structure and analyze only numeric and boolean fields. Use the advanced editor to add custom options to the configuration.', - } - ); - - const regressionHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.outlierRegressionHelpText', - { - defaultMessage: - 'Regression jobs analyze only numeric fields. Use the advanced editor to apply custom options, such as the prediction field name.', - } - ); - - const classificationHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.classificationHelpText', - { - defaultMessage: - 'Classification jobs require a source index that is mapped as a table-like data structure and support fields that are numeric, boolean, text, keyword, or ip. Use the advanced editor to apply custom options, such as the prediction field name.', - } - ); - - const helpText = { - [ANALYSIS_CONFIG_TYPE.REGRESSION]: regressionHelpText, - [ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION]: outlierHelpText, - [ANALYSIS_CONFIG_TYPE.CLASSIFICATION]: classificationHelpText, - }; - - return ( - - - ({ - value: jobType, - text: jobType.replace(/_/g, ' '), - }))} - value={type} - hasNoInitialSelection={true} - onChange={(e) => { - const value = e.target.value as AnalyticsJobType; - setFormState({ - previousJobType: type, - jobType: value, - excludes: [], - requiredFieldsError: undefined, - }); - }} - data-test-subj="mlAnalyticsCreateJobFlyoutJobTypeSelect" - /> - - - ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts index c42e03b584a56..a9eedbb2bc5e3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts @@ -57,11 +57,6 @@ export type Action = } | { type: ACTION.SET_IS_JOB_CREATED; isJobCreated: State['isJobCreated'] } | { type: ACTION.SET_IS_JOB_STARTED; isJobStarted: State['isJobStarted'] } - | { - type: ACTION.SET_IS_MODAL_BUTTON_DISABLED; - isModalButtonDisabled: State['isModalButtonDisabled']; - } - | { type: ACTION.SET_IS_MODAL_VISIBLE; isModalVisible: State['isModalVisible'] } | { type: ACTION.SET_JOB_CONFIG; payload: State['jobConfig'] } | { type: ACTION.SET_JOB_IDS; jobIds: State['jobIds'] } | { type: ACTION.SET_ESTIMATED_MODEL_MEMORY_LIMIT; value: State['estimatedModelMemoryLimit'] } @@ -71,12 +66,10 @@ export type Action = export interface ActionDispatchers { closeModal: () => void; createAnalyticsJob: () => void; - openModal: () => Promise; initiateWizard: () => Promise; resetAdvancedEditorMessages: () => void; setAdvancedEditorRawString: (payload: State['advancedEditorRawString']) => void; setFormState: (payload: Partial) => void; - setIsModalVisible: (payload: State['isModalVisible']) => void; setJobConfig: (payload: State['jobConfig']) => void; startAnalyticsJob: () => void; switchToAdvancedEditor: () => void; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts index fc604c9f5eb0b..e6769a7b64e2b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts @@ -79,21 +79,6 @@ describe('useCreateAnalyticsForm', () => { expect(resettedState).toEqual(initialState); }); - test('reducer(): open/close the modal', () => { - const initialState = getInitialState(); - expect(initialState.isModalVisible).toBe(false); - - const openModalState = reducer(initialState, { - type: ACTION.OPEN_MODAL, - }); - expect(openModalState.isModalVisible).toBe(true); - - const closedModalState = reducer(openModalState, { - type: ACTION.CLOSE_MODAL, - }); - expect(closedModalState.isModalVisible).toBe(false); - }); - test('reducer(): add/reset request messages', () => { const initialState = getInitialState(); expect(initialState.requestMessages).toHaveLength(0); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts index a79a8fcf61ed4..1353a35d8ecc6 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts @@ -442,12 +442,6 @@ export function reducer(state: State, action: Action): State { case ACTION.RESET_REQUEST_MESSAGES: return { ...state, requestMessages: [] }; - case ACTION.CLOSE_MODAL: - return { ...state, isModalVisible: false }; - - case ACTION.OPEN_MODAL: - return { ...state, isModalVisible: true }; - case ACTION.RESET_ADVANCED_EDITOR_MESSAGES: return { ...state, advancedEditorMessages: [] }; @@ -536,12 +530,6 @@ export function reducer(state: State, action: Action): State { case ACTION.SET_IS_JOB_STARTED: return { ...state, isJobStarted: action.isJobStarted }; - case ACTION.SET_IS_MODAL_BUTTON_DISABLED: - return { ...state, isModalButtonDisabled: action.isModalButtonDisabled }; - - case ACTION.SET_IS_MODAL_VISIBLE: - return { ...state, isModalVisible: action.isModalVisible }; - case ACTION.SET_JOB_CONFIG: return validateAdvancedEditor({ ...state, jobConfig: action.payload }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts index 547a55da7438b..b9a9caadcebd0 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts @@ -4,7 +4,43 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getInitialState, getJobConfigFromFormState } from './state'; +import { + getCloneFormStateFromJobConfig, + getInitialState, + getJobConfigFromFormState, +} from './state'; + +const regJobConfig = { + id: 'reg-test-01', + description: 'Reg test job description', + source: { + index: ['reg-test-index'], + query: { + match_all: {}, + }, + }, + dest: { + index: 'reg-test-01-index', + results_field: 'ml', + }, + analysis: { + regression: { + dependent_variable: 'price', + num_top_feature_importance_values: 2, + prediction_field_name: 'airbnb_test', + training_percent: 5, + randomize_seed: 4998776294664380000, + }, + }, + analyzed_fields: { + includes: [], + excludes: [], + }, + model_memory_limit: '22mb', + create_time: 1590514291395, + version: '8.0.0', + allow_lazy_start: false, +}; describe('useCreateAnalyticsForm', () => { test('state: getJobConfigFromFormState()', () => { @@ -28,4 +64,20 @@ describe('useCreateAnalyticsForm', () => { 'the-source-index-2', ]); }); + + test('state: getCloneFormStateFromJobConfig()', () => { + const clonedState = getCloneFormStateFromJobConfig(regJobConfig); + + expect(clonedState?.sourceIndex).toBe('reg-test-index'); + expect(clonedState?.excludes).toStrictEqual([]); + expect(clonedState?.dependentVariable).toBe('price'); + expect(clonedState?.numTopFeatureImportanceValues).toBe(2); + expect(clonedState?.predictionFieldName).toBe('airbnb_test'); + expect(clonedState?.trainingPercent).toBe(5); + expect(clonedState?.randomizeSeed).toBe(4998776294664380000); + expect(clonedState?.modelMemoryLimit).toBe('22mb'); + // destination index and job id should be undefined + expect(clonedState?.destinationIndex).toBe(undefined); + expect(clonedState?.jobId).toBe(undefined); + }); }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index 387ce89ee4120..8a07704e39910 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -92,7 +92,6 @@ export interface State { outlierFraction: undefined | number; predictionFieldName: undefined | string; previousJobType: null | AnalyticsJobType; - previousSourceIndex: EsIndexName | undefined; requiredFieldsError: string | undefined; randomizeSeed: undefined | number; sourceIndex: EsIndexName; @@ -110,8 +109,6 @@ export interface State { isAdvancedEditorValidJson: boolean; isJobCreated: boolean; isJobStarted: boolean; - isModalButtonDisabled: boolean; - isModalVisible: boolean; isValid: boolean; jobConfig: DeepPartial; jobIds: DataFrameAnalyticsId[]; @@ -167,7 +164,6 @@ export const getInitialState = (): State => ({ outlierFraction: undefined, predictionFieldName: undefined, previousJobType: null, - previousSourceIndex: undefined, requiredFieldsError: undefined, randomizeSeed: undefined, sourceIndex: '', @@ -189,8 +185,6 @@ export const getInitialState = (): State => ({ isAdvancedEditorValidJson: true, isJobCreated: false, isJobStarted: false, - isModalVisible: false, - isModalButtonDisabled: false, isValid: false, jobIds: [], requestMessages: [], @@ -328,6 +322,14 @@ export const getJobConfigFromFormState = ( return jobConfig; }; +function toCamelCase(property: string): string { + const camelCased = property.replace(/_([a-z])/g, function (g) { + return g[1].toUpperCase(); + }); + + return camelCased; +} + /** * Extracts form state for a job clone from the analytics job configuration. * For cloning we keep job id and destination index empty. @@ -353,13 +355,12 @@ export function getCloneFormStateFromJobConfig( ) { const analysisConfig = analyticsJobConfig.analysis[jobType]; - resultState.dependentVariable = analysisConfig.dependent_variable; - resultState.numTopFeatureImportanceValues = analysisConfig.num_top_feature_importance_values; - resultState.trainingPercent = analysisConfig.training_percent; - - if (isClassificationAnalysis(analyticsJobConfig.analysis)) { - // @ts-ignore - resultState.numTopClasses = analysisConfig.num_top_classes; + for (const key in analysisConfig) { + if (analysisConfig.hasOwnProperty(key)) { + const camelCased = toCamelCase(key); + // @ts-ignore + resultState[camelCased] = analysisConfig[key]; + } } } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx index 182e50a5d74d1..ac1c710e1d106 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx @@ -46,39 +46,13 @@ describe('getErrorMessage()', () => { describe('useCreateAnalyticsForm()', () => { test('initialization', () => { const { getLastHookValue } = getMountedHook(); - const { state, actions } = getLastHookValue(); + const { actions } = getLastHookValue(); - expect(state.isModalVisible).toBe(false); - expect(typeof actions.closeModal).toBe('function'); expect(typeof actions.createAnalyticsJob).toBe('function'); - expect(typeof actions.openModal).toBe('function'); expect(typeof actions.startAnalyticsJob).toBe('function'); expect(typeof actions.setFormState).toBe('function'); }); - test('open/close modal', () => { - const { act, getLastHookValue } = getMountedHook(); - const { state, actions } = getLastHookValue(); - - expect(state.isModalVisible).toBe(false); - - act(() => { - // this should be actions.openModal(), but that doesn't work yet because act() doesn't support async yet. - // we need to wait for an update to React 16.9 - actions.setIsModalVisible(true); - }); - const { state: stateModalOpen } = getLastHookValue(); - expect(stateModalOpen.isModalVisible).toBe(true); - - act(() => { - // this should be actions.closeModal(), but that doesn't work yet because act() doesn't support async yet. - // we need to wait for an update to React 16.9 - actions.setIsModalVisible(false); - }); - const { state: stateModalClosed } = getLastHookValue(); - expect(stateModalClosed.isModalVisible).toBe(false); - }); - // TODO // add tests for createAnalyticsJob() and startAnalyticsJob() // once React 16.9 with support for async act() is available. diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts index c4cbe149f88bc..2de9a1dcadd4b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts @@ -87,12 +87,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { dispatch({ type: ACTION.SET_IS_JOB_STARTED, isJobStarted }); }; - const setIsModalButtonDisabled = (isModalButtonDisabled: boolean) => - dispatch({ type: ACTION.SET_IS_MODAL_BUTTON_DISABLED, isModalButtonDisabled }); - - const setIsModalVisible = (isModalVisible: boolean) => - dispatch({ type: ACTION.SET_IS_MODAL_VISIBLE, isModalVisible }); - const setJobIds = (jobIds: DataFrameAnalyticsId[]) => dispatch({ type: ACTION.SET_JOB_IDS, jobIds }); @@ -102,7 +96,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const createAnalyticsJob = async () => { resetRequestMessages(); - setIsModalButtonDisabled(true); const analyticsJobConfig = (isAdvancedEditorEnabled ? jobConfig @@ -123,7 +116,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } ), }); - setIsModalButtonDisabled(false); setIsJobCreated(true); if (createIndexPattern) { createKibanaIndexPattern(); @@ -139,7 +131,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } ), }); - setIsModalButtonDisabled(false); } }; @@ -267,13 +258,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } }; - const openModal = async () => { - await mlContext.indexPatterns.clearCache(); - resetForm(); - await prepareFormValidation(); - dispatch({ type: ACTION.OPEN_MODAL }); - }; - const initiateWizard = async () => { await mlContext.indexPatterns.clearCache(); await prepareFormValidation(); @@ -327,8 +311,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const setJobClone = async (cloneJob: DeepReadonly) => { resetForm(); - await prepareFormValidation(); - const config = extractCloningConfig(cloneJob); if (isAdvancedConfig(config)) { setJobConfig(config); @@ -339,18 +321,15 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } dispatch({ type: ACTION.SET_JOB_CLONE, cloneJob }); - dispatch({ type: ACTION.OPEN_MODAL }); }; const actions: ActionDispatchers = { closeModal, createAnalyticsJob, - openModal, initiateWizard, resetAdvancedEditorMessages, setAdvancedEditorRawString, setFormState, - setIsModalVisible, setJobConfig, startAnalyticsJob, switchToAdvancedEditor, diff --git a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx index 68af9a2a49cab..ebc7bd95fb0c3 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx @@ -30,12 +30,15 @@ export const analyticsJobsCreationRoute: MlRoute = { }; const PageWrapper: FC = ({ location, deps }) => { - const { index, savedSearchId }: Record = parse(location.search, { sort: false }); + const { index, jobId, savedSearchId }: Record = parse(location.search, { + sort: false, + }); + const { context } = useResolver(index, savedSearchId, deps.config, basicResolvers(deps)); return ( - + ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 5be46ce4bcd2d..76636779001e7 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9654,7 +9654,6 @@ "xpack.ml.dataframe.analytics.classificationExploration.showActions": "アクションを表示", "xpack.ml.dataframe.analytics.classificationExploration.showAllColumns": "すべての列を表示", "xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle": "分類ジョブID {jobId}のデスティネーションインデックス", - "xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle": "{job_id} からのジョブのクローンを作成", "xpack.ml.dataframe.analytics.create.advancedEditor.codeEditorAriaLabel": "高度な分析ジョブエディター", "xpack.ml.dataframe.analytics.create.advancedEditor.configRequestBody": "構成リクエスト本文", "xpack.ml.dataframe.analytics.create.advancedEditor.jobIdExistsError": "このIDの分析ジョブが既に存在します。", @@ -9687,22 +9686,12 @@ "xpack.ml.dataframe.analytics.create.destinationIndexLabel": "デスティネーションインデックス", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessage": "Kibanaインデックスパターンの作成中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessageError": "インデックスパターン{indexPatternName}はすでに作成されています。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorHelpText": "高度なエディターからこのフォームには戻れません。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorSwitch": "詳細エディターを有効にする", "xpack.ml.dataframe.analytics.create.errorCreatingDataFrameAnalyticsJob": "データフレーム分析ジョブの作成中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameAnalyticsList": "既存のデータフレーム分析ジョブIDの取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameIndexNames": "既存のインデックス名の取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingIndexPatternTitles": "既存のインデックスパターンのタイトルの取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorStartingDataFrameAnalyticsJob": "データフレーム分析ジョブの開始中にエラーが発生しました。", - "xpack.ml.dataframe.analytics.create.excludedFieldsHelpText": "分析から除外するフィールドを選択してください。他のすべてのサポートされるフィールドが含まれます。", "xpack.ml.dataframe.analytics.create.excludedFieldsLabel": "除外されたフィールド", - "xpack.ml.dataframe.analytics.create.excludesInputAriaLabel": "任意。除外するフィールドを入力または選択してください。", - "xpack.ml.dataframe.analytics.create.excludesOptionsNoSupportedFields": "このインデックスパターンのサポートされている分析フィールドが見つかりませんでした。", - "xpack.ml.dataframe.analytics.create.flyoutCancelButton": "キャンセル", - "xpack.ml.dataframe.analytics.create.flyoutCloseButton": "閉じる", - "xpack.ml.dataframe.analytics.create.flyoutCreateButton": "作成", - "xpack.ml.dataframe.analytics.create.flyoutHeaderTitle": "分析ジョブの作成", - "xpack.ml.dataframe.analytics.create.flyoutStartButton": "開始", "xpack.ml.dataframe.analytics.create.indexPatternAlreadyExistsError": "このタイトルのインデックスパターンが既に存在します。", "xpack.ml.dataframe.analytics.create.indexPatternExistsError": "このタイトルのインデックスパターンが既に存在します。", "xpack.ml.dataframe.analytics.create.jobDescription.helpText": "オプションの説明テキストです", @@ -9723,12 +9712,6 @@ "xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesLabel": "機能重要度値", "xpack.ml.dataframe.analytics.create.outlierDetectionHelpText": "外れ値検出ジョブは、表に示すようなデータ構造でマッピングされたソースインデックスを必要とし、数字とブール値フィールドのみを分析します。カスタムオプションを構成に追加するには、詳細エディターを使用します。", "xpack.ml.dataframe.analytics.create.outlierRegressionHelpText": "リグレッションジョブは数値フィールドのみを分析します。予測フィールド名などのカスタムオプションを適用するには、詳細エディターを使用します。", - "xpack.ml.dataframe.analytics.create.sourceIndexFieldCheckError": "数値フィールドの確認中に問題が発生しました。ページを更新して再起動してください。", - "xpack.ml.dataframe.analytics.create.sourceIndexHelpText": "このインデックスパターンには数字タイプのフィールドが含まれていません。分析ジョブで外れ値が検出されない可能性があります。", - "xpack.ml.dataframe.analytics.create.sourceIndexInputAriaLabel": "ソースインデックスパターンまたは検索。", - "xpack.ml.dataframe.analytics.create.sourceIndexInvalidError": "無効なソースインデックス名。スペースや{characterList}を含めることはできません", - "xpack.ml.dataframe.analytics.create.sourceIndexLabel": "ソースインデックス", - "xpack.ml.dataframe.analytics.create.sourceIndexPlaceholder": "ソースインデックスパターンを選択してください。", "xpack.ml.dataframe.analytics.create.startDataFrameAnalyticsSuccessMessage": "データフレーム分析 {jobId} の開始リクエストが受け付けられました。", "xpack.ml.dataframe.analytics.create.trainingPercentLabel": "トレーニングパーセンテージ", "xpack.ml.dataframe.analytics.errorCallout.evaluateErrorTitle": "データの読み込み中にエラーが発生しました。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index dff26907b48ed..331e9d67c3897 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9658,7 +9658,6 @@ "xpack.ml.dataframe.analytics.classificationExploration.showActions": "显示操作", "xpack.ml.dataframe.analytics.classificationExploration.showAllColumns": "显示所有列", "xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle": "分类作业 ID {jobId} 的目标索引", - "xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle": "从 {job_id} 克隆作业", "xpack.ml.dataframe.analytics.create.advancedEditor.codeEditorAriaLabel": "高级分析作业编辑器", "xpack.ml.dataframe.analytics.create.advancedEditor.configRequestBody": "配置请求正文", "xpack.ml.dataframe.analytics.create.advancedEditor.jobIdExistsError": "已存在具有此 ID 的分析作业。", @@ -9691,22 +9690,12 @@ "xpack.ml.dataframe.analytics.create.destinationIndexLabel": "目标 IP", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessage": "创建 Kibana 索引模式时发生错误:", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessageError": "索引模式 {indexPatternName} 已存在。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorHelpText": "您不能从高级编辑器切回到此表单。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorSwitch": "启用高级编辑器", "xpack.ml.dataframe.analytics.create.errorCreatingDataFrameAnalyticsJob": "创建数据帧分析作业时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameAnalyticsList": "获取现有数据帧分析作业 ID 时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameIndexNames": "获取现有索引名称时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingIndexPatternTitles": "获取现有索引模式标题时发生错误:", "xpack.ml.dataframe.analytics.create.errorStartingDataFrameAnalyticsJob": "启动数据帧分析作业时发生错误:", - "xpack.ml.dataframe.analytics.create.excludedFieldsHelpText": "选择要从分析中排除的字段。包括所有其他支持的字段。", "xpack.ml.dataframe.analytics.create.excludedFieldsLabel": "排除的字段", - "xpack.ml.dataframe.analytics.create.excludesInputAriaLabel": "可选。输入或选择要排除的字段。", - "xpack.ml.dataframe.analytics.create.excludesOptionsNoSupportedFields": "没有为此索引模式找到任何支持的分析字段。", - "xpack.ml.dataframe.analytics.create.flyoutCancelButton": "取消", - "xpack.ml.dataframe.analytics.create.flyoutCloseButton": "关闭", - "xpack.ml.dataframe.analytics.create.flyoutCreateButton": "创建", - "xpack.ml.dataframe.analytics.create.flyoutHeaderTitle": "创建分析作业", - "xpack.ml.dataframe.analytics.create.flyoutStartButton": "开始", "xpack.ml.dataframe.analytics.create.indexPatternAlreadyExistsError": "具有此名称的索引模式已存在。", "xpack.ml.dataframe.analytics.create.indexPatternExistsError": "具有此名称的索引模式已存在。", "xpack.ml.dataframe.analytics.create.jobDescription.helpText": "可选的描述文本", @@ -9727,12 +9716,6 @@ "xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesLabel": "功能重要性值", "xpack.ml.dataframe.analytics.create.outlierDetectionHelpText": "离群值检测作业需要映射为表状数据结构的源索引,并仅分析数值和布尔值字段。使用高级编辑器将定制选项添加到配置。", "xpack.ml.dataframe.analytics.create.outlierRegressionHelpText": "回归作业仅分析数值字段。使用高级编辑器来应用定制选项,如预测字段名称。", - "xpack.ml.dataframe.analytics.create.sourceIndexFieldCheckError": "检查数值字段时出现问题。请刷新页面并重试。", - "xpack.ml.dataframe.analytics.create.sourceIndexHelpText": "此索引模式不包含任何数值类型字段。分析作业可能无法提供任何离群值。", - "xpack.ml.dataframe.analytics.create.sourceIndexInputAriaLabel": "源索引模式或搜索。", - "xpack.ml.dataframe.analytics.create.sourceIndexInvalidError": "源索引名称无效,其不能包含空格或以下字符:{characterList}", - "xpack.ml.dataframe.analytics.create.sourceIndexLabel": "源索引", - "xpack.ml.dataframe.analytics.create.sourceIndexPlaceholder": "选择源索引模式。", "xpack.ml.dataframe.analytics.create.startDataFrameAnalyticsSuccessMessage": "数据帧分析 {jobId} 启动请求已确认。", "xpack.ml.dataframe.analytics.create.trainingPercentLabel": "训练百分比", "xpack.ml.dataframe.analytics.errorCallout.evaluateErrorTitle": "加载数据时出错。", From 0306c7a8cf1efc34360f1422690dfffa1b057857 Mon Sep 17 00:00:00 2001 From: Greg Thompson Date: Tue, 9 Jun 2020 15:07:40 -0600 Subject: [PATCH 64/65] Upgrade EUI to v24.1.0 (#68141) * eui to 24.1.0 * src snapshot updates * x-pack snapshot updates * euiPaletteColorBlind param updates * euiPaletteColorBlind ts-ignore * fix collapsibleNav close button click for functional testing * await focus * increase legacy sass build timeout value Co-authored-by: Elastic Machine --- package.json | 2 +- packages/kbn-ui-shared-deps/package.json | 2 +- .../collapsible_nav.test.tsx.snap | 211 +++++++++--------- .../header/__snapshots__/header.test.tsx.snap | 85 ++++--- src/legacy/server/sass/build.test.js | 2 + .../__snapshots__/new_vis_modal.test.tsx.snap | 2 + test/functional/services/apps_menu.ts | 4 + .../plugins/kbn_tp_run_pipeline/package.json | 2 +- .../kbn_sample_panel_action/package.json | 2 +- .../kbn_tp_custom_visualizations/package.json | 2 +- .../kbn_tp_embeddable_explorer/package.json | 2 +- x-pack/package.json | 2 +- .../__test__/__snapshots__/List.test.tsx.snap | 18 ++ .../__snapshots__/asset.examples.storyshot | 8 + .../asset_manager.stories.storyshot | 8 + .../element_controls.stories.storyshot | 2 + .../element_grid.stories.storyshot | 6 + .../saved_elements_modal.stories.storyshot | 8 + .../sidebar_header.stories.storyshot | 4 + .../simple_template.examples.storyshot | 1 + .../public/classes/styles/color_utils.tsx | 4 +- .../__snapshots__/index.test.tsx.snap | 43 ++-- .../note_card_body.test.tsx.snap | 43 ++-- yarn.lock | 8 +- 24 files changed, 263 insertions(+), 208 deletions(-) diff --git a/package.json b/package.json index 5bf39a57c1ac5..419edcf268356 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "@elastic/charts": "19.2.0", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.8.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/good": "8.1.1-kibana2", "@elastic/numeral": "^2.5.0", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 744a656c54a7f..2c9251b03059a 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@elastic/charts": "19.2.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/numeral": "^2.5.0", "@kbn/i18n": "1.0.0", "@kbn/monaco": "1.0.0", diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index f5b17f8d214e9..60963c0acb990 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -1014,7 +1014,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
@@ -1662,7 +1658,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
@@ -3119,38 +3111,43 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
- - - + +
+
- - - + + +
@@ -4717,7 +4715,7 @@ exports[`CollapsibleNav renders the default nav 3`] = ` @@ -5120,38 +5114,43 @@ exports[`CollapsibleNav renders the default nav 3`] = ` - - - + + +
@@ -9277,7 +9273,7 @@ exports[`Header renders 3`] = `
@@ -9764,38 +9756,43 @@ exports[`Header renders 3`] = ` - - - + + +
@@ -14302,6 +14300,7 @@ exports[`Header renders 4`] = ` > diff --git a/src/legacy/server/sass/build.test.js b/src/legacy/server/sass/build.test.js index 46a898c30f84e..71c43ac010962 100644 --- a/src/legacy/server/sass/build.test.js +++ b/src/legacy/server/sass/build.test.js @@ -33,6 +33,8 @@ afterEach(async () => { }); it('builds light themed SASS', async () => { + // Increased timeout from 5000ms due to intermittent timeout failures + jest.setTimeout(60000); const targetPath = resolve(TMP, 'style.css'); await new Build({ sourcePath: FIXTURE, diff --git a/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap b/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap index 22cc873cbdb5d..53ef164685a1c 100644 --- a/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap +++ b/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap @@ -1264,6 +1264,7 @@ exports[`NewVisModal filter for visualization types should render as expected 1` > @@ -2772,6 +2773,7 @@ exports[`NewVisModal should render as expected 1`] = ` > diff --git a/test/functional/services/apps_menu.ts b/test/functional/services/apps_menu.ts index 969bddbd30f9a..aa7934d6b1156 100644 --- a/test/functional/services/apps_menu.ts +++ b/test/functional/services/apps_menu.ts @@ -58,6 +58,10 @@ export function AppsMenuProvider({ getService, getPageObjects }: FtrProviderCont public async closeCollapsibleNav() { const CLOSE_BUTTON = '[data-test-subj=collapsibleNav] > button'; if (await find.existsByCssSelector(CLOSE_BUTTON)) { + // Close button is only visible when focused + const button = await find.byCssSelector(CLOSE_BUTTON); + await button.focus(); + await find.clickByCssSelector(CLOSE_BUTTON); } } diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json index acd78cb4955e3..24b38fae96653 100644 --- a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0", "react-dom": "^16.12.0" }, diff --git a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json index 45d07933c4209..71a635c444b8c 100644 --- a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json +++ b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json index ca99e9b5995c1..78f0b42a6fbda 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json index 63dde0fa96dd3..6dbc9c71f2e81 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/x-pack/package.json b/x-pack/package.json index b3dcde2194d3f..fb708ab09d841 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -190,7 +190,7 @@ "@elastic/apm-rum-react": "^1.1.1", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.8.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/maki": "6.3.0", "@elastic/node-crypto": "1.1.1", diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap index 3de725dc58ea7..6a20e3c103709 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap @@ -161,6 +161,7 @@ exports[`ErrorGroupOverview -> List should render empty state 1`] = ` @@ -575,6 +576,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -754,6 +756,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -859,6 +862,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -889,6 +893,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -958,6 +963,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -984,6 +990,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1089,6 +1096,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1119,6 +1127,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1188,6 +1197,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1214,6 +1224,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1319,6 +1330,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1349,6 +1361,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1418,6 +1431,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1444,6 +1458,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1549,6 +1564,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1579,6 +1595,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1648,6 +1665,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot index 6601f570209e9..14791cd3d8b25 100644 --- a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot +++ b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot @@ -63,6 +63,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -88,6 +89,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -118,6 +120,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -148,6 +151,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -237,6 +241,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -262,6 +267,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -292,6 +298,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -322,6 +329,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot index aff630b21c770..1b8f1480759f6 100644 --- a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot @@ -422,6 +422,7 @@ Array [ > @@ -447,6 +448,7 @@ Array [ > @@ -477,6 +479,7 @@ Array [ > @@ -507,6 +510,7 @@ Array [ > @@ -585,6 +589,7 @@ Array [ > @@ -610,6 +615,7 @@ Array [ > @@ -640,6 +646,7 @@ Array [ > @@ -670,6 +677,7 @@ Array [ > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot index 6f12f68356467..408b0679c415f 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot @@ -16,6 +16,7 @@ exports[`Storyshots components/SavedElementsModal/ElementControls has two button > @@ -42,6 +43,7 @@ exports[`Storyshots components/SavedElementsModal/ElementControls has two button > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot index be0fb0573c394..1c506819df1fb 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot @@ -66,6 +66,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -92,6 +93,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -170,6 +172,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -196,6 +199,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -274,6 +278,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -300,6 +305,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot index 03093b41300b8..04b2184f27462 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot @@ -362,6 +362,7 @@ Array [ > @@ -388,6 +389,7 @@ Array [ > @@ -466,6 +468,7 @@ Array [ > @@ -492,6 +495,7 @@ Array [ > @@ -570,6 +574,7 @@ Array [ > @@ -596,6 +601,7 @@ Array [ > @@ -851,6 +857,7 @@ Array [ > @@ -877,6 +884,7 @@ Array [ > diff --git a/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot b/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot index 4d5b9570ee20f..16263aa7ea384 100644 --- a/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot @@ -55,6 +55,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -80,6 +81,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -105,6 +107,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -130,6 +133,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > diff --git a/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot b/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot index 14466cab1a698..f8583d7cd0dc0 100644 --- a/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot +++ b/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot @@ -169,6 +169,7 @@ exports[`Storyshots arguments/SeriesStyle/components simple: no series 1`] = ` > diff --git a/x-pack/plugins/maps/public/classes/styles/color_utils.tsx b/x-pack/plugins/maps/public/classes/styles/color_utils.tsx index 116e03096b0f5..0192a9d7ca68f 100644 --- a/x-pack/plugins/maps/public/classes/styles/color_utils.tsx +++ b/x-pack/plugins/maps/public/classes/styles/color_utils.tsx @@ -139,11 +139,11 @@ const COLOR_PALETTES_CONFIGS: ColorPalette[] = [ }, { id: 'palette_20', - colors: euiPaletteColorBlind(2), + colors: euiPaletteColorBlind({ rotations: 2 }), }, { id: 'palette_30', - colors: euiPaletteColorBlind(3), + colors: euiPaletteColorBlind({ rotations: 3 }), }, ]; diff --git a/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap index a2c7e72e51a9c..26775608637c0 100644 --- a/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap @@ -115,32 +115,28 @@ exports[`Paginated Table Component rendering it renders the default load more ta }, "euiCardSpacing": "16px", "euiCheckBoxSize": "16px", - "euiCodeBlockAdditionBackgroundColor": "#144212", - "euiCodeBlockAdditionColor": "#e6e1dc", - "euiCodeBlockAttributeColor": "#80cbbf", + "euiCodeBlockAdditionColor": "#54b399", + "euiCodeBlockAttributeColor": "inherit", "euiCodeBlockBackgroundColor": "#25262e", - "euiCodeBlockBuiltInColor": "#0086b3", "euiCodeBlockColor": "#dfe5ef", - "euiCodeBlockCommentColor": "#656565", - "euiCodeBlockDeletionBackgroundColor": "#660000", - "euiCodeBlockDeletionColor": "#e6e1dc", - "euiCodeBlockFunctionTitleColor": "#75a5ff", - "euiCodeBlockKeywordColor": "#c792ea", - "euiCodeBlockMetaColor": "#75a5ff", - "euiCodeBlockNameColor": "#e06c75", - "euiCodeBlockNumberColor": "#f77669", - "euiCodeBlockParamsColor": "#eefff7", - "euiCodeBlockRegexpColor": "#009926", - "euiCodeBlockSectionColor": "#ffc66d", + "euiCodeBlockCommentColor": "#8d919a", + "euiCodeBlockDeletionColor": "#ff6666", + "euiCodeBlockFunctionTitleColor": "inherit", + "euiCodeBlockKeywordColor": "#a184c2", + "euiCodeBlockMetaColor": "#8d919a", + "euiCodeBlockNameColor": "#6092c0", + "euiCodeBlockNumberColor": "#54b399", + "euiCodeBlockParamsColor": "inherit", + "euiCodeBlockSectionColor": "#e7664c", "euiCodeBlockSelectedBackgroundColor": "inherit", - "euiCodeBlockSelectorClassColor": "#ffcb68", - "euiCodeBlockSelectorIdColor": "#f77669", - "euiCodeBlockSelectorTagColor": "#c792ea", - "euiCodeBlockStringColor": "#c3e88d", - "euiCodeBlockSymbolColor": "#c792ea", - "euiCodeBlockTagColor": "#abb2bf", - "euiCodeBlockTitleColor": "#75a5ff", - "euiCodeBlockTypeColor": "#da4939", + "euiCodeBlockSelectorClassColor": "inherit", + "euiCodeBlockSelectorIdColor": "inherit", + "euiCodeBlockSelectorTagColor": "inherit", + "euiCodeBlockStringColor": "#d77092", + "euiCodeBlockSymbolColor": "#e7664c", + "euiCodeBlockTagColor": "#6092c0", + "euiCodeBlockTitleColor": "#da8b45", + "euiCodeBlockTypeColor": "#6092c0", "euiCodeFontFamily": "'Roboto Mono', 'Consolas', 'Menlo', 'Courier', monospace", "euiCollapsibleNavGroupDarkBackgroundColor": "#131317", "euiCollapsibleNavGroupDarkHighContrastColor": "#1ba9f5", @@ -230,6 +226,7 @@ exports[`Paginated Table Component rendering it renders the default load more ta "warning": "#ffce7a", }, "euiFilePickerTallHeight": "128px", + "euiFlyoutBorder": "1px solid #343741", "euiFocusBackgroundColor": "#232635", "euiFocusRingAnimStartColor": "rgba(27, 169, 245, 0)", "euiFocusRingAnimStartSize": "6px", diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap index 391aaba17ae3a..22f89ffc6927e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap @@ -115,32 +115,28 @@ exports[`NoteCardBody renders correctly against snapshot 1`] = ` }, "euiCardSpacing": "16px", "euiCheckBoxSize": "16px", - "euiCodeBlockAdditionBackgroundColor": "#144212", - "euiCodeBlockAdditionColor": "#e6e1dc", - "euiCodeBlockAttributeColor": "#80cbbf", + "euiCodeBlockAdditionColor": "#54b399", + "euiCodeBlockAttributeColor": "inherit", "euiCodeBlockBackgroundColor": "#25262e", - "euiCodeBlockBuiltInColor": "#0086b3", "euiCodeBlockColor": "#dfe5ef", - "euiCodeBlockCommentColor": "#656565", - "euiCodeBlockDeletionBackgroundColor": "#660000", - "euiCodeBlockDeletionColor": "#e6e1dc", - "euiCodeBlockFunctionTitleColor": "#75a5ff", - "euiCodeBlockKeywordColor": "#c792ea", - "euiCodeBlockMetaColor": "#75a5ff", - "euiCodeBlockNameColor": "#e06c75", - "euiCodeBlockNumberColor": "#f77669", - "euiCodeBlockParamsColor": "#eefff7", - "euiCodeBlockRegexpColor": "#009926", - "euiCodeBlockSectionColor": "#ffc66d", + "euiCodeBlockCommentColor": "#8d919a", + "euiCodeBlockDeletionColor": "#ff6666", + "euiCodeBlockFunctionTitleColor": "inherit", + "euiCodeBlockKeywordColor": "#a184c2", + "euiCodeBlockMetaColor": "#8d919a", + "euiCodeBlockNameColor": "#6092c0", + "euiCodeBlockNumberColor": "#54b399", + "euiCodeBlockParamsColor": "inherit", + "euiCodeBlockSectionColor": "#e7664c", "euiCodeBlockSelectedBackgroundColor": "inherit", - "euiCodeBlockSelectorClassColor": "#ffcb68", - "euiCodeBlockSelectorIdColor": "#f77669", - "euiCodeBlockSelectorTagColor": "#c792ea", - "euiCodeBlockStringColor": "#c3e88d", - "euiCodeBlockSymbolColor": "#c792ea", - "euiCodeBlockTagColor": "#abb2bf", - "euiCodeBlockTitleColor": "#75a5ff", - "euiCodeBlockTypeColor": "#da4939", + "euiCodeBlockSelectorClassColor": "inherit", + "euiCodeBlockSelectorIdColor": "inherit", + "euiCodeBlockSelectorTagColor": "inherit", + "euiCodeBlockStringColor": "#d77092", + "euiCodeBlockSymbolColor": "#e7664c", + "euiCodeBlockTagColor": "#6092c0", + "euiCodeBlockTitleColor": "#da8b45", + "euiCodeBlockTypeColor": "#6092c0", "euiCodeFontFamily": "'Roboto Mono', 'Consolas', 'Menlo', 'Courier', monospace", "euiCollapsibleNavGroupDarkBackgroundColor": "#131317", "euiCollapsibleNavGroupDarkHighContrastColor": "#1ba9f5", @@ -230,6 +226,7 @@ exports[`NoteCardBody renders correctly against snapshot 1`] = ` "warning": "#ffce7a", }, "euiFilePickerTallHeight": "128px", + "euiFlyoutBorder": "1px solid #343741", "euiFocusBackgroundColor": "#232635", "euiFocusRingAnimStartColor": "rgba(27, 169, 245, 0)", "euiFocusRingAnimStartSize": "6px", diff --git a/yarn.lock b/yarn.lock index f7b310cca7590..cf9126b668e51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1332,10 +1332,10 @@ tabbable "^1.1.0" uuid "^3.1.0" -"@elastic/eui@23.3.1": - version "23.3.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-23.3.1.tgz#08516910d24eb148110f99d3bd7551240f9ef3d4" - integrity sha512-81N5xXeZwm8HEPE5RAPQFFUNUzYlTVJcNhW+DDN0EY8MlxVob9hgHy0AwshQGfrHlqhm+4gix110pW3n9Jweyw== +"@elastic/eui@24.1.0": + version "24.1.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-24.1.0.tgz#40593cc474237e8c464d182faa50c748b3f66822" + integrity sha512-Y7s327h0Z8dsO6MY7Sn1k5pOrf9ZjWH/ZE2gVtfBn2He5aFahS/+A434EBqFG0YV5W1VZtYiXtSj0AE1gjtrrw== dependencies: "@types/chroma-js" "^2.0.0" "@types/enzyme" "^3.1.13" From 2e3578602fcf999b279cf0de4091630cbb4649ee Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Tue, 9 Jun 2020 16:17:28 -0500 Subject: [PATCH 65/65] APM Storybook fixes (#68671) * Resolve core legacy assets in @kbn/storybook webpack configuration * Ignore stories in Jest coverage * Combine effects in Cytoscape component so handlers are always added before events are triggered * Add mock context to ErrorRateAlertTrigger stories * Disable TransactionDurationAlertTrigger stories Changing the Cytoscape effect behavior is necessary because the layout was not being triggered when the final set of elements is provided as props to the component. When this is used in Kibana we're always starting with empty elements and fetching them, but in the Storybook we're starting out with the full elements. --- .../storybook_config/webpack.config.js | 23 ++++++++++++++++++- x-pack/plugins/apm/jest.config.js | 1 + .../app/ServiceMap/Cytoscape.stories.tsx | 2 +- .../components/app/ServiceMap/Cytoscape.tsx | 15 ++++-------- .../ErrorRateAlertTrigger/index.stories.tsx | 23 +++++++++++++------ .../index.stories.tsx | 16 +++++++++---- 6 files changed, 56 insertions(+), 24 deletions(-) diff --git a/packages/kbn-storybook/storybook_config/webpack.config.js b/packages/kbn-storybook/storybook_config/webpack.config.js index 2dd051882bb4b..543bb47656df8 100644 --- a/packages/kbn-storybook/storybook_config/webpack.config.js +++ b/packages/kbn-storybook/storybook_config/webpack.config.js @@ -17,7 +17,7 @@ * under the License. */ -const { resolve } = require('path'); +const { parse, resolve } = require('path'); const webpack = require('webpack'); const { stringifyRequest } = require('loader-utils'); const CopyWebpackPlugin = require('copy-webpack-plugin'); @@ -95,6 +95,27 @@ module.exports = async ({ config }) => { }, }, }, + { + loader: 'resolve-url-loader', + options: { + // If you don't have arguments (_, __) to the join function, the + // resolve-url-loader fails with a loader misconfiguration error. + // + // eslint-disable-next-line no-unused-vars + join: (_, __) => (uri, base) => { + if (!base || !parse(base).dir.includes('legacy')) { + return null; + } + + // URIs on mixins in src/legacy/public/styles need to be resolved. + if (uri.startsWith('ui/assets')) { + return resolve(REPO_ROOT, 'src/core/server/core_app/', uri.replace('ui/', '')); + } + + return null; + }, + }, + }, { loader: 'sass-loader', options: { diff --git a/x-pack/plugins/apm/jest.config.js b/x-pack/plugins/apm/jest.config.js index c3ae694fe8e14..43bdeb583c819 100644 --- a/x-pack/plugins/apm/jest.config.js +++ b/x-pack/plugins/apm/jest.config.js @@ -31,6 +31,7 @@ module.exports = { collectCoverageFrom: [ '**/*.{js,jsx,ts,tsx}', '!**/{__test__,__snapshots__,__examples__,integration_tests,tests}/**', + '!**/*.stories.{js,ts,tsx}', '!**/*.test.{js,ts,tsx}', '!**/dev_docs/**', '!**/e2e/**', diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx index 1c62d3cc03db0..30031a05304bb 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx @@ -346,7 +346,7 @@ storiesOf('app/ServiceMap/Cytoscape', module).add( }, }, ]; - return ; + return ; }, { info: { propTables: false, source: false }, diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx index cb908785d64d8..c57d702b9a546 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx @@ -121,15 +121,6 @@ export function Cytoscape({ const trackApmEvent = useUiTracker({ app: 'apm' }); - // Trigger a custom "data" event when data changes - useEffect(() => { - if (cy) { - cy.remove(cy.elements()); - cy.add(elements); - cy.trigger('data'); - } - }, [cy, elements]); - // Set up cytoscape event handlers useEffect(() => { const resetConnectedEdgeStyle = (node?: cytoscape.NodeSingular) => { @@ -223,6 +214,10 @@ export function Cytoscape({ cy.on('mouseout', 'edge, node', mouseoutHandler); cy.on('select', 'node', selectHandler); cy.on('unselect', 'node', unselectHandler); + + cy.remove(cy.elements()); + cy.add(elements); + cy.trigger('data'); } return () => { @@ -241,7 +236,7 @@ export function Cytoscape({ } clearTimeout(layoutstopDelayTimeout); }; - }, [cy, height, serviceName, trackApmEvent, width]); + }, [cy, elements, height, serviceName, trackApmEvent, width]); return ( diff --git a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx index 8f7ed54f91bd0..ebcb1627984ad 100644 --- a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx @@ -7,6 +7,11 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { ErrorRateAlertTrigger } from '.'; +import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; +import { + mockApmPluginContextValue, + MockApmPluginContextWrapper, +} from '../../../context/ApmPluginContext/MockApmPluginContext'; storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { const params = { @@ -15,12 +20,16 @@ storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { }; return ( -
- undefined} - setAlertProperty={() => undefined} - /> -
+ +
+ undefined} + setAlertProperty={() => undefined} + /> +
+
); }); diff --git a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx index e2429d1225442..da9adbb8dfead 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx @@ -3,18 +3,24 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +// import { storiesOf } from '@storybook/react'; import { cloneDeep, merge } from 'lodash'; -import { storiesOf } from '@storybook/react'; import React from 'react'; import { TransactionDurationAlertTrigger } from '.'; +import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; import { - MockApmPluginContextWrapper, mockApmPluginContextValue, + MockApmPluginContextWrapper, } from '../../../context/ApmPluginContext/MockApmPluginContext'; import { MockUrlParamsContextProvider } from '../../../context/UrlParamsContext/MockUrlParamsContextProvider'; -import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; -storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => { +// Disabling this because we currently don't have a way to mock `useEnvironments` +// which is used by this component. Using the fetch-mock module should work, but +// our current storybook setup has core-js-related problems when trying to import +// it. +// storiesOf('app/TransactionDurationAlertTrigger', module).add('example', +// eslint-disable-next-line no-unused-expressions +() => { const params = { threshold: 1500, aggregationType: 'avg' as const, @@ -44,4 +50,4 @@ storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => {
); -}); +};

|V>`uS;zOs4%?xx3pAHpOgXlI_T695tG#o*Ja+~9wAOG%JLl{mm4BA-@_ zZcULwc@RWApkH71?wuKRu&obEK)Q3wOO2CPZ7)oVtNL|&euJxK)Mw0=JT_d;7c{3W z)3Da}DeYGExl`Ti#AaGI3%9Mj9EKBaNN2E(3TqoRCVqclG<#Gz?FLUf@A_Pvu4H=szSxOUqYXS-31+xf z=h5O91^=Pf@c~>&a34aD_$(}>(9>u5oOB5Sa7PNLrV<0l7y#c4ptC!;MWh0R;gz)c zCpWBu7O-;U0IYh~RpwQJf9?8P}$F z744&El0&@^8_cd*sdFwI!5W{;XP6!we!sB`+U@vIcB_KYA036d!`$TC8b#1){ItBL zf%;CJAL^w`l2`Iuv`!F2#&~0yNy*V4>dS<0Yms|5+`mUg86V{{r!_>a((-FmGjK9y z{BR!8E1wR+dF8jwgNIq#<&~W1wNMWk%r|*_@u;?-2~E(jVl+zGzS5gid$6R}ZFO34#>kHb$8#ad@Sn-)*0)Q& z3~^|9{F<|JLH#-cWu|e^5>QhqyJJHjkZLD(Lp~@ua=Kzh>LInx0mF!G=l<`pbqfAfwvUn`a&#+V#rHcG)vOZ@;)LV7oeM0`C~QJ zeHsz|LQxZ80ITdA-*RFz-?WG`wdZ6uf_w^NVH@Px+Dwk*;=^e5kc5>Ygf?eMyc3C>y4zWVdA1KoF< zoS)pR%BR^ILSH%P=&Xbp<;B4%s_3OfWco`EksZy~+z^JT>?6@0iLVI97(2YXHj*M0ZXYyS3 zPIKv2N(LR|*LXzW97F@Al_GW=U9-nv71y28AuDdA6!m1bm`Pk76~Sb1{uq++efSPZ z48vkx(?^uCRv3uh>N(-Zl_H6bHmPA3ZXo@00AZ2HW}q9eu` zHpDnPhs4&J14qmPUJyzU*$p2D_!#cUoU6Pvd4LgxKIq(ay|n(`_7qInLmTocq4Od{a;+PnhvN$3+=83MgG6 zM>@0tM!9o<0^zOR31={foW$-ZD?BIv9y*@Z8J&X3~a9ig#bRn{l0?o5@IqS^Q>%_-{*2C*T!|Ye>cV(j=cRTPEjxU_HccW`R@J0v!K}* zUOA3ImhQne$-%b9v}SAoenYT=p~KMjGe-%Zr|!?wl!D($1YbQ2`Pm)d$@PNmBzW<} z%Fi8%Oh$$^AW^f(>%_U;lGs7$UbL#OwlC2=CITztP>nz$V=RFTCN!N+DH90GkqBc8 zBr-#U70rfKT!cMx5>XKiuQ3j>NG}mON6(%qxu_A zgR`jN3sh$^YE&X((l}ze7llcVm~V(!oQ+s^=P100V0FR0DNJ~}(&hRl$jIcaQq&8i z5M?CITXogRKsR=$cP|-eEs^Ltp{Tb~D7X~hC^nu8gueZ-@*?^}kzb6EsNx3j;U+jV zH{^6ZiZE2{ya1s637o%`qgPY7E(858ijg$D|5#D#wxm!w2P0c0zX9@1_z`S8&;Q}H zeuSg;s{nqliCC&apSn-WB6(eWcw^9K}F}D}|qJuHGga`zl`D5^BCo;A%U5`TGV=mzD zn(TnRlimk@R|qs>i65@=J1`;2UlNUtl7GgF&xa)^ttKllr_E-^6=9Q09b-|^1nHoZ zkD(A#C$JgXndmJj&^iho7CvuV`+W}L~rU0L~!Q*|vm(e#-v?S-n5K3$Y5|))DM06fXxB*VP z_-?0uoSBKu`U>NEOA!=u#Dy;fz(f=s zx|8g?O~7piOWJ*E(^q&m;TbW$IT@q4J2{AqU>H%*aZ22376y^q;ScPsKA`Rg_@xkn zQe-{_5W;z41rxBbzM}3vj3EeIA4@g`C#F$Qs-y*k3|uY(1b&;FzMv{LlLUseMR@dX^H5{JpJ%tZ;#} zZV?J(Z&gB}CKc@RXp!4%?jQ)#5IA(I0rp zE`l_`F}>!J^n0&Ru{zm#eYQ^tP_YjrqyimHz`j4&REVgfsW=2pfEPp71|!m4O)a4; zQyMG%Bn9iREphO@(-np*&PpXHq9W=u$*o4XVr+pu1Q7r)&y{*hDnvEkpSL&?x*+-FAtH2_Jle8P&Xqu&J>XX%i01JO%(^iB=wY-BT4WLJ6;7zfWA04 z#};VxFb6MCN2@*QD0$y)0+bg*&`p#fh{`}vd4mE>IPT+zanLe^a_U}{Y8z(11Kbf- z9?nz~=le91sWg(Q8Ve#zImS5RS4)mng<`8!0EnI`P}&5hU!ahJ)ZWpp&cYBxD%B3d zpCp;&B>U!Oz`bL!DM}iE&T4HFh(gXIF9cH?DMaXi3Dks%FgF91p6mz+wZ2e;{sC{( zerzcmm)l+f6~Q(X9o5G~<306o_7x%Qn;}+Mt)En>>jOo-kp@E5fu7VS?z|+Ny_ON0F421nnzt2YWF*JyF@txAio zHYx@@1_&YO%1qEFeYQ{C(NPQ(HPO*oyrz)GQeY+=x~cKm0ZW*UCLn{BOQSzu@;eYzemy8ywC94k(kNUm;C1bNas>-(l+aLplz zmPnzp(KN8cD6s^*9R+K`oC6$(0up9m6%_QK4#@raJp(GIyQ zFxhIZf>~$OYG?FnNvj44m8P)eB3K7yZ(magn*$pUcF00I(U=aTPUlccXAF$qgArD@ z2VUc$@q>cx>;w9JTS|n=UYdbTG<%TI-6^2%K}1iB2*jF?<_?rLh>wOy2H>)%jK%bd zFoLC{33FtChxT0=ZQ$hrAV~&RBEyx20u<)oyynZw@}-Pl1R}z~v5SD$6>t;V7BJd3 zk8OD`I`D@L#w-IkT>&XqeDx;au|p&b)7-0!x<@`yBr5@Gk01nLJUay?$ZT7WF9F(41OXR3_Tj?8wG(fAmxl* zf^!T2`@zF@Gl29&<>pKlK?N6Ad<5|z$Q+JbJ(>xL9?wAM z_CUHdmmuQmvjxvd&{!hV2Q(2w5H)^5Rr$GoU&>cY6q%&bat=U#E2OYBTAFzl&#y}X z(k=M_%o$MdfmF2eDNtPwsU-zdzNbFNX0MU-6R-+=os*vM{e{@zeD zrVBJiW)-m>&$q`J^W|fe-99~dQG0P&pe0dg=GSk)(;L|I28hEBt#5xs)q*+x03}a{ zOmA&v=`_N$fU!^0Nr(faT2td|>K1x}%7~3{*aCsi2GM6AK^DyO4Ip^~kiG%PM~0-@ zz76Rtmqu5<%p}7|m9gNq*~wwT*l#VNgyvrWk*w=D`wQVWK=|9Kz#FhwRIS{>(e@oI zq0=%G1^$VwLj$7r}$|-PPv*5YhzL09RgW6Ol{fx7q=+ivUFOj~pHLza#`MxL3C+>njj8=dT zk9w0}7Yt25B%WP}exw*7+g|Ahqe2O!g$U213Baq6^t}raJMf#RgO48_=Lf;>>=t^`MbLGmA2xC4Lk?-!m8dXe9c9|05OfPg$w;VECNh9^s^R~CeTW)@Hs4r*?KC6ki zIQ>()>H40)ZAec{dr*SkbZbzzO=UcfCZ}L8JJ&w8f!{>zD67Y3cd+tT5x1eL;jwDs zxRKg3IR$~A#p#mO8$#i;(dFuNUzqZPJGmaZD2*|&qZTL~^7?AHTi*vOn>e2z=S`HR zm`}&OQstfgm~W5Y!QEHLkqHQjSAi#Ca|(*mDH*4UFg->4;Tp+0(Frq5nI^s!`@5q? z^*s2Pfo65qbn;VDjb*kvqa|e@-t48CC;AHtNgLV&het(4%JyVbC1uk(WY%~%ixbM` zc-&*d{dB#I!CObqE1En=+&VpGUMl8szWb9HAe=oCsL;Wlx>)|oVbbWlU3T%=J<`^6 z8duSdn+;}z1uaZ3wiZ0p%{5vDMa}hpYaWzO&aCYIK6!dBHg4`_G4^)RV(P)kGwm|? zOt8z?3u^=IMX^{_=<=kMTF~9!lna7-f!9DW^UWSG9Sdc95H$hW^M}Y_N3PJ&^l1Gc zl!yl#aVWdHVXhulfT;z^! z^E)x|wRJGma{i?4zay%xZuv4RD32qbrN@%@Tg&P6Kw2HmmskXsk-Fs9M^Q@enVWu+ zg`1>xFxh?ko7g&XU3`7j|H)xitt3bd-z>FpqSlbT=!R*kqnn<)O@DQuffJZE2%6)_ zRqM5z!)#u}*K0o%%nFv2^vR7F3hISI2L>XaJC7tC$_#VB$?1=K%JN8xm~(#M7>+(t zR85eksb%W^nmKnnwNi<`kp# zZ-IQK4H}DQ>3QKw;oFmEuD9OwIH--p8tJ`{Xg(?%-)eb~=`#Aq=Jobc+-7U|O7rO# z`c+So$fl;CdQXW@AF~{OeQ6NUY+@@=8M@z{62EY{+WE$ldnSa0USg_w`|H*BQ7Q&u zyVj3-&DawBMs|(o_$Ep) z1^5=SQ{Hp*Br7v%y9jJ?)5ZAQv{#yyq2niXjHYDB%O>-o4m;WVq6ZPp?)Hxb)2JU> zGHVP&Nh>>Vr}Bg(j-p93dWD9)2#C9WGMg+DMkYOAF&dN9>jsQMK{Q>r_?VQaiZ3u$ zPhukIWGuUYvGl|sMaG+~fv9~|FfWQ(B6~GguroWE$@lne9F{EStP-qHmrdj+!^X&| zrY6!F<0M*2xIt$Tbn{)6>V0b101%Te{=qr^kXy+UNi5ad2aEG!)ZrAK%REDNgkzvD zc|MEYasHqueQ1$VH+|Nv&hS0CSF?a^F@MlX>U+v4sz9_*Z3xa>m5fW}nkP2x8_E~n zin8Ml6mM12wm1BqzN={nw|TB@{Zdb2rfNfaLT$uDiu_gb(V}C)6w=kZgQPJpQ0|M` zsDD^_8uA0@D6y2JQ=U5GJ63C%J-qTJaLFs^mX>meg-D!}MQ+?!Av1o-K%c=RnoEnr zwMBwU@9IX_*kzYQPo8{q!D&Imb8h{?Mr~);!h*71Y_w9?1X)-`rYekBQv-6-89h!J zgV~ez;0ZM!t}ZerYSX)&JtYozD%R^NG44^HRMe$<&tpRbt<6tE!h( z2yorn*4+84#1_l;AuU7P(3ov!IKv>d$}DLIX1k@%Dx)KCWiL22=K4*hKQ=d)S>3l2 z6h``Gph?SZR5a$tQ_pIOw90Lb2Ii-m&T26c<@VMZ3-j|gYc{S99oz;MmM_ohv81ox zNNOyuGn_Z{YE?KV4J>X;oi`Hwjt#Mycr+kJ+0-5XdhUbmQ@`LJ4HH`e_=tXyoC2|& z*~bO6-6@Kv>!amHUkdvg@(Q@|#aq)bf}E$);6G=ypQU8%Ze5uI*_IVB!eK#QNoItC z&1ee&N1#{X>?*O3TidC+5HAd|3cO(nq3RZzYq8ZTFt5#djHP#b*wRr8rpwu+Q*t-$ z(>B^iC9AwVMhd%G-2QdZ11GDB4$<6Xx%IPGRl6z{mo&J^A^o#YCzCHQS96QUbS}@x z)jXh@vGvZ|6pqOUdtsmX1WDt5x|+*=*QPiGL_F^gMFdoLqz3g@K2#sJHLniX_+_Dj zupWrr6(TDg2rs;;HF{S}iMR-2gk|JeD7%beo4YpWyR7bw=7oG-%JR(TRB^S z6O8m5=1MQW@Ce>RY%7yLFLq!*E_nH6?X^Grv;XV#oLhbe`ax17I416g0pg<{|8xY` zj(wzs9_~LDH4TgFwFu$GSGZia~}LWU$>sL%peZM>^0iB zmzwsSozqoFczCWz)8?}wLw#izvjd4r^IXvLGQn2dxA&FE(w_qEyTH?R*ZXEGM50vey4eg(u_Rb=&HUnrR`;96T6RNMa2wWrwts`YqCa$(6 zaL$9#^g*G94E9GqUnqPkYOiQ{F6g6A_iDK+{ZX;DoX_lNA$5A5 zk^Q{>$fd`Fh94NWbv4|bU-M}rr*$K(Dvlq2E#s`)S6a?nkJ$09)^26NW6U3(Oq?cc zRX2atFAw}q#Ll&I_gQuB=TB!|jJ~IH&cA$!;DSweAt&TLSIyS$0>yXF9qX7i7%k;a zi6)6B?HI4_Nd91@EW@dzKTiW3pnMo!JRAXFLBDqZDy-eF8Q%yH9&v*Y^R%ycysuW$ z`?do2izMkXE8yy#Er7Lf0O8$9en#94dL{NypUvj(uJ12v#7$#=N-Hok;F}8bzv2u4 zAp>OnrB!v_-2%vn90MqO?U-F1_$9zI-B$WFzEl?gmoWf=BVeNzY&NzcTwvj%pdb*9 zl(DZVa1({_A&mEuS0yKaL3oqFV##!1{9Y1^UTUX{XHYIM?taKKKR;`C9zW23?-JsJ zeDMwNf8eh6?3j&};qbBfP#!aZ{iNPp`e>f+++5s30YW_l)| zKbZS{_~7k}iVX}5M%q}0Rg9ug5r12U5z(=3&eym{++W-yCAnuOwe)ZCFf%LrAL8R0 z^e8XLzXm=2;XD2zJ36nQiG^#3jD%`s!FRrnRYv$r_o$&a}b))e2@9(%j3;%yOi~l19#A{f?P}%T5yM!93|MxCo zenDYTv7unee{>0J>*^bV19Bo8KYhlwwg0P2*wNZMFgP?kGCJ1S+8;I*HxoP;v@rf3 zu*UYz?%w{v;g_%9j{fNqo?raD{B`yFA6P>bgKqoVC0sOOdhCaPo?tCg?x2KE7MXyX1%y8@tySBB_B!zC} zgQQZEH^EiD1hmlR;_aaj?T5-*)NK%AUM?2eb%uD1z(D06$TDi=(0DK!%4%7XRJz<; z^ut6D-O-W*1~o#?@8E&UsY zmoD&Jab>vGb0N`Q(Yf;zW!d@n-B%=cBZ{)WDKLNR`Ru&}!7Jw)KUm2UZR@~+h`Fx2 zgnyFY1d>OEtN&A%&}J=&&Z=lF82|k?eF#(V_36)cv(}VP@PqMs7+>A)dN@T1uz?bt zw%Le~*e=?LlsVhoh=LPyZ$>NKe6<;)%2B+Di`5k0+lg**e9Dij>^#FSSj6VIt2jRhB38+Va9&j;M55O#B(DQTqd3E#(Fg=B8#W{z87sWBJ(Wei^b3d9Dd$b5JR?7w#_ey_4F;H?5*6 z%jx3D2B7;qebKS%s*u1l@FDnVZjd$eSLZOp8Gh;v+iv|CFY=`nLWlEZk~N3Ewx1{b z7ps|?78le8#!d}Gf%jiiY#`y@$hAl#bJ$k6>K)1LM7KN!ml+)y{0D){G^W*T8aiXGp|nb zWCS(8Hh;E!do=0xIrMZnL{JuoOn;;&yRynD@`0eF&A5K#-&o z3z@z!Tzj$fo$BNoYifg%dLS8%O&G&L-fklUBsxr^6HQsZi)M~y^&LYjl72sr6OMdM zVa}&Y@=O(AqV@-*xjHKx9q$MQS308Lxw>~G6clE$5Q$ws8Y_6Dgm*{O;}5wGlX(F$ zHx*)b95?UP;q|G;>f$I;MMG}{!I5;7Eb^Iy6cqaOq1xNzq8W}`u?pO9L)WOpp6IO$ z#49N?b9}9z_y*k5HX2&HdK@e@_&i(L>pO7*hz>?UHvFe%#L!#&nzz=xm&L-O zLwxA3gXBEwGn$-Yq7nEsoeEUPIvkHr=?OEILzUV_xijME=p%Nix%YMF9_r_9E52e; z;E@SR#dktB>_!_ypyR~`)CTTP<83ZUdXK5|krR7yhTP3*7P&;8F793ry2EYCl)0Rm07iU zOb>aSRo8X!*$^=_4M+Yjr~enZX`buTU;K#+-`anj{uPcP|BusuG@`<#P-AJ|{56L)j=sSVk>xWIBFEyK+0zEJ?Xaj{;(z>NovN^Wi-Rn%#J5A5KD7SEnaQ zYA&R2hy7$lWJ_$X6XidXo2h)yW=l;=Rwe@nFw_-di%B2x!>I#I9sL7e+UXq9B&6=1 zac9dP=x+oW6~>DfeP}Cvv@sQvDtg65-CW;_rzkvB)6H31Li5O-(yu@LEJM@h(^HMMCx&)pc0 z9D7&0X=g<0I#(6wFEl(N;$mUhbYkcxnTtJ?g@Yz$+3$@Trl%Q+Nn7*%_Z4rvdIX5 zNko|_c|r&WjI?c(I?X5;RRUYNvyUF4uPE@5fmjOR@3B-0n@IR2aE5YGb_7w~Ec(fu z`U&vWXW36dYYfY+eN%->dtWsLPDQ*%rrph%X}{MstYvZ(3USOIEhrvliBz9fpw35pKV)DqNWqevdkrNRLPI z;(i|nM|Zsr={MenZ+FRK^grAHvjR%ZbTMy%^UdD zS0TB}-(#oc;a5j_On+FK%E59Q3ctd3z1RsWekbv^{|OrPVyMDfIVW2$fPFOrE_%ST zH^4;3;45PHKqj9I$MJ+*JJ1eS^cXc*LCMDe$0NBQU}k;$6sW znN0p785Useo`?y`f%|zU0~z(sRcl~{Ucks5P#*P#s`xxg2J191G1(B^jSktnZ&$-X zVcPSW&(X6|$3e{)q8Q?#6{H={8G@A1gxiGv7`3&vA-@p!WSp_jFb2oi03k@v!07)$ z+?z*3{WtvoGh^sI#xlmfHuhaZNkrLqLK3ovtTiN|62>z2v2WS;eM$CZtl76@DGJ%8 zY$a6l8`tN$?)(1zasT!Gp7VA5;W!TGFviR4`FK8_k+G&QX`4vpSy;6x5bgt1UyDjY z;246O2Q+E6H4smlJi?a3!)&mh!eB>tqq3H8nKc2SHqjCI;7>RrH8;}bLkUf8e+0b} z^H=rgjDV;pLCV8*x8SFgm?mJODH2>9kcM~`f{9F=VT3%5%|^$_U7$2_0t%QT4DP~C zN&r~bd=7HLy=G z7)vcL4+36kNz1tCh#b!wdt`|=DajMqSLm3`Eg#2YjyfoGbrX?rimWS{3^GEPD%|IT@NhQa(pvw!co7Gc81 z6>~BOS>)T)j^O}fPTHan%vkW{k9kjo`SYTsoZvl3bQirRc%k!zQX20&1XDXBT>d?&CN z7jplwk|T#RuB1SiNHuwyOZvCHOB=8d!M(;*RH`I)V)7#+DDRe)#Vr+vOgzp3 z=cEMW&bI*K#$j9A&$>TQe%-d%PlJ7IF3rJIwKxE$F0emll;V5=Fm~w+tuXRdUe;kw z=8SBlW);J6YQGOadk+TQ@fLVX;$c+ycVO(T7Q@YzS75NKI1j0vYCxwh7hMr&@F)!A zE1p{A^RBL6&f-}M>5o{w;780Ip+~m{>#LW_eHyD15Yno{uuD7UlS5!mcv>tX8g^YJ z6<^p3z|&iRfV3(@`i4Sp@csGHyqfx`3CPcu&=Q-JFA)+mzeppiF$Ypri4>5#&tMBB z<*!hX`2^peCd7)Fl!)}D=x6HHVa@;@OF$E*AyN_iXSy1327E~mekbq-r>Ga-YMGh= zB%PHvPJpZISv^G`$6{J8IF|+!n#o+l#v9AnZCX|;z6U&Vp-v^V;!qtO>QrlK-9{f^pP$yBMaEu! z=Jm>e*cGAJo(}4HrUk(LTE7468d)xj@$I1e4Ybb}EDZtzzbWl;gb{RC1PH<%0lOQ~ z6M`t=oP|g2!0Ix9>d>y@;V$TP`eK3Js~T;J3$PNu-Wc1CrhuH+r|o;7fJs@(rC$#* z*C~HohpFl2el7!q!nzvpZ(xSuu{FKPORWaF0G*9@hI(*ohEbUfgbp#Neywv1-%@>7!=ZD}s+Hf3;yh3$rK=EPf*iN5@RK_+ub3zwmRnxV47o(CrB zSvBoh=&+f7%KC~;r?O zOlAv?&3~PYAk>^#P%7gFWro253e8EV(aM^(RK#5>HrTbw7O%N?p%@T?diqM`(@6Mms1v*>zxQi)1oV+t@J&Y{r0V<+r z2s`uH#vke|Ka#qHMD%=9`^Vt?k8PwbA?HH3!a}d*LchDrZFQl2Y2_mxktn|f-ns?+ zlIU%!#Tjv$4h0%{%wph+QmYas9fbTx#3w6Lz>Hm9y#~JZf*Om^yX1;d$5Zc*E*@Ea z{`unbjM~RvqulfDpTW!8rLm?J64mD}T2ayEYjRQUORb0<&KCi8D4x;@N>!>n9#58mbVk zuZISyALC)7{Z`G4n|nW1A3I!nIVlw8DRfJ<_+g#?=V|$gJmSJjL6KKeFliG_yuY0? z8R;l<$=yV#!phEH;vU(jg``oShDTJh1CU&oAMUX?@3rxIf8)EA@)Yv^_R7v@u8^Lw z4N=RCEvUhVI;+EVQ84X2GJQ(e=e7~_et*Y4+K`&!L&eJIy?DF6Ae%X0t5#UtgLM~P}+l#I&dTSw5qL+y(Q zhMYmYSmaHvA6noa#xIdtFMq(e$*#me%{vi1iqLohRLua;QM_Hhw3dUb0u^>vsuYl~+z|PZB+Ow+a)7RE# z4KL4{vd>yN&)Pnpbr8=87k`&NA~z&F{cdx5TOWMk5X5{a@#ZfGAU!40I{MT8;i&;l zT>A53T!<6%YrYf2iTb^A^Y5zl-}RS&8!ugrM#BfH&3W(;(Huc>8zJLw!T`vguLiPQ zE#mnJj1F+nP=}zGzHG++{pYoz`tR%_STsOTaF3`VU@wTh8t_^$;JbsZKZH0gXe;#tqcTst`c3c?0sNvHn*zk4o`&E&t_b8H29=l8|`!#zj3FV1EQ{P+ET>v>rd z0(uF#4G!Z|HXvR2lWzMp9P#HD{rk{K}-B52U1kq$o^n9r+)5L0-o?fr7!s!o^KeXSBF}rgU+; zynU>^?_K%I*NVcz3ern!H>p2LavN3_msgG~oEJ%(+s=!m_QwC%4&SuZlIo-lbDtV} zM;iM#8b{_yz0&6Cl@^TcKMKT_g`JkQZ~s*@ZEp_kxNp?i;7X{&c6IjlG?@I;I_+&X zJx?o!hDd?MKaRxS^~3Y}>A~M~St6->+R-rB>2cmbeZM&TVU^TF9X=tB43>`!_5G7; zjBXr`_4SVRNB&nE_1vTQZhCt5UkS=?eOEwe+v~q9{yQa+xd4C zvb?hVm-wGFWM}pJ(dxnP_4TctFC#l^tLMqc*X6H=KS-`cQZ03N^zC^w^^o+Ae+MQ1 zs29(E9Gxd7|F6}H|5q}X|M^J(BIxOEgq_BcgjT#ctHnSKw~A6Lg_4)%WKN+G<7GcK zRoI>WSd>b{|Kd_i%*qq9uQMoC4ppV_WxM8tAG4%qZf9lnxkDzZ9L9Rb3W` z-jvT)+w^qsDNBl|@Ipq7R(%r%vjSNz)A*fv=a^&l_NN(#8_&C{WNi4gbAn=nwR?4J;Qs#>eg;F&1HqpA|P zI;n%yteK#b6AKPd)QIp}QBE`So|-)I-=IPQUiR?27Gb_WB(XyXBR1$L=1Uhi8f~8Cu)_-nJ^S(4eLi@w-a@rxL!p-Y-% z{as6WEvwVrrt#pXYIOJ0otqb=yqZ;teD%=@RGFD)2P2*Kr0YD8zTui^`vR}JmN38H z;lk7Gcs|@Cht}iO6yp0|>&4Z7AC}aA|9iIg_R`JYJF}07q^@c;@$c{B@1#c{34OYt zNr15J1pvA^5at2Jm3lkIV0uj`yJidNTl|yCN3Np21>DVF zNEUd}+y1>qJj_x<5ji~J@Hsm$6OY0b<=n(4a|L3J@3f4hg2SI(0WOxl9kAT1O>Fv| ztcWZfWDIvt{#9NG4%&K4jw?&K_BbKkWFEnMwIETpEl`muN8R4W;YEIS#Y|NNw?@*xAW+&fUP@cVA7?%unmHj>7j zs!4DQl&jfgh;a8x(yJ8hGSQDNg>Q`b0Mn^%*j=&|o}#%s|N7V$C9Ni!%@^Tn+MXJG-$3g2Y3V|SIdfh*!587lKQh}^96UTR*1 z44T>?;5jP+6o}`B|9bOXV)~xkNN8yLcLxO7YIy)fZ(~O*N`;+iAyiCNs65mGhWgXW zzU(hhmPWb(UU6NbVK)T>CTOh2*QL$+!vr_+f=a*gIl)hnCfOl7=3xk(@IU$ul7A_! zwH{kiKUVAD`iaKvUSHu!@#*X?UE`SLyQP-5KZv%nY@#f`B-m45*WS*pvW*c19v8p8 z(Gh{9{(&V8*A|1gDf`3 z3efxrwCGY0bC9)k^$EYBpM*)v$219}%0k3DbQ+zWHI4mhN6ZbWq_(g4s~-i^O}~79 z*lV6Zf4`AD<1ZS=y0kTSCzz^rKsnt*Az}A470#NhRW;@^1;%`MCjfpEM=iXmd{2;e zT<)mi?$jpT{efw|eHUKr$Bd+inRy|@K+3!qOKRn+y;K5ZtX4I^aub3MGp3n+UCkw4 zwPsu>99c^bb;OiIk*zfWHPn33R^c=n zs20%iZdh0S!g0JC&kX(ed4{OeO(3g+a8h-XqXWrXm~}b&KD3dR$bS?)Y+LQF(~34& zI@qT4#kx0N9g-}%({4TWbuuyNy^u`!OY*9qz;@MHDsRlY$JjzrA6+l;x0&6%h{UHn z)v=mPBQ_4$=1?tW%evotnmNxC3vf^j>A+@~Zycv_G=Aq6?v-#;f0FXPVBpSz+)~nO z&%hE8#nr&RPZ!-)`(8u83BuGm?@x7LPuXlmQv%41F-h&WJ>Fh9`K{Zrh}_NVrqA+G znBW6bvZ)8P@Y4Mr`u_K6nr_zY#QuQmWuB+j_nQZW_up(gOzowXz%ZDm!FAi9GKRoM z%;5o=YHR+AI>eGZD(BzCO)%lhI!Vd9PvK!0^;3x;z-dkbnxe~ar#FaI zVqnT-yq)gRSFyfdwQatZ71e!ZL$a03= zhos(h6V$z-!GCMrK2-*(BK;!IkTRJdCB4sbw^vZ$ijiW1;%i0Q8{G(H6ov^!>UA+P zZ(=BN$*%|?x`Hp?Myfi7>1)-%-)P)3o%Y}3Q>X>WYo(aeHNdqrJ+tD1uXY7R&LZR{ zd}1F2&X{nZ-}?y~!c#Dej{r^^Q+m5=p%h>Y*#j`+o)7h7MwM&kP6q+PhGE`Ka33c` z!EBg`Wk8^ACkFkey_qkwRRg79WrOA1Yy^)*x?3#JtlY8n@Q#ojkp z$s$CPF6^4m^Hj#7x8dNq%VhxDt=R}x!%*zq2sB>7B+xpqpZz71hOp1g^x{ayNi2jL ztW?7I2!*I;Var(&*!7C~L>EnI!V#7e#kh=3@nMVt0Z}yw!DIHh&1iDfCvpblzBaB` zz<`J1g@;QNlfT#(?kdg{#xNL?L+Hd>L61%7EUfx_b<9S3=li{jCl|tj>1bz#(JUSf2Oj_nW}Qk$HBpICKu?VQ1QIs`0QWY4*4!3 z&KwA$FhYDUPFm>#xz+`@J&I5~dt#`>)f1cW8n~X1k!)##GGUbdG<#bx+)V#blC_~g4kyQFBnOK@J zGXE+j+)$7E6&EZk{3Idbgu<^ z?H6~{FHU%GqUx2bHxx^7ka)a~7-$qQHZKgpJ$5Je6cBQ_ZRczik+17la+we za{DbqshDAYfK1rcE@df9zGa!MPMWyvjEexBl3JN!>M3)k-z^taPqS^LPLYFcuc{JA zFE=81Vp^wk2vI*2@_0+@WTm7tQJ=fEoC2)daYa#c)xkMEkvpzvtSE`^J$WrZB77wZ<6Wr{&9>^DMqw#?vFyZHSjZzJtqWJxuE>*9J6K0 zDuZjA^vFiKI_?Y^Ue{|E&yci_DJ#JAja{`8m+LNb*YQr)3W8r362Tli2*^Y(lxhbd zx>RBQnwiQFLZt*gWJR{e*Y}gjv1HJd**rkiLRxd`4HcQ%^XOIaWQ*~(8>V#0_Sz6h z2wsCxcA}mlu3lU8jfm2l+pbWZR!H*X8+h&Ybs>@o5vC4${P5lzUN9Ltpdo<0DZo`e zXt<%7ySf!!EysR)Y_j%`Ty<;CYmHVJ4K$eAL(Jh`!%ao7j3hww3|agEL5o11Y9n3F z=;%>U$i5h48BdYh0#^bc`(R-u2n`*eYuCWQ4fMJoN|vnPO0ewm+N(|QxO;m)QbmbK$%Od~hmpUVMA8E0P7(bD6s){&gq!ezSmNH-l~KOekuxqf;x3DP@X+PYd|Nj5=3{QZ$z%| zBfWTQO&3K5l0Bei{Fj)S7*cj39!2B^BH8=6!5xf&bg~vmov*1bBb#GaN=n2eIA$cic=Xe z%!4PpX3!uMN5DNtGVUNuIFPyQNZ}I}12@F@6ln&g<>GQ*h~y}IKe()BxYeMOA3R_m z0vm2axI8C}ctE*rM(Tgl@dk`a?~g%jyJf&6@bJy#l|hiNSd0bIw-F%#8l&LuW9%A& zdywnB83w4Ue`=2p#l8MX8BZNI_FfVkq(LX4_!hB<{J??4ACKH!9%oxd_z+sSm0-qH z$i{`f-Jf(KFOZow2q@7~jwb-qimIK6yP)8TATO7t353=ga`H|L!##Q(h6j1}DIrQ@ zthN(*`;AxKrUVs`>?p!Q8}eEkT+|)G+=kGr5%fIc9qU%$-g`Z>43@h`P6C3k~xZ=Y-I%Z87MRgjP{|yvou{TkLo+w_k4wRXCGMTmBjN!KZeS+BV^&6 z*W7CvCug>)ID*^}?{^5a3$s!l?}tXFcnt|+3KZCh_bQTuKA<^?-^eNc%8 zf9P!gz#e?<$y>Ol@B)>p$2qD?SF_V7x;J^zcATdcyud7$XGu3?N#B(>eMN!6tXIwT_E_wpZ>0emR$?R#!R{%YUDmAvO?yww9+C( zk}_+8jC%0{-{d6qa_mJ(it&{X;54LdeDUWOwvfZY zA$`sdtl(Kt)*^-B>^qK@M8qO>EkNA?|J5#Y2QmMi`-?2+GKJ*wN4jCi7-B#k86Jhi z+@oVqpug7+A5fso2>8s)#kA9oy!7yPF*i&dK~{+UtN^diwq2tho>5WY{Nj#yo=aqHIAPytjPGW06J@0=XS9|~TGwZ+Q-(RB0y+9qfz&JT_U4s4_{9Uam!Y7NaF5?5ABoL8B zR}s0T>p2_xM43f$RWx^9GlA@<-}a=^&QD6@H5yJI4rD>&may$6jjf1SEo?*$S+TH1 zz0dSw;zC_y>z)yEoRi+wppk~V%QBOUuN}d;0JNeht8M^~xtR!1EWV}IYi3RoQG+~n_SkwrkAECwws={P6IYDaf7a)xPeOT4v9 zA>Q9cC%-G%RhnwaIXIW!+=adG)<1@&f1g*X@>Xc_&vNOzvD%0)Kpn z;3SHPR!Pv;-7rUf=j26vuT$A-MN!aneWRg!$Dp*w(?#l6(sjcZTNMvlZ4P84zfpA^ zP{&QCW`PjnyA+1G#kPmG$%n(shtyqT)H=vpTmw?e2O8D0d98?d9SF2dtNz7Zus%|t zW}dpM1<0CYjRW18=%NDuI^1C6%0}wHI1D2HxxoFCW_ggO>yRq&*QPGXg|*BRC~mm& z^#y1ftN4Q^?u|+Nf%yR9;SE{X#46`+{q-O^BU)q_@kdk^ioRw`A!`rKU9bM>8NUF};zU@&@o+U+Z7m(Be&~N6F z6FCIQ3*ymY#KPQ@H2}O2+5YBr#im=<( z5oo1(U{GPWE|Jc}dXd3nPO@w$mpW$2R1-yhof{TnQEnKrU}@;B>UQdNpJ>>252nQU zOS)3Mj!nhw_vj3&aOr{v!IXZ|ws++cOqS8|g$*Meg&OLc=tLK252xZ)GnN8%2;|{- zZ6D;H61Kd?Xf^g5eWv)M)dD!G5hbb%tqyCZ&+&gJF|Ew0rx3qrYNVWd z=5qkLG2&N1%fkSjBII1)Sc+=p%I9!u;=bl7q8^2R=M>C~;@DKilD69OS0%ca#IOVo zoJu?)-iRAXJ7ka}MXP+sjW_by1a}lYqel-VU%_E3eLPVC92XG85-7d$NkaY~F2ApQ z$9tETWx=t=o0V9~FJBE)HGR+pbeL8kwgJsHn8RS0r#fn>AGJv(_HJ6}y(LF3G>^`t zd`~4tU(;PRP=B6`hmpqI*3{%_^KDUGwL|*p%n$i=H)&EGvi&cbU8P-Y6Y8GuZ&l)E zQJ3DN47o=5GLMDMKV{b0UW{CRYB;p?A+URKcu=*I>LgEdG4l$aml|T(i1&dX?l$&A z-=lnyyZW$DMw*e$rO0o0k_#C*6olpz+(hQ`^te7KI*0pwAwpx7B|Wv5P*OpRa#(x9 z8cKq8XxSm~8VmG3w!wVWI{OwRukFk&7^boJ>i4B@VNsw1*TkR69*a>N7^CZi6UT78 zxg<|Zoh5v0Lijd$#IJ&CsNV-33-Y}AoYLp+m&XF~mo%%Rri=`8VG)-Vz68y2Y2M#q zxnQ;*r96Pr6nd)sz15OpP9eDWi}&)4E<=|~*VEn`%{tt-a5AsZh2s*F33hPTnbTsVDa<>(;Y)>3H+f3lX?my2n)VC@=?Z{7>F& zr)9t``{=Z;4B#05*JDYUPB#b4JJtM+HQ1jbF3Cv~O}w$qLVf8zdU2fxQbXB2sKZxl zt&X9Hv-IHeXY&{^wiiSw)f=D`0;0(!^XmWf=?Pw=3toKg(;F?1<|$X1k@ZW^P39jb%8WT69|O1pW9h=61ZCFmWaXE-+A z_?|FeGzK$pU$~ODKb>(fQP?&;$s0^YIU;$59nCX8QXE%gA;~N1o1vzTYK8mqfPH`E z@jc#Zr!HERF<$s0Q9^-~kFt%<@tTzIbHd*zI$los!lpcKa-!EZpcF(m>-Wnp05e^hgnjgXq2MY}ynawYO;aUbbo~GP1qZ zaC0=$#sEPwqs>F+j;oBVh>b(ztsYcIfg5``p6)7Q0xM6)KUlAsDKEe)E?u4~3|_U0 zc+BnP2+c*XLU(E616V&j%4Ozv(UfB=^kiZbpp(H^-pUfR z%~SksFcMtR|17>+69{s_uOybHU3#{tzn|D6$GMr#Zo8n8{;jCgyYQmsk@|^;pCdBQFTsXmj`~|Dd*Slm)pdjFQn;7<%*iU_^AMj9@T_ zUgO(wj>=DS6U$do+=WTvUewpZ1Nk%sX<2KWye9bHN35cB5Cf>trW8C4Unv5%RVKxw zIlCZ{?iIqohK25H@k@zoQrbKm^s{!V3Nfsh1F^Xg{4%$P zY&1@&Ld6mLe3oa6Q&a6!r&#+NkCepUJYQ#F{4dgExCp)G*NOri&M)6AD8O}!LqD>( z9UfI92JvJF*7&i4KCRF5lM?15@uIhm^O?2+m-pO09;GVYqYZ?(T?~1jFfsF>?+c*w z%+(^$cwQwzPpimU7%xkIgsOYKrAL#u5k*~~?<$|iKsIWVfVa_%gxuyTXiOLuT74Sx z36}$v0yE~=GG_@y?fr`1g3$&;vwq$J_V8hsx$IlND?cuql?Nk=d!d$#n!59Y@wv*Y z-hl*Gt~Qpz8r&V;x9-P8wUq}eL06l2hyMU(Lk^HzAL4rdI@GX)tp@H2^?p#A!trl% zx?}N^*JC??j}a4Jb-SrG`z2TJj)&#;HlI)5h6%xIY%hj-38AGVFS7p zB0gy%lpZ3E4ek}QH8C}`e<^ra&LKcWaV#;j=NTAvhG|u#YI*vCE~B&b$@{=%zeT4j(Sbd#wYZ1L=xHA+=~GlzL%vFD_5fm z%@hz6f-J*tIB^ToM5#JUUDTbdBClqdKZr$9zGFmSu=hw)DnT$o#Dx%SVK@ zFE=Bv1$kT#2PL9$Ea5OkP_|-W)BuQzg^?Q{wTuBXv(QYauqa)t54%RdI^F0bljqBi z;uy%LlE?MF=H*>NtABw_9Aa~y;R2;_d1UN&CtmG^7t@4GawxNP;AjRDs*#g7ub*@p z1+`-b8Ury30!RXkfJr1*3P?y34EzCA6cDNIO^wqQvF%I=cMZ3ARnd~d@PuZJvw ziFcsvR$I+sn*nbLeOv`qs~|0`G4O7nF5tIxv|_j4Wksij_HBY{8$vS>HBdXO*=DM- zgr6w)?RI{PLRtN=@}P2{Jf>mKO)9BurTVKm)HQc`t;-MQLE=2fy&P zKJyw}y$4BNfL}?4ymSj!64G3IriHE1icTdnsC^@&BWps#s*HzwS%#ws8kcl$@C7Ig>V`{P(GeSF)3iZz=)lq! z$Q!3|Op^RLy+DE-P8E=kam&VH7yts0J%AWz$Gzljnfyp@fr2?&E8X!h!kEUS zeq_#w-n4?UV)yse@V&1i4SeH?1>NbY;|T$}9m~UEP5n5JaXjeaEuY9C2utxqA=~p3 zR%J%|Cq1{9#}k&6bnQ43Q3m}M*T_c!#2WlUGysGE!$)I(7s$t6NsLb$B(sc8{Wgp; zy%pG0*lP;Q>4hW;wbYkHhAqjiLjzb_Dn3p$CLk0-K%kr^W+E3S(8;YOtfo~>m7l12 z<08v2iW3KSn4(&P1=fc|9~fv^@UymO4;?@SuD!L~1cPdr7scWtul4QQzQQ?8FUsSx z>MDL}k9HX23>Ny-lgdU(+Xkp2$r|Hp(eLCl2dll3Ea!xfiXf=LG=A>(%&G28>G5nb zNxu=@mFLXpwJb#pG_Y$ju_-0DX}q3gXqQZ)_9HnmwbC^u#{ zOvnh!Vis}@B-mxrW;1KeF>bMDAl5^M&z$9gk-r)>%j}yssUgpP)0^lN@`@2K2FPzO zMH&&zur>2l!RY2AGg-Z;%(eNPObwI+48PkK^oqTM0Mh0#O5g;j26Qi&);T`M-QomN z+>I{Bbw}oC89E6>y0l)qLuFEOudT1VLT~U5pHU2`wq_BQ@`v#H#oa?yf^5lrn{-ZV z2w)0|>W@Y`E&|tesRAr4LgqdSE~<7?hw~GHEDeLSwPx`w3k~(S;TP&@(NpH4gM(|h z*(VC0si?0L~^nyep9mda+GHLi&JU@TKhX`{Lqaru%bST zE$PC6%ul$z#dg%Z={>C#1%Q*FOF%CkMwx|dc5f_(Z@#hmVQG!&wlWz7JUOfy$*emt zW_r-B%wM-tRjq&SS`*tvkNIc6T9P&PwC~-q!U{omIgLfGSOfG3y#d_D+{NU&y0C$Z z8d}yJxiTo8GMeOADJoWKCOm(%IqTp^_Y-)G(9$1HoVX2apV7+F-8Nq?hSLX5ur6&Sf*1!j{CTwWs3f~hn%>Sayw|^yh4Y)ZcO}5b=VH&>T|v?Sf5s9 zCP2FA-qox20-;*ht}bZAtR&{xvyIuCWvv~|t@4p3#ea66T*Dcftg2jHQ?;`1a<|iv zu-3df73tG^r^vzap<`l=!?RwT#rlH5xg26zadpA+D$c6k(YJE_s=kAe#d;L}KIR7C5vuI3zrkBq(yaC%pep}KKk%Gu zx}y)rYXZ2_P&*n&ncVnD^pC+sNNmak24&4V1*T?X&1W_DZ4$rS=>Uf76zx;@AThWG zaue7(R)O7jxrg(998DU&YKxfR82PK%KAlVnXQdXeqb5RbwuiTDBJ&8hH*$a#e!^vQ z;kL;uDL=6=_SC-A2ITvlDP@JOm!uBZVQoXA-aqd$vuS08DYzoLOrNcsN8y4 z*pf}(<~DXO*xoMhR460~(Q{i95ttfcI_J_Y;nuPF#Y4%B2r=(@==Rp%Z6L;Nuz}ay zpsb=QD(?mkl;t+|&259A6xHO`hQSRpxu38MiC%Uew{oAMfnD-X*zV(Oedzw7%6-zu zeXGx%BL>~j01)rLMrCBWf8_e+Rm4_!;tp@wQj<~-@@HQATWaL;a3$+olQZ{Xavacs zyTJnf!+_hcVhxf2bY9@X4_OOO9&YP@f0`S73gEx~%>BfKL*s%*X;^QeO@3rqJra@b zg(C<-;*VCGLQsXjB`{>iBn}pcR+ndx-@pP}yMYj6%{{Ve47^h`3=}Q3@V%h}LrcUU zXg%mIdLS=((BJf6xaGlU?ZNcOgZZTgORNWLwg=nB*V8Hwj&Tpp&mLUgJuVVGP_&-h z7d?3{dGg-$<49Wi$kB7UJMnkiL!*SfD4%cUJ}e?KD%j05!+IR( zbBN?ifXF&Weu;SSj%O2}%>VuqK!yPH3?eRHJOCMf1HptN(;tT{VQ`vl!VeDRk$X2k zdq#rD#SyrJe&7PpQ|x8!jZvTSlzy!p$unu^H>gSlDz zJmr{pC*rWBD#m{UuK4muQogwNJqDF@u=z zjiPp{VHTM{l@)Lef+8(?cW2=?oCKq3Oy?&`qkfh_Qv{I!=q=7FP}BVJ~OVi_`&bp zEK^v%5v~>%BxkVKwESH@du^BPw6(LGa1qko2oU6+k_A;7ee@;xENtmL4JrQJO%xb- z8~M=gc{#1`hWGQ33rUT+XBXcek9GdOv+`ux`o+wn7qc&4%*DQ#&wgRU{P08Pi#|j1 z1&tTP*5Z5vJT&6-3*YZApr_=xIc>dO< zuiNAP@LT@hXt09;Hj4?A(+ZsP6;y(D9Ei(LBMi}J^&hG=*YQP+u%9l>Es=z#Gf zdpqH!x13rNFOvcPEZkD>+m~ukfDCehZSIW@K_ZYGkh)@EW7~tH(-&*M2`GL0b{d0d#xm` z5GnWVqpjPi@i|3qPox;$r?lET>~8-MovX2XTL-m8cN=0Un7*1Dpw*NE-RSF{h)%3_ zd$l|sJlKW50hJ`@+Qf@XzrVE78^L_}Ayp!|MPl5oI*i+i)L5bDJtm$iPZi?_`D*!w*7 za_ZBQ^4grO4~>t%$4H_64Wdu}2Shgphk+tMoN9MbVp3QBC8ANd|5(Mp@!Ue=o2{p7 zXk>K9IJokTn~w=Li!^y}=9hQQrQ0{(^NF>vDB<^69c{U0Jd@jpa5HuBl|Fwwto^vF1DViw6%bB?1wAZ=mSMppjIS96Y| z6Jo3l|CuLB>itLp(UbEl&sp@h8)>a0Bymkfd3{zkiACSeBT?x21qJ1O1#NE&1{MoT zDhf$Bx|2mQX$|r93~9xv^mSobW=7fKR(Vkw2~9tT(%Z-Wfzm5hzE-w&leqNCcgs~( zwg28Yx_|pWXnM_mqv<3r-QDKjXnJQ)%ltBlOFxIw*S@#z9=A;|wwL6zSC+T;w{+Y$ z?0nm-=R-*!R!3h~j}G>azI%5LsE@xJ@9vsd{d&%*FR%VHn)L4EUzqyb zzc6(YqdrHWB1eY@;{9FmoJN}OIiOtowT{L{&jU@ zzF}jjV&@-?&)WO12S;Cj{0mlJU)%kDuzR|>xAx}X+wM8Ce!ir1aE`3cj+|`HogD0v z(B_ll)6;{xbAtWb=AS>Lg{7VU!-b{)36THadYc5I=NAr538pLQzw$f>(Q|u3W4N^K z=QiRi!l|D~>aLYcsYU(oAbN(-8I`?hh;6bHCA)w}qKG+@MvTAR$dAh_-8$O&jIT`j zaY|g*{u@M(;M8GqM22feO3B;dZ7v!cN3(rBdAq3*#+ENTMPFGpS%Nq_71wF1S?+_#y z$K1<1pT|4TLG*u#c$iFcv~N!TBjU-?CYKjl4xU$1$+aW1Cy97Cyf>G_$i%MngzzOh zt%Sn^Ngz6xgcnl;y1&U3Efv$pt-{7uuc$@AlE@35j1ro3lqQLIv|0-C3=Gw_LO&~K z#!=+!b8mUxwc=eYQM$rtT!VmUZsvS}P^;!Ek-o2jBM~GA7rq#9z(W-TW%3+wiqMbC;q&4Cxqb(6k8mxDeE+!I=fW;nlkO?#Cp+WQ*CJ~ z8$R7GbP^=Is$2{%WX)s|CbC6Ws11n3Rp35sK6M*Ye}Qq{OkiCbj1 z-TP{R6YuFZTV)MM@U4nctin-7!mo&dUekmJYe{NMCSWF`M!8d#mGtzWGsR{$ zKvpG#)GRjOhcvsyqpid__J%9B@+bw_=35O6^tqqgie!-UM?RwXQI{sB;##!Ym*#i& z5J&xl)h-tP<5y)rH-z<3wP{bqj~Qw@PHK^>ZyCJ9WwO%i=cz;H^2#h4cfIQ#4)@v> zxx8z)EA!|lf#}bNiQ;tcggZp9mFb4f6%D=+tZG_ucL@QJIfzL#e`?nqOX^F0P<65{ z{bQwhWAeGg>1II+jod~_@uyGKUQMhokXe{FofBjQ_o5y?!!tyVdW=?IxC1OB?s{IQ!&9usm9IXH~^E1;>A zvB_gp3d+(HxzLf5rt0Hzf|FP>YPMSCXD%aHlHVQZPUR@K9ZS$U%$w|D`mh&jleVmF zjO*b##f#m9=OKt;n!P;8{V+}4JY>p1uYlZsxIt7NL$PL`i1~hm=|~<^<3OK;-+tsf z*wBVN&@bgE$(*mkOFKHyUqOg*NVxrF^Mj^FI%13W>seC8bfXeE#4RfK-hIvsFnVe^ zdomiB(xr$1O{{LWgOo@&3&`h&67nFP2d31W7Z(uXB*k`RB1P%18o8}>H_ap>_)IK( z&?JTrnqvw?hiVk;Zn-BHKQ5Fob84~Vp@{ED#BUDxh;~m8MMOZl1tVEUDuopdhZ%;! zd2~VQR&>Cq?kkA$TRj&xd$O6|>nh5KQH*-eE1Vca_TrSL>bIOL?|*Zn?I0s=Ll?X^ zRP5_wSc%c@61~}^=+klvJ86#RoJ&ms(ll zB-!28vYU>FN~;V1D3kP8ifsAtqsphS@6t%iRQ(N)%KAvxyU~*oAxqsX1DH@d#>mJ% zIc#}9A;gw0GAi*jDLf!4(`G|E(rGD(nf3+lGUX25@yeHSuR?M=OFuJyN2VulS=_E{ zN5J0^?fB}E&Y^a3l4iq9>P)X{99(U$41enTSzdp~O%#)Xe8-btJCGwP;UgM1+ky^Z z=APmUzHR|yl&PtWu6U4X`@wN`-dOH*T7&*`BZmv~)*sBQoCCf!J16;Z)0c{##^tmhXG+|H>s@^;F+--=?Q zzU5|lFk5+r#Pp!93026Y=PcGEN>oZ*QpYotBQGblZD|MZdp5CmQB+Y)?7b;!?_Ja?tp*W^ z8GEa}YuBdsDk@g(+ErSmQ`g7s^ZWj;`?`O}eO!NB`TP7UXO8nY^M1b`@8?1i{)Iaq zb=+;SuptP4Rg4?0pn%XYRJHJf7;M9L*UDe`v{gpv?Y)tS*M1Az6$7{f<#S}!CjZj`JfP-IWRgr+|@xRK3CoYvL|9AV== zcr@;^)bd{D>&jFf?RPGZN=@mm;5Z$}pb4!hj!Tlr!^M*EPEkTfaQc&zQCPMNSkF~idT)7v`gcA>XA zFZboomfR?g@Ac$Y94MS~s;it&E9lVySi85u1>~Vr! zo6bC5llN!)njd-Ggx{gb<2)E=GV z8$Fkb`|9&_w5k#N>h=a3Kh&zoBY+o6*xRtxec zSFXFiDH_&&IU3;`bg*CWN2Y|DgaNQZAzE_*uD85MMs$N!e#4<$FP)$cL_HyZE2P8U zG&BlU{Zy!#j)|H4#T(97<4_t9M#vaLZYlA(H4=T#fAt-g#NH#V_9!NIxWup^%TbV> zaxJAgg@9!Z*e>MP^=wu95388QsTNu&Zm0a!G`g`Y&%w~Pg$ zA3wN=dVOy6&?qjX8g40x10l)fFH^&h-Jk&;8cN_;xpPxF5?yU^fb98A+EiVrt7jj= zSOF8wWP}NHVvwLDWRJuo{D9Y#1W8NL?Y;4;zeW8>fVRe8Nj-{YK=#RVMqQ_zIM+@O z$#Wy378SoBexu}O{a1(1h43akY#z)I+`&{Zpq#78&^k_#hSBxSQRk7U(*4Eu<&_52 z=^XeH;EuFMEBX&4ag;*jOP%nsxyUKjr!!Jfl>0YCso>gYJn^4_)T)#jd=#K4!rZRV zU4CMjj7NSDLvSd0N>fsM6;tnkkl{dL{SVeB7%0goc{~utw@CYKMU6C^%!kBK9PuaS zFs;19&7wsk#wf`s%U^n487URjbQOUb8eTqHiy?i%Rkerr;FA~*RTPHRKc0jE-H&>*1QWNq2vJkXP;oR? zO>>Fg6^aKc*)(amjr^SN#4Gm~eq=7i5>>LXID|A1}^F?jRQO?bKkJ)mroDIJqZU0r@r^7wS2xGn^!S2&*)nKz@I z_xd)&Qe4WyWmjI`a?DKXgSFfFH|;!@Uvwo#;F2@yU?vFiNL^(G_wKfPkVh#JmO?2c5Z)9mMWTCsMi)z@ ziZG%Ip2IyOa5`A>bjubmkmw33%LLGOZz0QH5~-~7sDh2a0S*b)F4kkj5V`>J&x8m0 zS{1xe6awj3>5}_m-4&Yb5WG>DWso%-MwLQFIgv_BET(zrkmxmaHId3Rdqy|qP#)1# zt$pdGp?d)}LOgv1bB~FK`_*Dq*=epO)a|?ojZy`IpG!bH#TSpb^Nnhn9#y|=q6+ka z28(bMd+}7nfkD3z)Iqh?Yf%4My870EZM(0TnJIzRn(|d#@}fTSQ3w4XRrv1= z_xyHKzF7Xj_Etx@u5OD~ZA0uC^@}Cwu%v2?Mkjpm#^aN4Onx)16g7JfJZ!tAm9j%x zw`ws2{*50V8c>^5ESMc(^_Ztis=3M1m=CIC~%U^utT~Km6{e-RVF3-TztfIsYy3csfG;A9n9kx_YjwlkQ4$|Di zmpZunTP^CnJ_jn}q&(vpRx1e`fy9vG8FlE;MvFl(rN;)!UC>)%1`v{k_+zV)wQOFP z$+N3#VimP|0Rtum=3j^Q+JGv(qcp*NoczHICEBtS2Bb3{8%zX))X-=ag}IWb|HCoa zZ~8JD&~-Co7qJ|UGXsdaKAytJ>w}tvX_vGBOhgIxSTx~}Re#H64GjkqeEl0#2Cl0# zB51caKq~Im_%q7hJ6W(XS@dVJm~*OBX{y|2s`Bwvb-|QTc@_dTFo~?TDw~>0XW^8D z2{&J@u+F%00E1CS)AhkK#o+f$Q{)6;s>BqN|OS>k|_;?sdwGrdqt z8!i}WdiF7swP}}K32j#~?XC}J2nYPIVD?=i+|op848YhHrNP(>-4~nvMh8Dh^#1C@ z`J-UgJa?9}{J}0Zw+)RUW4Mi3L<9g- z=b&o-7~0eoYuHM?iLf}5HoF+8HV4fl0(<@KINv9OQYB6tpGQ8Qo-dh;?dAOQi%Sjz zNamuXB`u)D$t_bCkbqSXVAVr%MVtim_y9c)1rKaO+kNxsjB7>jz>7bwnHy2YIzd&p zR|dH@Hg(~e2y&p%rYYG*``-l#^s2yR6D0|{veFGL*o00Wfz}GQj{CL-ZE1F%gFie0 z7o8P0r1Dk!%j^SafsT{Ssjo>$a_Y1dK4_E!w7wor2Ze_Z zY|lSgU+03byKI0;l5MVjX~tNp&JC??^4aI)hb&uhDDdDWuwfl4?LeMayh$6d14`Xy zO{D}PX0l9nj<{A%yP#zQsf-+NKX5@#efK{X(o`tAyz=B0!0ZD1p?4jC%`@cU4l9CE zd+$GP-)IIXxB$<%HgYjLbUSZo2Y1xfv9!jNiG5J@>fOKwc$V#+Y|)O`lSU;nBX|k( z(I!+F@l@4si?w7QQnU}bj9mY+xi9g3{{RipF~U-CQzrUur#*pZ&m27DhFmMkB5m(# zIYHYq5F-7Xat#MB6yV@t8hXI0IYPjHcK77(f`~r6-FGjS3obFYjvLyhM^g2oXw+t* z$#%y$?iD=u+XOqGQ9JGj7|PihsKfxdHG(BKDW8xY5Xu)a6+fUCQ8RNx0SMV$!lfJKVukO8YQ%BQ4( zMu%hQarIpEWjC8Z@#prxw&{3+9(PZ#5!u`ob4$F@%BA!)F&QCz~P=N^IKtK|KuM#?7C#uS0|pq;@*E#5O+k<=5ec zQk%#Rt;*j{Y`^(FeE)Ul+kUD9*5RB!0C@MwchTnW#>yWZbXeeZHB^h?t?gIG$>Kb{$8z9Sj{!5PgPITC*Jp>MU_&XA|B6{uf zJ36R@o|>ZBnUM^Z5+>oY;$KokOV2NjP&so@wJ8geZHtw3l2HfU(6RB5v=&a_QP zEqN9vQq9^xew?-Cy>M68^qOe?gN@ZMhJ2i*)PHT(f`*IXUA;2lYqIYu!1-_|*4UX# z6>j0c6*}Eq$Ko{b{q-P8Jj;}NnBF0!{OBI{GmhsHLp>B<@_b+f_qS`3)t(E z!Ou&jU?tKHG($KK|HlNt&$(aCeMziol>Hz{zVl*}%59zJF`w`I>q>Bm_{+?9GcKUW zVS&g&+}sB`cBz28BqDNG4NUNGsix_pO-}&HR*x_8@KA(kk6t zZ!*UzzI}~v8ep7988raP}d)UeAJ)yc4 zd>OY1dMiA62s;|xJ6JtzblO;fjfJA=`_|Wsqkc;rGW0_mp|2t*86ksDJCyKpRi$iB zNDi}YWE{jNZ70r=;ESiK_Yje*Qns59P(GK|m@vvls8q*lD>WG0?|a;HRaqYz4Jwz> z;SDNDW`!^H#-F^Xe>Y9T{7Z&KiF2(@nnfpSLndXb5rErztZGnG9eufSl!KRwGRXcB zG_jt$0bDO(t20eT4r=&`rt8`197KzswMZz@3Ew2W&aqZdb9?Ebd`&?4+z));qs%i9 zX;sU_d=&oaMYd-Z@6#HRvT4@FP1wtF?U`5U(pEjUsB^7%z|Z451@^nQu2yT@ciA>; zeKt7uv$X^WP6KLwLSnZTow`ml=~I&h-d`xgkn;3ie=Bxu6%sTC12s62=qDEY66r=m z{U@_Mp~4}b49Tw}U-?3=3p+8-k5o{>N{_$h1%A_2rKfy43399>d))BT4k%FR#=tR`yNKprrL6(QTn8>Z-vU3T3xG5%Zv+REDZ0Jzz z*OF^XDoA$|5*6B~Ay!%Y?a7Mfow^G(WJH-gE-(9q$F_u^sgr~1FHH4i7nXIz2moVj z>5ZLEP&MVFzDK5Bx>xuSVV+v7Dq}2<+rDDtC_KLcYtpsjGaiEx6P(+HhP(v+VL-;@ zNV_w%#ux1)V|8yd{31O@ekhVuOdrBHFLx_#Bm|=UmU7-7dWSAe>EzYi^*pLx(F3)3 zNy27(hUrbJ{t+d6tTs5(e=tPdnE|F)CdPcBWGWmDUFXo&@(@;0I5f%D%-xgFo>wb= zUn@*%ilP=#V@O}B620Tdp!#b<3+v$&K|+;Nm+ce^T#B3U^eL+GgKo2(&|S-1?@nd+ za*A$X+h;6R%hY9#lTMRFB;1Y1ai!tqMXRgqTFNVI8>;l|L1x8r?+;Kcz*}QXYFVV> zh5HgR^>-yG;-$JWrj|noz2+x?v?Kvl3nbuHpn(aYm$!qaCH{Q0oKkuMD`+Y$?yW$P zCvzJ`XKNlQ{mVvxN#8%4&2{xEYS|YjxV-8_6;l%wfhQWO6kpL}0BZ zwP_A1hN#e%K8C6Vo0;1Tva6WwM30J(qy?QMJV+zX!{}ciB=2Zhu{lY6q(Fz#8pkRb zzb}Jm@cJ6i457Y<)I?kAG$)wXchU#w=JA+cwpA?P{}R zib6==n43=*_xER9-$D1UL6rzhNS@<#wOW25LReaXVBI9FJ484~1c*d7#i%IG5_RbT&X>nzBgt_l?y6wH@+J~)B$}sl#EaRRakVS} zH9f8qpL3mTo(exkd2mvYqdpu1`J(pJFC@yVqkQoieicc+H^?;XZuyKW`kn+hsu1wQ zw#|p`MPzlOYD>Beflqr38=V#Fa$nG$tJIewaZLXn$VG%B?G@bkxuCXa5sl)_U@V_D zJzqunCC`2lm=vgD&a=1=4(%2f1GqcLHBo6{XHq#>RZwL2^2|zBgg?v&!=xpjBKc-F zy#tCpO;f84sC#LJ8xfvE*8i-9&R3*?!zH+qOs^B{65)aZ*S(327eD#s1FgE*N)!6v zD>3xQoAtJ(u6`i)HzshuOTWDpp!>^_yMuOGP3m)f0z_(I*W+Lr_-U@)d@VT~95QdS z%jwA?wtzC%Hl5{P$!iN)-#MqypY;as0EZ%LIDP;C-Z+oZk*ue6yH$OOxp@>w+iyhy zGEPXC)BerHSq|zuWm4W{x@67E34RS+qkXRk8WedahDNOYSN-mRhRf*O5m>ZOuK)Iq zgTgh;&*9se9yUT;?|$i7lr@^RXDaIl#7McP={>QoKUhWc5+n}v-=S;qHA=5FP^W3M z{tU?1y(iu8=TAkKG%0ZcJl*1-c_r_~2jdK0yxdH#MTxc@CvOJ7%Yamp2mB*IsY2#e z8g|?IZ@E3V=69j?CC?9!xxaT^l5vvEfmB$JV0%>6eN*7hkEW8)1H5O{I&V_W1E)gd zT{xex#(5awgVXz%*2nU??0R{ugd@sF#ZUO0#{Jb}7D&ayTM**FCd3(R~>D z8k*GI+Mg#xY~1VnV$@$I)x$YN4OrxKZI&e96_aTDx6%oNDkZALL?7p@-kj2pL8BL{dlG)%X>`Vu_ZIL<_Gs`DX)|~UT21AT zFjU*!Qi-@r$Mj6TReD&ul#>a7A>t*EX#%>qiYOoZbDfI_y~C9+q&U=F*-C$BB1-N; zIU55yCbH>w=g>_u8$G=Bfi2~(3mEF4(v|mYs3#V80bWB%5Imx`nqCTK012$Oqjal6 z7y8S!KzU)Rxz(Mo$=VGPa8aJaWs_<-VSOH!J&eS@4qj>{;?+z1=vrR;sdir`0?5#* zn){2Dq|(@$Pe>T5_#&+qHy6V~em89nYaG;wlV|Q)MYm5SL~)enI+X1b({hM(Do3!8 z`WBw|yfF5dKK2{#y|VD3l-I;taYmFVG^KC>W07t=1;b71GnrdHNO?sXdISKA7<1yI zzEtGkYkLSTnz|(sF!C&LOxy?nLZEQ+w=p!031{lxj8j-t@m~oz@Qy|t;+jSf0mL>A zlIdheYx+5IKDbGL9H1_0gRjIeUu**&i%ne*lQ{XQ`Igx9`i$5zHJE*rqwO$O7KX%b z>m(>56TTA6ZVqQ_rk7~HWrR0+!%sBAZT}gWt8mJ z4xMLW(G@n_W5S+kkCt7ViXfQ!YmS$~a(2kw*>lQVUN}17YpY)xJL8$jIwJXM``_n2 zKBr5smski&5>MpyFzSA-hG#e$5OWr-Z5b1Kh$l?yHeh&&pUXyhsr`e%$a(rpEmg3s zkRA>-o#m+9mH{63DaKvU^h)Kf3URWa$Y;a~s%ZdUF7#p$O8*e1=7ky-WU6(lDQY%S z7O}i?+I6`^em2aE0RY|eXDVC%Mvb+Y4oAF4F_x`f>8lF)U2RHGvG{Nz=-GbBv}xtM z4IZJCAMXUt@BoNq;LCdPEncrm6Qn&HFv9**i(gu{R2~%p$5hh$uBmGRQiEScx!%&FTzKnOl)V5U4Meuad@dVN8Uwuba zs(4OJ>F8wrPyhw&XI*R#R(plaC_^reuIcB8>mQ-U1wsvQS<(|@~+tFMG{ zEgFV7;He8uOAfWDelt8?HfJL9JzZDq+})Rt32%Mye6ThTA_a?M=8i}fP<=M$%t*AL z1*FdxGf~~B1-#o_2Im{c6^nOS;di$w9NyO{1?i5EO<>Fxq9>W2p^T*-E#%KliF*p% z{{pFsCm6S6yNZ-BIpb-K@bD4Ut^L7RC>_$ZyIq9x8nFYaH0^3^yTpi+DpHl;swX$&jf13i5keOYv*yTcvFT` zpXER`>AXkxJwxZo&#HcaLU12-oy|R|fO|z`^f$Cffb$6nblXFIEDE6wax91?nx}_p zr$J#RDmfgfdT$bMWb+8)2IAcYbPc@#OMy}6Cdn_3P3KnQHOh7?{Vn6u)Vl7vAX(80Engr>#ktxymB~ z-jqeaj&qig%2IcVc)i8qGuO+H?Ea#`yerqf@KMvF$f{wq)!_apGyq#2wS8dM%EOw! z4X7NnUz%fCgxiB4rfwhEOU&_F;RKaMrt4hhB4ssaFJ`ve@TL>d?1;Cx>f7Xn7STkh z@DGEfi8v9&)Yf!VPYmA6BzZZfMJ#hGRtuXvn9e*=6`f81ER+t%Z*hIM&pz7PR0S89 z=kXs9iY+lW^9f}fN$%v-5EMq1PVSN#oQ{1#*nM8FcL9)1lv|0QolV%V+Xk+DglBb| zuB`w;E4%5zHBe>zH&=WvT%dwYG%pBzVY!2AdR_BT2TN9gf3Y)CIzD=AT9=r_y=-|k zpgz|JE;Rxal!@~hAXlB&AL>`XDISdqj1k4-gmeK1J;|32lR0GAJ72mbv#6Ek3h@5q zk_LOy4HIQydoY@QS+lyk(1BK8F!j{lec_Sia>%VS2OI|PLs6}wj5T46IuI*0{8;9q zuref^sB78J3^>jM+MW~-5cD5-Fnq_rF3u))Y>CGDKaYvL;sJXkIRptxY z!skw+Tb1D3E;mS=EJk*h?(A4yl&+l{Uh>bbeb&{!T)Yfw&rJjG&^r1|a$!mVOP{lc z!yM+2F~)NfpBr06957LDTQeNFDgT{(QJ~AP8&C5)fpg0pD_@|s&iuSsiDxG341f0? zH=RbvtgsH2(ZQIf#;8FOZtI_b={NbR6|3Ldy`)ZC<#Y7RKPFD1qlJdGWG*R>wI|UH zj{)p$CKB#qGU-_lo$Nf*+}exqP}eN#EDO=>(;^~Wn{6(H31b+KtYCYQ6I8y|`MKN- zgX8qx$Kl`eJj{5a$`aF%+D%q5{;TEJT(fsCL5z{w5XITtTTofy0k1tiB= z)<7g%=(R3p-!AuUmL4L9xR+`meQcnWwz8KS7W?{0cO)`hq3b#aQQ+|R(z6j#%^uCy zm3!%d8xeJa@zT_zNwRG6Kwp5bCiEljFREu+ZLKA`zmRQNf?D4S>@iUHXKcto(kWJe zu&dR;s_`aV+chS^VOs;d!~6*l0#^8`lIw6u46iW;s6!Y!H64>Tim4_iO`#Hm2P^(B@i}%|xi}LZi?Th+=Zi)5f3EPcj^}7CC z7|UvTxd^g7K;wl^j7vd+7p}8&J|?d#Tz)IWN_UEgyMi^LSL=f3-&>5m|9oWZpx)v3 zFhl8zS<=toh&x5+9@Xc?OHmJD4>-`#u>mnv)vH4bv1)Mys?@J%^y9JBV#7fcmD&ZT ztG+K~r#y@>j0LH`lX1|D{N`NK-)lT6O#)Si7CD0e8N)!!`7Iu8i78=)aBhNr`rsHcIPxBV?Nt#$&%Ryp;%Hi^tqU-K-3ELy4gvLWm#)VhMy z=dYObU#{ne5qpEbhTaP_wa3du!6g-SeO59{`Uk_Z{5e^Qd_VN8%05WaE!f`MIrJI z;-YMY_}T2uX)JXRRS*Fm9TFRq8}>ug;#{BQTlRKl#Px4{H@@W<{VKcoK}mWaxzBWs z{<~V=1MIyATw7Tp12AHA*!9e?$I8n$s_c^tjj;cGPsrizSn;7U#M7qWc(;w;USN36 z{n27;zZS@2xV>|!3>8Y3aA7guQwfDn2}Lidiy!!wjOZiD%(4MJhpDxFe zBBDF}@4ogNG^5TqieDE~mijaPl%SeT7`^wS_--f`|Ht?9 z=A%%C*MihD?%>%t>gl+$CzO8@JRZiOq@Mq{m(ximepVI@g&}caFfTzJGQ0mSn5&zDd3olmlJk-wob(n-g8E>l9#H%~Z)dI_i zT{2QS_p04SyN%&95Q`f;n@0f@3Bo1y20aZ-HJ*s2sz+s>Oy2UfwZnSmmlH~Drot{6 zXlu#7V&TAr(mPiC%HUNVl`?^w-`n;U^~cJ{Z7u6B1P}HWYj3oiPUZx8WKc;tcIVDj zpqb=!;1I6o-(e-%xrZ5&{vP{By6UgZeEQy%Yrn|_ZE=6}ZmSC~3H(O$y(z7Qr%{bJ zBZTLoAEYZA%nS9C=>ihe7rqt=TVT(}8SVA{@*9QfLk_uOAR4A~l=q3t=}0E_G)9w2 z{qjO4l1q!3I+8vbsgt3 zN7AWn-VgLX04;OZ1xKJmE4%Nj-L^%Lr>olD+Qin}J}N}mYouRp2X7NJS1c~?P}*5K zrSjX$7&pBuGWAajwYMQZfA`iD0F-txr2HPVons^}R2iHvkGGbI*Q#1XA${cMqKMKJ zR=%JLcoIc2GBaBxw_b}A$?2;G&fXFRdZj3JA5Nf~AK{?L7t2$o^m?m;P*|7#c>Y!L zBiQ1UyIXTx!$jxt8^d_dtektPk(5qoY7`0sT@j2TKu*SCQuH%|*udcgaIX_SF9SAh0$KxH6e!DYjV zy32DSF-E1rZx{4D>hWcoltcuNR216!Ft;4x8O0DlUoHV}EBaZj6YsAI_#BKD(Rk+^ zIRb%J9pET~=OnLBTYM`mp^YILiS)2*Q7JTGsN~1JT<~KEkkmvJ;u8&`0N*A;hAr$j*oLa){`GGV~)B^RRwA6BzHx5xI&H4sv&N)DA=4HJp%`Z&4@W+e_ zr_UM_71aBB&o~#MYC=SH`tnrc$#*CnC`4NsljcbF+Myka;E3NZBB$nmQ!rjtEgyvV z^;p+}W^yWthVRA)0>6@Bd3kwdxc?Ntechzh9DOwhd<0-1pNnTp5BFy#ElXl&8g6&1p zN)oa-4I`~YwW%P|nHHQQhG^Z$$Xk#z^)Xq}m3Z6t*^b1eJpVs%t94($IAKb978PVT}$8=6D=@rP(sgR&>4~m5PKqHqPjpBx!~0XzglMHiNV8yy<)`qH zxp+6uvV=0I?oEnlu=9u`&$y7k%(5s^-bU`_=NI%mEeX|cX1~fJi*QRgWri-dA-#e_Z&5ljVD^ia@XxB9!S3{a;#{q$PN!qDb zNo7%+a)SEP=AL4b(vVEMuRvql_N%9cxPb08Y+Lz1@XFjkD=G551*hA%8u3l9C>M)q z07xUF@u8Q_^}`vK{dxX+TG>h zJ&7OdeLxYzXAv^&gJ;!-g`3}}ElgV?GewCzYj{{!{|l<`%!em$FKQb44JASz)%~^e zc+|Eky7Ta|9r^uKn>W_tPRfs3BJfbJYxJYq-Cv+{u31-_?+>p}y?I2tZ;idxy9u** z8hv9rM||*y7La@f*R@*_egG|B|0lS&%Q5Vx{hhC6pNgZk-YT^EK0JB)H~jhdKgzA+ z@_jcRM>L#ldG%gP`2?f?)0M&bh5T(oVyMXHS2yfWG8>iu`OD2^tQy0hGbGYNowK_rG{+GKV7^$g zYpO6ktw5-B?G$%yBUS8#*{)A6Ii6RnbWpByGdr=+GYhk0^I}nm_)?Kwh$a^f08okU zori7_5)YU$6kxvi5s7Ukj%EA!3Ca!i7{RV$rPu`1GtD6=dxRK=FxTq@$K7q)O%X2# zk?$18`n+-~>XIeV^X9P@{zI-G4Fv|HETEg$q$r(!&Y4cDgwlRE`f@--XB%2SV2P5=cx81GI-s~KR` z+cTPdP1Q71ZvoAxsfT%N7X-k=-(*KstxYxj$~D+WHlrAHshQ>>6y7j%kw0ZRz%ic8 zXfYoe@Q?~U^{^}rpD}ZV@h`+T!iXUkzo}e>sWQKrMunLHzj=HLs=!4?ve4p*OVvkf zQ-7dJpy7)k%^PazT4Ao{l@-AAX2DG=Aa;+lyMTDj_cMVMFuj*@W?tb2| z230z^m08qszbsaP&<6tQL$stcr{$a1B(U7^9xjSE2pU7?2Z;!W@3_?%~wX zlhdjgWg)CGrS9lHiEH7o1c)HOZsA<9S=EFh4^yI0e1lLzdv!v; zP~up1;;c~8a&^*{Q1W4Q@~KeD_v(~?goq$vD4~kTT$B2F+dN<`^`A=*yTgOD&&BD= zH5mrNnHDvfcEVY1HCcz2`X3LnB878sH95(i4xfiIsj=4$Mi9V4CnLdJH{RR9d14su zn2QbPe~=++Q))_8B8i9j%IbM}Jf_up#j{mK>?3*cYQ_K5pr&S$_>TSkP`zDMD3q7X zL{ddO76=x~qgShx_VQL3)%C^X`POd8AD2cVs}1&&KA;dfItY{6JpNhosMifv+6RtYq~1yQkc;&BS25BC{?Lw@9at9&}A*cueL!W1~?(w_uU&S zQCrSJF%*BGg^#qun=DLdgk5WkZBda8wYD$+sJ&2#&FUG z+(2VEnjQ2~M63(;{@AwOY`eDjJGM+3EPQxuT2Sw3BvSRu9VT|1G*DHxEB2Cc5Y#C; zi9-d|*36aqTuT=F(c}{|=Pn~(Z&r^oWc4szsmE-AXFmHZDSv!QgM}{Emt)1v{G-Y# zJo4k!5DmhQ1&)GI&*x{k3f;_~)z&*!1DC&3tc84B5&_Z6jBc@)Ylgc>kH81rmXbW) zW%n`;iui5FRqQD@?B}^X)7je}<6^auDBWH(!ewlFT}mW{3m-LDNM|%$sjc^w4aY?i zruBY9@v+((&p+shzsxEBxF#{w-Ebl|@o}pmJpS|ubR!bjc*flL0N!{m(D+&6#uvE< z#N=qVF)nL`8%KxYF=x@7M$yswpN0zGqo&2bH5?={qW9UyND>;hc^e; zEFWAX7yStz@5x&K+b;$^2lA+~@}r`D?Apc{=>DDkv~kdw_!%g%fBgr06Zu_93e6@8 zLrKbeO_cf73wBMQhs6fIl1KBW#S37Kwq-*4UQ0ogL zLj%So>G$Xfk;ioJnyy_+LhIbAHHB!Xnqk+aDBoU666vMj`2vH-l`)(W>snG>#!@ks z0St{oHKmA{M6rcr$wn!0Gn5qcn?LjYDqwjt`(7QYJOEgK&i*n0*ek{PrkQ=And@CM z_a~|AKcu*S1aMzUA+AXyzceG(&yl>JJ6+G%_BJ_B>a>(v(0pX3MxRqdBs8ogsMLog z2jJ7<6*=HxsTzOYgi#O{1x8_N{02Zx%{9l~?ANfORp$uY00#%f%&Z46=bSJNRI+su z)_i+)pJ^r4^GrSp-%^)2X+bqDn;%58Hg54}JdjMl4lGOO{X%j?c*zhyn)=*K5*Qd4 zV3tX539dGi{ql0+5k` z+t7mgD6;=n!C$Vou%`brFVg4Al5Q<$jZ6HIy%+H#@^Ab(dpl;nVW0JxJT)rvQ_uSVnz?abI7w|A3Fz8B<2gj9%goKCS3PRG0LoQuI^J~MN#)M%L z!f@$fgjbJR2Osq;g@->5FCU92ZGLPQ{W!HTCa)SB6N|0sjLqD*YMsTU7vP;N3E92z z$>|9RiHUWy$^Kp`1r;gPZ7H>VsjWk4W%d6?&+>}Wd$#{Ap0&?rPw(fXB<7ABUP1GM z*rx?$V+Ah;3WgU7iz|xiri<%aOENM_!vo5SO0P<2<(_us`8nl11ErwxYzY+p}W1~|C2}i)cxV> zzZm_^o8E{A|6=q{zx&&x`$xJ5y7LD6hllE`hq}CnJI#lCdxuvy|MlqqVsz5T!p6wL z-v5y3|6%C!3$GS`|3{)vPmcXJL%-7JC0VntNv}snt^hizr)_?X^e;o-*#DmrefHmG z+RDb_`!CD$P5&j)G5;F$X)P8@tg6Tg#zPR|b z@^gOtN~QnaUAG-%V+^j~UR6&J~^VM&7HU!M0V`j{*W7b;~xKSzU*i_2C8wT#{Vl{#_IMTHD021h85by z^9{w^BM8NZImHV#Oz;q{kL8#$$Siv7CCMLF?7XB#Dh&oWmmMeWlr~eCTCO=`uIMUfj~;wzEbhMPUU(lmv`# zD*qh0p&gwP^kI%3{^iZRNcrF{vsDKcn_%xnMZB1a0^_?>0J&HUI$VM@Fk~bq1z==2 zVpoDlQ`~6UEcLSSP%49Fy}iGOk@)%TudB13#OlOuXhfu$8LYwq?#yX6_my@@ZVbK9 zf0h0y@#;naJ|(Bqg1Pm2tk)8dn%fO$wXdd$B)G3}PKgVbG>RC{~WEum@_52!U93 zhQ?JDKBvOjDa&_ZG972ePiO+JNga|;8ibqN?I38Xv**IDwo9zWozzto)SrEE7)RKZ z6b2WhDHLPjG0&zeB;Lby^#7Db(^>61=P-3&9XFT;F?J;hM90n;?a=0&4PT!=i$gQI zK&yWav&lQk9uNbwx9O_%HPDHtqpGcXhwn0rJty)DV>JugM5AKmx5gWjgLJ!6F>HKD^3FL?s0DKh9jh9}xd$4` zm>mQ6iJ|2(vVmJ7TM$RV#x_Q3oZyazI^g#<0bzjSISrQ0e-L;i4JNPm7h}8>q6eQ( z47zB7?n_Lg0+MH*@3MQ})Mmv(L)4!KYD?STrcp1>&qnA#!VtAoS{CcCCxIR7#*Kj; z;xQE`(hpJHIMiv6R9YEYZ=Lu#K3RZYvC&Z70;m+0Wff~%fCincu2j~&JaT0qe@wfX zKJXnms7}qz3Qd6r4IpQhJi9xg6iRA2{?Go3IkK^AdrO6tM#uV5DM-d3EVnIlA%6b4 zM%!UZVMw;H0OyBi4iZhQT{ASF6107wwDQcf^zEv;qf!h%LN0V{@KUPMMlFNVVZ(F+ zSZBon8qi9|fb=ODvK+8Zep8l#nb&$`w^01e}y z18qHR2bG0*j4qMfLhm+rr|m@gUMj_s8;bok1Q-(o1r3^bFV>1nu@rru*m(Iy&z7=yKfe zlD4Bx7_Jl0?oi!048!%l)BhBH*O~oTUQ=<(_w?cK-`1&-9i3HCiP46tZ%?&46}O}y zu|2Bm?+~4X-!_xAE`RS5;$?cDMJ0OT%Vw?xj7zKhbB2F)pX>MKSm)FzK25m zOU=a~Ftng-o9pg)(|z6~o9(~@XPr0;E@Aqp;Xhob9-X>y?tpy5y{*6f39ma~aJA;$ zcc^D+b4cM2p$tlg)Gsyk8qUwL9c9}~O&4C_7TPY6@7J=o6iBP*e#x4D1!(WaZJwLZ zbu>z!IHW}&SJ79*c9-d0ahCz3GDORP>x}4b^k%6f7Mb{1!dGKh=#=|Wz|ccf^@ZUM zNs2GIC>y2< zbeNHybD&!8C@RP6R-LkFc4x3H^dePlc9MU$xRIueah_Rh|QKSq>+m zS4w`qe&;bQV6x@%{>^H~cuYV+#oxf^uD{<&O9Sv?jB?VfX7_^8VdI)qrzo(-cjnV# z>NylWk&OC04j#XFgZBK9=(jLvkl21S=8!T}I7%q2IO<%|S`Zn{hK^Q1haF2&oV;VN ze@DOXK$VB0XUT!lFv;Y#LVNw8bUUGnc!r=i^nnPtCM7FWC@SKJJ)8_54F*6_ z02T-G%>gi706xB&GJTGo5NLM|jI`CH(z)O|8^HGa6T(snj01$u2|^J#J_-S=xS)Zw zJbB#?Ww5v@I~?7k`SeZPlh^?oN0jws*pspaC~QnV&^2*F{>lHt)m{HJ^}q4shXsrt z9TFQLoe~Ztwh;~l1w>k3lt_uBOhkokz~~SpL>Y~AH%hlO(%mT_C?dKq@6R`W_@4jZ zJkRrX&hvJi>$*RbQP_RYz%@!bv~HxYF@0J}WJ7&qD1zAs3V8^l?p=m$gxneJkurt` zbz@$`Sq=QU5qrYSv%QG%gqO9P(VaaUw+mjcdEp_~W1gX?>YQUXi7{DXED?zC8+N>N zM=!8#9{tm=^vdlv0CDueVn47^LRELiudGf^YtYQ2SO*5_HQY@U_Bk|b4x;29VXztjKMW$aoI`cRsblL|*3krH)PCi9#|K|N`{2q znt8j0ATrwmG)H2eOfi&|(?)qFvb4o`+rE`M#vj9ykL4o0jzg5QgA&d`@1XpLNZxFU zH%i7)?7ETHDBpe94re~1yboo{7=s?RGWL+(5x1cpFOp<}aq2qQrx^aHPWb0RVM-M; zthG)$1=Nt`x6BlPzZNV9&4)uce`x$r>S2LgueQUmihKA<0;DDqYq?C23!Lak(MpoM!GdiQuPEYFsCj+-_y0lXc;kp0JwYt z%Rx>qZ7pqiWqsoh_R51VP`1h8F z^cR{-lMI?3v#wJxU|V0v!5MPng2#~bog<|_Gd@N;P9JAUx)e7Q?LIc~Fa?vq9klSY zzG9Z+kVv+2>?{iv9m_M6|HKSO1IeH}#Q!Fdbzx0Ct(8{Yry^^@r>D>K>Qwb%%%^Vy zGG+yu;bz^9OUx_$NMZkGFM*~Tp-34)oyemyn2rWps>h6!aDBvvP+ht(cNHRiRQNWVbo|?`X_FNgxkd{pY@wy9v(>?mb<&jvf zm8+jg&3erZiYy(!$vWLoC#L1PA|FslQp#6QQq^uiXd;p+4TJp2&*E zmSa+()Hbd3RPi3vP0tuyV;WOut}dzB*_5)pkP}yI~CJEKFaa z_Y87NL^4w&WMYt=z=MJ88%{ghcqTk~sJI;+6Dm83Uag}x3P@7L5z#bz&mOTeY;(P@=dx%P0AIXn^1p@o6tP3O)Q%D8XR_;uH=k&`NpGbEJ{R@w|ON0}P@f@%bHHvOhs;Tq&dQK2b-a!@ACk(3vKeJ!nn zUwLU98cms!dl@Te3CrM%HimpThHr$g+-)>+<-qf1;9{|o+Xdq$a_H-Pp$U6xU1X*= zk~*?jpqxZgXE4kdKYYIbb$NdHyWG&a&48xb1GFnt14$hN5jITs3xG2Hc86-ll?Bj` zq+QZ(4VuRPrtPIjzQF{Oq@AhXu^ z_W*P z2hwQ*k}hNQiHd*>FDi>0#uk6=MO19CM!YGllH=RF=iPdbn$uLji`(6HtSn_YRxz|N2u)qq##J@|c zx|Q{4H}7uG!mC|gKvUu3ZfU8>OR$L9kcmBeXxZz%`j2~!pZA&<_dfr-I<0{IY(oRi ztR;iDnKG?ek8NdAy3=R3$G7**r4&Uo5uaY0dKv9gWm*k>KA6`CgndHfa6FNDCo@tr zv3+u&7%eq&=63yR0G}NsXuD5S3so}%peR60o0g3s)JzDR8U`sPkTR4+-$YZCDo27~j#}i|eS6PH2vj8t!>laDD z@+6rrN)~SLhL;#OoARTk>j1`jyPdI9xs0PUjz@wNmRP@&hFm9g5$j_pRiLtcBnLJ5 zt_4RNP|wJMsq8Vm$gx}76U_(FWjawT%rE0LR)j}asVbxr8O$&IZO-_k&8ZWZMuWFa zANH{`QO-ljbI?@33^S&ElE6il=0(nb7kO_k3NkJVzg!eAU6hjHK}Xb;nt$FPl`6hd zUr55QlgyEZA|t2+3Z^2g)EuR^+^{5laJl?od*cQNDFowZ-r zY7;nBTn9G?Q_=6i_umaVm8TA*N@{kSP8Y8k5!K}r-0RvNgf*) zM+4!7W(;{0_QiXa)h?4BU7npp=DORaIorl{rC~NOFQeaMb>GvJEV_%i@m;j>VS^m@ zFD&kYm%aq|Xe$qHELZsTz-GfcJX5Q262A3aCY}26b)Ob4&Tff7FqX1|=isR8C*%}) zq$2x7bDRa#pZ2AekTO-z{%lm&10P}z#BF;tbL!pQmxEUO$5DZZ;0Mc*{4c6vzZ4wM z{$ky^7sPpQ@$buX*ti;IS{uxAi7Cg5h1n*bn09yv^$ zf`kDuQ;p4)QdrXhvmJ$34)2NB4!GPHUZtSIWZcBKdqqHJu39W-k z(p5ei;Dj|hGdVM}+~$kB%DZ=;PF!XZ?@nz@|cS{_SUp>cH=c$*_ zo^Vak5CU~@kmbqdZDPk{i78jf$b2)rUO!afJ-<{otDyNK?1}>+MxJf~&-NtUzmJAL zdox^_vh5Kfo3F|})O0)8cimV2?D@RYX#SWo#_u&SIRW%po|8t1d+%d zE}ld*F^5v~xh>K1#JN&P@#^jjCQgJasi2N>@E98i6&0$FuuQ_b?Kv=>BsXF`%Umdg zEhziAZdn?j^u%Fk&U==+LJ$x}8_KNJdETFb9AI|YpDdfTKt*VK!&M721RiO{%d*)S zGalQaFa_Bx=L~|Tr1l%HSYtEE+yvHi1fE}L3i?wAL{~Ka9v$RK>$EulhhdUg+%m%% z16d-#cBoB@+g&EBC$8y;HfqL`V9s+?2J_032lOYDP>3(Qj#o^FYE)C5Pg~~q%CJr) zcaK#FtDp`EC!kRuM|H@2x6M|EN-?)RWOP zmb>X_2to^x`X@s#!x_rs1}2xrYJ(>2hUAXyS3QzxRy~LyUoLz zmyI4s!O`{+;2mj4GF12nMKni3P_8RfyR#QL1{I8MR-||Zqp{FR-+f>f-OLfc7p=X`2({O55MTv(zv=C7pm}INXBcuhXpJEfJ>qM7S(PoG#M|jdwS`G+haD z!>AByuTls5VZ|p3Xo|~kv1MyB;B-K-M`1gC85n;97Ho`42*MQbYwP>+0rq%JK8W;ec@um#QQ8e-{iS9x88*Y<(_$W!HW~mNllOO>YuaBT|nv27fRUC(r z5_|xI5q{baMQSIP9y?3I1QK8*Cs}7bMIsSX5ZC@%Q4rS3i4MxlZtwPmzA=R~CSl?J!u9#FS+kmJSD730~8& zGPBWmjYY1hOA@K`p$ZeN97BKX)QEu#glaubd0mKnT6rH9I|X}A7b3=GX(8PF6E1ClaQOm8Pw~47Q!6~ufF5uyUG91EbdME@!~@5{hU|2+&Ew6C=T22urJF`QEbxj z$HwbmoU~NUxOLor+EuUK-Z0QI`=u#cy;=aKJkZK8nU$z_4i7Bj3`DFE$jX=-W7 z{*RV-u!)vS7twOEYx2gzzCnVG`nBn|5X^SFp>PCrrP_~&%0+`<@zfeZU^+PT6=3Sm@Q`_h*J-1y z*_eoqai!L+rfvn*;nopd0I&*t~&kITlhGRhevXTMs-*SGK`ps}-*D6gka>z(&;xN?AGL8~Bv1AU9gSpfJv2eUn@a!An_89|fDJMyeiTCzA4wIqPv z9@69mQZ}L#^b7{Pl&`;Ei{;Yt#|!;g3sQgif&E&@P@{S%vI>gNr7PLq>lrM zC_@VdpoCaZ67N-k8X8@xeP_}DHtbLXdeOJKs&($x z-aX$|tPRib<`abFjPL8>kNTuRIC6>9Ae+$jhBbYfqpv;dnSt66CW`oc!rOu3-azAK zLNAwt2}F}3_+DaFb9pz;Hh+Rw?5=aX=n5^8f*>O?j78j=i4T#EP|dQv_lpo~u^+BE zP52=kdbNRntC6CZVU+AfM$VeNDTe-c6i}uOL`WBIq<`o#7BL5sbWU#10T4RlBefvZ z6t&v7ZiaD@^5NPuKfb!O!AITi9h|_o+5zksWBt*18wfB+jhM+ZY<_{ic22>6Ksom^ z;>YsnRhAV$n3C6`dwPbEpO5&s4RT{!l)sDeOB9nTh`{&IBqSpD`gPon1F^Z29T}uc zMBs)}$3n$=G_or%A|YgDmt;;cg$E;B_eF^m zgB0QIxREx&bR$i~+jd7vL=?3GveM9~l5jpA1|7u}ND+^Kya-dKwf3KmSp;XoWE+~W zO(_A(+%Gc5$5GU@YZ$(|UTJ|Op5x8wf=#3+A+0q|iYc;?;6kK@x|cs9@AURPzu+#B@i)pYS`h9hDM zu6Lf?;64QqP$aXA6GMYpQ1ywK0b9PHocYWCVtI>+mnaP0Q-)IxxHR~grC{Po2yG%S zQ~WF1;B4BEGgDa0bddDqCyUt9TPg16l-6`~HXUDy)3dm8rD81QxgZmlfdvRS9XvVB z+)GPr#m^BTSpb0 z+G+$A)rgpcg$&7MOvP;A*O)I05hZ?&i65*Zu|bWq>%T42pT{HS5B@6R>&-cjz~U&yGd+Qa6i|o?RiQfZ z?RFX^tvrDX-&l?I5?s-1|CW}RIWA50$v|w50KT-$1Hy0eeQUb?cZHmyR(|aFk_)uS}804b)CWD(I>O&wteX}CL-w04r zemq?`Yipw#(Pl8cN-OR`Co>E)h_(IpuSxMcI?6%Jz&jxL(JhFu+?~IF&4#5~H&o5Z zTD)GqW*9}H{CUAKPu-1}FzyE+!Vyp?$hJst@@mtvVVErcm@1#;W0!3YF_uQPJiPUj z-!YHEjY=Q-3hjHoWOES{+~%;A;q*QQNk!#|2ZT|ZE4U>KlG~lt^Y_i zuVpaU$n-8mcrREBta1A-||{fD&24ju+dOBoMutzDYZ7<2<)7A7|LesYS$?MlOm=V8nc{xTs{Ba9KRe?qNs}18a^DZWR@A{I(4dqq?ok zqJ?!0h1oDuJaL#<5nNxvlk^^n2$cOCab7^9xCmrnF}JHOPXe(epsS(QV=M0!(XgJk zLHQ;$n)(Sc7=86Q^f2|7gIE$3v7muaT_Wc+G7jn$M7DDchU66S?{w99U`Z zfEn-d&m6xuaB{Vtxr0Z_#F#_b>XgG%4bsU_%vor}#A3X+^Zk}1ic|i#f4_a&zuzjN zIGU;hx%Q~yAT8L;ViiBVg@ZMJPLM_XQLl4rS_DBA;3Hf`v8SA5);Gs|~3>Gm3aDxe|# z-cj&=i8$Sk+RM3P$0(gfb9BDh@qMeaX~dsYxllK$XxfUL4q_| z_ksF;S)TiXDl~TkAx(PtIy>3C$3%ml9!LWsN(nNz`Gf!g3{dz!nuxn~4G4D>meBaQ zxvc()1r&1l{T?syr@RVb#Dk0|`FST+8+waqQt#vA{viaT<*7+htH+mtXr79(`^1LR z#IRg@O;kMg!V{nCxpo;kK^_)(e9Nt3mo58saO;ZtJ(IRHc4ra}>IG7VtJvF!`XA=1 zwkr|k8zb#i+X3)I^Oq4t2lLNExkkAB(qisKcK*Ze2k~aLnp&y*)!6QuSiX26bDB_O z80G!E`pZzrHYIZ`HM6ud4cDb-3@oB@ehxyq@=D^dSRf&BIoco`!9vYKRPY5XS?i33q+5ir4pwXQEC z#zRuP@krd9ehXmX1zEHQ&$#@D$#U(V`UA$BzEQ0N{s}Ov!*gkV)*D_q-pwF}frQhv zOT%S#K`}rvwa;M>{2wjpNGCFJO4`aL)(Oi_^2*)!#C?ASv7|6VVnRyLw%C?ij0Z8wt3~-ckxC=M)Rd@tcUTe+O%FthlL?p= z5=8GRWzqhjT}YM1UOe?{2sa9H^MS#(T_%a`*f&*g+M6_#*?8&OiIKOX!-f+uj&d{(hJ!*Y~KXOw9*}SGVfoIxH)jc z7@PBn%Fp0P9iKWAPz_@F zj+=>vt&Ss;@yFN9xLTFRA(FK2SNFAFVkTMI0mUhkqI65&-j+v!RYyn_64mR5C zXw`nPK%UeDN1bA$fSn-mR~*9(;M^m$JlM+{M-{7!B#immlH|O=ws)1(3md%mjK9{%eG?NPZ42;ns0>p`>CaN zad`AgGwltOG$9QN@#7d1& zC)khYkeOVLe##QtS)yi?Jqj3cnfctjmmXcW#Lb>~HY?RwzkkFbD8w}J$yBD5o2f`B z24=V1@mV8ou&A~_6I3HATtwvYwv{XuqF*SglA-4|=YQPk^K!6L!_mD|_gSU8+Sk0J z;~ktA^rMXgiDbkosIFa$VqIJiwS!Lz%Ff#gvd2czz1X>5?=8_u9$$I}M?FA)rY=|g z%HYKkdHdaTLIw8n9tzYDu_nh-eq}2`*k%bvQhCt(L90HbYl&K~M_ZT^JSrHyl zwBoo1%*8!}bNR>A^1c?skgG;ujp{geE|HhK2qp%o0*HvHX`>0GP9>dQq(PKXye4)J_IZ4I?zuu-7sI;d(@dRtt1MP-OF{TU zDj z4$cc&cvI*IW%j5@gekyL|AO!>&R(z=7(9)}QSnE)V=}Da7Lge-Lcw@hB&EwGNS&?# zXR@T*dhXY?8Xyl{L91;cy(r0rd#V#a>*c>Lbs^xrU;95EvX(jajGo>zfb)dIE(Z zBT{{hF|=2u7*p+|2oY2Y%zcxaU z-=BgYRglW?Ry8M2=3&;4#Bl9Zu>;r`Vopn+dJOA%Una^ulWUdCNYNVxN)|21E*~YV+AlUV}}ApQXcd@$UA9ZrFkj ziTtFb;^12tF=w8|9Vp|)mL{(b@piI=C1563)Sp5?8t*#5BNOjfa1CPkl$J9?hL8*K zvcI=`Guh0QHN#V{wS7dTwvYovqC#1Kn9yM1bnU0xm3zEv@p$K*cY4DW1+RRWZ{q6x zOzhM#)}@YdKPLQ&m*q*Seic*rqi))u1KvQ9dKSf!Cm#kL_KHr4^y9RjR|@1Z3rt(b zCmz}57)E`!Hi&GZ^HY}bqmdRsSaS?3->(|x-BtLnW7ed5Q>oFj^Pc4P4_L%1PHB3eC~;@Cle;`yjS<3V)Wb;T#nYe! zCf4sr{{FI0Ji;xRbeS)=ys7EBxMcM1XbT?QS^`*_^*yuxy{2mits$6-M__X$;||m&c21o@YO4Sl*tb(BYycu2D~3Whnym)YU#+#3S7e4Y zlyyL*&?T>;(LHcAf`bz3YDlE3J;tekm7DQ=z4s{YtmC*;OfVV>Ht*;S+XkWimWP#? z0sDc!gq9FQQAKNT9AHcSbqk011^=rugNk5qd9mm>=7z*^59Y_Q^{#?jKxLHFXk#mS zYT(;zN}oon7VYS+x@04$6E%VR_?*&8_J)pPbE{BdGU_UA=b2iqyW7a?2H5A8(RKw7 z+q~aA>#*ouYl8$N=Ws5>n-AkY+<`KZyMQ_JMqD}SOdm~h@T;moYWEd{S`}zcPh6V@ z($*C#00KEJ4@LYI<#fE}xUr{^F8Iq4B(LEO`$UOC-TLqyYji67ghC3&_VPpU`;(kv zB0PxxkjK17Xq`XytfMbs39B6ldrA!3br0u%SUt7I+jE8lWI!`Q)2Bf3x7vV?3A%u7 zx)(ykTzes3GR+;+L|LLVO0{DJ@7W4T{&!#ztr3S_52B;=gFqtW@(bwlig1xTlh+?2 z7|W6AG~xi3bPbh2Nt30x6(sY}TMO!{mP8C6bbSl$-^7};^7AZeabc{Ph==pPF;_#K zkaoA9;&^Eql!DvdK)c;utmjL=Sf_MMkf{um5tbw7j$OvR-)pxw6@b{$hlv&Np~@+! z<%W`T7BA^R(}R;*ITTcvbXo8TYwai8pyqWCy=;%YS^;u=cZ4Z4Q%SbmOGs_d6lJ<)VkVo_JJxTug7l!XU=Bv*c*Zdk zbP$UBl5h3#JhXP=dWry=D-#8?Ly5uBa+%ILnW$atsL*9JR*q^_;mMglYH zs%>+jwviOA@Qlf6K(`i`S{o{-Z3j+}*##Z6bOCne*w+gjwV+7m)3Bia|wH?g}XI3C@RL8qrF14$%QSx_6nT5-^ z|CgZns~&Ru1=?MQ%$=iH-Q;OLZ_gfQUEX#4sQ_Gu20%E?S#^1b)kiWxU02= zKRZgp07|bN5V$oYuc@JZu8DG{_~($jGN5}rAOUxr>q^YM=VZ$V26tIu5XMhQiMiTi z!rILI{2DQqYle@@DrTRM=F6i2%tj&F2O`gY<~=*vMA}k9gBH2YgX!wqp8>Xz1yu6q zsAn7)I>)!KQYhtww>-K#?pbUd8TUS*qLOn5TtzsU=iIZs%rn`>Y4!DpsO6ib=Rg0M z2RWvicLA^*nW<6Woy4A~A@a?NMJWoY*pI@W_s;}g0_=*%J$MRSx0(HS+c)6bFBuEQ z3Us}@wN~^p^`rt$XplibIt{!HOXB~Q& zweP#y|8dDPeAxcDcDt13P69VRj!`_G)+P2QNSWTH07J&hw;BW?@o@q01hYGdcU^3* zf;`=|;(2zo9K}!&>!`EscpgHOtro&)lSA5Gt=w7sV|JRd;I;Igv*^L=M6sn79roUC zK7*k{SohyJI^I^XcL)@JwMg`%)#zO`5P>pnOmNR5(Z_v2)i1IFK1x!Gr{PSMhKlrTtx!gOBg=;(14c zRhw~gssz;$O1|b@w-J;;pu{Z$951idtpc)}8VS!^+}xTXn7J}LaIa(sgz-nt%mqqj}6phGywO|5f}6{dBo7{}X-5?Ge#sC2VQajTQi zF0;yeAKZcSsf#jj&DKds>W>MDCAm=KJ0I zs5obr(f!WAHX~)Ev0&$r1R-;gEQG=oRUBrgh>shJJR0?uTz%KISSj-`XO<2%o81`{bVFn zTtz(Y#Pjku4mC|={*N5dXTo~W-BFO>%8+46E9((t^h{KvRQiPon(gSGuG|Bj&hw!) zx~17QzFgqm8X(sGYFGeu>F}#98QgR1D9%oEy#h2YZ+5rh)T4ahP?$KI$Psz;;dup3 zwro{<0oVIyqfRs1dGeZR9`~x-G$ja72YnID4hkv{cB|xV;uQ6-)Y`6~Y6@Xjm=_2u zPZpdPH1SYqD}#TrsuDS&oMNk~br$*}C+=-2!ATI7%oSRY6Qiz@W2$ltKS?pu7Qfc% zRBH;$uPmxKi48b*Z@(cZxKE8psUigBPH2NWl6$?{^OhG0+tk22)Y|;*$QaUYV?-lDX-5T z5gBT?P4NK*6w>k<(&xOPGIq7<+|oys|B}d-jCY?u9#mxR+-N(s7`Z#^65WQx_{g6GN6l|!U{M< zk$V+vRKJJ~(4lViLodlbaNvz5cr7fz$hsadPLSQ+=^t?=L7y2eU=6&=%P}_9w#rMl z=)^i%NA;ZSw?65oW>n}b$Dcyg81Sgzc ze_H+U+C%pilare>^K0E-uUC<4|q z?r51)54#_pPwvXhcu97%gA_gSDD2I^eahFC+>%TJ+bY^WSEi1hwx7X4>4CcexBOXS z0CK=FBVO&FI}e{+)M+98{bUjNHxo~~9n?%K(bXObHqV?d0pj6M#dS2>Hzq|4aJ`UP z(fwSnk9a#A%KGF6Dy81q_8fWHPAsbr(LHDWrR}Jm5yeCx+#A#qL`1QIlqZH|jm8lv z|EWD9I|qqj@vref!8GCxZ||ujnKvZK5)%Jwc=t>tx6|mI=JD;m<(tR~YuNd> zf;!ZCuX5`LRFHqdW0mBdhV(BX-{?Uy^n_Un&^nGk<$eVJMtght3-ogPOwfVU?WQ7iba=MNy$X{3{S|AP-SRAN@j#wU?u`@_K;zbL-i6R15P}Z31uP zDL&JwS1qi#xcwm@Z}UjRoIr4^EBvln)≀(K2ickH+HI5`Jp&qKLkGzCs{Mi=gVj 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

*O} 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Μ@e%#Pih3`)v?Y~oIWp1?V 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