@kawix/core
Version:
The next generation module loader for nodejs
477 lines (407 loc) • 11.4 kB
JavaScript
var arg
var Path = require("path")
var Child = require("child_process")
var Os = require("os")
var fs = require("fs")
var WritePath = require("./write.path")
var Kawix = require("../main")
var offset = 0, pack, pack1, er, forceui
if (process.argv[1] && (process.argv[1] == process.argv[2])) {
var _arg = process.argv[1]
if (_arg.substring(_arg.length - 6) == "app.js")
process.argv.splice(1, 1)
}
var originalArgs = [].concat(process.argv.slice(1))
var oargs = [].concat(process.argv)
var args = [].concat(process.argv), cmd, cmdargs, pro, args1,
proposals, enableCoffee, ignoreKwaValidation, env1 = {}, map
pack = require("../package.json")
var enableUi = function (force, i) {
// in windows automatically is opened a visual terminal
// but in osx and linux not
// this is for open visual terminal
if (Os.platform() == "darwin") {
args1 = args.map(function (a, index) {
if (index == i) {
return undefined
}
return "\\\"" + a + "\\\""
})
args1 = args1.filter(function (a) {
return !!a
})
forceui = force
cmdargs = [
"-e",
"tell application \"Terminal\"",
"-e",
"Activate",
"-e",
"do script \"" + args1.join(" ") + ";exit;\\n\"",
"-e",
"end tell"
]
cmd = "osascript"
}
else if (Os.platform() == "linux") {
if (process.env.DISPLAY) {
proposals = [
"/usr/bin/xdg-terminal",
"/usr/bin/x-terminal-emulator",
"/usr/bin/gnome-terminal",
"/usr/bin/mrxvt",
"/usr/bin/mrxvt-full",
"/usr/bin/roxterm",
"/usr/bin/urxvt",
"/usr/bin/xfce4-terminal"
]
for (var z = 0; z < proposals.length; z++) {
cmd = proposals[z]
if (fs.existsSync(cmd))
break
}
args1 = args.map(function (a, index) {
if (index == i) {
return undefined
}
return a //"\\\"" + a + "\\\""
})
args1 = args1.filter(function (a) {
return !!a
})
forceui = force
cmdargs = ["-e"].concat(args1)
if(cmd && cmd.indexOf("xfce4")>=0){
cmdargs = ["-e", args1.map(function(a){
return '"' + a + '"'
}).join(" ") ]
}
}
}
else if (Os.platform() == "win32") {
args1 = args.map(function (a, index) {
if (index == i) {
return undefined
}
return a //"\\\"" + a + "\\\""
})
args1 = args1.filter(function (a) {
return !!a
})
args1.shift()
// In new versions is not needed shift argument position 1
// args1.shift()
var name1 = Path.basename(process.execPath, ".exe")
if (name1.endsWith("w"))
name1 = name1.substring(0, name1.length - 1)
cmd = Path.join(Path.dirname(process.execPath), name1 + ".exe")
cmdargs = args1
forceui = force
}
}
if (process.env.KWCORE_FORCE_UI) {
delete process.env.KWCORE_FORCE_UI; enableUi(true)
}
var InstallStd = function (callback) {
var er = function (e) {
console.error(" > Failed loading stdlib", e)
}
Kawix.KModule.import("gh+/kodhework/kawix/std/package.json", {
force: callback == null
}).then(function (pack) {
let file = ''
file = "gh+/kodhework/kawix@std" + pack.version + "/std/dist/register.js"
console.log(" > Loading stdlib")
if(callback){
callback(Kawix.KModule.import(file))
}else{
Kawix.KModule.import(file).then(function(){}).catch(er)
}
}).catch(er)
}
for (var i = 2; i < args.length; i++) {
arg = args[i]
if (!arg)
break
if (arg == "_______internal")
continue
if (arg == "--reload" || arg == "--force") {
process.argv.splice(offset + i, 1)
offset--
Kawix.KModule.defaultOptions = {
force: true
}
}
else if (arg == "--install-std") {
return InstallStd()
}
else if (arg == "--map") {
map = args[i + 1]
if (!map) {
console.error(" > Provide an argument(name of app) for option --map")
process.exit(1)
}
process.argv.splice(offset + i, 2)
offset -= 2
args[i + 1] = "_______internal"
}
else if (arg == "--original-file") {
kawix.originalFilename = args[i + 1]
//console.info(kawix.originalFilename)
if (!args[i + 1]) {
console.error(" > Provide an argument for option --original-file")
process.exit(1)
}
process.argv.splice(offset + i, 2)
offset -= 2
args[i + 1] = "_______internal"
}
else if (arg == "--coffee") {
enableCoffee = true
}
else if (arg == "--ui" || arg == "--force-ui") {
enableUi(arg == "--force-ui", i)
}
else if (arg == "--update") {
// this works on release version
er = function (e) {
console.error("")
console.error("Failed updating: ", e)
}
Kawix.KModule.import("gh+/kodhework/kawix/core/package.json", {
force: true
}).then(function (pack1) {
if (pack.version >= pack1.version) {
console.info(" > Core is up to date. Searching updates for stdlib")
InstallStd()
//console.info("> kawix/core is up to date")
} else {
console.info("> kawix/core is not up to date. Please wait while is updated")
Kawix.KModule.import("gh+/kodhework/kawix@core"+pack1.version+"/core/dist/kwcore.app.js", {
force: true
}).then(function (a) {
if (a) {
InstallStd()
}
}).catch(er)
}
}).catch(er)
return
}
else if (arg.startsWith("--ignore-kwa-validation") || arg.startsWith("--disable-ui")) {
process.argv.splice(offset + i, 1)
ignoreKwaValidation = true
process.env.KWCORE_FORCED_UI = "1"
offset--
}
else if (arg.startsWith("--")) {
process.argv.splice(offset + i, 1)
offset--
}
else {
if (map) {
if (!arg)
return
// generate an executable file
var dirname = Path.dirname(process.execPath)
var file = Path.join(Os.homedir(), "Kawix", "bin")
if(!fs.existsSync(file)){
fs.mkdirSync(file)
}
file = Path.join(file, map)
var content0 = ''
if (Os.platform() == "win32") {
file = Path.join(Os.homedir(), "Kawix", "bin", map + ".cmd")
content0 = '@echo off\nset current=%~dp0\n"%current%\\kwcore.exe" --original-file "%~n0%~x0" "' + arg + '" %*'
} else {
WritePath.write(Path.join(Os.homedir(), "Kawix", "bin"))
//if(process.env.KWCORE_ORIGINAL_EXECUTABLE){
content0 = "#!" + process.execPath + "\n" +
"// kawix.originalFilename = __filename\n" +
"process.argv = [process.execPath, " + JSON.stringify(__filename) + ", "+JSON.stringify(arg)+"].concat(process.argv.slice(2))\n" +
"require(" + JSON.stringify(__filename) + ")\n"
// + "\n// kawi converted. Preserve this line, Kawi transpiler will not reprocess if this line found"
//}else{
// content0 = '#!/usr/bin/env bash\n' + exe1 + ' --disable-ui --original-file "$BASH_SOURCE" ' + JSON.stringify(arg) + ' "$@"\nexit $?'
//}
}
fs.writeFileSync(file, content0)
fs.chmodSync(file, "775")
return
}
if (cmd) {
if (!forceui) {
forceui = arg.endsWith(".kwe") || arg.endsWith(".kwshc")
}
}
var forceuiFunc
var execute = function () {
if (process.env.NODE_REQUIRE == 1) {
process.originalArgv = process.argv
process.argv = [].concat(process.argv).splice(1, 1)
require(arg)
}
else {
Kawix.KModule.injectImport()
if(arg.substring(0,4) != "gh+/" && arg.indexOf("://") < 0)
Kawix.mainFilename = Path.resolve(arg)
else
Kawix.mainFilename = arg
var options = {
parent: {
filename: process.cwd() + "/cli.js"
}
}
// require file using KModule
var erfunc = function (e) {
console.error("Failed executing: ", e)
}
var func = function () {
Kawix.KModule.import(arg, options).then(function () { }).catch(erfunc)
}
var kwa = false
var funcKwa = function () {
if (kwa) {
options.filename += ".kwa"
options.language = "kawix.app"
}
Kawix.KModule.import(arg, options).then(function (result) {
if (!ignoreKwaValidation) ignoreKwaValidation = process.env.KWCORE_FORCED_UI == 1
if (!process.env.DISPLAY && Os.platform() == "linux") {
ignoreKwaValidation = true
}
if (result && result.Program) {
if (!ignoreKwaValidation) {
if (result.Program.type == "terminal") {
forceui = true
if (Os.platform() == "win32") {
if (process.env.WINDOWS_GUI == 1) {
/*
var name = Path.basename(cmd, ".exe")
if (name.endsWith("w")) {
name = name.substring(0, name.length - 1)
}
cmd = Path.join(Path.dirname(cmd), name + ".exe")
cmdargs.shift()*/
enableUi(true)
} else {
forceui = false
}
if (forceui) return forceuiFunc()
}
else {
args = [args[0], args[1], "--ignore-kwa-validation"].concat(args.slice(2))
enableUi(true)
return forceuiFunc()
}
}
}
if (!forceui) {
if (result.Program.main) {
try {
result = result.Program.main()
if (result && result.then) {
result.then(function () { }).catch(erfunc)
}
} catch (e) {
erfunc(e)
}
}
return
}
}
}).catch(erfunc)
}
// see if have extension valid
var valid0 = false
kwa = arg.endsWith(".kwa")
if (!kwa) {
for (var ext in kawix.KModule.extensions) {
if (arg.endsWith(ext)) {
valid0 = true
break
}
}
if (!valid0) {
// check if is KWA
var fd = -1
try {
fd = fs.openSync(arg, "r")
var buf = Buffer.allocUnsafe(40)
var leido = fs.readSync(fd, buf, 0, 40, 0)
if (leido >= 40) {
if (buf.toString().startsWith("#!")) {
var ind = buf.indexOf(10)
buf = buf.slice(ind + 1)
}
if (buf.toString().startsWith("$KWA\n")) {
kwa = true
}
}
} catch (e) {
} finally {
if (fd > 0) fs.closeSync(fd)
}
}
}
if (kwa) {
// LOAD THE KWA REGISTER
/*
Kawix.KModule.import("https://kwx.kodhe.com/x/v/" + pack.stdVersion + "/std/dist/stdlib.js")
.then(function () {
Kawix.KModule.import("/virtual/@kawix/std/package/kwa/register")
.then(funcKwa).catch(erfunc)
}).catch(erfunc)
*/
InstallStd(function(promise){
promise.then(function(){
Kawix.KModule.import("/virtual/@kawix/std/package/kwa/register")
.then(funcKwa).catch(erfunc)
}).catch(erfunc)
})
}
else if (enableCoffee) {
InstallStd(function(promise){
promise.then(function(){
Kawix.KModule.import("/virtual/@kawix/std/coffeescript/register")
.then(func).catch(erfunc)
}).catch(erfunc)
})
} else {
return func()
}
}
}
forceuiFunc = function () {
if (cmdargs[0].indexOf("node") >= 0) {
if (process.env.KWCORE_ORIGINAL_EXECUTABLE) {
cmd = process.env.KWCORE_ORIGINAL_EXECUTABLE
cmdargs.shift()
}
}
console.log("Executing: ", cmd, cmdargs)
pro = Child.spawn(cmd, cmdargs, {
cwd: process.cwd(),
env: Object.assign({}, process.env, {
KWCORE_FORCED_UI: "1",
WINDOWS_GUI: "0"
}, env1),
detached: Os.platform() == "win32",
windowsHide: false,
shell: Os.platform() == "win32"
})
pro.on("error", function (e) {
console.log(" > Failed opening terminal ui", e)
})
pro.on("exit", function (d) {
process.exit(d)
})
}
if (forceui) {
return forceuiFunc()
} else {
return execute()
}
}
}