From 14325ef891c66c5d32b9585972f7073ea37f044c Mon Sep 17 00:00:00 2001 From: Shinwoo PARK Date: Thu, 27 Mar 2025 00:51:05 +0900 Subject: [PATCH] refactor: hugh project refactoring for monorepo setup --- .gitignore | 3 +- .yarn/install-state.gz | Bin 43000 -> 32930 bytes dist/.yarn/install-state.gz | Bin 7261 -> 0 bytes dist/lib/index.d.ts | 4 - dist/lib/index.js | 23 --- dist/lib/internals/nest.d.ts | 6 - dist/lib/internals/nest.js | 24 --- dist/lib/internals/utils.d.ts | 12 -- dist/lib/internals/utils.js | 82 --------- dist/lib/logged/class.d.ts | 9 - dist/lib/logged/class.js | 50 ----- dist/lib/logged/index.d.ts | 2 - dist/lib/logged/index.js | 21 --- dist/lib/logged/metadata.d.ts | 7 - dist/lib/logged/metadata.js | 20 -- dist/lib/logged/methods/function.d.ts | 2 - dist/lib/logged/methods/function.js | 44 ----- dist/lib/logged/methods/guard.d.ts | 3 - dist/lib/logged/methods/guard.js | 43 ----- dist/lib/logged/methods/index.d.ts | 5 - dist/lib/logged/methods/index.js | 13 -- dist/lib/logged/methods/interceptor.d.ts | 3 - dist/lib/logged/methods/interceptor.js | 43 ----- dist/lib/logged/methods/middleware.d.ts | 2 - dist/lib/logged/methods/middleware.js | 43 ----- dist/lib/logged/methods/route.d.ts | 2 - dist/lib/logged/methods/route.js | 52 ------ dist/lib/logged/override.d.ts | 10 - dist/lib/logged/override.js | 152 --------------- dist/lib/logged/utils.d.ts | 18 -- dist/lib/logged/utils.js | 57 ------ dist/lib/logger.d.ts | 17 -- dist/lib/logger.js | 35 ---- dist/lib/reflected.d.ts | 45 ----- dist/lib/reflected.js | 76 -------- dist/lib/utils.d.ts | 2 - dist/lib/utils.js | 11 -- dist/yarn.lock | 173 ------------------ package.json | 10 +- .../nestlogged-fastify}/README.md | 0 .../nestlogged-fastify}/package.json | 10 +- packages/nestlogged-fastify/src/index.ts | 0 .../nestlogged-fastify/tsconfig.build.json | 0 .../nestlogged-fastify/tsconfig.json | 0 packages/nestlogged/README.md | 20 ++ packages/nestlogged/package.json | 21 +++ {src => packages/nestlogged/src}/index.ts | 0 .../nestlogged/src}/internals/nest.ts | 0 .../nestlogged/src}/internals/utils.ts | 0 .../nestlogged/src}/logged/class.ts | 0 .../nestlogged/src}/logged/index.ts | 0 .../nestlogged/src}/logged/metadata.ts | 0 .../src}/logged/methods/function.ts | 0 .../nestlogged/src}/logged/methods/guard.ts | 0 .../nestlogged/src}/logged/methods/index.ts | 0 .../src}/logged/methods/interceptor.ts | 0 .../src}/logged/methods/middleware.ts | 0 .../nestlogged/src}/logged/methods/route.ts | 0 .../nestlogged/src}/logged/override.ts | 0 .../nestlogged/src}/logged/utils.ts | 0 {src => packages/nestlogged/src}/logger.ts | 0 {src => packages/nestlogged/src}/reflected.ts | 0 {src => packages/nestlogged/src}/utils.ts | 0 packages/nestlogged/tsconfig.build.json | 12 ++ packages/nestlogged/tsconfig.json | 17 ++ yarn.lock | 121 ------------ 66 files changed, 78 insertions(+), 1247 deletions(-) delete mode 100644 dist/.yarn/install-state.gz delete mode 100644 dist/lib/index.d.ts delete mode 100644 dist/lib/index.js delete mode 100644 dist/lib/internals/nest.d.ts delete mode 100644 dist/lib/internals/nest.js delete mode 100644 dist/lib/internals/utils.d.ts delete mode 100644 dist/lib/internals/utils.js delete mode 100644 dist/lib/logged/class.d.ts delete mode 100644 dist/lib/logged/class.js delete mode 100644 dist/lib/logged/index.d.ts delete mode 100644 dist/lib/logged/index.js delete mode 100644 dist/lib/logged/metadata.d.ts delete mode 100644 dist/lib/logged/metadata.js delete mode 100644 dist/lib/logged/methods/function.d.ts delete mode 100644 dist/lib/logged/methods/function.js delete mode 100644 dist/lib/logged/methods/guard.d.ts delete mode 100644 dist/lib/logged/methods/guard.js delete mode 100644 dist/lib/logged/methods/index.d.ts delete mode 100644 dist/lib/logged/methods/index.js delete mode 100644 dist/lib/logged/methods/interceptor.d.ts delete mode 100644 dist/lib/logged/methods/interceptor.js delete mode 100644 dist/lib/logged/methods/middleware.d.ts delete mode 100644 dist/lib/logged/methods/middleware.js delete mode 100644 dist/lib/logged/methods/route.d.ts delete mode 100644 dist/lib/logged/methods/route.js delete mode 100644 dist/lib/logged/override.d.ts delete mode 100644 dist/lib/logged/override.js delete mode 100644 dist/lib/logged/utils.d.ts delete mode 100644 dist/lib/logged/utils.js delete mode 100644 dist/lib/logger.d.ts delete mode 100644 dist/lib/logger.js delete mode 100644 dist/lib/reflected.d.ts delete mode 100644 dist/lib/reflected.js delete mode 100644 dist/lib/utils.d.ts delete mode 100644 dist/lib/utils.js delete mode 100644 dist/yarn.lock rename {dist => packages/nestlogged-fastify}/README.md (100%) rename {dist => packages/nestlogged-fastify}/package.json (66%) create mode 100644 packages/nestlogged-fastify/src/index.ts rename tsconfig.build.json => packages/nestlogged-fastify/tsconfig.build.json (100%) rename tsconfig.json => packages/nestlogged-fastify/tsconfig.json (100%) create mode 100644 packages/nestlogged/README.md create mode 100644 packages/nestlogged/package.json rename {src => packages/nestlogged/src}/index.ts (100%) rename {src => packages/nestlogged/src}/internals/nest.ts (100%) rename {src => packages/nestlogged/src}/internals/utils.ts (100%) rename {src => packages/nestlogged/src}/logged/class.ts (100%) rename {src => packages/nestlogged/src}/logged/index.ts (100%) rename {src => packages/nestlogged/src}/logged/metadata.ts (100%) rename {src => packages/nestlogged/src}/logged/methods/function.ts (100%) rename {src => packages/nestlogged/src}/logged/methods/guard.ts (100%) rename {src => packages/nestlogged/src}/logged/methods/index.ts (100%) rename {src => packages/nestlogged/src}/logged/methods/interceptor.ts (100%) rename {src => packages/nestlogged/src}/logged/methods/middleware.ts (100%) rename {src => packages/nestlogged/src}/logged/methods/route.ts (100%) rename {src => packages/nestlogged/src}/logged/override.ts (100%) rename {src => packages/nestlogged/src}/logged/utils.ts (100%) rename {src => packages/nestlogged/src}/logger.ts (100%) rename {src => packages/nestlogged/src}/reflected.ts (100%) rename {src => packages/nestlogged/src}/utils.ts (100%) create mode 100644 packages/nestlogged/tsconfig.build.json create mode 100644 packages/nestlogged/tsconfig.json diff --git a/.gitignore b/.gitignore index 05f2fc1..eeb2963 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea/ .vscode/ -node_modules/ \ No newline at end of file +node_modules/ +dist/ \ No newline at end of file diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 0f28c70ad571b73194ef0b4d5b110aa81431d3aa..0f81bf6e92420963a1368688193062d340886ca5 100644 GIT binary patch literal 32930 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 literal 43000 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

vZl9NQjbk+8T73%0W>&|^ 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 QPQ&N_A3wq_HiuLK06{_yCIA2c diff --git a/dist/.yarn/install-state.gz b/dist/.yarn/install-state.gz deleted file mode 100644 index b2df8ab74b590a00e4b0a3e0aacd6ea24092d3b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7261 zcmV-j9HQeNiwFP!000003hjMckKM^}pD6F@x{{?NNb+cp5nBi(s;auXE>s-Yvf%i^ zb`0BZ0S2h9s@@$fIm2*&;r^+X}c;t1?(Dwro%6B~YY_LV1o zd9mvH=IZQM=Eda?9)02L%h&Pj;_1!x4<3EtvoD@~@Z{n;uFk&kiC_Ql;xaETKmKPw zefs;KJ^1X4XMg>`782>0;>3)r2S|+BxFZcU-RJ1+O^c$)d}1=1TR=3nu4b!(tT{N% zv4z2NjI^?}-qdL>uR)RNDzUut7_Qn7S829{cRjzP28f`b@?429r_SkvltFM#4=5d& zvxm;mg*-fA9|I7`m5VFcn&p)u$ zQW{nSp6I<};84pHb{qR|KtgV9Ofxq@(9C60fFwaGRaqS;n(+jR)wMvakA+A*xN@N+ z2Q3|C6ODVMnfBnhu(fwR|D+`(gF78{fE|%|l{x!MH7G6_Z=}1Lc4HkBT zDJ$CWiTir4rQFyk3MS9x!m*`W3v3o*0$4TcFl?Z)*I>jsc~ox|8oHWIX3RmkluB2J zDaG$Bf5)m$F+>dlK?JOmj3|p~6;n}l^rS}Jti)t?U~Qgb(MrtFMj&I3A&R}vmaC{O z$|e;)n&L>zg6>3&#>@&yV^p)zRo?mh6%NyrDfJxX3u3bXLB}} zS`*jg;)DS8LY7e^`(_u5B~K#HIb>AGAfQ~*Eqc>M6GBmAbWsP3VQ-)R?1SgeFY@eH zAAUbCu5Z3SFD}2o-+1)JU+P*QjH(=yB8J53X`zOqF*!-AX%oy&E&HMsgo}&%Kxy1K z)>5*m1tQiA5L4zt@6!h^843#BM_)Wm%(auUS~J5r#!y$3cU6l*MY;ht;ywc0yLoSt zwwg?Cy=%-IVlmKUAv!x?_7!~%opTDc?Q8^9J9h+eXlVP`F?vT=799*&3s>b_WAWN| zy`e5@^Igx+JPan`)Bu=kMJ-!{Botd=j5)j;n?^?W&`R2O0n1I-^fg8{FcKK5K13r{ zr5PX-A(uK*4IGw46b9QJDdAj8Vgw`JV^+W1`H5pR8GWL9x9+0Rd1`|6(J*qkmD_4e zj#Fh@eiLk2>Qo*IHOt4ED07Jwi{2B~&VJ?Q zI?lfO@b*INe}3iW`nsO|q@JC9^W~d&uOEHzOKHkfwXI1R0>DhTq?m{3(t_T`>QuZc z49B1jZzxq38N=)q1lDjF z&lQP0GHqFN8q3*mRzxy!RBI93eYS2u?r0$py^8?SlHMD@=#;T4dtO8c)OfhP^8cOP6%NP1ivuKJ8#ZWeJtHIj(tS-F@5@01R zWwNR{wVKR|zV_885v#G)&}PvLOTu?6ARe84_TcQ-U)4>2a{2Vh{RPuEpZd)w*FXH} zA6|vuTs_;L@r}oK|Nh}m|HN-Tx&5R^ADsOikErYGi}|=-JbV3HJI%KxLc%_mb|tA! zXxy3_VDD@+v$FXluhpE#XfTr+v;j?pas}B;iD(Q&3rDZsaY)P|%LprS#NgGnbMzsO z+18vj=bBi6Cs65~K(TfL_0|cLOeawFoIv4n0=35pln*D6>YqTiegX;i3FOQt5X?^? zA3cGT@&vNN?|%F2@5a?-Uff( zPobI%E^qe6!8m;IPb99FaY>a(~_+ah>O?53E zbnAJtyFo@6LNQBG-{qGK#wFirb}l zN#nleiXva+TQVa!l!qDjUSy_@xDv!Np-`O!Kqs}-T{m{uCFP=IBDI{SD=2Z9#86C& zUNCruPjsJ(z%+6T%n2>eKD>^rrv+yp+-AXFyR7S*$5$VJTzU4*d?mRThds9J&OUtR zmmk;J*Z<<`*{9b}J?hcJ&py1pvqN=Qht}qtElmN_cZxT$&l)jCEE-V2fkbz)XD$GT zxdSrt^q9{|maJSgtgY}ifeofP0glRQT_u!ZCqX&(jZSc5 z>PZj@m6q^Asb^o>+WhhL3*CMxuAV%(y1YlP#}?m9y?%80^vR=h#E0+@=~l5FY5UUJ z*{ph~g|*xjhgfXk@L0LlWcD#T=LFcIt>Dp@i1}Q#Mr*D-+6V;a88cevX}MFfSk*lv zTskd4TO%n(P?wZi&<_-=G8(L*G2OFfxGmXUzD@GErUBzv0fTw!&H-f_B1Q>FM)W`# z10|q9`UZGXT$!pSY)q(i9^A*$z97p%3r5rJ=5c4TvFfE_KfL+r(|W1b4=%5=?$PS8 zW%uf~-fETLp*_S~rLwi{otD^~6|))K`l1eA?wp)}X>A~vVR((|E-WJM*x1lli|lGt z%_r}RHKa}MvLo3VHb*xZki@O^is-|t`c6%#^(h-Qe?zGNpgJ>h@a@#he zu}PMT1R+weqMGTmF>YW&j7lMM2s)Kb#dLy<($YBrLom1Ydlxm-F%<`u zQP1T<0M=lMs;V6*^jptrJ+8R<-jllV^c%k~vL0E2Z{Ahdnr(M?b)syWC9+-ObmSGy zRu+|4aJeS?l33Jd7_Ft6iPl=qUAhD>vJ9GiPGA8>mxUY~ZqTNEdCF=-l;*BHCA>Gw zWoz|pw3;8Nwp^X{&S$z9wyExmbr$q4gK)A>Z`05_NeNdh@Pd`;#j7=~WCVcTmBZA` zS}IvXD`P=0%l<`r@LF1lZ0% ztm}YohRVL{sg+Sn8FGvb1=(#f*6tk0w)CCM6d`Zpmu{0P11xrW5(zFwJ8y$wI(W4$ z!m^ELEthyP? z`b~WD=x1mBoy(_B{!#ng^YM@#(r>&h#eRK0zj%CearsZ;>d8~T`TozI|EIU6&`>EQ zt20QA1_Ck7kQxsxxP^gwUlN@Mi18L}?`dsu=CIfZ#gev|Qm4|8waS2d%bmu$ZS<3+ z`s^G-1*qSG0SMS#G5UO;P2t$Gd-HnV>it%y)iqn=q#e!40=Anlil*)qO4=d0CvTso zK5Xl&Yb&bO-JjwGp?rYg=K%E|oANst5DP*ui!}4i@ef zi9SXf3kZRzgr%cVY8~qIqvw}-5f|UP%bnlW>anHwMhyPf{1EMhS~*1r!dg00Al;Kg zcDXTI*isVbvVegZV-?m+P4M1evIu9F^igioQztf`*tAoR4!XgItmdF28>gXCXJ|>g zjnIRkS++y3O{2G#gy_0IN^027YqbquOsyA|3NBb&jk(jd>zzc^PD!*Hsa6f()Hz9b zHCng}jZhZrm0i%mZ{a+`>K(wTszz+A+j|_S^~0O%#~1UyAbe!8y?IONAwGn=AZ%?d zX$-6FbTUiSTpMu8ZT(?u4#3jRpsAt-m5u?j3x0-TCCWK^6EY}TImRNH&Wm}Y%sy7O zrhR0@ZjMOk6yPzjuMA#?*>Yq8(uTellJZhkuRhHsc#Zx4?IsP9wAp%1HxKMBmp1{E zY{El)E%R>F#VQ(t7y1I6b4EE33&)_uX~|X0T@j@3y4mJ|I=?iZueE6zZwKHb%k6Ei zdzVzv!`=4-t%x?F3t;)y zfv%lCmO;`Q+LBjaX~3--W71Ms)eiKDI|7C@T_9`R;t@%?abvB~bvKBDL7Hf5Yl_Bb zF_LCz^QCA6ER9$a2G(pHg2rwgZUN?Smf3pq1`ODi%W6RoK2>P<;QXyfy6I=%d+N`w z@53mLExR{$im&cyqYMifIAsSa@FH8d16n|vws-*&?Y_e9aw{*~DT&V}jNx;|blc6Z zw6IK%oy*L=;W9xF%(1^&}3il#elwPYdT4Pg0Wy$Q) zVMX-Th{PJE^zEE!FbNId-Qo7#RSl@MjBY!AlXt^^0#}H1!Zf7Zf^I<3Jdj~S_{w!y z_S|v|@5zgfEVVbasSn$W0DA1M(qRB~&uMDX$FNB|GZ<{cS8Fyy$d+z5xw@lQ7o!%A zBPO!u?jo0GFj=ZYfQM}E14F`g$gzkASL=O97gOX)m$k_hyQ}Rm)eixui<^4p&+faP z#}?d6g?@D_6kmDVW4CMH*M#WUUGCSlNv}YOV>et6eJuuNB-}b5D)Cg8&4obQ;CDi^ zNU;`O-6C80T#$faL5bbTVKwYIkd0cw>bj!K>ScX5QMhvZFpSmQ6Sa1?lT>CjtDj;f#$D`sas z%!R%>{kph+?_SLC*rGd3h1yHZ(6JSzGg0M+WC{T=W^Ia|^_F>C=}JVEo7w)nIk!_u zYhrT|&8`NvdT&~|%ll3p`cBcef52fTD}smm&PQ}}T8KAaMC~n=HmU$J+01C|IyMvx zZ7l);iQLz)JAjI=PRrVW6%y8AH?Lzv*SO(z0Y^){CKkiHz-kP$Pi4c~=N zHrThg^#xJ-R`9GU8U4O`<;a426Vu0^VfupL$qi+^cT+Q ze_Vfj+kSg~`RV1=UtFGjWv|5i^PfJgvk(64pa1@!pMCAs{PH!NeU$aIF0(G<;?7Kt zJ;!$*Cop$*o+mIXbzUbh)pNd1U;^R%;}d9_o!>nA=GP6;gc_a@M0CyXWu*lB>H`u4m|M8#}?n~p82-rd^;W3f99CK^x};-J@egE@@sDS z4}SMgfAlxGWdwn_vceh^h%Wp52 z{OHZqlDB4g>@My5v(wFRRzIAl!x@1FZ{}@x8Bh>PhfoR{Nm9UKW~?O z?0)R~Fiw78^~V<3Th3SxoUwc!&iDjq^yfeR{O$eNT$J}@)yW|kacl<9p~<(0?IFAY zMeNt_Zt};Ty*&T)1O^7rAD_U4+xe46U;4Z+|FNkS@6$N`fd@FY=-w)NZ^!ZVwW9aM z8>dr)yfC_BcP-zG*|-C1JGRW;iZ{2zaj(UjyVoaYYsY5Py;l) zc0H)ozEe)Kk~%$`Q-_?qVua0m@YkkdT*YylkPceLCF|vFwsErmA3gyiUR7J zAt5-zn(Qg9+6{IX3wPMuRLlr3;Mr|>vPRmbdElaw+sxB+)3!&iaO{$1F$jH9R1TUv z4qKo@KNsvX?++3>mOMF&9l~{A!oqgMWNC z?MK*)qX0Y11z4~t(-jI6V#Byqp|rolX1OBZn7+;3sJFiR1(R24xOt~rx=feW#-?%r zOZgfbh(p_KP^vy|8C=XQdnredgMQ$H`-|)P28MQ`)h(OyE z>*hMFg&k^jlcf6ClSLiKoX6(R6?o((qK5aSggr%wH$;mOO`7ld0&BuGX5Udu z#|H0df$a3%U3a-WlYusGM%aDw$ey}%hfYygK4lF%ysgJR&b?awMHX*1Hy2(VHo`ru z4Q|+WDKxM)du7Z`ta4y%-Eu<1zJr#KhqbvxH^wXz=jfQ(`l#4n@kDFH99)~R%(*#Q zIVZ~`jZKVHLtY$4<3O!T7q#>h>e{bODEZxK)nFJQ7 z!7-`=#TP;Om==sB4LVvC+2|c&_X;-dvNoxOVkcB{^@I?eHF@%;kOPsnv_vu+jB`(! zb8gyPhHva?6*a{4EqT+oKHbcw>THndV@VPtHn;q0m2Q;Wjqq9}M<#&&KoP$E_7mB2N_X14V zEX79ASy;exLd`L8ZGO1!QGE%5qT$MYlR9B@#2QhuSRrlyIXBKktu<~cy=Vu@9ccl1 zmv6H3HDAKH=gnaNRA0b{8l`G&A@xZz8?8ME5ZG`c&)#V>mvs(eu)gWx1Vd~O?QFX* z7u>^*wqZAgNRh(kUYl%5ts4j8RPF^mn#R;dD6|=+B0Gz*f#-1m4Mw^Y?S!W*&dq-^1cyM-d3pT8e}wKN9UZ?iqvob^H5IKWiaRcn*=I-p5XPGn?g}XZZ?6_1eCb^7 z_VGRX)-Qumz2%6m&c5<;De|9x_TZk#bMU}F{GHou zkA3~+V}JSM>o(c{ykNzFkr@spG z5ZgWWEajo8-LArX&D8E*pN^@$5aTxvzO($+{*FDQ{C=!UKCr-J3+)~Tr@Yb8x_kZZ zorPm>_&fiXC$N+5e1B{C=j`^6Jqi8ZlBbU?xYw`VzxX-d6>`g;{zbkjd2;?ge?Hyh{C~a4F**O= zZxBl!{pQ)X9$&?$zkl(#e(#ftPp_Xp*%Ah4i9H-1qtsxTwAALLQ)__?b9W16-1bG;{LX}R_KoXL rFP=WF{NeM9$9er*-~Gbbx9*ny-M;Z>H-1z5{9pgSr>W-Z7NGzD2>Paw diff --git a/dist/lib/index.d.ts b/dist/lib/index.d.ts deleted file mode 100644 index e42cc6f..0000000 --- a/dist/lib/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { LoggedRoute, LoggedFunction, LoggedController, LoggedInjectable, LoggedGuard, LoggedInterceptor, LoggedMiddleware, } from './logged'; -export { ScopedLogger } from './logger'; -export { InjectLogger, LoggedParam, LoggedHeaders, LoggedBody, LoggedQuery, Logged, Returns, } from './reflected'; -export { getRequestLogger } from './utils'; diff --git a/dist/lib/index.js b/dist/lib/index.js deleted file mode 100644 index fdbe9cc..0000000 --- a/dist/lib/index.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getRequestLogger = exports.Returns = exports.Logged = exports.LoggedQuery = exports.LoggedBody = exports.LoggedHeaders = exports.LoggedParam = exports.InjectLogger = exports.ScopedLogger = exports.LoggedMiddleware = exports.LoggedInterceptor = exports.LoggedGuard = exports.LoggedInjectable = exports.LoggedController = exports.LoggedFunction = exports.LoggedRoute = void 0; -var logged_1 = require("./logged"); -Object.defineProperty(exports, "LoggedRoute", { enumerable: true, get: function () { return logged_1.LoggedRoute; } }); -Object.defineProperty(exports, "LoggedFunction", { enumerable: true, get: function () { return logged_1.LoggedFunction; } }); -Object.defineProperty(exports, "LoggedController", { enumerable: true, get: function () { return logged_1.LoggedController; } }); -Object.defineProperty(exports, "LoggedInjectable", { enumerable: true, get: function () { return logged_1.LoggedInjectable; } }); -Object.defineProperty(exports, "LoggedGuard", { enumerable: true, get: function () { return logged_1.LoggedGuard; } }); -Object.defineProperty(exports, "LoggedInterceptor", { enumerable: true, get: function () { return logged_1.LoggedInterceptor; } }); -Object.defineProperty(exports, "LoggedMiddleware", { enumerable: true, get: function () { return logged_1.LoggedMiddleware; } }); -var logger_1 = require("./logger"); -Object.defineProperty(exports, "ScopedLogger", { enumerable: true, get: function () { return logger_1.ScopedLogger; } }); -var reflected_1 = require("./reflected"); -Object.defineProperty(exports, "InjectLogger", { enumerable: true, get: function () { return reflected_1.InjectLogger; } }); -Object.defineProperty(exports, "LoggedParam", { enumerable: true, get: function () { return reflected_1.LoggedParam; } }); -Object.defineProperty(exports, "LoggedHeaders", { enumerable: true, get: function () { return reflected_1.LoggedHeaders; } }); -Object.defineProperty(exports, "LoggedBody", { enumerable: true, get: function () { return reflected_1.LoggedBody; } }); -Object.defineProperty(exports, "LoggedQuery", { enumerable: true, get: function () { return reflected_1.LoggedQuery; } }); -Object.defineProperty(exports, "Logged", { enumerable: true, get: function () { return reflected_1.Logged; } }); -Object.defineProperty(exports, "Returns", { enumerable: true, get: function () { return reflected_1.Returns; } }); -var utils_1 = require("./utils"); -Object.defineProperty(exports, "getRequestLogger", { enumerable: true, get: function () { return utils_1.getRequestLogger; } }); diff --git a/dist/lib/internals/nest.d.ts b/dist/lib/internals/nest.d.ts deleted file mode 100644 index 3d0a16d..0000000 --- a/dist/lib/internals/nest.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; -import { ParamData, PipeTransform, Type } from '@nestjs/common'; -import { ROUTE_ARGS_METADATA } from '@nestjs/common/constants'; -export { RouteParamtypes, PipeTransform, Type, ROUTE_ARGS_METADATA }; -export declare function createRouteParamDecorator(paramtype: RouteParamtypes): (data?: ParamData) => ParameterDecorator; -export declare const createPipesRouteParamDecorator: (paramtype: RouteParamtypes) => (data?: any, ...pipes: (Type | PipeTransform)[]) => ParameterDecorator; diff --git a/dist/lib/internals/nest.js b/dist/lib/internals/nest.js deleted file mode 100644 index 04ca6e6..0000000 --- a/dist/lib/internals/nest.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createPipesRouteParamDecorator = exports.createRouteParamDecorator = exports.ROUTE_ARGS_METADATA = exports.RouteParamtypes = void 0; -const route_paramtypes_enum_1 = require("@nestjs/common/enums/route-paramtypes.enum"); -Object.defineProperty(exports, "RouteParamtypes", { enumerable: true, get: function () { return route_paramtypes_enum_1.RouteParamtypes; } }); -const common_1 = require("@nestjs/common"); -const constants_1 = require("@nestjs/common/constants"); -Object.defineProperty(exports, "ROUTE_ARGS_METADATA", { enumerable: true, get: function () { return constants_1.ROUTE_ARGS_METADATA; } }); -const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); -function createRouteParamDecorator(paramtype) { - return (data) => (target, key, index) => { - const args = Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, target.constructor, key) || {}; - Reflect.defineMetadata(constants_1.ROUTE_ARGS_METADATA, (0, common_1.assignMetadata)(args, paramtype, index, data), target.constructor, key); - }; -} -exports.createRouteParamDecorator = createRouteParamDecorator; -const createPipesRouteParamDecorator = (paramtype) => (data, ...pipes) => (target, key, index) => { - const args = Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, target.constructor, key) || {}; - const hasParamData = (0, shared_utils_1.isNil)(data) || (0, shared_utils_1.isString)(data); - const paramData = hasParamData ? data : undefined; - const paramPipes = hasParamData ? pipes : [data, ...pipes]; - Reflect.defineMetadata(constants_1.ROUTE_ARGS_METADATA, (0, common_1.assignMetadata)(args, paramtype, index, paramData, ...paramPipes), target.constructor, key); -}; -exports.createPipesRouteParamDecorator = createPipesRouteParamDecorator; diff --git a/dist/lib/internals/utils.d.ts b/dist/lib/internals/utils.d.ts deleted file mode 100644 index 4df622b..0000000 --- a/dist/lib/internals/utils.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare const notIncludedSymbol: unique symbol; -export declare function includeObjectSync(ocv: any, opt: { - paths: string[]; -}): any; -export declare function excludeObjectSync(ocv: any, opt: { - paths: string[]; -}): any; -export declare function objectContainedLogSync(ocv: any, options?: { - include?: string[]; - exclude?: string[]; -}): string; -export declare function getItemByPathSync(obj: object, path: string | string[]): any; diff --git a/dist/lib/internals/utils.js b/dist/lib/internals/utils.js deleted file mode 100644 index 048f3cc..0000000 --- a/dist/lib/internals/utils.js +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getItemByPathSync = exports.objectContainedLogSync = exports.excludeObjectSync = exports.includeObjectSync = exports.notIncludedSymbol = void 0; -exports.notIncludedSymbol = Symbol('notIncluded'); -function includeObjectSync(ocv, opt) { - let current = Array.isArray(ocv) ? [] : typeof ocv === 'object' ? {} : ocv; - opt.paths.forEach((dotpath) => { - let query = ocv; - let objRef = current; - const path = dotpath.split('.'); - for (const [index, key] of Object.entries(path)) { - query = query[key]; - if (query !== undefined && objRef[key] === undefined) { - if (typeof query === 'object') { - if (Array.isArray(query)) { - objRef[key] = []; - } - else { - objRef[key] = {}; - } - } - } - if (typeof query !== 'object' || index === (path.length - 1).toString()) { - objRef[key] = query; - break; - } - objRef = objRef[key]; - } - }); - return current; -} -exports.includeObjectSync = includeObjectSync; -function excludeObjectSync(ocv, opt) { - const copied = typeof ocv === 'object' - ? Array.isArray(ocv) - ? [...ocv] - : { ...ocv } - : ocv; - opt.paths.forEach((dotpath) => { - let objRef = copied; - const path = dotpath.split('.'); - const lastIndex = (path.length - 1).toString(); - for (const [index, key] of Object.entries(path)) { - if (index === lastIndex) { - delete objRef[key]; - break; - } - objRef = objRef[key]; - if (typeof objRef !== 'object') { - break; - } - } - }); - return copied; -} -exports.excludeObjectSync = excludeObjectSync; -function objectContainedLogSync(ocv, options) { - if (options && typeof ocv === 'object' && ocv !== null) { - if (options.include && options.include.length > 0) { - return JSON.stringify(includeObjectSync(ocv, { paths: options.include })); - } - if (options.exclude && options.exclude.length > 0) { - return JSON.stringify(excludeObjectSync(ocv, { paths: options.exclude })); - } - } - if (typeof ocv === 'object' && ocv !== null) { - return JSON.stringify(ocv); - } - else { - return `${ocv}`; - } -} -exports.objectContainedLogSync = objectContainedLogSync; -function getItemByPathSync(obj, path) { - const paths = Array.isArray(path) ? path : path.split('.'); - return Object.keys(obj).includes(paths[0]) - ? typeof obj[paths[0]] === 'object' - ? getItemByPathSync(obj[paths[0]], paths.slice(1)) - : obj[paths[0]] - : undefined; -} -exports.getItemByPathSync = getItemByPathSync; diff --git a/dist/lib/logged/class.d.ts b/dist/lib/logged/class.d.ts deleted file mode 100644 index 35a92b2..0000000 --- a/dist/lib/logged/class.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ControllerOptions, ScopeOptions } from '@nestjs/common'; -export declare function LoggedInjectable(options?: ScopeOptions & { - verbose?: boolean; -}): (target: any) => void; -export declare function LoggedController(): (target: any) => void; -export declare function LoggedController(prefix: string | string[]): (target: any) => void; -export declare function LoggedController(options: ControllerOptions & { - verbose?: boolean; -}): (target: any) => void; diff --git a/dist/lib/logged/class.js b/dist/lib/logged/class.js deleted file mode 100644 index 386fc1a..0000000 --- a/dist/lib/logged/class.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedController = exports.LoggedInjectable = void 0; -const common_1 = require("@nestjs/common"); -const utils_1 = require("./utils"); -const methods_1 = require("./methods"); -function LoggedInjectable(options) { - return (target) => { - (0, utils_1.loggerInit)(target.prototype); - const logger = target.prototype.logger; - const methods = Object.getOwnPropertyNames(target.prototype); - methods.forEach((method) => { - if (method !== 'constructor' && - typeof target.prototype[method] === 'function') { - if (options && options.verbose) - logger.log(`LoggedFunction applied to ${method}`); - (0, methods_1.LoggedFunction)()(target.prototype, method, { - value: target.prototype[method], - }); - } - }); - (0, common_1.Injectable)(options)(target); - }; -} -exports.LoggedInjectable = LoggedInjectable; -function LoggedController(param) { - return (target) => { - (0, utils_1.loggerInit)(target.prototype); - const logger = target.prototype.logger; - const methods = Object.getOwnPropertyNames(target.prototype); - let verbose = typeof param === 'object' && Object.keys(param).includes('verbose') - ? param.verbose - : false; - methods.forEach((method) => { - if (method !== 'constructor' && - typeof target.prototype[method] === 'function') { - if (verbose) { - const path = Reflect.getMetadata('path', target.prototype[method]); - const httpMethod = Reflect.getMetadata('method', target.prototype[method]); - logger.log(`LoggedRoute applied to ${method} (${utils_1.RevRequestMethod[httpMethod]} ${path})`); - } - (0, methods_1.LoggedRoute)()(target.prototype, method, { - value: target.prototype[method], - }); - } - }); - (0, common_1.Controller)(param)(target); - }; -} -exports.LoggedController = LoggedController; diff --git a/dist/lib/logged/index.d.ts b/dist/lib/logged/index.d.ts deleted file mode 100644 index 67b66e2..0000000 --- a/dist/lib/logged/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './methods'; -export { LoggedController, LoggedInjectable } from './class'; diff --git a/dist/lib/logged/index.js b/dist/lib/logged/index.js deleted file mode 100644 index 0b7e383..0000000 --- a/dist/lib/logged/index.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedInjectable = exports.LoggedController = void 0; -__exportStar(require("./methods"), exports); -var class_1 = require("./class"); -Object.defineProperty(exports, "LoggedController", { enumerable: true, get: function () { return class_1.LoggedController; } }); -Object.defineProperty(exports, "LoggedInjectable", { enumerable: true, get: function () { return class_1.LoggedInjectable; } }); diff --git a/dist/lib/logged/metadata.d.ts b/dist/lib/logged/metadata.d.ts deleted file mode 100644 index 971377d..0000000 --- a/dist/lib/logged/metadata.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { OverrideBuildOptions } from './utils'; -export declare const nestLoggedMetadata: unique symbol; -export declare class LoggedMetadata { - options: OverrideBuildOptions; - constructor(options?: Partial); - updateOption(options: Partial): void; -} diff --git a/dist/lib/logged/metadata.js b/dist/lib/logged/metadata.js deleted file mode 100644 index 600ae52..0000000 --- a/dist/lib/logged/metadata.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedMetadata = exports.nestLoggedMetadata = void 0; -const utils_1 = require("./utils"); -exports.nestLoggedMetadata = Symbol('nlogdec-metadata'); -class LoggedMetadata { - constructor(options) { - this.options = { - ...utils_1.defaultOverrideBuildOptions, - ...(options ?? {}), - }; - } - updateOption(options) { - this.options = { - ...this.options, - ...options, - }; - } -} -exports.LoggedMetadata = LoggedMetadata; diff --git a/dist/lib/logged/methods/function.d.ts b/dist/lib/logged/methods/function.d.ts deleted file mode 100644 index c7ac515..0000000 --- a/dist/lib/logged/methods/function.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { OverrideBuildOptions } from '../utils'; -export declare function LoggedFunction, R>(options?: Partial): (_target: any, key: string, descriptor: TypedPropertyDescriptor<(...args: F) => R | Promise>) => void; diff --git a/dist/lib/logged/methods/function.js b/dist/lib/logged/methods/function.js deleted file mode 100644 index 7807c86..0000000 --- a/dist/lib/logged/methods/function.js +++ /dev/null @@ -1,44 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedFunction = void 0; -const utils_1 = require("../utils"); -const metadata_1 = require("../metadata"); -const reflected_1 = require("../../reflected"); -const override_1 = require("../override"); -function LoggedFunction(options) { - return (_target, key, descriptor) => { - (0, utils_1.loggerInit)(_target); - const logger = _target.logger; - const fn = descriptor.value; - if (!fn || typeof fn !== 'function') { - logger.warn(`LoggedFunction decorator applied to non-function property: ${key}`); - return; - } - const logMetadata = Reflect.getOwnMetadata(metadata_1.nestLoggedMetadata, _target, key); - if (logMetadata) { - // already applied, override instead - logMetadata.updateOption(options); - return; - } - const newMetadata = new metadata_1.LoggedMetadata(options); - const all = Reflect.getMetadataKeys(fn).map((k) => [ - k, - Reflect.getMetadata(k, fn), - ]); - const scopedLoggerInjectableParam = Reflect.getOwnMetadata(reflected_1.scopedLogger, _target, key); - const loggedParams = Reflect.getOwnMetadata(reflected_1.loggedParam, _target, key); - const returnsData = Reflect.getOwnMetadata(reflected_1.returns, fn); - const overrideFunction = (0, override_1.overrideBuild)('function', fn, logger, { - scopedLoggerInjectableParam, - loggedParams, - }, key, returnsData, newMetadata); - _target[key] = overrideFunction; - descriptor.value = overrideFunction; - Reflect.defineMetadata(metadata_1.nestLoggedMetadata, newMetadata, _target, key); - all.forEach(([k, v]) => { - Reflect.defineMetadata(k, v, _target[key]); - Reflect.defineMetadata(k, v, descriptor.value); - }); - }; -} -exports.LoggedFunction = LoggedFunction; diff --git a/dist/lib/logged/methods/guard.d.ts b/dist/lib/logged/methods/guard.d.ts deleted file mode 100644 index 97fa480..0000000 --- a/dist/lib/logged/methods/guard.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ExecutionContext } from '@nestjs/common'; -import { OverrideBuildOptions } from '../utils'; -export declare function LoggedGuard, R>(options?: Partial): (_target: any, key: string, descriptor: TypedPropertyDescriptor<(context: ExecutionContext, ...args: F) => R>) => void; diff --git a/dist/lib/logged/methods/guard.js b/dist/lib/logged/methods/guard.js deleted file mode 100644 index 360c586..0000000 --- a/dist/lib/logged/methods/guard.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedGuard = void 0; -const utils_1 = require("../utils"); -const metadata_1 = require("../metadata"); -const reflected_1 = require("../../reflected"); -const override_1 = require("../override"); -function LoggedGuard(options) { - return (_target, key, descriptor) => { - (0, utils_1.loggerInit)(_target); - const logger = _target.logger; - const fn = descriptor.value; - if (!fn || typeof fn !== 'function') { - logger.warn(`LoggedGuard decorator applied to non-function property: ${key}`); - return; - } - const logMetadata = Reflect.getOwnMetadata(metadata_1.nestLoggedMetadata, _target, key); - if (logMetadata) { - // already applied, override instead - logMetadata.updateOption(options); - return; - } - const newMetadata = new metadata_1.LoggedMetadata(options); - const all = Reflect.getMetadataKeys(fn).map((k) => [ - k, - Reflect.getMetadata(k, fn), - ]); - const scopedLoggerInjectableParam = Reflect.getOwnMetadata(reflected_1.scopedLogger, _target, key); - const returnsData = Reflect.getOwnMetadata(reflected_1.returns, fn); - const overrideFunction = (0, override_1.overrideBuild)('guard', fn, logger, { - scopedLoggerInjectableParam, - loggedParams: [], - }, _target.constructor.name, returnsData, newMetadata); - _target[key] = overrideFunction; - descriptor.value = overrideFunction; - Reflect.defineMetadata(metadata_1.nestLoggedMetadata, newMetadata, _target, key); - all.forEach(([k, v]) => { - Reflect.defineMetadata(k, v, _target[key]); - Reflect.defineMetadata(k, v, descriptor.value); - }); - }; -} -exports.LoggedGuard = LoggedGuard; diff --git a/dist/lib/logged/methods/index.d.ts b/dist/lib/logged/methods/index.d.ts deleted file mode 100644 index 9aeedf1..0000000 --- a/dist/lib/logged/methods/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { LoggedFunction } from './function'; -export { LoggedRoute } from './route'; -export { LoggedGuard } from './guard'; -export { LoggedInterceptor } from './interceptor'; -export { LoggedMiddleware } from './middleware'; diff --git a/dist/lib/logged/methods/index.js b/dist/lib/logged/methods/index.js deleted file mode 100644 index d2f4aba..0000000 --- a/dist/lib/logged/methods/index.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedMiddleware = exports.LoggedInterceptor = exports.LoggedGuard = exports.LoggedRoute = exports.LoggedFunction = void 0; -var function_1 = require("./function"); -Object.defineProperty(exports, "LoggedFunction", { enumerable: true, get: function () { return function_1.LoggedFunction; } }); -var route_1 = require("./route"); -Object.defineProperty(exports, "LoggedRoute", { enumerable: true, get: function () { return route_1.LoggedRoute; } }); -var guard_1 = require("./guard"); -Object.defineProperty(exports, "LoggedGuard", { enumerable: true, get: function () { return guard_1.LoggedGuard; } }); -var interceptor_1 = require("./interceptor"); -Object.defineProperty(exports, "LoggedInterceptor", { enumerable: true, get: function () { return interceptor_1.LoggedInterceptor; } }); -var middleware_1 = require("./middleware"); -Object.defineProperty(exports, "LoggedMiddleware", { enumerable: true, get: function () { return middleware_1.LoggedMiddleware; } }); diff --git a/dist/lib/logged/methods/interceptor.d.ts b/dist/lib/logged/methods/interceptor.d.ts deleted file mode 100644 index 53f7a61..0000000 --- a/dist/lib/logged/methods/interceptor.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { OverrideBuildOptions } from '../utils'; -import { ExecutionContext } from '@nestjs/common'; -export declare function LoggedInterceptor, R>(options?: Partial): (_target: any, key: string, descriptor: TypedPropertyDescriptor<(context: ExecutionContext, ...args: F) => R>) => void; diff --git a/dist/lib/logged/methods/interceptor.js b/dist/lib/logged/methods/interceptor.js deleted file mode 100644 index e4beaba..0000000 --- a/dist/lib/logged/methods/interceptor.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedInterceptor = void 0; -const utils_1 = require("../utils"); -const metadata_1 = require("../metadata"); -const reflected_1 = require("../../reflected"); -const override_1 = require("../override"); -function LoggedInterceptor(options) { - return (_target, key, descriptor) => { - (0, utils_1.loggerInit)(_target); - const logger = _target.logger; - const fn = descriptor.value; - if (!fn || typeof fn !== 'function') { - logger.warn(`LoggedInterceptor decorator applied to non-function property: ${key}`); - return; - } - const logMetadata = Reflect.getOwnMetadata(metadata_1.nestLoggedMetadata, _target, key); - if (logMetadata) { - // already applied, override instead - logMetadata.updateOption(options); - return; - } - const newMetadata = new metadata_1.LoggedMetadata(options); - const all = Reflect.getMetadataKeys(fn).map((k) => [ - k, - Reflect.getMetadata(k, fn), - ]); - const scopedLoggerInjectableParam = Reflect.getOwnMetadata(reflected_1.scopedLogger, _target, key); - const returnsData = Reflect.getOwnMetadata(reflected_1.returns, fn); - const overrideFunction = (0, override_1.overrideBuild)('interceptor', fn, logger, { - scopedLoggerInjectableParam, - loggedParams: [], - }, _target.constructor.name, returnsData, newMetadata); - _target[key] = overrideFunction; - descriptor.value = overrideFunction; - Reflect.defineMetadata(metadata_1.nestLoggedMetadata, newMetadata, _target, key); - all.forEach(([k, v]) => { - Reflect.defineMetadata(k, v, _target[key]); - Reflect.defineMetadata(k, v, descriptor.value); - }); - }; -} -exports.LoggedInterceptor = LoggedInterceptor; diff --git a/dist/lib/logged/methods/middleware.d.ts b/dist/lib/logged/methods/middleware.d.ts deleted file mode 100644 index 66a698b..0000000 --- a/dist/lib/logged/methods/middleware.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { OverrideBuildOptions } from '../utils'; -export declare function LoggedMiddleware, R>(options?: Partial): (_target: any, key: string, descriptor: TypedPropertyDescriptor<(...args: F) => R>) => void; diff --git a/dist/lib/logged/methods/middleware.js b/dist/lib/logged/methods/middleware.js deleted file mode 100644 index 61b713d..0000000 --- a/dist/lib/logged/methods/middleware.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedMiddleware = void 0; -const utils_1 = require("../utils"); -const metadata_1 = require("../metadata"); -const reflected_1 = require("../../reflected"); -const override_1 = require("../override"); -function LoggedMiddleware(options) { - return (_target, key, descriptor) => { - (0, utils_1.loggerInit)(_target); - const logger = _target.logger; - const fn = descriptor.value; - if (!fn || typeof fn !== 'function') { - logger.warn(`LoggedMiddleware decorator applied to non-function property: ${key}`); - return; - } - const logMetadata = Reflect.getOwnMetadata(metadata_1.nestLoggedMetadata, _target, key); - if (logMetadata) { - // already applied, override instead - logMetadata.updateOption(options); - return; - } - const newMetadata = new metadata_1.LoggedMetadata(options); - const all = Reflect.getMetadataKeys(fn).map((k) => [ - k, - Reflect.getMetadata(k, fn), - ]); - const scopedLoggerInjectableParam = Reflect.getOwnMetadata(reflected_1.scopedLogger, _target, key); - const returnsData = Reflect.getOwnMetadata(reflected_1.returns, fn); - const overrideFunction = (0, override_1.overrideBuild)('middleware', fn, logger, { - scopedLoggerInjectableParam, - loggedParams: [], - }, _target.constructor.name, returnsData, newMetadata); - _target[key] = overrideFunction; - descriptor.value = overrideFunction; - Reflect.defineMetadata(metadata_1.nestLoggedMetadata, newMetadata, _target, key); - all.forEach(([k, v]) => { - Reflect.defineMetadata(k, v, _target[key]); - Reflect.defineMetadata(k, v, descriptor.value); - }); - }; -} -exports.LoggedMiddleware = LoggedMiddleware; diff --git a/dist/lib/logged/methods/route.d.ts b/dist/lib/logged/methods/route.d.ts deleted file mode 100644 index b8e0538..0000000 --- a/dist/lib/logged/methods/route.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { OverrideBuildOptions } from '../utils'; -export declare function LoggedRoute, R>(route?: string, options?: Partial): (_target: any, key: string, descriptor: TypedPropertyDescriptor<(...args: F) => R>) => void; diff --git a/dist/lib/logged/methods/route.js b/dist/lib/logged/methods/route.js deleted file mode 100644 index 462d3fc..0000000 --- a/dist/lib/logged/methods/route.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.LoggedRoute = void 0; -const utils_1 = require("../utils"); -const metadata_1 = require("../metadata"); -const reflected_1 = require("../../reflected"); -const override_1 = require("../override"); -const nest_1 = require("../../internals/nest"); -function LoggedRoute(route, options) { - return (_target, key, descriptor) => { - (0, utils_1.loggerInit)(_target); - const logger = _target.logger; - const fn = descriptor.value; - if (!fn || typeof fn !== 'function') { - logger.warn(`LoggedRoute decorator applied to non-function property: ${key}`); - return; - } - const logMetadata = Reflect.getOwnMetadata(metadata_1.nestLoggedMetadata, _target, key); - if (logMetadata) { - // already applied, override instead - logMetadata.updateOption(options); - return; - } - const newMetadata = new metadata_1.LoggedMetadata(options); - const all = Reflect.getMetadataKeys(fn).map((k) => [ - k, - Reflect.getMetadata(k, fn), - ]); - const httpPath = Reflect.getMetadata('path', fn); - const httpMethod = Reflect.getMetadata('method', fn); - const fullRoute = `${_target.constructor.name}::${route ?? httpPath}[${utils_1.RevRequestMethod[httpMethod]}]`; - const scopedLoggerInjectableParam = Reflect.getOwnMetadata(reflected_1.scopedLogger, _target, key); - // if @InjectLogger exists, fake nestjs as it is @Req() - if (scopedLoggerInjectableParam !== undefined) { - (0, nest_1.createRouteParamDecorator)(0)()(_target, key, scopedLoggerInjectableParam); - } - const loggedParams = Reflect.getOwnMetadata(reflected_1.loggedParam, _target, key); - const returnsData = Reflect.getOwnMetadata(reflected_1.returns, fn); - const overrideFunction = (0, override_1.overrideBuild)('route', fn, logger, { - scopedLoggerInjectableParam, - loggedParams, - }, key, returnsData, newMetadata, fullRoute); - _target[key] = overrideFunction; - descriptor.value = overrideFunction; - Reflect.defineMetadata(metadata_1.nestLoggedMetadata, newMetadata, _target, key); - all.forEach(([k, v]) => { - Reflect.defineMetadata(k, v, _target[key]); - Reflect.defineMetadata(k, v, descriptor.value); - }); - }; -} -exports.LoggedRoute = LoggedRoute; diff --git a/dist/lib/logged/override.d.ts b/dist/lib/logged/override.d.ts deleted file mode 100644 index a7d3f82..0000000 --- a/dist/lib/logged/override.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Logger } from '@nestjs/common'; -import { LoggedParamReflectData, ReturnsReflectData } from '../reflected'; -import { LoggedMetadata } from './metadata'; -interface FunctionMetadata { - scopedLoggerInjectableParam?: number; - loggedParams?: LoggedParamReflectData[]; -} -export declare function overrideBuild, R>(type: 'route', originalFunction: (...args: F) => R, baseLogger: Logger, metadatas: FunctionMetadata, key: string, returnsData: ReturnsReflectData[] | string | true, logged: LoggedMetadata, route: string): (...args: F) => R; -export declare function overrideBuild, R>(type: 'function' | 'guard' | 'interceptor' | 'middleware', originalFunction: (...args: F) => R, baseLogger: Logger, metadatas: FunctionMetadata, key: string, returnsData: ReturnsReflectData[] | string | true, logged: LoggedMetadata): (...args: F) => R; -export {}; diff --git a/dist/lib/logged/override.js b/dist/lib/logged/override.js deleted file mode 100644 index ae9f77f..0000000 --- a/dist/lib/logged/override.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.overrideBuild = void 0; -const utils_1 = require("./utils"); -const utils_2 = require("../internals/utils"); -const logger_1 = require("../logger"); -function overrideBuild(type, originalFunction, baseLogger, metadatas, key, returnsData, logged, route) { - return function (...args) { - // Creating ScopedLogger - let injectedLogger = baseLogger; - if (typeof metadatas.scopedLoggerInjectableParam !== 'undefined') { - if (type === 'function') { - if (args.length <= metadatas.scopedLoggerInjectableParam || - !(args[metadatas.scopedLoggerInjectableParam] instanceof logger_1.ScopedLogger)) { - args[metadatas.scopedLoggerInjectableParam] = logger_1.ScopedLogger.fromRoot(baseLogger, key); - } - else { - args[metadatas.scopedLoggerInjectableParam] = logger_1.ScopedLogger.fromSuper(baseLogger, args[metadatas.scopedLoggerInjectableParam], key); - } - } - else { - // special, can access to request object - if (type === 'guard' || type === 'interceptor') { - // args[0] == ExecutionContext - const ctx = args[0]; - if (ctx.getType() !== 'http') { - injectedLogger.error('Cannot inject logger: Request type is not http'); - } - else { - let req = ctx.switchToHttp().getRequest(); - if (req[utils_1.REQUEST_LOG_ID] === undefined) { - req[utils_1.REQUEST_LOG_ID] = logger_1.ScopedLogger.createScopeId(); - } - args[metadatas.scopedLoggerInjectableParam] = logger_1.ScopedLogger.fromRoot(baseLogger, key, req[utils_1.REQUEST_LOG_ID]); - } - } - else if (type === 'middleware') { - let req = args[0]; - if (req[utils_1.REQUEST_LOG_ID] === undefined) { - req[utils_1.REQUEST_LOG_ID] = logger_1.ScopedLogger.createScopeId(); - } - args[metadatas.scopedLoggerInjectableParam] = logger_1.ScopedLogger.fromRoot(baseLogger, key, req[utils_1.REQUEST_LOG_ID]); - } - else if (type === 'route') { - // args[metadatas.scopedLoggerInjectableParam] is now Request object, thanks to code in @LoggedRoute!!!! - let req = args[metadatas.scopedLoggerInjectableParam]; - if (req[utils_1.REQUEST_LOG_ID] === undefined) { - req[utils_1.REQUEST_LOG_ID] = logger_1.ScopedLogger.createScopeId(); - } - args[metadatas.scopedLoggerInjectableParam] = logger_1.ScopedLogger.fromRoot(baseLogger, key, req[utils_1.REQUEST_LOG_ID]); - } - } - injectedLogger = args[metadatas.scopedLoggerInjectableParam]; - } - // If this is ExecutionContext based function (e.g. Guard, Interceptor) get Request from Context - if (type === 'guard' || type === 'interceptor') { - const context = args[0]; - if (context.getType() === 'http') { - const req = context.switchToHttp().getRequest(); - route = /* supporting FastifyRequest */ req.raw ? req.raw.url : req.url; - } - } - // Start Log - if (logged.options.callLogLevel !== 'skip') { - const callLogIdentifyMessage = type === 'middleware' || - type === 'guard' || - type === 'interceptor' || - type === 'route' - ? (0, utils_1.createCallLogIdentifyMessage)('HIT', type, key, route) - : (0, utils_1.createCallLogIdentifyMessage)('HIT', type, key); - injectedLogger[logged.options.callLogLevel](`${callLogIdentifyMessage} ${metadatas.loggedParams && metadatas.loggedParams.length > 0 - ? 'WITH ' + - metadatas.loggedParams - .map(({ name, index, include, exclude }) => name + - '=' + - (0, utils_2.objectContainedLogSync)(args[index], { - include, - exclude, - })) - .join(', ') - : ''}`); - } - try { - const r = originalFunction.call(this, ...args); // Try to call original function - // Return Log - if (logged.options.returnLogLevel !== 'skip') { - if (originalFunction.constructor.name === 'AsyncFunction' || - (r && typeof r === 'object' && typeof r['then'] === 'function')) { - return r['then']((r) => { - const resultLogged = Array.isArray(returnsData) - ? typeof r === 'object' && r !== null - ? 'WITH ' + - returnsData - .map(({ name, path }) => { - const value = (0, utils_2.getItemByPathSync)(r, path); - return value !== undefined ? `${name}=${value}` : ''; - }) - .filter((v) => v.length > 0) - .join(', ') - : '' - : typeof returnsData === 'string' - ? 'WITH ' + returnsData + '=' + typeof r === 'object' - ? JSON.stringify(r) - : r - : returnsData - ? typeof r === 'object' - ? 'WITH ' + JSON.stringify(r) - : 'WITH ' + r - : ''; - injectedLogger[logged.options.returnLogLevel](`${(0, utils_1.createCallLogIdentifyMessage)('RETURNED', type, key, route)} ${resultLogged}`); - return r; - }); - } - else { - const resultLogged = Array.isArray(returnsData) - ? typeof r === 'object' && r !== null - ? 'WITH ' + - returnsData - .map(({ name, path }) => { - const value = (0, utils_2.getItemByPathSync)(r, path); - return value !== undefined ? `${name}=${value}` : ''; - }) - .filter((v) => v.length > 0) - .join(', ') - : '' - : typeof returnsData === 'string' - ? 'WITH ' + returnsData + '=' + typeof r === 'object' - ? JSON.stringify(r) - : r - : returnsData - ? typeof r === 'object' - ? 'WITH ' + JSON.stringify(r) - : 'WITH ' + r - : ''; - injectedLogger[logged.options.returnLogLevel](`${(0, utils_1.createCallLogIdentifyMessage)('RETURNED', type, key, route)} ${resultLogged}`); - return r; - } - } - else { - return r; - } - } - catch (e) { - // Error Log - if (logged.options.errorLogLevel !== 'skip') { - injectedLogger[logged.options.errorLogLevel](`${(0, utils_1.createCallLogIdentifyMessage)('ERROR', type, key, route)} ${e}`); - } - throw e; - } - }; -} -exports.overrideBuild = overrideBuild; diff --git a/dist/lib/logged/utils.d.ts b/dist/lib/logged/utils.d.ts deleted file mode 100644 index f89a9e3..0000000 --- a/dist/lib/logged/utils.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { LogLevel } from '@nestjs/common'; -export declare const RevRequestMethod: string[]; -export declare function loggerInit(_target: any): void; -export type BuildType = 'route' | 'function' | 'guard' | 'interceptor' | 'middleware'; -export declare function createCallLogIdentifyMessage(message: 'HIT' | 'RETURNED' | 'ERROR', type: BuildType, key?: string, route?: string): string; -export declare const REQUEST_LOG_ID = "__nestlogged_request_log_id__"; -export interface OverrideBuildOptions { - callLogLevel: LogLevel | 'skip'; - returnLogLevel: LogLevel | 'skip'; - errorLogLevel: LogLevel | 'skip'; - /** @deprecated use `callLogLevel: 'skip'` instead */ - skipCallLog: boolean; - /** @deprecated use `returnLogLevel: 'skip'` instead */ - skipReturnLog: boolean; - /** @deprecated use `errorLogLevel: 'skip'` instead */ - skipErrorLog: boolean; -} -export declare const defaultOverrideBuildOptions: OverrideBuildOptions; diff --git a/dist/lib/logged/utils.js b/dist/lib/logged/utils.js deleted file mode 100644 index 7d4177c..0000000 --- a/dist/lib/logged/utils.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.defaultOverrideBuildOptions = exports.REQUEST_LOG_ID = exports.createCallLogIdentifyMessage = exports.loggerInit = exports.RevRequestMethod = void 0; -const common_1 = require("@nestjs/common"); -exports.RevRequestMethod = [ - 'GET', - 'POST', - 'PUT', - 'DELETE', - 'PATCH', - 'ALL', - 'OPTIONS', - 'HEAD', - 'SEARCH', -]; -function loggerInit(_target) { - if (!Object.getOwnPropertyNames(_target).includes('logger')) { - const newTargetLogger = new common_1.Logger(_target.constructor.name); - newTargetLogger.log('Logger Initialized.'); - Object.defineProperty(_target, 'logger', { - writable: false, - enumerable: false, - configurable: false, - value: newTargetLogger, - }); - } -} -exports.loggerInit = loggerInit; -const callLogIdentifyMessageDictionary = { - route: 'ENDPOINT', - function: 'FUNCTION', - guard: 'GUARD', - interceptor: 'INTERCEPTOR', - middleware: 'MIDDLEWARE', -}; -function createCallLogIdentifyMessage(message, type, key, route) { - if (message === 'ERROR') - return `ERROR WHILE ${callLogIdentifyMessageDictionary[type]} ${key} (${route}): `; - if (type === 'guard' || - type === 'interceptor' || - type === 'middleware' || - type === 'route') - return `${message} ${callLogIdentifyMessageDictionary[type]} ${key} (${route})`; - if (type === 'function') - return `${message} ${callLogIdentifyMessageDictionary[type]} ${key}`; - return `${message} ${callLogIdentifyMessageDictionary[type]}`; -} -exports.createCallLogIdentifyMessage = createCallLogIdentifyMessage; -exports.REQUEST_LOG_ID = '__nestlogged_request_log_id__'; -exports.defaultOverrideBuildOptions = { - callLogLevel: 'log', - returnLogLevel: 'log', - errorLogLevel: 'error', - skipCallLog: false, - skipReturnLog: false, - skipErrorLog: false, -}; diff --git a/dist/lib/logger.d.ts b/dist/lib/logger.d.ts deleted file mode 100644 index 6fc7757..0000000 --- a/dist/lib/logger.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Logger } from '@nestjs/common'; -export declare class ScopedLogger extends Logger { - private logger; - private scope; - private scopeId; - constructor(logger: Logger, scope: string[], scopeId?: string); - private scopedLog; - debug: (message: string) => void; - log: (message: string) => void; - warn: (message: string) => void; - verbose: (message: string) => void; - error: (message: string) => void; - fatal: (message: string) => void; - static fromSuper(baseLogger: Logger, logger: ScopedLogger, scope: string): ScopedLogger; - static fromRoot(logger: Logger, scope: string, scopeId?: string): ScopedLogger; - static createScopeId(): string; -} diff --git a/dist/lib/logger.js b/dist/lib/logger.js deleted file mode 100644 index 305d6d7..0000000 --- a/dist/lib/logger.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ScopedLogger = void 0; -const common_1 = require("@nestjs/common"); -const hyperid = require("hyperid"); -const createId = hyperid({ fixedLength: true }); -class ScopedLogger extends common_1.Logger { - constructor(logger, scope, scopeId = createId()) { - super(); - this.logger = logger; - this.scope = scope; - this.scopeId = scopeId; - this.debug = this.scopedLog('debug'); - this.log = this.scopedLog('log'); - this.warn = this.scopedLog('warn'); - this.verbose = this.scopedLog('verbose'); - this.error = this.scopedLog('error'); - this.fatal = this.scopedLog('fatal'); - } - scopedLog(method) { - return (message) => { - this.logger[method](`${this.scopeId ? `(ID ${this.scopeId}) | ` : ''}${this.scope.join(' -> ')}: ${message}`); - }; - } - static fromSuper(baseLogger, logger, scope) { - return new ScopedLogger(baseLogger, [...logger.scope, scope], logger.scopeId); - } - static fromRoot(logger, scope, scopeId) { - return new ScopedLogger(logger, [scope], scopeId); - } - static createScopeId() { - return createId(); - } -} -exports.ScopedLogger = ScopedLogger; diff --git a/dist/lib/reflected.d.ts b/dist/lib/reflected.d.ts deleted file mode 100644 index 24bf15c..0000000 --- a/dist/lib/reflected.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Type, PipeTransform } from './internals/nest'; -export type Path = string | string[]; -export type Paths = Path[]; -export interface IncludeExcludePath { - includePath?: Paths; - excludePath?: Paths; -} -export interface LoggedParamReflectData { - name: string; - index: number; - include?: string[]; - exclude?: string[]; -} -export interface ScopeKeyReflectData { - name: string; - index: number; - path?: string[]; - priority?: number; -} -export interface ReturnsReflectData { - name: string; - path: string; -} -export declare const scopedLogger: unique symbol; -export declare const loggedParam: unique symbol; -export declare const returns: unique symbol; -export declare function InjectLogger(target: any, propertyKey: string | symbol, parameterIndex: number): void; -type ParameterDecoratorType = (target: any, propertyKey: string | symbol, parameterIndex: number) => void; -type LoggedParamReturns = (name: string, options?: IncludeExcludePath) => ParameterDecoratorType; -export declare const Logged: LoggedParamReturns; -type Pipe = Type | PipeTransform; -export declare function LoggedParam(): LoggedParamReturns; -export declare function LoggedParam(...pipes: Pipe[]): LoggedParamReturns; -export declare function LoggedParam(property: string, ...pipes: Pipe[]): LoggedParamReturns; -export declare function LoggedQuery(): LoggedParamReturns; -export declare function LoggedQuery(...pipes: Pipe[]): LoggedParamReturns; -export declare function LoggedQuery(property: string, ...pipes: Pipe[]): LoggedParamReturns; -export declare function LoggedBody(): LoggedParamReturns; -export declare function LoggedBody(...pipes: Pipe[]): LoggedParamReturns; -export declare function LoggedBody(property: string, ...pipes: Pipe[]): LoggedParamReturns; -export declare function LoggedHeaders(property?: string): LoggedParamReturns; -export declare function Returns, R>(namePaths?: { - [name: string]: string; -} | string): (_target: any, _key: string | symbol, descriptor: TypedPropertyDescriptor<(...args: F) => Promise | R>) => void; -export {}; diff --git a/dist/lib/reflected.js b/dist/lib/reflected.js deleted file mode 100644 index b78c3d4..0000000 --- a/dist/lib/reflected.js +++ /dev/null @@ -1,76 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Returns = exports.LoggedHeaders = exports.LoggedBody = exports.LoggedQuery = exports.LoggedParam = exports.Logged = exports.InjectLogger = exports.returns = exports.loggedParam = exports.scopedLogger = void 0; -const nest_1 = require("./internals/nest"); -exports.scopedLogger = Symbol('nlogdec-scopedLogger'); -exports.loggedParam = Symbol('nlogdec-loggedParam'); -exports.returns = Symbol('nlogdec-returns'); -function InjectLogger(target, propertyKey, parameterIndex) { - Reflect.defineMetadata(exports.scopedLogger, parameterIndex, target, propertyKey); -} -exports.InjectLogger = InjectLogger; -function createLoggedFunctionParam(name, options) { - return (target, propertyKey, parameterIndex) => { - const existingLoggedParams = Reflect.getOwnMetadata(exports.loggedParam, target, propertyKey) || []; - existingLoggedParams.push({ - name, - index: parameterIndex, - // If path is provided in string[] type, convert it to string path because it is used in string type - include: options && - options.includePath && - options.includePath.map((v) => (Array.isArray(v) ? v.join('.') : v)), - exclude: options && - options.excludePath && - options.excludePath.map((v) => (Array.isArray(v) ? v.join('.') : v)), - }); - Reflect.defineMetadata(exports.loggedParam, existingLoggedParams, target, propertyKey); - }; -} -const Logged = (name, options) => createLoggedFunctionParam(name, options); -exports.Logged = Logged; -function LoggedParam(property, ...pipes) { - return (name, options) => { - return (target, propertyKey, parameterIndex) => { - (0, nest_1.createPipesRouteParamDecorator)(nest_1.RouteParamtypes.PARAM)(property, ...pipes)(target, propertyKey, parameterIndex); - createLoggedFunctionParam(name, options)(target, propertyKey, parameterIndex); - }; - }; -} -exports.LoggedParam = LoggedParam; -function LoggedQuery(property, ...pipes) { - return (name, options) => { - return (target, propertyKey, parameterIndex) => { - (0, nest_1.createPipesRouteParamDecorator)(nest_1.RouteParamtypes.QUERY)(property, ...pipes)(target, propertyKey, parameterIndex); - createLoggedFunctionParam(name, options)(target, propertyKey, parameterIndex); - }; - }; -} -exports.LoggedQuery = LoggedQuery; -function LoggedBody(property, ...pipes) { - return (name, options) => { - return (target, propertyKey, parameterIndex) => { - (0, nest_1.createPipesRouteParamDecorator)(nest_1.RouteParamtypes.BODY)(property, ...pipes)(target, propertyKey, parameterIndex); - createLoggedFunctionParam(name, options)(target, propertyKey, parameterIndex); - }; - }; -} -exports.LoggedBody = LoggedBody; -function LoggedHeaders(property) { - return (name, options) => { - return (target, propertyKey, parameterIndex) => { - (0, nest_1.createRouteParamDecorator)(nest_1.RouteParamtypes.HEADERS)(property)(target, propertyKey, parameterIndex); - createLoggedFunctionParam(name, options)(target, propertyKey, parameterIndex); - }; - }; -} -exports.LoggedHeaders = LoggedHeaders; -function Returns(namePaths) { - return (_target, _key, descriptor) => { - Reflect.defineMetadata(exports.returns, namePaths - ? typeof namePaths === 'string' - ? namePaths - : Object.entries(namePaths).reduce((prev, curr) => [...prev, { name: curr[0], path: curr[1] }], []) - : true, descriptor.value); - }; -} -exports.Returns = Returns; diff --git a/dist/lib/utils.d.ts b/dist/lib/utils.d.ts deleted file mode 100644 index 1a27448..0000000 --- a/dist/lib/utils.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { ScopedLogger } from './logger'; -export declare function getRequestLogger(functionName: string, req: any): ScopedLogger; diff --git a/dist/lib/utils.js b/dist/lib/utils.js deleted file mode 100644 index a8ba580..0000000 --- a/dist/lib/utils.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getRequestLogger = void 0; -const common_1 = require("@nestjs/common"); -const logger_1 = require("./logger"); -const utils_1 = require("./logged/utils"); -const logger = new common_1.Logger(); -function getRequestLogger(functionName, req) { - return new logger_1.ScopedLogger(logger, [functionName], req[utils_1.REQUEST_LOG_ID]); -} -exports.getRequestLogger = getRequestLogger; diff --git a/dist/yarn.lock b/dist/yarn.lock deleted file mode 100644 index ee58e54..0000000 --- a/dist/yarn.lock +++ /dev/null @@ -1,173 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@lukeed/csprng@npm:^1.0.0": - version: 1.1.0 - resolution: "@lukeed/csprng@npm:1.1.0" - checksum: 10c0/5d6dcf478af732972083ab2889c294b57f1028fa13c2c240d7a4aaa079c2c75df7ef0dcbdda5419147fc6704b4adf96b2de92f1a9a72ac21c6350c4014fffe6c - languageName: node - linkType: hard - -"@nestjs/common@npm:^11.0.12": - version: 11.0.12 - resolution: "@nestjs/common@npm:11.0.12" - dependencies: - iterare: "npm:1.2.1" - tslib: "npm:2.8.1" - uid: "npm:2.0.2" - peerDependencies: - class-transformer: "*" - class-validator: "*" - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - checksum: 10c0/cf8976279dfd04e6a6c2f909e36dcfb4d06207e8dc0eafffcd966fc2d7a147ce511f0ca616c9157fe7c1a316e81241b372d569ab8b8b0aa587cd42283ce0f0f2 - languageName: node - linkType: hard - -"@types/node@npm:^20.9.1": - version: 20.17.24 - resolution: "@types/node@npm:20.17.24" - dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/2a39ce4c4cd4588a05b2a485cc0a1407cbea608dd1ab03e36add59d61712718d95c84b492ca5190753f0be2bce748aeeb0f2a1412e712775462befe3820b3ff9 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"buffer@npm:^5.2.1": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e - languageName: node - linkType: hard - -"hyperid@npm:^3.1.1": - version: 3.3.0 - resolution: "hyperid@npm:3.3.0" - dependencies: - buffer: "npm:^5.2.1" - uuid: "npm:^8.3.2" - uuid-parse: "npm:^1.1.0" - checksum: 10c0/709dafd2a25e21086a2d881adb3436a16eafd28692ebd967829ca1d5f10adf001925feb23b6aadfee464ea313d851e7ba7a5452869aaf6cde15e9149793a09e0 - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - -"iterare@npm:1.2.1": - version: 1.2.1 - resolution: "iterare@npm:1.2.1" - checksum: 10c0/02667d486e3e83ead028ba8484d927498c2ceab7e8c6a69dd881fd02abc4114f00b13abb36b592252fbb578b6e6f99ca1dfc2835408b9158c9a112a9964f453f - languageName: node - linkType: hard - -"nestlogged@workspace:.": - version: 0.0.0-use.local - resolution: "nestlogged@workspace:." - dependencies: - "@nestjs/common": "npm:^11.0.12" - "@types/node": "npm:^20.9.1" - hyperid: "npm:^3.1.1" - reflect-metadata: "npm:^0.1.13" - rxjs: "npm:^7.8.1" - typescript: "npm:^5.2.2" - languageName: unknown - linkType: soft - -"reflect-metadata@npm:^0.1.13": - version: 0.1.14 - resolution: "reflect-metadata@npm:0.1.14" - checksum: 10c0/3a6190c7f6cb224f26a012d11f9e329360c01c1945e2cbefea23976a8bacf9db6b794aeb5bf18adcb673c448a234fbc06fc41853c00a6c206b30f0777ecf019e - languageName: node - linkType: hard - -"rxjs@npm:^7.8.1": - version: 7.8.2 - resolution: "rxjs@npm:7.8.2" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 - languageName: node - linkType: hard - -"tslib@npm:2.8.1, tslib@npm:^2.1.0": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 - languageName: node - linkType: hard - -"typescript@npm:^5.2.2": - version: 5.8.2 - resolution: "typescript@npm:5.8.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5c4f6fbf1c6389b6928fe7b8fcd5dc73bb2d58cd4e3883f1d774ed5bd83b151cbac6b7ecf11723de56d4676daeba8713894b1e9af56174f2f9780ae7848ec3c6 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin": - version: 5.8.2 - resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5448a08e595cc558ab321e49d4cac64fb43d1fa106584f6ff9a8d8e592111b373a995a1d5c7f3046211c8a37201eb6d0f1566f15cdb7a62a5e3be01d087848e2 - languageName: node - linkType: hard - -"uid@npm:2.0.2": - version: 2.0.2 - resolution: "uid@npm:2.0.2" - dependencies: - "@lukeed/csprng": "npm:^1.0.0" - checksum: 10c0/e9d02d0562c74e74b5a2519e586db9d7f8204978e476cddd191ee1a9efb85efafdbab2dbf3fc3dde0f5da01fd9da161f37d604dabf513447fd2c03d008f1324c - languageName: node - linkType: hard - -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 - languageName: node - linkType: hard - -"uuid-parse@npm:^1.1.0": - version: 1.1.0 - resolution: "uuid-parse@npm:1.1.0" - checksum: 10c0/513d5b0407b8929c54d452e8e286a1f6f00d40a2ebf6607fc7297b9caa40eee35230dcc4ce3f178f84d89704e8147e24d1a33d680a8afb7e12a5700714db7f51 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard diff --git a/package.json b/package.json index 334016b..594e15c 100644 --- a/package.json +++ b/package.json @@ -7,14 +7,10 @@ "author": "Shinwoo PARK", "license": "MIT", "private": true, - "dependencies": { - "@nestjs/common": "^11.0.12", - "hyperid": "^3.1.1", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" - }, + "workspaces": [ + "packages/*" + ], "devDependencies": { - "@types/node": "^20.9.1", "prettier": "^3.5.3", "rimraf": "^5.0.5", "ts-node": "^10.9.1", diff --git a/dist/README.md b/packages/nestlogged-fastify/README.md similarity index 100% rename from dist/README.md rename to packages/nestlogged-fastify/README.md diff --git a/dist/package.json b/packages/nestlogged-fastify/package.json similarity index 66% rename from dist/package.json rename to packages/nestlogged-fastify/package.json index 63a3e01..410bf24 100644 --- a/dist/package.json +++ b/packages/nestlogged-fastify/package.json @@ -2,10 +2,11 @@ "name": "nestlogged", "version": "3.2.3", "description": "A NestJS Logger Decorator Library", - "main": "lib/index.js", + "main": "./dist/lib/index.js", "repository": "https://git.psw.kr/p-sw/nestlogged", "author": "Shinwoo PARK", "license": "MIT", + "private": true, "dependencies": { "@nestjs/common": "^11.0.12", "hyperid": "^3.1.1", @@ -16,10 +17,5 @@ "@types/node": "^20.9.1", "typescript": "^5.2.2" }, - "keywords": [ - "nest", - "nestjs", - "log", - "logging" - ] + "packageManager": "yarn@4.7.0+sha512.5a0afa1d4c1d844b3447ee3319633797bcd6385d9a44be07993ae52ff4facabccafb4af5dcd1c2f9a94ac113e5e9ff56f6130431905884414229e284e37bb7c9" } diff --git a/packages/nestlogged-fastify/src/index.ts b/packages/nestlogged-fastify/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/tsconfig.build.json b/packages/nestlogged-fastify/tsconfig.build.json similarity index 100% rename from tsconfig.build.json rename to packages/nestlogged-fastify/tsconfig.build.json diff --git a/tsconfig.json b/packages/nestlogged-fastify/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/nestlogged-fastify/tsconfig.json diff --git a/packages/nestlogged/README.md b/packages/nestlogged/README.md new file mode 100644 index 0000000..0021e46 --- /dev/null +++ b/packages/nestlogged/README.md @@ -0,0 +1,20 @@ +# NestJS Logging Decorators + +This package provides some decorations to make NestJS logging simpler. +It only uses Logger provided by @nestjs/common package and some dependencies required for nestjs. + +## Installation + +```sh +npm install nestlogged +``` + +or + +```sh +yarn add nestlogged +``` + +## More Info + +[Wiki](https://nestlogged.psw.kr) \ No newline at end of file diff --git a/packages/nestlogged/package.json b/packages/nestlogged/package.json new file mode 100644 index 0000000..410bf24 --- /dev/null +++ b/packages/nestlogged/package.json @@ -0,0 +1,21 @@ +{ + "name": "nestlogged", + "version": "3.2.3", + "description": "A NestJS Logger Decorator Library", + "main": "./dist/lib/index.js", + "repository": "https://git.psw.kr/p-sw/nestlogged", + "author": "Shinwoo PARK", + "license": "MIT", + "private": true, + "dependencies": { + "@nestjs/common": "^11.0.12", + "hyperid": "^3.1.1", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@types/node": "^20.9.1", + "typescript": "^5.2.2" + }, + "packageManager": "yarn@4.7.0+sha512.5a0afa1d4c1d844b3447ee3319633797bcd6385d9a44be07993ae52ff4facabccafb4af5dcd1c2f9a94ac113e5e9ff56f6130431905884414229e284e37bb7c9" +} diff --git a/src/index.ts b/packages/nestlogged/src/index.ts similarity index 100% rename from src/index.ts rename to packages/nestlogged/src/index.ts diff --git a/src/internals/nest.ts b/packages/nestlogged/src/internals/nest.ts similarity index 100% rename from src/internals/nest.ts rename to packages/nestlogged/src/internals/nest.ts diff --git a/src/internals/utils.ts b/packages/nestlogged/src/internals/utils.ts similarity index 100% rename from src/internals/utils.ts rename to packages/nestlogged/src/internals/utils.ts diff --git a/src/logged/class.ts b/packages/nestlogged/src/logged/class.ts similarity index 100% rename from src/logged/class.ts rename to packages/nestlogged/src/logged/class.ts diff --git a/src/logged/index.ts b/packages/nestlogged/src/logged/index.ts similarity index 100% rename from src/logged/index.ts rename to packages/nestlogged/src/logged/index.ts diff --git a/src/logged/metadata.ts b/packages/nestlogged/src/logged/metadata.ts similarity index 100% rename from src/logged/metadata.ts rename to packages/nestlogged/src/logged/metadata.ts diff --git a/src/logged/methods/function.ts b/packages/nestlogged/src/logged/methods/function.ts similarity index 100% rename from src/logged/methods/function.ts rename to packages/nestlogged/src/logged/methods/function.ts diff --git a/src/logged/methods/guard.ts b/packages/nestlogged/src/logged/methods/guard.ts similarity index 100% rename from src/logged/methods/guard.ts rename to packages/nestlogged/src/logged/methods/guard.ts diff --git a/src/logged/methods/index.ts b/packages/nestlogged/src/logged/methods/index.ts similarity index 100% rename from src/logged/methods/index.ts rename to packages/nestlogged/src/logged/methods/index.ts diff --git a/src/logged/methods/interceptor.ts b/packages/nestlogged/src/logged/methods/interceptor.ts similarity index 100% rename from src/logged/methods/interceptor.ts rename to packages/nestlogged/src/logged/methods/interceptor.ts diff --git a/src/logged/methods/middleware.ts b/packages/nestlogged/src/logged/methods/middleware.ts similarity index 100% rename from src/logged/methods/middleware.ts rename to packages/nestlogged/src/logged/methods/middleware.ts diff --git a/src/logged/methods/route.ts b/packages/nestlogged/src/logged/methods/route.ts similarity index 100% rename from src/logged/methods/route.ts rename to packages/nestlogged/src/logged/methods/route.ts diff --git a/src/logged/override.ts b/packages/nestlogged/src/logged/override.ts similarity index 100% rename from src/logged/override.ts rename to packages/nestlogged/src/logged/override.ts diff --git a/src/logged/utils.ts b/packages/nestlogged/src/logged/utils.ts similarity index 100% rename from src/logged/utils.ts rename to packages/nestlogged/src/logged/utils.ts diff --git a/src/logger.ts b/packages/nestlogged/src/logger.ts similarity index 100% rename from src/logger.ts rename to packages/nestlogged/src/logger.ts diff --git a/src/reflected.ts b/packages/nestlogged/src/reflected.ts similarity index 100% rename from src/reflected.ts rename to packages/nestlogged/src/reflected.ts diff --git a/src/utils.ts b/packages/nestlogged/src/utils.ts similarity index 100% rename from src/utils.ts rename to packages/nestlogged/src/utils.ts diff --git a/packages/nestlogged/tsconfig.build.json b/packages/nestlogged/tsconfig.build.json new file mode 100644 index 0000000..1ab50dd --- /dev/null +++ b/packages/nestlogged/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "node_modules", + "dist", + "src/test", + ], + "compilerOptions": { + "experimentalDecorators": false, + "emitDecoratorMetadata": false, + } +} \ No newline at end of file diff --git a/packages/nestlogged/tsconfig.json b/packages/nestlogged/tsconfig.json new file mode 100644 index 0000000..3546de1 --- /dev/null +++ b/packages/nestlogged/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2021", + "sourceMap": false, + "outDir": "./dist/lib", + "rootDir": "./src", + "declaration": true, + "declarationMap": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "exclude": [ + "node_modules", + "dist", + ], +} diff --git a/yarn.lock b/yarn.lock index 04a2aea..33215cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,34 +52,6 @@ __metadata: languageName: node linkType: hard -"@lukeed/csprng@npm:^1.0.0": - version: 1.1.0 - resolution: "@lukeed/csprng@npm:1.1.0" - checksum: 10c0/5d6dcf478af732972083ab2889c294b57f1028fa13c2c240d7a4aaa079c2c75df7ef0dcbdda5419147fc6704b4adf96b2de92f1a9a72ac21c6350c4014fffe6c - languageName: node - linkType: hard - -"@nestjs/common@npm:^11.0.12": - version: 11.0.12 - resolution: "@nestjs/common@npm:11.0.12" - dependencies: - iterare: "npm:1.2.1" - tslib: "npm:2.8.1" - uid: "npm:2.0.2" - peerDependencies: - class-transformer: "*" - class-validator: "*" - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - checksum: 10c0/cf8976279dfd04e6a6c2f909e36dcfb4d06207e8dc0eafffcd966fc2d7a147ce511f0ca616c9157fe7c1a316e81241b372d569ab8b8b0aa587cd42283ce0f0f2 - languageName: node - linkType: hard - "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -115,15 +87,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.9.1": - version: 20.9.1 - resolution: "@types/node@npm:20.9.1" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/0cb52c0840fe9a2e8f988564da6823bb3141e34fef8cb7264762c851c0dac5d9ef4859db422dfa41cd1a864ad126a9bd3b588d0285bc9af6de814de3280da9b3 - languageName: node - linkType: hard - "acorn-walk@npm:^8.1.1": version: 8.3.0 resolution: "acorn-walk@npm:8.3.0" @@ -280,16 +243,6 @@ __metadata: languageName: node linkType: hard -"hyperid@npm:^3.1.1": - version: 3.1.1 - resolution: "hyperid@npm:3.1.1" - dependencies: - uuid: "npm:^8.3.2" - uuid-parse: "npm:^1.1.0" - checksum: 10c0/4d8f3641e60a723ea3e4b25b25a611a8d59cb8404cc4f52ee80b9844d2261edbac35c4ab3ff70f0e1ee3712c44ad5edad26aa2f2957db88288623b71e3f61db0 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -304,13 +257,6 @@ __metadata: languageName: node linkType: hard -"iterare@npm:1.2.1": - version: 1.2.1 - resolution: "iterare@npm:1.2.1" - checksum: 10c0/02667d486e3e83ead028ba8484d927498c2ceab7e8c6a69dd881fd02abc4114f00b13abb36b592252fbb578b6e6f99ca1dfc2835408b9158c9a112a9964f453f - languageName: node - linkType: hard - "jackspeak@npm:^2.3.5": version: 2.3.6 resolution: "jackspeak@npm:2.3.6" @@ -369,13 +315,8 @@ __metadata: version: 0.0.0-use.local resolution: "nestlogged@workspace:." dependencies: - "@nestjs/common": "npm:^11.0.12" - "@types/node": "npm:^20.9.1" - hyperid: "npm:^3.1.1" prettier: "npm:^3.5.3" - reflect-metadata: "npm:^0.1.13" rimraf: "npm:^5.0.5" - rxjs: "npm:^7.8.1" ts-node: "npm:^10.9.1" typescript: "npm:^5.2.2" languageName: unknown @@ -407,13 +348,6 @@ __metadata: languageName: node linkType: hard -"reflect-metadata@npm:^0.1.13": - version: 0.1.13 - resolution: "reflect-metadata@npm:0.1.13" - checksum: 10c0/728bff0b376b05639fd11ed80c648b61f7fe653c5b506d7ca118e58b6752b9b00810fe0c86227ecf02bd88da6251ab3eb19fd403aaf2e9ff5ef36a2fda643026 - languageName: node - linkType: hard - "rimraf@npm:^5.0.5": version: 5.0.5 resolution: "rimraf@npm:5.0.5" @@ -425,15 +359,6 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.8.1": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10c0/3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 - languageName: node - linkType: hard - "semver@npm:^7.3.5": version: 7.5.4 resolution: "semver@npm:7.5.4" @@ -546,20 +471,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.8.1": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 - languageName: node - linkType: hard - -"tslib@npm:^2.1.0": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb - languageName: node - linkType: hard - "typescript@npm:^5.2.2": version: 5.2.2 resolution: "typescript@npm:5.2.2" @@ -580,38 +491,6 @@ __metadata: languageName: node linkType: hard -"uid@npm:2.0.2": - version: 2.0.2 - resolution: "uid@npm:2.0.2" - dependencies: - "@lukeed/csprng": "npm:^1.0.0" - checksum: 10c0/e9d02d0562c74e74b5a2519e586db9d7f8204978e476cddd191ee1a9efb85efafdbab2dbf3fc3dde0f5da01fd9da161f37d604dabf513447fd2c03d008f1324c - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 - languageName: node - linkType: hard - -"uuid-parse@npm:^1.1.0": - version: 1.1.0 - resolution: "uuid-parse@npm:1.1.0" - checksum: 10c0/513d5b0407b8929c54d452e8e286a1f6f00d40a2ebf6607fc7297b9caa40eee35230dcc4ce3f178f84d89704e8147e24d1a33d680a8afb7e12a5700714db7f51 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1"