From 8d306ab6905628f92a73d05622b02e3983c4eeb1 Mon Sep 17 00:00:00 2001 From: Er2 Date: Wed, 4 May 2022 04:48:42 +0300 Subject: [PATCH] init --- .gitignore | 1 + config.lua | 12 ++ examples/config.lua | 14 ++ examples/main.lua | 29 +++++ img/luapack.png | Bin 0 -> 79053 bytes img/luapack.svg | 104 +++++++++++++++ license | 19 +++ main.lua | 303 ++++++++++++++++++++++++++++++++++++++++++++ plug/arrow.lua | 17 +++ plug/assigns.lua | 16 +++ plug/lua.lua | 108 ++++++++++++++++ plug/num.lua | 28 ++++ plug/switch.lua | 31 +++++ readme.md | 21 +++ 14 files changed, 703 insertions(+) create mode 100644 .gitignore create mode 100644 config.lua create mode 100644 examples/config.lua create mode 100644 examples/main.lua create mode 100644 img/luapack.png create mode 100644 img/luapack.svg create mode 100644 license create mode 100644 main.lua create mode 100644 plug/arrow.lua create mode 100644 plug/assigns.lua create mode 100644 plug/lua.lua create mode 100644 plug/num.lua create mode 100644 plug/switch.lua create mode 100644 readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fe4fb11 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build.lua diff --git a/config.lua b/config.lua new file mode 100644 index 0000000..dbd0f16 --- /dev/null +++ b/config.lua @@ -0,0 +1,12 @@ +return { + entry = 'main.lua', + output = { + name = 'build.lua' + }, + plug = { + --require 'plug.switch' {}, + require 'plug.arrow' {}, + require 'plug.assigns' {}, + require 'plug.num' {}, + }, +} diff --git a/examples/config.lua b/examples/config.lua new file mode 100644 index 0000000..fc841b2 --- /dev/null +++ b/examples/config.lua @@ -0,0 +1,14 @@ +return { + entry = { + 'main.lua', + }, + output = { + name = '$hash.lua' + }, + plug = { + --require 'plug.switch' {}, + require 'plug.arrow' {}, + require 'plug.assigns' {}, + require 'plug.num' {}, + }, +} diff --git a/examples/main.lua b/examples/main.lua new file mode 100644 index 0000000..96100b1 --- /dev/null +++ b/examples/main.lua @@ -0,0 +1,29 @@ + +local main = () ==> + + emp = () => + + add = (a, b) => a + b + + local a, b = 5, 8 + add(a, b) + + a += 0x10_10 + +--[[ + switch(a) { + 5, 8 => error 'cant', + 300 => error 'trahtarista' + (() =>)() + , + _ => print 'can', + } +--]] + + print 'hello world' +<== +main() + +{ + tst = true +} diff --git a/img/luapack.png b/img/luapack.png new file mode 100644 index 0000000000000000000000000000000000000000..e126649652bc7a4695bc7e74b68311dc3278188c GIT binary patch literal 79053 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%0A<6MtF;{?WYVb|VSvU&_r2u5 ze8lDdcl1uRZfWKb4cnA?1+*OFvKml|j6S-AuqD21^aXG94=!`&Q>Bi122f!jY&lV7 zO0dqKjiiMirhg;TOAHqsuyfkuSW`T?nqFD136og;3-4yV^m>f*rUC{<-1eKL=rkYR z@e3YDvmF0rvXD3M@iYDSHMBf^{irC1xpzr_Z17vJK3QcCpl4As|4zSReXUUmZqR#p z##ob5)(y&LuXb%i$&!qhnQHT(p5pN}Pw!_*(Ii)*{s^~F3xgSzZ{qxrD7X-X1O0MaKsGH}h;W==q z@E5s;8OXxoiv_;9LP>tz^H!g$@Sx;ES|rPD+7SL2=80)UM%9GZtGS z*B*5SrzA#EcT)l|;K|KvLzJuq--Ao#^`<59P|-c!%T9QCS3w>}ewUoE*-#+8^dps!LfvLPstd?rHTFV^s zE{9?k3Duwrr_9U-z9hq3(?>nmB43B;V>3103ZKPxhZUikwb>gZYu?!LwAu#xa)8=q zo>sk#|NNM(CrKs%3kHg=qfu&C+wVm0p+3Oq%9CsTW}YP=S=wOVMO#5j@Eq#?rM5?LwNO~^-We1io#b1;Zm;Lvt$Gb>l?x<#&4v*rj8VmV*~Swl%4|2m4@y8H-q zQzk^jSn}*@?4|a7TNn}CO{SuCJC=$T)57bpCa4PzH#6h@l(56*BiFqATz&ZRjYoYO zRK~vy?%f|T1kKIbOaxO@aqk%1r$_UK4QRz=S(SN_$ED>D1drKzoS^r)di-dQ+u+-` z409%i-9pe#+iF71X1y$(oeD{Drck+kGZ9ss0rs_#P_e;Ef_T&x#-5x_w?dU(2-%_D zH+}%zsBE^}P&$CvjwvBHY=afnfcviOGK6fqL!8e?vo_~X276jGm0`&`?TE<<)znpf z4JVtqboAn3ILOQWghm3>cY9*1Jp7H;mBsV5bav<*<1y{53{+@T?1pTV0;2=?Mp;bfm_n83Y$>ExYYEvKJ$u?Y<31pxmNYmB}rKGsMBe9drr+{ ziGH?-eamO-VTo@_q5_t?g@n1yPEzLNfc6{U0_>7koeNUC_%#1$tYwbV!_M#s%T1FX z_zP^W08(>vc{I1(Frt7+f8UJMj`-p$-*|oV8QjiKKtlh!ojMEG#uZ{89`)d%JLIy5 zPZ)d2RauiZ=F@8{1?=2zdxPnZ-T=U}9O6X|1i5z9J`1tOb2GJ4Ly-;d%!O_l4mPD{ zR8&h_3+&qN_R-gXmdZxQfr&ms5HS$sjAi0a7N8v{PnsSWBOcq!!23?5CJr=F zw~I7Hb^W0ITT3F%v6(D!qfj*G@M3f8>Gla7RDhk_ER|0t^AG>YPFzC9GoR_I*PfdN zEm7ZB7|^TV49ZHmRtU!VqLDq=+W2e@Ad-C$df4X^O1=u-(hX#jB z{*duDyvW5OgaW2TXxFb`O-|N)azs^o>+;L{D2BuhY@@8n=RgJMg_j~QZJAG`(y;MV z)77xs$L;+N_+(F&WOH}xq{9DA z7$Uh9)`~+_AL5e=u(q}Od!p>)8~kEk|D6jRIrDF{)r~yp0&AU!6(hd&qUWgZVbz%f z`di;Lbt15@c~u#tY$U%xXDq?(K06#>=xMznTN$=^0qaUkKA6kwg7|jtQv8V0v}hHB zww#pc%WO{}3EXsjd(dG9-bg((Y{UIb5oIr>lqU z;zi2bQ3qcNL$xb=@+ew+NYn)X;Z&hvYtx`h#l7uSo#I^IeCKMgo8)b7j%$Wgj(uqw zyWTI^+#Y<6-{>*&^8A>T!t#NlDeGj~JH}yOW;sL?Iu%S}jOTkvMCz$`A43XzcsXFO zN?nRk)D+F-K=(e(od(fX*hyp~%0Le~N+o}m|4U57wPSs6r^ws99P2-&RVlVtw!h&> zpvup)_*c04-b+Am-VK}4r@u2qWH(P;4a#8zNTd3l6(<~+l&`mBcfx1aJ+-{e=B4~& z%GN?G5+LTNVQ6KY>p)k7k&CQXvq`tOjh7d;jm?gc=KK1^29l20tCA$DLHikCf8IEo*TeVjGHH0vyp(OTPcA zj3Ff7AAG}p6RHhq?wR|*zgqYw2oo%7r}wWuSM`0KkvUEdOUzaR5Mj)`J;{ca?Xejr zIPsK_RJVGTLHIJA_#JmpP@Ij#K^T-3{F8d+;U5+M%_$>~wIN@*in)s)d#U(8FG9^i zs?ooJ@gB5HBGNv{1#8K?%D-&PJ|vw0iE)R`lYZ&$l3bRO#ZT7}%6;uAbCq^n1S66F z`iLV}$TZIc1if8wPKPyd>2Hw@#t(y-g{wt_&ZNm zE^&Cnk*2$bsFYBPfgLm5!YxxJ2l+WNZP@;hZtxhoyei_qZs(#rKl*b%-YZh!%8PQ& z(*mf6q|H9HbP#PAHuP~fDlt#yY5q55%YQvgqhP56J3>~6ttY?hvOUOH7+1s@#W=Qy zlJIbBcajtE{Sv4sZ)Xke(ihl@TmG!h8oyr!Tkx0Tp;p4(pk@lw-vh5-s3th6Jqu>j zS@T6X*Bd>u3hA{vgY0LLMnJLy52tQH8OiJHo+B6)%j~QTV9bwm3$9{`ZTfaT0*YbH zT+Km|oWV|UCyi3xVg>6+bAAW>V?Jihmlve`WnZ)DAiV8B4Bb%t*I)RbRi)@Tze*{! zhgnAngb1)ZgW&93W$}O0))Qkl`Z$Eg8I_J98%wUE-so%3$FZGWfFB9@%^%dY>p zcA1~yKvrKGgBo*b}ZnQC_Vr$@`8W$Fw>=%er9@-)OZ533$dcKbiw~_ z`Bvk%W-82NidXci#yu_-GT-M6&PT4|ePPOf$>GxC8oGk6F(G;RF|wAtFU`0+;BGZE z&-5cjTel;a2C&u)lfhM!OBiEQd!)ynwyqqm!oIuRZYi8Zna72JJH?Y9`q&+Qymk*i zZ`aG^=|u>{00W2AGrT0$!>H1-i2#?uC&x2~6gvLM<9O{Lpk)ekfO>Rks;m@%iMCr@ zTR(A)m$e~KOJUrV4@MxJ6ryc9??h`OH{JK@3ym!t^(Qc!)P(A!PY@LAv}tDRdAMSq zTctI?l%3M9<#?3{L9WJ706m?r$>%=*`KmTs5AUcr+Z9`Twu$Q3qsPS}cM_8t!SA_`e=diJ2gwE7cc1Y}zf*@S z^JEZS!D>F#Z-N8grN^K|=NJ_DRQMtdGwlhxfJ8X=C#xrBlf>*yL ztMWo(=>lW=u$R*+1$2|>cP`SCvFpg^&ONY&;=Fh|w7WEFBNEbl*!nMD7DCy%JTcAu z3rhbw4L>p*dpA;L|kxNN_0<#8p3Wiv(?^HADOEmtJ5UYWwz)q?a0wloM z&BcagjfUmT$iapLKsKy>bQ;O;hUXq?w;^QK|FBa)3knvC!Y0rMGp%nCm?`Es`2V(K zvEL1P)D@nlOP0KGCfuLhdlgo{ZRFLk{@a{`q-{>GlI=E4{)@sQorg`1NJJ!Q6DA?V zxh7cZCsJz+S43651dv&~S+23o3W>z_`cDbMX#gH&XVE#K|H@cA zR-XJhlXwPb}LdEClf7qJ9Is>vG1b=dwMM*np_7iU^>L1~ZhZ z{O%{-Xir=$JRh3A7%9nUaKWptOg)jMgSdzOE)78?WPu}`q>z4%mCEki)$zwuzaFA6 z8toc$R7ZDP_n;)L3pb}J-A0JVyW89!R6M+Ic&Jr+2lQMnW8B}F}*0qL_{8u^zS_W{-P)j7V2f|dn941)QD3RaI(0&1ut z+O_E`r^`p&0eC`Ba-9*uaC+~!?$7%#cA#=8cG76Phl5`UGRH7HNV3T}Y}IvJSt^ zRI)h;>t$Q(g<=n*#CS(R`?SHHVoD8nB?Mt`WUj(Sax_@B8jZRYR6lz;Zrm-(P9Z$N zh!Oeik$#_G;VS&U*y}T3;~72$or%wX^6S-ZA!fq7$Q$ou4?fuQbbloP> z7aqY_#x0MVFKvBRwHlBs;K0DgNTgtDMLuRq@zXh8vL2gbrIb13RsD%uyma6ou;w>J z%Kr4v2Y42oo(p<5eA+*@#n8-#k9H%gjn1B(a*9cV)&ML!@j?W+D;)u`6WgOMGpp0l z3c0LH(UKwP0IE<6uVmH5gWi+lbLi6@QNyD4e<@7fw=oc#f9FR}a^kCd@Gu#1EZv$r zXtEyQ%dqN>X}7X}3D!El0Y z(9@-OarxVN9wsHF2p}XtP%-#aN{6zG6aKhJwNjukThAOcJ{v=Nq{z^$MBUzA#G@2= zoFw>Vl;aVa`vC99Rg}dEBY9f6mt8pz>*58j00XE478+{VYuu_c5s+GL^FEQgDM4&~ zeb(hZLS5KpYMKdrZ0aJyf3@6e;#OA}1;+2j&c{FZSLwEF-#2QZw7kpV6 z*<`sK3cJ{k&?)ReN~0j#1zk_Dhus@;?P>Mv&FWK+P?Yce z6;RI85M(~*fT1>8Te8$x=WZF;CBzQUa|m$3LM^`}0|M0uU}@;ElMQYBfc?ZI3jb-F zY8!`bQ)7CDgNHvxWJ`XhO+;oHB6DcWV}m;gh0CnNtcP_ zeQH%kG2s9YmnBG|+^Ju-7P1(_GN6P5ocv@_25MlgSw(j-ZOvzKl`Qap1;hbLzV%$i z3@zC=^*ygBI9TxM*}k_ROzXFl$VI+&gdZy2A{%-EN2*i1%TC9ERBq7hw^!roy-7OB zSp{^T$D)#Q96R4i^vIEh&NWStr+|61ck*eRo(C$~imOL72S(?~g_lT#l9R*0pCHq# zBkd4Fsi?#)4*Yzq{=eo?K>)-N;HCfRhR-(hdabzbKL)rfFmv6`!>RTTPSNt*LWiLP za-+3L;8eAq(?vp>pJffqHy)ZoVODelS98C=*LLElrlq|P*f)H@?0z?*r=>6X-3J#^ zMw}0Eug&M5)`H^ALUE0uk4cAR|M$5+fsh7MQ8Fe!ogd;x9I*)lPkNJ3l@j^d6M4S2 z=x<5E1XPxU#u~|@0l@w@jk)o>sw(qg;LoiuDg!mOt@?jq-!IQ^9WoGuF|FXe{!%AW z-lPu`l#|;rzQSJdd{nqqn)c@ZePFa05JbCCKeYl42WB)Td>P1PjHX&i(y+qfJ#7A4 zz5Xi^R_yt3!jNYm+7DyaemzRtaV4`scclc+>jEm(fpbQ|vVbmbT4X>X#HuiQkeG{0 z(md-ke&8V1N+#?gRu5|G!7k5!C??`gtQvMQE9#R+H-gdDPFjLs1p?Uh){AIS6TpcA zEgIwT?T@V@+*-p=8(u05dw5Yh352x#C z{2!`!UWQXcw+a*tI->W*kSmrC2ipK^0hyy<#gRBzE`#X};YtWlF&#QK1V4o%S3C0= zi>40Y<5d_jI5Sa8s3$OU>rAYsM^>?td*3SMimw+~sosB8{>{qwo~mTPK$YeN4GK1{ zshTYhg*kB@Cx|%_>86Ft+^V~5IX4`;Zm#_8QR5Z=1rPhImjsJkXs#pp!2^NL{?ha{ z&U|7l1!|2q?Bsy1{2M6b^BNk}ZRb+8upBcOs%C0iFW6VL8)zTDqeWg)sZHe}+696R zXmEM6P;>BKI!cHud!np>ntSpPz0a!nhrGc+jitn6(A|#-c4~Lh1PG$gaG4I6@RPp5 zs#PQE5@cmsOy9YTwP-Zt`#xDscX5@lyw+X_P-f(#{f1PYe7kWZQh6OU=*&;l21om; z9p%uy&L6iRjfDV)KCky7u%7)&${#+l<>AL@@IQJ+6yaB*gQ zpZkn$%#Z}xeNpNWQ>H(Ot${2~QO07cJg$n%^)?XTk!=v+06=OMU+?2jM#oksHhq?% zR};(|hV>@jLL}aF+#f zYjl@J*0RY`7B8u~U`P{;Eu%i2bx^2vaG*C>#DB&6P+fU4!6)UGz$~a0D#9M&MlrA% ztCD?f&1~4g#P`U=Tz>YnjN_P?G0UTw`V66huQ^2IB^-!wcr{#Wj`O6i<05e1+ldwzD`55JL)zTB(TnM}b3q*n_&0^j>k z1J?H`Q8o)4-rq7Dz=jmHtG(WmhhwS_fxIi!K2gWCUG8%X?XcEX-+pRwjYPy$=4+^3 zcb*fokvHxFILW@gVrln(pY#%LG(YzGWOabe(<`Z1s~j1OBc2?U8TTq|@Hw!;lV-5A zS;WP7uh`D&qo0*go=Osqxps^Q^0{AZ;J8&3soj_mX}h6|Jrk(kn~#8L(7a<6o&DnF z)G+h@H65L!4QP4`aHoDua3HD`0fKXIy$_t*>GgdGZQP5r7Jk_8w9P&~tc;PAz3+TBiq9p+=6T{w1( zln%F%f9F%?jRqX6m$6jB)`H`6ta3H{%smn?0_N&DvRDX~_+GI~T)g?<0vdoaREIww z4n#)sGUh(cC+3;`C43o4y9x`=WNIM4bA^aI13RAg{;cfdJ7H%h>6^~9$Ir!z`cswc z@FO2~kw72>2L2@$AIc|KP+=*!_{~fO9-Ut{=taQh>1DRM8>xQM-NdvqvkoQtC?!P^ zzj_!D1E0!_443}kRW$*9J*)heg&sqA>uY1jESi548Vu@d^q|M_q{#6Ww{=Td;ZVl~_ zh4H^aB3AAku7hv$E;>=E#u|`&^6q2Cot$UN_-ZDg@NUTHmD`rw9c^))*SD@N>{O#_ zGgp!}MxhxF8!7(@VvWvz)(zrZ;q9P>e0CSZ29rj3#UCx`5>U05=}H#NK*I$k24iVx zX}sY;!~!v;vGNmevd}!<>7Uo+cf0?JaAe!3Ql~*EMkeg*P=kT~I@!>YPoYti6lD6NOeVlbZ zAQ+@u=lR^$dzUX+TaTgS0uj76Evg~;B%6*{?pG;-pt~30#&aS3&_j^cf^F&Lwm^|AH*iI3UUcZs^$vz5MOSRwCV3?*H%c5{YAlnc%PikxVYUa=E#9m3@*fE|>@@eudFq)EGmgh*YP2 zp0sffj1g5KSBSZ=3t+8)ZBV=22chdlcxw!#m|i)b`7(s`?$-8ySO-xlka1l!g}&o= zdWO7ojYy#szp_WGx(a3b5+R|kYSUA?Vf}ve{l+{p zX@6Z+3Wx7WR=xQb-|qY%4$#bL?e`t&oXn)pn)C!RBEG}6;(ORdBm3Wr(U2rQ7# z!aj6;;Yo`mINgB>8YWE7k1ln`vMZSza4r)g>HUP*QF3J~@pOcNJEc)WMFf_e%}TZq z-e9`NKeH>2Nx%qq$BSKzq9^(0{a`&4m@q0MgPkxdM)7!ebN&Ha^D8t}`Y6-P<&9PoP|F6o+lDN~PWya28_qeP#L% z`l0aUzty#uvt~j!IH7TNcMrbXzg1Vi=MXXftpoo1PV5^)1G8$7civc|^!s5~wDu{j z(czCuDQv#}0Wv&n6^said0`kjSuZ^ldXzf4drFtemMB}hdt;}ds9<$D(?3Vk2F0P0 zjj~@-b$ie9)y&Y>F1$DOS5t$7BN>>M$c#Q6SY*}@^DVx|^DnM5k+;qC!a&afqOJXP zGBarDEW-eV@P9Yn8_^eZf>v|Ax1u&WZuc z*cjbvR0~!w0;SV%F~VBdsF3M(Ws0e_Rx_wgnQQ1B1F0^F%&AEa)|%R;RTp@+TQ z|4@S*CVry`L!{C@ZW$smJK_T=ijwJL{aLEK+O!ccVKhE0qM0|)JLmp=7S*;j zq8>G1@+ktXwfx=*_u}Ig;0$lRzE~^eO*Ym3y5*NqPY(hwlg==s&f6}j=KEp`=m6R8 z*M5=P2Yv!nXUTWxy{zxKmGHU^=v2L37oU+J&dAaAj$*ETr7)EowbXvQ}TK zh62cYF>j00b+ki(!xnc=D2A7<*stS}HwhxC2~{Uf#6zWTinm~be-tT|x%J4ke$nGy zZuZ;qw9~c5Nat#0@`hSWnwY+Wv;KyzmoPCsi(_`wjcZfA@JSjGUu5iB*N9I? zwv*)Rqty#|tnvqY499`L@X#_&TR8EJc16SIskdRXou7PvAV_mTFyKfvs}rp@f~_*d7a?E`23b8H_rg-w{;*uKA zGix>vWi5xK5#k8?TE0@2?gg#1y zH-zgO=0snXG)jvR4**3Wy7SSje6?o3m6pk?BuNQzUR{J?=BTQX){^!LGUs!G7x)iK z5=E?3Q!jUzSKSMU667S9TpM~()=kJttu(Je;ebgD1E z{kaI)IaakBYG0Wb#6JH~#E6#4>#v$BJgOe9Nq-~v;kFWpwJS8^iD^2Cf{noJ%9tB| z^pR=zx>cfq37mAo)r;UdLnG*3d<)t}aZMm%g*75;5H!=OAul*8AGbkL1Pp6xzT$1+ zaj-IFDvtEI{P`;?;HMG*9|#FJQ_(tk;)Ok#O6_^O;Ya%mEoz5DJIxNNO-o1XIey(H ze|}J~MVnzvkijy`$$D?NdaJeSP04&_QW@PEL7ERQ)Ren34ds4Acq0oOo=JHmzaqs9 zoYh0a%_Z5&^{b}=( z&g}Fq2zdBiNhPo`sEl$u3c{qaeca;jOXT<32N6KHy~k@21qW_c2tocD#P|9rU8qq3 z4a9S{czOx$m>w+KwOe=z@DM&#%tiErsH8J8C-weDc3Fs(>Cp6KR>#CZP4@E8v5}o> z-Bd}#&9@WwY|n0lY&+@N;Kk7{lpT!kqz=;pj7?xo06>BdPvuE6i2KGd|JiVu-OAwC zO31+zuZ~8f7H(-xe)qwtMXjxN(kBurkoVD!UKq5wNFCekXaL@pRKP2@ByTT2p3Ag1 z)wcbK;z74_!12Na>3ThD-ayjI(R;NXn)pr&yX`TS8D)aT==#%hbq zL*s|*^HYm2y@zMQZ+s`BWgK0V<_^(wIJ7x&57}n&RVqJkv zh6has2Q)L`)ZGdB3fbLI{22VRzvbN#O$Nv12FMJC@ZkFpV_BMxu7aeRH{>V}js}MZ zk1qJYOLh~@j{FCX7Ub*f+Wrdl$A*;5h|=DmjEN@nGOeNX0+J&$n`Jfe_ql}VQz7`>-k~gNV<|F?c6DjOt+<3_wm5A} zKA$LiB@}(k_tJJ_bDt{;{@dg^G0L4~`saXL&FO+*3;!fU{8;;h!RRpt3oCl(*Udwy40k9Dj5?H1g;{w6^fA|u(Kd7R;NQe|{;=VQzR9_db1 z)6E&h5PVqRBlMht`EAqFG}fx7&bInEp(vjtQ9T{a1 z6;1{FB>r49J2tp?mHc9K;#hlijh5ZQ^8?vnUwX|6`czUQn*ZlO(c(>HSH%{IuBCC=ewXups`JD;(Q&a$*UIS>;hAhTO+7nX zQ@>&-kAaezY&UsNvG?1%sz_W^y3!|yt z3h)uNq&+xEduWh_%5WzwIii=0DNg04=a-e(F)(6+5ylYR-lS&qN@bu*+GWZp9quC! z5>Jcd_4l5Sn4-nHsNlLaa6GOZ;#Zv%XPiQ&7M!x>P3XnP0p5QzI#rh|sKwD5aO&Lk%zp0#H#YLW*L!XAcnr;yILjNBFS!3BWLHaX zb0vd7J;D?g_rW)+eIl+s`O?~3)nn6bT$MD*^v?OU$CW~QU{)G+Y)n{@_E>i{q~eW@ zbq*UBdz%{7Lk^lh_(~;r_!;|+xX(sRsgr&A$Y@A?gOe|1XkD>wyyR+7kGZ`ON~7Ob z)vJLb!C&-`4M&|SMb{-~l++D5IQE%whc^?+{z_|yk_`bMxsz^$Wg-C zw5xB45bKsRnir)B!%4HbSoR^_BYuYY|o7j`TPdZ1#|W5agRXPi&_ zs?7cl;2k$%y>4$6kPY-%GQ)}|JB;< z+Tm&#eD=IF$*ZXRv=$$K9kb)T58d||k6BmEoL`TIsZTb8ip86PI7c=M(eD3VBz^*) zF^FoNJp~b~4-S{__(3h{OqlI0`cC$D8zo|lMl|Fr1{NmVYx8}oy=zB>`2n2lFl#;~ z&D`43R6FlY4kP?>-K}#+1y-e1NFH0XrH~ckh5eSTQlh$sii6d^B1u>gZDBOaV(A^ zafY9{6a#Ih+1|Km;2XjuBf78w4&aX>-8AY zKFr^)__K5?e3Lh)s-F^V;p7l&iLA!LMdnO{-g^B3KeeCh%9Z4S`}Unti$IZ*uN@;Y zyLI}!+Bozb?0&33(d!jJWqm8!}& zkLFJgF;?t|8wfurP5!_b8Dy9(;xPN7o_72=;iW=6gD-n>mUH*WR%ZFIX4#9+&5$b80nM{u(^`Akl{B}mzevB7Yx z)-2T4uMz0z;|&c8r>}VlN+$5Zb9jAQfnKwX7n2Hs zcNscHAcFU5d92*^`y7Bki}0b_6O{oGA4B0Zr3ELP%vEp7BCPLO_~@{F(*JJ!50^$3 zZB_BUM@H;3TLMV=`=07|ckSZ~%6nhlo^f+ZO`eA5m>nPEhW+a~K-UC?XN}`*EF44? z{}yXPEp@t1(E}A7@18#!K{o7QCn#4|R#{yrJIL^F4!HUCyTf=$^U|bPfQ{2#h96@n za`dB|o;#sy_8O#FH%HN+V=&FWx(0*w?;7mc<6*?m-3s{J*Tx7#G}$;549<#lPcFZ7 zi+)qL6>r9Nz8@3VBNEqwSHi;aNm)Q-53K&hi%lsd;QR0@v|4-8Jq6B}?4DI&Ny{wf za((0TPGOK!g>UZukBPMm8O^Iy_$5`YrAl%*Ra|}{ncLXZqY{)N{0pX-G} z`!xE>T}IsU$Hrxp7rzFlFCDu&ea7SQ@cJw0Q^y)&YbFgo9f{1aEA+TBS%gQvNDB5q zFW{NcSUp)2P8hApoXqUiQ$TOm4rYHH>MwF~l6aIZ0~*H0%dwVgLv@)jHGR9KszL2R zou|;xMj!HzB21Kck+FVZ(CPH!it^nWt|nCD&o+_v*Z=;-`?jkd=LWM9ng$-1E_0!g zSdGVXabn`%N!p!FL1f9Afb^OM-6QJUS+c73gf!GYXrj0!%aP(PB`!ELp;mJl zrunLEtRus!^xMG$h0n(_qvHQK*a}K`JAKJh6==D$G$sn$v(>hl`1!tG z(tD6-OmmO5s`~aLUCFX<<^=wCo&B}5wjubRy{sxsMv+q!^%SPZJu}zh@?L_qJgV~h zfwX+I27R4q+KbcUYc>?zzKoiAY;m#&-xxND;eY0v!>;-3LnZ?YvXjz50u-GE?RNS2 z-OJd$!^G~o@5MQ2;+&5Ekn9h2i}J6^sy}oDCJGqXnyTC7J`6-S4>Qo|?C@6??y#f38osqo;bS~9-m zIXtq@k!6P$33)l>E4S9_`qVa<@JqOqB7{B_AR8Lk{sddW!JrEvI%Qe8zFmYPka;GO zi-1Qn(!k8-J9DMy{$bsx(+S*Tj{F~~XLq3Z6^I}^8Trg#N){uU{|b53^Q_EV z`L7B&P$^D8o`k2loY=97(x!)YkT7w2LiQuYj}hl*@`!zs=5VN*(Qq#WZ&&oq0>HC3 z`f{hK81xUpEZ{S1l)>HC8^mkq)ug*wAh3RA%oum?aB-*4UxR~vN`8v zlBFky)o)T&)l?X8RK3RGL1&tAxGniMMjsEhfA!Fze~DZn?hOR>Z-dct`=j~A*sD}6 zOM>J)2l|Av4LVMrF{OPr!fCot9>1fHiA7f3P?*%{a;>)#>&AH&k=Mf)ivj5SBH} z30A9c+ikf&lg*iU(>_Zin=&~f#oWW&XC(u#zSSpOuyF5NoqOcxP)@#|EPc65pb z$myMnn7WXn>Hd7f!VS-$R{s`_h434%NznX6Z%qMpv#r6L5 zZdOK$G>UOh*(mOAxdYpnDS2GOftl;C+E$0h#;H2<|3UNLu@fQd zUY)?9g(tH66f{>`yC&*Z&-0oyH^n`cIY5T-g-KK|5;G$$+40D1coFfUpc?a_T=|vI z16y_c>2!O(+7zmqYWOH!)Wc%g=VnSVV`7PSg28x*7Mglbo@S`!4T7wR)Z(z-e|Cc< z=kCe9zL$hiQG{d-Dwd4awSCMEp>3$|^Dj2vx*O~^JTj#BaSPUb&XRUlgv;~jw9RCc zGf$xj0N<5aOPeh$apNu~;WXLENCR*e!}~JJ_k6vi5C)<2*Kgb#)~5s6c9y3l%h)#a z%|iETn_aN?)SO~?e+%V@GD(#r^2zJ2$C&gullB0Z#VEMzmlMO=u51vKQ@=Np|9<$< zHDOxiCy_@ya|HtTLuKbA6N+A$UY?FPsV$oNWqIvXUE*LgWutU|>lov$PAdFk%l3S( zM$?!2-^EMEPc4H(vaHo=FZk!!FhC#0w%)h)lBRhzv>5vQg@797S4v`nS$B^Hz4=#Z zujjdOJ9uyU9b>CK#LezMK#ap*^`k0Z&?4N~;iW2+#Y zmv!FdUQZ9@T-yD4EN2 z;6>6kt!XZeI%_{!5FWail-8lzrSzO;d$;0!5@X=r#s#f<^Hu$4Bb1{rL@$;K>A#5i z(mv7RXDz?xIV&!pAhBE@iwH>ouun=*jA=-YtxSjchaF)M_~h?}+4dpMFci3bJYm5Y zvOxXE)bQfjB4eawdso{lBGb!GaFBbnz`>-?EO2N@cC=0khxo?j&5;d35Ssu|s|33E z)DKuoBcpNoy}1FW0QLs2{Nm5vZ7IJ9zUCUTBfE#!&mIHIrRQ6U(Mex=8-LX@4SF{d zNrcfZ>vC?cfNDV0lM&k+fSRLR9wso%OcX&Nse7hu?ZtEiu>}S#E5Ipv?Tv$8PNJW@?$67hmT= zGK><1j*pxdhHqc^&}bkn+n@_aycActZ(MZPm=~_CbSLh<_%~s-Pb=f3^wmlg2X@Pa z{^@HcYu{U_r~74JdjeTC00wir`LHj%IR;bF&!_h{P`+Nfv4h3~Pf}APg9s)J9&H@T z*uZuK{$CaQ_CB&e{kw%`d)H~(hWuy~)9uVVv-y|FA4)cKk<5I+LF^b_21~^XItCop zT(cKHZ16*KA^phjb4v<;o?l+@xh?5#Y+Cs)jI<3SC7WGfnk4hbXefr=`-u!L+w1PJ z!df|)A*bZ#{3WF%AsQW8S+-N}{qDbMCM9Rtc*`>p-jUjtkcA@%ud_LSR2sv~@Q{h40^CA@ZLr>HI-sL60vMtWgMTG z2>gCfO}uF|hYNK6H#P4fSYBB6nP?J4Snm>}DdS}nXV#kH=xz*iR+Wp@wi==va2gFH`JTAlgNz-8b*U05*i-yQoGGH@+fmrEoo#w`et2E^BZedr`3jo zV(DG;*UnMQ6n1unp&NIqIdTC;yiD}zNj?q_MXIV-!5mm`X{9Xj><431|=C%dh=SxaWEo*ZN2HIzOJ-Z)l%qERU{ zF}RxI4|McS!YLoHFL!V}yqZyan#oWYkqyWyVeJWUWR%05P(Zj=g_2oTF4xukmPB6z zrpM-_j(l#T<1hK*apU#@Z|8KDlUS4gOBobIJ0rL+7xlGYdj=*J%CCzg)Y^RcVQOa< zk|?TW2y_L%s@hu}fMK$mdFc8gm_#owwnBFnYJYw%+;Vy`zXDp!^+g+U8;qL%RQ!_P z9j203ZYKO~GV?whET-mEL4L3k6JkN)&f_d+W8WK}i;u&)G&x4M{S(&~mUsoCH~!(V zJg_dVA}%k7gZ-DyeV2`C-U*ee0Xi`tFi`)yHLLvC0K5qN9y~UYb|d>^3;yVdil}oM zWH@~ri&yeBius!=gax}i9u`ZVU&3wMif8ZV3D4A=cq<@rCnn^Ng8p(_b0Pf64TY1e zB|O#a=<#$e-p@$N>fCPMpMu0|?2jo=-`Z$^poefeTDVASk&+(F zN++Zzq4Ee%yY5cAth`I#GD}1s>X9H+5l#os*`n_Kinde;!%N#p72N%3>E$XIQku|6 zm<$j%+obT+q2hO_s1H`B@@m2RK+qH2dwvoS1@ZpDVNrl!UcOV#!Y=d|Wh;t#M|ekf zW*}obUg>!Hn6k)CjEM*r>=u^~z0=Z2$aFtMGS_Wr=W96vV#Jsc{T@?=An9)@!OuYw znL|HNx&IxKD-^DB6|0cSS;h9C$MCM%e|qVX+7!f|sQ_w_Votz!d(RyC$s=uN``DjF z?(ggR3e#SIS723LZsKCsR@hf#w-a!Q+Vlq0mXDwpmX`d2gyG+>F~m;;?F-nVyp!E| zFOoy52W;mH_|&T|vgnM68hXn65*p9(0l3oHXM?r4D=a?!bFQG5At8NC^y6U0WjG6< zbIdHl>msR#|9x}>rZQvp4wFp0nG#qhgGdvoW~3Pv1(!J$rF23Yhj*(Lw+Z`U5&aKj+S(~o=_Oa z-Tf1BZK}-&bRIZi+75@yZlyjK<0(M9PKKRXYej7okSUH@PT)G4=V+SCgg5=EF zagZ<>*qI@EYB4GoulxW5@Jq2@%!=8!O^Id1QE=7fPp78D_of-<;qnSP=n9sIP-tl4*mTpnD_!tvXo!sX|}=nZ@o+x zyQ2at;a%87fyzeGNd5X;Q~K8uIJ=o+Y2#5)hzQGac(6WHAQ~kA9@ptISzE4=fnpFP z5#PuHV2^ycXm4uNqbTOQ?m4@e1b+%0=BZQOZLQpt10XWzc(x0tS{4e3mfN^63 zXXSCiZ6We=YbtH2!;=O7kwAD)=#LM7Otx^X1{JA`zCaqW8U?h$5@CT_mH?AbnSMJT zO2P{&0;85y{ruE8@piO>`@3`u-Q}9$6EU%)D}MfqEjI47o&sO^@{H z|JTS>$3?YvYw@UvC?z0W0@8?50#ZW^c>w8DLQW-i%7?BPMMM|WU zk`4tyLPEZ^z2CjwpWk<5|1QPVUhn8?IEiCAsy6y#FK zOqFzAUA_pRt*0lyk7a)GvQvTjn5KCEpK7KC8>-xL(p{JlM-mtP{B-6sf1m>HVP$QQ zd|FXbtnAynYl-n`5!=j8?N?I2DOL%Kh1R+f4Q{)H2KfE?&GvIl^*Jf+#x(l6*U3Ri z^;NSG_AbVvFExlQ*?6=6{PDnaAt)!Ry&*j9k?K9a>wt&qx>u##(koBq2gD>wP#SqB zB?R}}z$4%p;&Jbq_sK;OKf+iGKR$P^$}0O_5n)ENgYdQDbl+8p2L`iPD~z&rL5ibN z9pCnBe8uZGf^Cmwj)HbL9a^G7@OL*~IbLUXe?JMBOWn|gk^tw?l^;;8&RDy5x+?rI zB-cQkmj7w=s?^z3yg@#07||sq^2PY7io<%WlF!O3c`&`yByP!$KMlSL#iS?*)7F#R zl~0|zpbRPq2+*;N`7xIX9)vHHO=f*~?f@(q+a9y6 z@(3s{J6mzEOP$*K!{FAJ-UY4o{4?DzsUx{xuc_b$k)>av)!@@Xi4EK;1Ie_n?w1h^ z4nw0ENeEu}2!bAI-e(&76TTr!Gp0G1uQ+ZAxS`h~8t}gJL60S3|w? zce@&6WRBI`EG*!)LVk0$8Dj=C$Kg5FBb3*6T|85A2?MGa#I#-Hc8@eJF9yX*zD`@m zuql>4>^0EY$6nvn(y2(;@B6X$bil!$(~BGj)`zJ$;lsYQ3Wq*IMMT6Uo?^!UH*84|mMjYr13jV7Z=GRbRB0B(wP@XnGjDckqw~cdR`!?ioS6nM@18aPYh1}~V%Oc}6fA!y8p-dG zQ7~QXOaXbaLL3u%4HL<`;Y}f-J{shaBsP;yZZE_S<@8;}DhlX+VqLXQ4p<@e4|lXZY54M>-$LNxymLDz>+4h zlS(miZ;<=Y>7mRjH?L6WgdVEL!Qw_LS$10D8O^qZ*RjlI-pjtt{!-oveD2~o5s_-m zBTl5Pyf?W;na(A-B}$vU*%|r9H{E9fuMU!<&LKUVyPUWYJl#xIC=5)LxaY!ee9RsQX0#9YWH1I4ZFT*PEZQt@z&w;pl z{=j~i05r3-1rxPv(sPxD#}`Juf<3sUPG#gfDjwQ7?)o~rezP}Xw0`#5EZpnS!@sta z9W6E1&y^%qKohgu)csV^Gj}S!(k0$Mx#w+k{N-3-qA2K0Adp_=kS;g*@vS=iL_k^~ zlGgBfM&ZnvrO_f?E9-^k_SdGlE74Vs5yt1DcO_`>Vlkmn!7=T__i!<$?;8#e8`VA2 zJ4dp=vM8ud&s&8T{E=qq)_bb_{d$ZF$(b|nLBNUqzS6t&aX3o&E`Wa^kwVw9gcw$f z^GK9=$%P^eD|RG?nCi0MjZ$mWNQ?msmcv?TZ1O9}i@RK-Fq1wuebI^~`ZKFB z`G)Q+l>35GvZb<$rHGK5Fut-Rt?A6A6yS;u#N@qe!5;@kj#|^7DDSJRkI)6P#XaW8 zp|F0^LWl6hsWR^F`MEinmyB3g7-GX7^scS*aHHC=vn8Mvjo`~0m4+#)3$-1lDm|+S z?49;^gh1}mcDY~POlY=j>6I^mz%Ge&wtCH;rmaTgCrcx-{$#OILvF0qoBdIc^%ZV7ONPPye_ zG!xB8Y4Xr*`|ISfq!*aT_?nZAp~ts4{+iy;WLS2^hv}8SU_#4V%;OR7c>!R&{QJ35 zpAUGZfw8~(u?H+C=V*1DO)2jzG@6DNH~seuBx%;?{`T}gmt>R^(1%qrI=iAvSZ}PS zOsgze(E1(aqc1>W7THva+i~V%Z@DRLe@+A74-zP|C;E@xx1phQK|zns$Y1+3_4Kq+ z#-y#uN8v87g$i~PLwA51(lL|3{i_$xp6@^-DGySz0N<_hq;(%Lkd)s98ax+K;uWI z(3rR|_T3wyTgF?p1IflE?Vmf!?sE#C$wy^QsoPLix@>HD1Po+^KlwvKq%>MHrYH;G zrO$PXCr=Cl0sOr1+NT9@5lwunzw(Pwfeyj-G=q*2^K*SbKD718*fK9ogP})xpkV*`z9omsoZ3#*c>)irdnb90e^V_Weqw1cIq zXF!k`F(Q6E)qqB~1}~m4t!0kl^~{`E9yhF0SG{2GtAVse5W%Bqav?*-0e}Ufi(gyu z7kX)?IlCUAc)KNUD`|bPIB|0X&zA)o4Fl^a_#jk6G_1Bip;ISwVWnQPX2_9W7_xIbXd(0?hG~b(@-L!};JB3Ww6BwNJdW<|V6X8#@CcCD%r* z5AGs8QE0%}O!g7~?MTwu#oP22Bffgwlevf__jZR&{)~dr;wIS!FENY?KOm6AIr4ww+xoQ8fb`)5|u5 z4@}eyf%)fswvZ_UQ6M2PIp*Ov`#kGe77l)TL5cx@B^ZE^QW#BHUDL|uZ5k&X9D|Za zQQXb}Pqyz;BKl4DtF8SCWQ7=Fu6bqVb|m|><%s!hp%Ig){ye((^{aZUm%S8S7<42e z4^!K%lF=-h+e6Nt0t7JUa(q=tY5@`GVJ*P^tM%u>OS1D$%qc)F(LPC`dC&RSpINhs zN^4Y;9?t_gni@N07k5R|gUj|d5p`GFr;QEm~|q){1M zxnv2`I9zpLO)AlZ)vV2X`EIRI!_+sQaLTq|w9UBwm&`o*2{ zKLy!$n@G;AZJ;<(4H-fnbTW8>BeK;BPDTz&_`MKpGRqPN z-7JduzvX}QKiuy>g9$hMFTWS=knkcqhW~5Coz0M7H~xOF6T?XKzx|#dzsCF(o`36> zWA|ubKkcOpzh}VI7&2|?|3?)6+f3xjk5T@ctJsg}krU(W1b${`6D{kA`y!8NtE?&R;Xfj^P`7QBwbrRC!#c|7*G|937k6Xtd&L>b-Of4i!aB Kg;M#OLH_`iqp?~5 literal 0 HcmV?d00001 diff --git a/img/luapack.svg b/img/luapack.svg new file mode 100644 index 0000000..ec4f9fa --- /dev/null +++ b/img/luapack.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + diff --git a/license b/license new file mode 100644 index 0000000..888e15d --- /dev/null +++ b/license @@ -0,0 +1,19 @@ +Zlib License + +Copyright (c) 2022 Er2 + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgement in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..7ef87ce --- /dev/null +++ b/main.lua @@ -0,0 +1,303 @@ +lp = { + name = 'LuaPack', + version = '0.1', + copyright = '(c) Er2 2022, Zlib License', + + path = {}, +} + +-- String interpolation +function lp.strf(str, env) + return str:gsub('%$([%w_]+)%]?', (n) ==> + if env[n] + then return tostring(env[n]) + end + <==) .. '' +end + +-- Helper function +function lp.insPath(t) + for _, v in pairs(t) + do table.insert(lp.path, v) + end +end + +function lp.foreach(e, fn) + for _, v in pairs(e.plug) + do fn(v) end +end + +function lp.reqf(file, opts) + if opts.ext[file] + then return opts.ext[file] + end +end + +function lp.req(e, opts) + return lp.reqf(e.file, opts) +end + +-- Polyfill +function table.contains(t, V) + for k, v in pairs(t) do + if v == V + then return k + end + end +end + +-- Try to find file path +function lp.resolve(name, dir) + if path.absolute(name) + then return name + end + + name = name:gsub('%.[%w_]+$', '') + + for _, v in pairs(lp.path) do + v = v:gsub('%?', name) + v = path.join(dir, v) + + local f = io.open(v) + if f then + f:close() + return v + end + end +end + +-- Use this in plugins to get module +function lp.get(d, e, opts) + local f + for _, v in pairs(e.plug) do + f = lp.resolve(d, e.dir) + if f then break end + end + + if not f then + print(lp.strf(' [WRN] Cannot find "$file"', {file = d})) + return nil + end + + local c = lp.reqf(f, opts) + if not c + then c = lp.make(f, opts, f .. '.out.lua') + end + + if not e.req[c.i] + then e.reqs = e.reqs + 1 + end + e.req[c.i] = true + + print(lp.strf(' [GOT] $file', c)) + + return c +end + +-- Alias to makeEnt without entry flag +function lp.make(file, opts, out) + return lp.makeEnt(file, opts, out, false) +end + +-- Make function +function lp.makeEnt(file, opts, out, entry) + local dir = path.abs(path.dir(file)) + local ext = file:match '%.([%w_]+)$' + local oext = out:match '%.([%w_]+)$' + + file = lp.resolve(file, dir, ext) + + local e = lp.reqf(file, opts) + if e then return e end + + local f, err = io.open(file) + assert(f, err) + local src = f:read '*a' + f:close() + + e = { + i = #opts.ext + 1, + file = file, + dir = dir, + ext = ext, + src = src, + reqs = 0, + req = {}, + entry = entry, + plug = opts.plug, + } + table.insert(opts.ext, file) + opts.ext[file] = e + + if #e.plug == 0 + then error(lp.strf('File "$file" cannot be loaded. Add plugins.', e)) + end + + lp.foreach(e, (v) ==> + v.load(e, ext, oext) + e.src = v.deps(e, opts) or e.src + e.src = v.transform(e, opts) or e.src + <==) + + return e +end + +local alp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' +function lp.randgen(n) + local g = '' + for i = 1, n do + local v = math.random(#alp) + g = g.. alp:sub(v, v) + end + return g +end + +function lp.save(e, out) + out = lp.strf(out, { + name = path.base(e.file):gsub('%.[%w_]+$', ''), + hash = lp.randgen(6), + }) + local f, err = io.open(out, 'w') + assert(f, err) + f:write(e.src) + f:close() + return out +end + +function lp.config(conf, dir) + local cfg = { + -- defaults + entry = {}, + output = {}, + ext = {}, + plug = { + require 'plug.lua' {} + }, + } + for k, v in pairs(conf) do + if k == 'entry' + or k == 'output' + then + if type(v) == 'string' + then table.insert(cfg[k], path.abs(v, dir)) + elseif type(v) == 'table' then + for _, v in pairs(v) + do table.insert(cfg[k], path.abs(tostring(v), dir)) + end + else error(lp.strf('Unknown type $type in "$opt"', {type = type(v), opt = k})) + end + elseif k == 'plug' + then for _, v in pairs(v) do + if type(v) == 'table' + then table.insert(cfg[k], v) + v.load = v.load or function(e, ext, oext) end + v.deps = v.deps or function(e, opts) end + v.transform = v.transform or function(e, opts) end + v.postbuild = v.postbuild or function(e, opts) end + else error(lp.strf('Unknown type $type in "$opt"', {type = type(v), opt = k})) + end + end + else error(lp.strf('Unknown option "$opt"', {opt = k})) + end + end + + return cfg +end + +function lp.build(conf, dir) + local opts = lp.config(conf, dir) + for k, v in pairs(opts.entry) do + local out = opts.output[math.min(k, #opts.output)] + print(lp.strf('[BUILD] $file => $out', {file = v, out = out})) + local e = lp.makeEnt(v, opts, out, true) + lp.foreach(e, function(v) + v.postbuild(e, opts) + end) + local save = lp.save(e, out) + print(lp.strf('[BUILT] $o => $r', {o = e.file, r = save})) + end +end + +function main(argv) + print(lp.name ..' '.. lp.version) + print(lp.copyright) + print '' + + local int = (argv[0] or ''):match '^lua' -- started using interpreter + if #argv == 0 + or (#argv == 1 and int) then + print(('Usage: %s config.lua'):format(int and (argv[0] ..' '.. argv[1]) or argv[0])) + return -1 + end + + local t = os.time() + + local ent = path.abs(int and argv[2] or argv[1]) + local dir = path.dir(ent) + + local f, err = io.open(ent) + assert(f, err) + local conf = f:read '*a' + f:close() + + f, err = load(conf, 'config') + if not f + then error(err) + else conf = f() + end + + lp.build(conf, dir) + + print(lp.strf('Built under $sec seconds.', {sec = os.time() - t})) + + return 0 +end + +path = { + absolute = (f) ==> + f = f:sub(1, 1) + return f == '/' or f == '\\' + <== + + , relative = (f) => not path.absolute(f) + + , abs = (f, pwd) ==> + if path.absolute(f) + then return f end + + pwd or= os.getenv 'PWD' + + f = pwd .. '/'.. f + f = f:gsub('(.*)[\\/]+%.%.', path.dir) + f = f:gsub('%.[\\/]+', '/') + f = f:gsub('[\\/]+', '/') + + return f + <== + + , rel = (f) => f + + , base = (f) => f:match '([^/\\]*)[/\\]*$' + + , dir = (f) => f:match '^(.*)[\\/]+[^\\/]*[\\/]*$' + + , file = (f) => f:match '([^\\/]+)[\\/]*$' + + , join = function(base, add) + if path.absolute(add) + then return add end + + if path.relative(base) + then base = path.abs(base) + end + + local p = path.abs(base ..'/'.. add) + if path.relative(p) + then return add end + + return p + end, +} + +math.randomseed(os.time()) +os.exit(main(arg)) diff --git a/plug/arrow.lua b/plug/arrow.lua new file mode 100644 index 0000000..b317f31 --- /dev/null +++ b/plug/arrow.lua @@ -0,0 +1,17 @@ +-- Arrow functions in Lua +-- f = (n) => 2 + n + +return function(op) + return { + name = 'Arrow functions', + transform = function(e, opts) + return e.src + -- multiple-line + :gsub('%(([^%(%)]*)%)%s*==>%s*(.-)%s<==', + 'function(%1) %2 end') + -- single-line + :gsub('%(([^%(%)]*)%)%s*=>[ \t\v\f]*([^\n\r]*)', + 'function(%1) return %2 end') + end, + } +end diff --git a/plug/assigns.lua b/plug/assigns.lua new file mode 100644 index 0000000..cebbf3c --- /dev/null +++ b/plug/assigns.lua @@ -0,0 +1,16 @@ + +local reg = '([%%w_%%.%%[%%]]+)%%s*(%s)=%%s*' +local regv = '%1 = %1 %2 ' + +return function(op) + return { + name = 'Assigments', + transform = function(e, opts) + return e.src + :gsub(reg:format '[%+%-%*%/%%^|&]', regv) + :gsub(reg:format '%.%.', regv) + :gsub(reg:format 'and', regv) + :gsub(reg:format 'or', regv) + end, + } +end diff --git a/plug/lua.lua b/plug/lua.lua new file mode 100644 index 0000000..a100f64 --- /dev/null +++ b/plug/lua.lua @@ -0,0 +1,108 @@ + +lp.insPath { + '?.lua', + '?/init.lua', +} + +local env = { + name = lp.name, + ver = lp.version, + copy = lp.copyright, + + cache = '_c_', + req = '_r_', + mreq = '_m_', -- require by map + mtemp = ' function($req) -- $file\n$src\n end, -- $file\n', + pre = '--[=[=]=]', + regex = '([^\n]-)' .. 'require%s*%(?["\'](.-)["\']%)?%s*', +} + +env.require = lp.strf('$req(%d)', env) + +local base = lp.strf([[ +$pre -- $name $ver +$pre -- $copy +$pre (function(m) +$pre -- Module cache +$pre local $cache = {} +%s$pre +$pre -- Load main module +$pre $require +$pre +$pre end) { +%s +$pre } +]], env) + +local main = lp.strf([[ +$pre +$pre -- Require function +$pre local function $req(i) +$pre -- Check in cache +$pre local c = $cache[i] +$pre if not c then +$pre -- Execute module function +$pre c = m[i]($req) +$pre +$pre -- And put it to cache +$pre $cache[i] = c +$pre end +$pre +$pre -- Return cached returned value +$pre return c +$pre end +]], env) + +local mreq = lp.strf([[ +$pre +$pre -- Require by map +$pre local function $mreq(m, r) +$pre -- Check if module exists +$pre if not m[r] +$pre then error('Cannot find module "'..r..'"') +$pre end +$pre +$pre -- Using default require +$pre return $req(m[r]) +$pre end +]], env) + +return function(op) + return { + name = 'Base Lua plugin', + load = function(e, ext, oext) + if ext == 'lua' + then return true -- load every lua file + end + end, + deps = function(e, opts) + return e.src:gsub(env.regex, function(bef, name) + name = name:gsub('%.', '/') -- lua.lua => lua/lua + if bef:match '%-%-' + then return '' end -- under comment + local d = lp.get(name, e, opts) + if d then + return bef.. env.require:format(d.i) + end + end) + end, + transform = function(e, opts) + if not e.entry then return end -- change only entry files + if e.reqs > 0 then + local m = '' + for i = 1, #opts.ext do + local v = opts.ext[opts.ext[i]] -- [i] => [file] => object + m = m.. lp.strf(lp.strf(env.mtemp, env), v) + end + return base:format(main, opts.ext[e.file].i, m) + end + end, + postbuild = function(e, opts) + local f, err = load(e.src, 'lint') + if err then + print(e.src) + error(err) + end + end, + } +end diff --git a/plug/num.lua b/plug/num.lua new file mode 100644 index 0000000..a454e41 --- /dev/null +++ b/plug/num.lua @@ -0,0 +1,28 @@ + +return function(op) + return { + name = 'Better numbers', + transform = function(e, opts) + return e.src + :gsub('%.?%d[%._0-9A-Fa-fxboXBO]+', function(num) + local base = 10 + local nnum = num + :gsub('_', '') + :gsub('^0([xboXBO])', function(m) + if m == 'x' or m == 'X' + then base = 16 + elseif m == 'b' or m == 'B' + then base = 2 + elseif m == 'o' or m == 'O' + then base = 8 + end + return '' + end) + assert(not nnum:match '[xboXBO]', 'invalid number '..num) + nnum = tonumber(nnum, base) + assert(nnum, 'invalid number '..num) + return tostring(nnum) + end) + end, + } +end diff --git a/plug/switch.lua b/plug/switch.lua new file mode 100644 index 0000000..7cb1b48 --- /dev/null +++ b/plug/switch.lua @@ -0,0 +1,31 @@ + +-- BROKEN + +local reg = 'switch%s*%(([^{}]-)%)%s*{(.-)}' +local regv = '%s*([^=>]+)%s*=>%s*(.-);' + +return function(op) + return { + name = 'Switch-case', + transform = function(e, opts) + return e.src:gsub(reg, function(case, code) + local st + return code:gsub(regv, function(when, c) + local code = st and 'elseif' or 'if' + st = true + if when == '_' + then code = 'else ' + else local st + for v in when:gmatch '%s*([^,]+)' do + code = code .. (st and ' or' or '') + .. (' %s == %s'):format(case, v) + st = true + end + code = code .. ' then ' + end + return code .. c + end) .. ' end' + end) + end, + } +end diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..139f971 --- /dev/null +++ b/readme.md @@ -0,0 +1,21 @@ +
+ +[![Logo](img/luapack.svg)](https://gitdab.com/er2/luapack) + +# LuaPack + +LuaPack is a module bundler. It takes Lua, MoonScript etc. files, transforms and bundles (packing). + +
+ +# Usage + +Usage is very simple: + +```lua build.lua config.lua``` + +# Installation + +You can't use main.lua file directly, because it uses non-standard Lua features like arrow functions. + +Download `build.lua` from releases.