init
This commit is contained in:
		
						commit
						8d306ab690
					
				
					 14 changed files with 703 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| build.lua | ||||
							
								
								
									
										12
									
								
								config.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								config.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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' {}, | ||||
|   }, | ||||
| } | ||||
							
								
								
									
										14
									
								
								examples/config.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								examples/config.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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' {}, | ||||
|   }, | ||||
| } | ||||
							
								
								
									
										29
									
								
								examples/main.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								examples/main.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								img/luapack.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								img/luapack.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 77 KiB | 
							
								
								
									
										104
									
								
								img/luapack.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								img/luapack.svg
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,104 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363)  --> | ||||
| 
 | ||||
| <svg | ||||
|    version="1.0" | ||||
|    id="Ebene_1" | ||||
|    x="0px" | ||||
|    y="0px" | ||||
|    width="947px" | ||||
|    height="947px" | ||||
|    viewBox="0 0 947 947" | ||||
|    enable-background="new 0 0 947 947" | ||||
|    xml:space="preserve" | ||||
|    sodipodi:docname="luapack.svg" | ||||
|    inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" | ||||
|    inkscape:export-filename="/home/er2/Desktop/luapack.png" | ||||
|    inkscape:export-xdpi="96" | ||||
|    inkscape:export-ydpi="96" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg"><defs | ||||
|    id="defs23"><inkscape:perspective | ||||
|      sodipodi:type="inkscape:persp3d" | ||||
|      inkscape:vp_x="0 : 473.5 : 1" | ||||
|      inkscape:vp_y="0 : 1000 : 0" | ||||
|      inkscape:vp_z="909.38991 : 908.67343 : 1" | ||||
|      inkscape:persp3d-origin="473.5 : 315.66667 : 1" | ||||
|      id="perspective1468" /></defs><sodipodi:namedview | ||||
|    id="namedview21" | ||||
|    pagecolor="#505050" | ||||
|    bordercolor="#eeeeee" | ||||
|    borderopacity="1" | ||||
|    inkscape:pageshadow="0" | ||||
|    inkscape:pageopacity="0" | ||||
|    inkscape:pagecheckerboard="0" | ||||
|    showgrid="false" | ||||
|    inkscape:zoom="0.32" | ||||
|    inkscape:cx="512.5" | ||||
|    inkscape:cy="825" | ||||
|    inkscape:window-width="1920" | ||||
|    inkscape:window-height="1007" | ||||
|    inkscape:window-x="0" | ||||
|    inkscape:window-y="0" | ||||
|    inkscape:window-maximized="1" | ||||
|    inkscape:current-layer="g18" /> | ||||
| 
 | ||||
| <path | ||||
|    id="rect1651-6" | ||||
|    style="display:inline;fill:#002a5f;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none" | ||||
|    d="m 0,420 473,256 v 0 L 947,420 473,164 Z" | ||||
|    sodipodi:nodetypes="cccccc" | ||||
|    inkscape:label="boxc" /><path | ||||
|    id="rect7503" | ||||
|    style="display:inline;fill:#003b80;fill-opacity:1;stroke:#4646d7;stroke-width:8;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1" | ||||
|    d="M 186.55273,0 0,103.54688 V 420 L 473,164 Z M 760.44727,0 473,164 947,420 V 103.54688 Z" | ||||
|    sodipodi:nodetypes="cccccccccc" | ||||
|    inkscape:label="boxb" /><g | ||||
|    id="g18" | ||||
|    style="display:inline" | ||||
|    inkscape:label="logo"> | ||||
| 	<path | ||||
|    fill="#000080" | ||||
|    d="m 835.5,473.6 c 0,-199.8 -162.2,-362 -362,-362 -199.8,0 -362,162.2 -362,362 0,199.8 162.2,362 362,362 199.8,0 362,-162.2 362,-362" | ||||
|    id="path2" | ||||
|    style="display:inline" /> | ||||
| 	<path | ||||
|    fill="#ffffff" | ||||
|    d="m 729.5,323.6 c 0,-58.5 -47.5,-106 -106,-106 -58.5,0 -106,47.5 -106,106 0,58.5 47.5,106 106,106 58.5,0 106,-47.5 106,-106" | ||||
|    id="path4" | ||||
|    style="display:inline" /> | ||||
| 	<path | ||||
|    fill="#000080" | ||||
|    d="m 941.5,111.5 c 0,-58.5 -47.5,-106 -106,-106 -58.5,0 -106,47.5 -106,106 0,58.5 47.5,106 106,106 58.5,0 106,-47.4 106,-106" | ||||
|    id="path6" | ||||
|    style="display:inline" /> | ||||
| 	 | ||||
| 	<path | ||||
|    fill="none" | ||||
|    stroke="#808080" | ||||
|    stroke-width="10.8612" | ||||
|    stroke-miterlimit="10" | ||||
|    stroke-dasharray="40.8475" | ||||
|    d="m 890.6,261 c 33.5,65.8 51,138.6 51,212.5 0,258.4 -209.7,468.1 -468.1,468.1 C 215.1,941.6 5.4,731.9 5.4,473.5 5.4,215.1 215.1,5.4 473.5,5.4 c 83.1,0 164.6,22.1 236.2,63.9" | ||||
|    id="path16" /> | ||||
| </g><path | ||||
|    id="rect1651" | ||||
|    style="display:inline;fill:#003b80;fill-opacity:1;stroke:#4646d7;stroke-width:8;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1" | ||||
|    d="M 0,420 V 947 H 473.49454 L 473,676 Z" | ||||
|    sodipodi:nodetypes="ccccc" | ||||
|    inkscape:label="boxtl" /><path | ||||
|    id="path8" | ||||
|    style="fill:#ffffff;stroke-width:0.822633" | ||||
|    d="M 23.675681,674.91644 V 870.29109 H 145.09508 V 848.32826 H 48.601807 V 674.91644 Z m 350.276829,50.92133 c -20.4013,0 -37.265,5.92205 -46.64302,16.36949 -6.41654,7.23917 -9.04988,15.30195 -9.62573,29.20444 h 22.54003 c 1.89206,-17.19302 12.094,-24.92612 32.98888,-24.92612 20.07225,0 31.34064,7.48682 31.34064,20.89574 v 5.92261 c 0,9.37801 -5.59324,13.4075 -23.27986,15.54635 -31.58911,4.03091 -36.44334,5.10158 -44.99873,8.55664 -16.3704,6.66332 -24.67819,19.24872 -24.67819,37.51117 0,25.50163 17.68697,41.54354 46.06781,41.54354 17.68661,0 31.91754,-6.16946 47.71211,-20.6478 1.563,14.23156 8.55555,20.6478 23.0339,20.6478 4.60674,0 8.06123,-0.49405 15.3004,-2.38611 v -16.86335 c -2.4679,0.57583 -3.53732,0.57519 -4.85352,0.57519 -7.81502,0 -12.09116,-4.02969 -12.09116,-11.02206 v -82.59321 c 0,-24.92579 -18.26297,-38.33432 -52.81356,-38.33432 z m -205.24634,4.0304 v 108.25916 c 0,23.36277 17.43938,38.3343 44.7508,38.3343 20.6481,0 33.72684,-7.24001 46.88897,-25.74927 v 19.57873 h 20.0726 V 729.86817 h -22.21077 v 79.63189 c 0,28.7099 -15.05379,47.46417 -38.33431,47.46417 -17.68661,0 -28.9565,-10.77552 -28.9565,-27.63949 v -99.45657 z m 235.84714,70.99393 v 25.17208 c 0,7.56823 -2.22058,12.09195 -8.88392,18.26169 -9.13123,8.3086 -20.07269,12.58705 -33.23483,12.58705 -17.43983,0 -27.6395,-8.30848 -27.6395,-22.54003 0,-14.72513 9.95367,-22.2942 33.81004,-25.74926 23.60957,-3.20827 28.46224,-4.27647 35.94821,-7.73153 z" | ||||
|    inkscape:label="lua" /><path | ||||
|    id="rect1651-3" | ||||
|    style="display:inline;fill:#003b80;fill-opacity:1;stroke:#4646d7;stroke-width:8;stroke-linecap:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1" | ||||
|    d="M 946,420 V 947 H 472.50546 L 473,676 Z" | ||||
|    sodipodi:nodetypes="ccccc" | ||||
|    inkscape:label="boxtr" /><path | ||||
|    id="path45551" | ||||
|    style="fill:#ffffff" | ||||
|    d="m 490.8125,747.75 c -4.2014,0.38195 -6.49305,2.6736 -6.875,6.875 v 114.58398 c 0.38195,4.2014 2.6736,6.49306 6.875,6.875 4.20139,-0.38194 6.49305,-2.6736 6.875,-6.875 v -34.375 h 34.375 c 12.41323,-0.38194 22.62954,-4.6788 30.65039,-12.89062 8.21183,-8.21183 12.50868,-18.42814 12.89063,-30.65039 -0.38195,-12.22225 -4.6788,-22.44052 -12.89063,-30.65235 C 554.50107,752.4288 544.28475,748.13195 532.0625,747.75 Z m 154.6875,0 c -35.34622,0 -64,28.65378 -64,64 0,35.34622 28.65378,64 64,64 14.56082,-0.0462 28.67059,-5.05633 40,-14.20312 V 863.75 c 0,6.648 5.352,12 12,12 6.648,0 12,-5.352 12,-12 0.1263,-17.12699 0,-52 0,-52 0,-35.34622 -28.65378,-64 -64,-64 z m 134.89062,0 c -13.17711,0.19097 -24.53925,3.43813 -34.08789,9.74023 -9.35766,6.49308 -16.51908,14.61001 -21.48437,24.34961 -5.15626,9.7396 -7.73438,19.85978 -7.73438,30.36328 0,10.5035 2.57812,20.5295 7.73438,30.07813 4.96529,9.73961 12.12671,17.7604 21.48437,24.0625 9.35766,6.3021 20.71981,9.54926 34.08789,9.74023 9.16669,-0.19097 17.28363,-1.81357 24.34961,-4.86914 6.87502,-3.05556 12.3177,-6.39886 16.32813,-10.02734 4.01043,-3.81945 6.01562,-6.77821 6.01562,-8.87891 -0.19097,-2.29167 -1.05033,-4.01041 -2.57812,-5.15625 -1.33681,-1.14584 -2.7691,-1.71875 -4.29688,-1.71875 -2.29167,0.38195 -4.86978,1.90841 -7.73437,4.58203 -2.86459,2.67362 -6.77885,5.34787 -11.74414,8.02149 -5.15627,2.67362 -11.93705,4.10591 -20.33985,4.29687 -15.65976,-0.57291 -27.78513,-6.01559 -36.3789,-16.32812 -8.59377,-10.12155 -12.98676,-21.4837 -13.17774,-34.08789 0.19098,-12.79517 4.58397,-24.25345 13.17774,-34.375 8.59377,-10.12155 20.71914,-15.47006 36.3789,-16.04297 8.4028,0.19097 15.18358,1.62326 20.33985,4.29688 4.96529,2.67362 8.87955,5.34787 11.74414,8.02148 2.86459,2.67362 5.4427,4.20204 7.73437,4.58398 2.48265,-0.19097 4.20139,-1.05034 5.15625,-2.57812 1.14584,-1.52779 1.71875,-2.96007 1.71875,-4.29688 0,-2.1007 -2.00519,-5.0614 -6.01562,-8.88086 -4.01043,-3.62848 -9.54924,-6.96983 -16.61524,-10.02539 -6.87501,-3.05556 -14.89581,-4.68012 -24.0625,-4.87109 z m 69.3086,0 c -4.2014,0.38195 -6.49305,2.6736 -6.875,6.875 v 114.58398 c 0.38195,4.2014 2.6736,6.49306 6.875,6.875 4.20139,-0.38194 6.49305,-2.6736 6.875,-6.875 v -33.51562 l 22.91601,-23.20313 42.39649,60.72852 c 1.52778,1.90973 3.43684,2.86523 5.72851,2.86523 1.33682,0 2.67492,-0.38259 4.01172,-1.14648 3.24654,-2.86459 3.81945,-6.10979 1.71875,-9.73828 l -43.82812,-61.875 -0.28711,-0.28711 43.25586,-43.54102 c 2.67361,-3.24653 2.67361,-6.4937 0,-9.74023 -3.24654,-2.67362 -6.4937,-2.67362 -9.74024,0 l -66.17187,66.45898 V 754.625 c -0.38195,-4.2014 -2.67361,-6.49305 -6.875,-6.875 z M 497.6875,761.5 h 34.375 c 8.4028,0.19097 15.37195,3.05554 20.91016,8.59375 5.72918,5.72918 8.68988,12.79643 8.88086,21.19922 -0.19098,8.4028 -3.05555,15.46808 -8.59375,21.19726 -5.72918,5.53821 -12.79447,8.40278 -21.19727,8.59375 h -34.375 z M 644.5,764.75 a 48,48 0 0 1 48,48 48,48 0 0 1 -48,48 48,48 0 0 1 -48,-48 48,48 0 0 1 48,-48 z" | ||||
|    inkscape:label="pack" /></svg> | ||||
| After Width: | Height: | Size: 8.1 KiB | 
							
								
								
									
										19
									
								
								license
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								license
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| Zlib License | ||||
| 
 | ||||
| Copyright (c) 2022 Er2 <er2@dismail.de> | ||||
| 
 | ||||
| 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. | ||||
							
								
								
									
										303
									
								
								main.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										303
									
								
								main.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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)) | ||||
							
								
								
									
										17
									
								
								plug/arrow.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								plug/arrow.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										16
									
								
								plug/assigns.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								plug/assigns.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										108
									
								
								plug/lua.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								plug/lua.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										28
									
								
								plug/num.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								plug/num.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										31
									
								
								plug/switch.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								plug/switch.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										21
									
								
								readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								readme.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| <div align="center"> | ||||
| 
 | ||||
| [](https://gitdab.com/er2/luapack) | ||||
| 
 | ||||
| # LuaPack | ||||
| 
 | ||||
| LuaPack is a module bundler. It takes Lua, MoonScript etc. files, transforms and bundles (packing). | ||||
| 
 | ||||
| </div> | ||||
| 
 | ||||
| # 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. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue