diff --git a/Makefile b/Makefile index 515016fee..24b1c5372 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CC=g++ -RELEASE=0.0.11 +RELEASE=0.0.12 INSTALL=/usr/local/bin -LIBS=lib/loop.js lib/path.js lib/fs.js lib/process.js lib/build.js lib/repl.js +LIBS=lib/loop.js lib/path.js lib/fs.js lib/process.js lib/build.js lib/repl.js lib/acorn.js lib/configure.js MODULES=modules/net/net.o modules/epoll/epoll.o modules/fs/fs.o modules/sys/sys.o modules/vm/vm.o TARGET=just LIB=-ldl diff --git a/builtins.S b/builtins.S index 517a0d199..895de5b3e 100644 --- a/builtins.S +++ b/builtins.S @@ -28,6 +28,16 @@ _binary_lib_repl_js_start: .incbin "lib/repl.js" .global _binary_lib_repl_js_end _binary_lib_repl_js_end: +.global _binary_lib_configure_js_start +_binary_lib_configure_js_start: + .incbin "lib/configure.js" + .global _binary_lib_configure_js_end +_binary_lib_configure_js_end: +.global _binary_lib_acorn_js_start +_binary_lib_acorn_js_start: + .incbin "lib/acorn.js" + .global _binary_lib_acorn_js_end +_binary_lib_acorn_js_end: .global _binary_just_cc_start _binary_just_cc_start: .incbin "just.cc" diff --git a/config.js b/config.js index 2ceef628d..5a6e62a5f 100644 --- a/config.js +++ b/config.js @@ -4,7 +4,9 @@ const libs = [ 'lib/path.js', 'lib/process.js', 'lib/build.js', - 'lib/repl.js' + 'lib/repl.js', + 'lib/configure.js', + 'lib/acorn.js' ] const version = just.version.just diff --git a/just.js b/just.js index 9600aa055..8b4f6220d 100644 --- a/just.js +++ b/just.js @@ -138,7 +138,7 @@ function wrapRequire (cache = {}) { const { vm } = just const params = ['exports', 'require', 'module'] const exports = {} - const module = { exports, type: 'native' } + const module = { exports, type: 'native', dirName: appRoot } module.text = just.builtin(path) if (!module.text) return const fun = vm.compile(module.text, path, params, []) @@ -213,7 +213,7 @@ function clearTimeout (fd, loop = just.factory.loop) { } class SystemError extends Error { - constructor (syscall) { + constructor (syscall) { const { sys } = just const errno = sys.errno() const message = `${syscall} (${errno}) ${sys.strerror(errno)}` @@ -230,36 +230,35 @@ function setNonBlocking (fd) { } function parseArgs (args) { - let clean = false - let cleanall = false - let dump = false - let inspector = false - let silent = false - // TODO: most of these are build args - only parse them in the build script + const opts = { args } args = args.filter(arg => { if (arg === '--clean') { - clean = true + opts.clean = true return false } if (arg === '--cleanall') { - cleanall = true + opts.cleanall = true return false } if (arg === '--silent') { - silent = true + opts.silent = true return false } if (arg === '--inspector') { - inspector = true + opts.inspector = true return false } if (arg === '--dump') { - dump = true + opts.dump = true + return false + } + if (arg === '--static') { + opts.static = true return false } return true }) - return { args, inspector, clean, cleanall, dump, silent } + return opts } function main () { @@ -314,9 +313,9 @@ function main () { just.hrtime = wrapHrtime(just.sys.hrtime) delete global.console - const { args, dump, clean, cleanall, inspector, silent } = parseArgs(just.args) - just.waitForInspector = inspector - just.args = args + const opts = parseArgs(just.args) + just.waitForInspector = opts.inspector + just.args = opts.args function startup () { if (!just.args.length) return true @@ -355,8 +354,13 @@ function main () { if (just.args[1] === 'build') { const buildModule = just.require('build') if (!buildModule) throw new Error('Build not Available') - const config = require(just.args[2] || 'config.json') || require('config.js') || {} - buildModule.run(config, { dump, clean, cleanall, silent }) + let config + if (just.args.length > 2 && just.args[2].indexOf('.js') > -1) { + config = just.require('configure').configure(just.args[2], opts) + } else { + config = require(just.args[2] || 'config.json') || require('config.js') || {} + } + buildModule.run(config, opts) .catch(err => just.error(err.stack)) return } diff --git a/lib/acorn.js b/lib/acorn.js new file mode 100644 index 000000000..53fa4d361 --- /dev/null +++ b/lib/acorn.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).acorn={})}(this,function(t){"use strict";var n={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},e="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",o={5:e,"5module":e+" export import",6:e+" const class extends export import super"},h=/^in(stanceof)?$/,i="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࢠ-ࢴࢶ-ࢽऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿯ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞿꟂ-Ᶎꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭧꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",s="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_",a=new RegExp("["+i+"]"),r=new RegExp("["+i+s+"]"),i=s=null,p=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,477,28,11,0,9,21,155,22,13,52,76,44,33,24,27,35,30,0,12,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,0,33,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,0,161,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,270,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,754,9486,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,15,7472,3104,541],c=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,525,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,4,9,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,232,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,792487,239];function u(t,e){for(var i=65536,s=0;s",g),template:new f("template"),invalidTemplate:new f("invalidTemplate"),ellipsis:new f("...",g),backQuote:new f("`",x),dollarBraceL:new f("${",{beforeExpr:!0,startsExpr:!0}),eq:new f("=",{beforeExpr:!0,isAssign:!0}),assign:new f("_=",{beforeExpr:!0,isAssign:!0}),incDec:new f("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new f("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:m("||",1),logicalAND:m("&&",2),bitwiseOR:m("|",3),bitwiseXOR:m("^",4),bitwiseAND:m("&",5),equality:m("==/!=/===/!==",6),relational:m("/<=/>=",7),bitShift:m("<>/>>>",8),plusMin:new f("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:m("%",10),star:m("*",10),slash:m("/",10),starstar:new f("**",{beforeExpr:!0}),_break:v("break"),_case:v("case",g),_catch:v("catch"),_continue:v("continue"),_debugger:v("debugger"),_default:v("default",g),_do:v("do",{isLoop:!0,beforeExpr:!0}),_else:v("else",g),_finally:v("finally"),_for:v("for",{isLoop:!0}),_function:v("function",x),_if:v("if"),_return:v("return",g),_switch:v("switch"),_throw:v("throw",g),_try:v("try"),_var:v("var"),_const:v("const"),_while:v("while",{isLoop:!0}),_with:v("with"),_new:v("new",{beforeExpr:!0,startsExpr:!0}),_this:v("this",x),_super:v("super",x),_class:v("class",x),_extends:v("extends",g),_export:v("export"),_import:v("import",x),_null:v("null",x),_true:v("true",x),_false:v("false",x),_in:v("in",{beforeExpr:!0,binop:7}),_instanceof:v("instanceof",{beforeExpr:!0,binop:7}),_typeof:v("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:v("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:v("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},b=/\r\n?|\n|\u2028|\u2029/,k=new RegExp(b.source,"g");function S(t,e){return 10===t||13===t||!e&&(8232===t||8233===t)}var C=/[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/,w=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g,E=Object.prototype,A=E.hasOwnProperty,I=E.toString;function P(t,e){return A.call(t,e)}var T=Array.isArray||function(t){return"[object Array]"===I.call(t)};function L(t){return new RegExp("^(?:"+t.replace(/ /g,"|")+")$")}function N(t,e){this.line=t,this.column=e}var V=function(t,e,i){this.start=e,this.end=i,null!==t.sourceFile&&(this.source=t.sourceFile)};function R(t,e){for(var i=1,s=0;;){k.lastIndex=s;var a=k.exec(t);if(!(a&&a.index>10),56320+(1023&t)))}function vt(t){return 36===t||40<=t&&t<=43||46===t||63===t||91<=t&&t<=94||123<=t&&t<=125}function _t(t){return 65<=t&&t<=90||97<=t&&t<=122}function bt(t){return _t(t)||95===t}function kt(t){return 48<=t&&t<=57}function St(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function Ct(t){return 65<=t&&t<=70?t-65+10:97<=t&&t<=102?t-97+10:t-48}function wt(t){return 48<=t&&t<=55}gt.prototype.reset=function(t,e,i){var s=-1!==i.indexOf("u");this.start=0|t,this.source=e+"",this.flags=i,this.switchU=s&&6<=this.parser.options.ecmaVersion,this.switchN=s&&9<=this.parser.options.ecmaVersion},gt.prototype.raise=function(t){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+t)},gt.prototype.at=function(t){var e=this.source,i=e.length;if(i<=t)return-1;var s=e.charCodeAt(t);if(!this.switchU||s<=55295||57344<=s||i<=t+1)return s;var a=e.charCodeAt(t+1);return 56320<=a&&a<=57343?(s<<10)+a-56613888:s},gt.prototype.nextIndex=function(t){var e=this.source,i=e.length;if(i<=t)return i;var s,a=e.charCodeAt(t);return!this.switchU||a<=55295||57344<=a||i<=t+1||(s=e.charCodeAt(t+1))<56320||57343t.numCapturingParens&&t.raise("Invalid escape");for(var e=0,i=t.backReferenceNames;et.maxBackReference&&(t.maxBackReference=i),!0;if(i<=t.numCapturingParens)return!0;t.pos=e}return!1},xt.regexp_eatKGroupName=function(t){if(t.eat(107)){if(this.regexp_eatGroupName(t))return t.backReferenceNames.push(t.lastStringValue),!0;t.raise("Invalid named reference")}return!1},xt.regexp_eatCharacterEscape=function(t){return this.regexp_eatControlEscape(t)||this.regexp_eatCControlLetter(t)||this.regexp_eatZero(t)||this.regexp_eatHexEscapeSequence(t)||this.regexp_eatRegExpUnicodeEscapeSequence(t)||!t.switchU&&this.regexp_eatLegacyOctalEscapeSequence(t)||this.regexp_eatIdentityEscape(t)},xt.regexp_eatCControlLetter=function(t){var e=t.pos;if(t.eat(99)){if(this.regexp_eatControlLetter(t))return!0;t.pos=e}return!1},xt.regexp_eatZero=function(t){return 48===t.current()&&!kt(t.lookahead())&&(t.lastIntValue=0,t.advance(),!0)},xt.regexp_eatControlEscape=function(t){var e=t.current();return 116===e?(t.lastIntValue=9,t.advance(),!0):110===e?(t.lastIntValue=10,t.advance(),!0):118===e?(t.lastIntValue=11,t.advance(),!0):102===e?(t.lastIntValue=12,t.advance(),!0):114===e&&(t.lastIntValue=13,t.advance(),!0)},xt.regexp_eatControlLetter=function(t){var e=t.current();return!!_t(e)&&(t.lastIntValue=e%32,t.advance(),!0)},xt.regexp_eatRegExpUnicodeEscapeSequence=function(t){var e,i=t.pos;if(t.eat(117)){if(this.regexp_eatFixedHexDigits(t,4)){var s=t.lastIntValue;if(t.switchU&&55296<=s&&s<=56319){var a=t.pos;if(t.eat(92)&&t.eat(117)&&this.regexp_eatFixedHexDigits(t,4)){var r=t.lastIntValue;if(56320<=r&&r<=57343)return t.lastIntValue=1024*(s-55296)+(r-56320)+65536,!0}t.pos=a,t.lastIntValue=s}return!0}if(t.switchU&&t.eat(123)&&this.regexp_eatHexDigits(t)&&t.eat(125)&&(0<=(e=t.lastIntValue)&&e<=1114111))return!0;t.switchU&&t.raise("Invalid unicode escape"),t.pos=i}return!1},xt.regexp_eatIdentityEscape=function(t){if(t.switchU)return!!this.regexp_eatSyntaxCharacter(t)||!!t.eat(47)&&(t.lastIntValue=47,!0);var e=t.current();return!(99===e||t.switchN&&107===e)&&(t.lastIntValue=e,t.advance(),!0)},xt.regexp_eatDecimalEscape=function(t){t.lastIntValue=0;var e=t.current();if(49<=e&&e<=57){for(;t.lastIntValue=10*t.lastIntValue+(e-48),t.advance(),48<=(e=t.current())&&e<=57;);return!0}return!1},xt.regexp_eatCharacterClassEscape=function(t){var e,i=t.current();if(100===(e=i)||68===e||115===e||83===e||119===e||87===e)return t.lastIntValue=-1,t.advance(),!0;if(t.switchU&&9<=this.options.ecmaVersion&&(80===i||112===i)){if(t.lastIntValue=-1,t.advance(),t.eat(123)&&this.regexp_eatUnicodePropertyValueExpression(t)&&t.eat(125))return!0;t.raise("Invalid property name")}return!1},xt.regexp_eatUnicodePropertyValueExpression=function(t){var e=t.pos;if(this.regexp_eatUnicodePropertyName(t)&&t.eat(61)){var i=t.lastStringValue;if(this.regexp_eatUnicodePropertyValue(t)){var s=t.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(t,i,s),!0}}if(t.pos=e,this.regexp_eatLoneUnicodePropertyNameOrValue(t)){var a=t.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(t,a),!0}return!1},xt.regexp_validateUnicodePropertyNameAndValue=function(t,e,i){P(t.unicodeProperties.nonBinary,e)||t.raise("Invalid property name"),t.unicodeProperties.nonBinary[e].test(i)||t.raise("Invalid property value")},xt.regexp_validateUnicodePropertyNameOrValue=function(t,e){t.unicodeProperties.binary.test(e)||t.raise("Invalid property name")},xt.regexp_eatUnicodePropertyName=function(t){var e=0;for(t.lastStringValue="";bt(e=t.current());)t.lastStringValue+=yt(e),t.advance();return""!==t.lastStringValue},xt.regexp_eatUnicodePropertyValue=function(t){var e,i=0;for(t.lastStringValue="";bt(e=i=t.current())||kt(e);)t.lastStringValue+=yt(i),t.advance();return""!==t.lastStringValue},xt.regexp_eatLoneUnicodePropertyNameOrValue=function(t){return this.regexp_eatUnicodePropertyValue(t)},xt.regexp_eatCharacterClass=function(t){if(t.eat(91)){if(t.eat(94),this.regexp_classRanges(t),t.eat(93))return!0;t.raise("Unterminated character class")}return!1},xt.regexp_classRanges=function(t){for(;this.regexp_eatClassAtom(t);){var e,i=t.lastIntValue;t.eat(45)&&this.regexp_eatClassAtom(t)&&(e=t.lastIntValue,!t.switchU||-1!==i&&-1!==e||t.raise("Invalid character class"),-1!==i&&-1!==e&&e>10),56320+(1023&t)))}At.next=function(){this.options.onToken&&this.options.onToken(new Et(this)),this.lastTokEnd=this.end,this.lastTokStart=this.start,this.lastTokEndLoc=this.endLoc,this.lastTokStartLoc=this.startLoc,this.nextToken()},At.getToken=function(){return this.next(),new Et(this)},"undefined"!=typeof Symbol&&(At[Symbol.iterator]=function(){var e=this;return{next:function(){var t=e.getToken();return{done:t.type===_.eof,value:t}}}}),At.curContext=function(){return this.context[this.context.length-1]},At.nextToken=function(){var t=this.curContext();return t&&t.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(_.eof):t.override?t.override(this):void this.readToken(this.fullCharCodeAtPos())},At.readToken=function(t){return l(t,6<=this.options.ecmaVersion)||92===t?this.readWord():this.getTokenFromCode(t)},At.fullCharCodeAtPos=function(){var t=this.input.charCodeAt(this.pos);return t<=55295||57344<=t?t:(t<<10)+this.input.charCodeAt(this.pos+1)-56613888},At.skipBlockComment=function(){var t,e=this.options.onComment&&this.curPosition(),i=this.pos,s=this.input.indexOf("*/",this.pos+=2);if(-1===s&&this.raise(this.pos-2,"Unterminated comment"),this.pos=s+2,this.options.locations)for(k.lastIndex=i;(t=k.exec(this.input))&&t.index=this.input.length&&this.raise(i,"Unterminated regular expression");var s=this.input.charAt(this.pos);if(b.test(s)&&this.raise(i,"Unterminated regular expression"),t)t=!1;else{if("["===s)e=!0;else if("]"===s&&e)e=!1;else if("/"===s&&!e)break;t="\\"===s}++this.pos}var a=this.input.slice(i,this.pos);++this.pos;var r=this.pos,n=this.readWord1();this.containsEsc&&this.unexpected(r);var o=this.regexpState||(this.regexpState=new gt(this));o.reset(i,a,n),this.validateRegExpFlags(o),this.validateRegExpPattern(o);var h=null;try{h=new RegExp(a,n)}catch(t){}return this.finishToken(_.regexp,{pattern:a,flags:n,value:h})},At.readInt=function(t,e){for(var i=this.pos,s=0,a=0,r=null==e?1/0:e;a=this.input.length&&this.raise(this.start,"Unterminated string constant");var s=this.input.charCodeAt(this.pos);if(s===t)break;92===s?(e+=this.input.slice(i,this.pos),e+=this.readEscapedChar(!1),i=this.pos):(S(s,10<=this.options.ecmaVersion)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return e+=this.input.slice(i,this.pos++),this.finishToken(_.string,e)};var Pt={};At.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(t){if(t!==Pt)throw t;this.readInvalidTemplateToken()}this.inTemplateElement=!1},At.invalidStringToken=function(t,e){if(this.inTemplateElement&&9<=this.options.ecmaVersion)throw Pt;this.raise(t,e)},At.readTmplToken=function(){for(var t="",e=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var i=this.input.charCodeAt(this.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==_.template&&this.type!==_.invalidTemplate?(t+=this.input.slice(e,this.pos),this.finishToken(_.template,t)):36===i?(this.pos+=2,this.finishToken(_.dollarBraceL)):(++this.pos,this.finishToken(_.backQuote));if(92===i)t+=this.input.slice(e,this.pos),t+=this.readEscapedChar(!0),e=this.pos;else if(S(i)){switch(t+=this.input.slice(e,this.pos),++this.pos,i){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:t+="\n";break;default:t+=String.fromCharCode(i)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),e=this.pos}else++this.pos}},At.readInvalidTemplateToken=function(){for(;this.pos !(['.', '..'].indexOf(f.name) > -1)) if (files.length === 0) { rmrf('lib') diff --git a/lib/configure.js b/lib/configure.js new file mode 100644 index 000000000..0037a4773 --- /dev/null +++ b/lib/configure.js @@ -0,0 +1,232 @@ +const { baseName, fileName, join } = just.path +const acorn = require('acorn') +const { isFile, isDir } = require('fs') +const { launch } = just.process +const appRoot = just.sys.cwd() +const cache = createCache() +const appDir = just.sys.cwd() +let config +const moduleCache = {} +let { HOME, JUST_TARGET, JUST_HOME } = just.env() +if (!JUST_TARGET) { + JUST_TARGET = `${HOME}/.just` +} +if (!JUST_HOME) { + JUST_HOME = JUST_TARGET +} + +function requireText (text) { + const { vm } = just + const params = ['exports', 'require', 'module'] + const exports = {} + const module = { exports, type: 'native' } + module.text = text + if (!module.text) return + const fun = vm.compile(module.text, just.sys.cwd(), params, []) + module.function = fun + fun.call(exports, exports, p => just.require(p, module), module) + return module.exports +} + +function createCache () { + const libs = new Set() + const natives = new Set() + const modules = new Set() + const external = new Set() + return { main: '', index: '', libs, natives, modules, external } +} + +function make (...args) { + const currentDir = just.sys.cwd() + const process = launch('make', ['C=gcc', 'CC=g++', ...args], currentDir) + process.onStdout = (buf, len) => {} + process.onStderr = (buf, len) => {} + return process +} + +function getExternalLibrary (originalFileName, fileName) { + if (config.external[originalFileName]) { + just.print(`${originalFileName} found in config`) + } else { + const libsDir = `${JUST_TARGET}/lib` + if (!isDir(libsDir)) { + just.fs.chdir(JUST_TARGET) + const process = make('libs') + while (1) { + const [status, kpid] = just.sys.waitpid(new Uint32Array(2), process.pid) + if (kpid === process.pid) { + if (status !== 0) throw new Error(`make failed ${status}`) + break + } + } + just.fs.chdir(appDir) + } + const moduleDir = `${JUST_TARGET}/lib/${originalFileName}` + if (!isDir(moduleDir)) { + throw new Error(`module not found ${moduleDir}`) + } + fileName = `${moduleDir}/${originalFileName}.js` + } + return fileName +} + +function getModule (fileName, libName) { + const modulesDir = `${JUST_TARGET}/modules` + if (!isDir(modulesDir)) { + just.fs.chdir(JUST_TARGET) + const process = make('modules') + while (1) { + const [status, kpid] = just.sys.waitpid(new Uint32Array(2), process.pid) + if (kpid === process.pid) { + if (status !== 0) throw new Error(`make failed ${status}`) + break + } + } + just.fs.chdir(appDir) + } + let moduleDir = `${JUST_TARGET}/modules/${fileName}` + if (libName) { + libName = libName.replace('.so', '') + moduleDir = `${JUST_TARGET}/modules/${libName}` + } else { + libName = fileName + } + if (!isDir(moduleDir)) { + throw new Error(`Module ${moduleDir} Not Found`) + } + const json = require(`${moduleDir}/${libName}.json`) + const entry = moduleCache[libName] || { name: libName } + if (json) { + if (json.exports) { + const lib = json.exports.filter(l => l.name === fileName)[0] + if (!entry.exports) entry.exports = [] + const exists = entry.exports.filter(l => l.name === fileName) + if (!exists.length) { + const exp = { name: fileName, obj: [] } + lib.obj.forEach(o => { + exp.obj.push(`modules/${libName}/${o}`) + }) + entry.exports.push(exp) + } + } else { + if (!moduleCache[libName]) { + if (!entry.obj) entry.obj = [] + entry.obj.push(`modules/${libName}/${fileName}.o`) + for (const obj of json.obj) { + entry.obj.push(`modules/${libName}/${obj}`) + } + } + } + entry.lib = json.lib + } else { + if (!moduleCache[libName]) { + if (!entry.obj) entry.obj = [] + entry.obj.push(`modules/${libName}/${fileName}.o`) + } + } + cache.modules.add(libName) + moduleCache[libName] = entry +} + +function parse (fileName, type = 'script') { + const originalFileName = fileName + if (fileName[0] === '@') { + cache.external.add(fileName.slice(1)) + fileName = `${appRoot}/lib/${fileName.slice(1)}/${just.path.fileName(fileName.slice(1))}.js` + fileName = getExternalLibrary(originalFileName.slice(1), fileName) + } + const parent = `${baseName(fileName)}` + if (type === 'module' && fileName.indexOf('.') === -1) { + cache.natives.add(just.path.fileName(fileName)) + return + } + if (!isFile(fileName)) { + just.error(`Warning ${fileName} not found`) + return + } + if (type === 'script') { + cache.index = fileName + } + if (type === 'module') { + cache.libs.add(fileName.replace(`${appRoot}/`, '').replace(`${JUST_TARGET}/`, '')) + } + const src = just.fs.readFile(fileName) + acorn.parse(src, { + ecmaVersion: 2020, + sourceType: type, + onToken: token => { + if (token.value === 'require') { + const expr = acorn.parseExpressionAt(src, token.start) + if (expr.type === 'CallExpression') { + if (expr.arguments[0].type === 'Literal') { + let fileName = expr.arguments[0].value + if (fileName[0] !== '@') { + const ext = fileName.split('.').slice(-1)[0] + if (ext === 'js' || ext === 'json') { + fileName = join(parent, fileName) + } + } + parse(fileName, 'module') + } + } + return + } + if (token.value === 'library') { + const expr = acorn.parseExpressionAt(src, token.start) + if (expr.type === 'CallExpression') { + const [fileName, libName] = expr.arguments + if (libName) { + if (fileName.type === 'Literal' && libName.type === 'Literal') { + getModule(fileName.value, libName.value) + } + } else { + if (fileName.type === 'Literal') { + getModule(fileName.value) + } + } + } + } + } + }) + return cache +} + +function configure (scriptName, opts = {}) { + if (!scriptName) throw new Error('Please Supply a Script name') + const fn = fileName(scriptName) + const appName = fn.slice(0, fn.lastIndexOf('.')) + const builtin = requireText(just.builtin('config.js')) || {} + config = require(`${appName}.config.json`) || require(`${appName}.config.js`) + if (!config) { + config = require('config.js') + if (!config) { + config = JSON.parse(JSON.stringify(builtin)) + } + config.embeds = [] + } + for (const module of builtin.modules) { + moduleCache[module.name] = module + } + if (!config.external) config.external = {} + const { index, libs, modules } = parse(scriptName) + const builtinModules = config.modules.map(v => v.name) + if (!config.target || config.target === 'just') { + config.target = appName + } + const cfg = { + version: config.version || builtin.version, + v8flags: config.v8flags || builtin.v8flags, + debug: config.debug || builtin.debug, + capabilities: config.capabilities || builtin.capabilities, + target: config.target, + main: config.main, + static: opts.static || config.static, + index, + libs: Array.from(libs.keys()), + modules: [...new Set([...builtinModules, ...Array.from(modules.keys())])].map(k => moduleCache[k]), + embeds: config.embeds || [] + } + return cfg +} + +module.exports = { configure } diff --git a/main.h b/main.h index 7d0c5744f..24c60dde6 100644 --- a/main.h +++ b/main.h @@ -10,6 +10,10 @@ extern char _binary_lib_build_js_start[]; extern char _binary_lib_build_js_end[]; extern char _binary_lib_repl_js_start[]; extern char _binary_lib_repl_js_end[]; +extern char _binary_lib_configure_js_start[]; +extern char _binary_lib_configure_js_end[]; +extern char _binary_lib_acorn_js_start[]; +extern char _binary_lib_acorn_js_end[]; extern char _binary_just_cc_start[]; extern char _binary_just_cc_end[]; extern char _binary_Makefile_start[]; @@ -40,6 +44,8 @@ void register_builtins() { just::builtins_add("lib/process.js", _binary_lib_process_js_start, _binary_lib_process_js_end - _binary_lib_process_js_start); just::builtins_add("lib/build.js", _binary_lib_build_js_start, _binary_lib_build_js_end - _binary_lib_build_js_start); just::builtins_add("lib/repl.js", _binary_lib_repl_js_start, _binary_lib_repl_js_end - _binary_lib_repl_js_start); + just::builtins_add("lib/configure.js", _binary_lib_configure_js_start, _binary_lib_configure_js_end - _binary_lib_configure_js_start); + just::builtins_add("lib/acorn.js", _binary_lib_acorn_js_start, _binary_lib_acorn_js_end - _binary_lib_acorn_js_start); just::builtins_add("just.cc", _binary_just_cc_start, _binary_just_cc_end - _binary_just_cc_start); just::builtins_add("Makefile", _binary_Makefile_start, _binary_Makefile_end - _binary_Makefile_start); just::builtins_add("main.cc", _binary_main_cc_start, _binary_main_cc_end - _binary_main_cc_start);