welsonjs/app.js

501 lines
16 KiB
JavaScript
Raw Normal View History

2020-06-28 14:22:57 +00:00
//////////////////////////////////////////////////////////////////////////////////
//
// app.js
//
// Bootstrap code for running a javascript app in windows. Run as:
//
// cscript.js app.js <appname> <app arguments> ...
//
/////////////////////////////////////////////////////////////////////////////////
2020-07-03 09:15:23 +00:00
//"use strict";
2020-06-28 14:22:57 +00:00
/////////////////////////////////////////////////////////////////////////////////
// Bootstrap code, basic module loading functionality
/////////////////////////////////////////////////////////////////////////////////
//
// The module loaded is run inside a function, with one argument, global which
// points to the global context. So global.FN is the same as FN (as long as a
// version of FN does not exist in local scope).
//
// The module should return its interface at the end of the script. The basic
// pattern for a module is:-
//
// var module = { ... };
// return module;
//
// Or:-
//
// return function() {
// }
//
// The appname argument causes <appname>.js to be loaded. The interface returned
// must define main = function(args) {}, which is called once the module is
// loaded.
2022-11-28 08:32:21 +00:00
//
// Report abuse or security issue: abuse@catswords.net
2022-12-22 07:01:41 +00:00
// https://github.com/gnh1201/welsonjs
2022-11-28 08:32:21 +00:00
//
2020-11-18 04:13:38 +00:00
2020-07-23 02:41:33 +00:00
var exit = function(status) {
2022-11-04 06:43:22 +00:00
console.error("Exit", status, "caused");
2021-04-28 07:28:43 +00:00
2022-11-04 06:43:22 +00:00
if (typeof WScript !== "undefined") {
2020-07-23 02:41:33 +00:00
WScript.quit(status);
2022-11-04 06:43:22 +00:00
} else if (typeof window !== "undefined") {
2021-04-28 07:32:17 +00:00
window.close();
}
2020-07-23 02:41:33 +00:00
};
2020-07-03 09:15:23 +00:00
2020-06-28 14:22:57 +00:00
var console = {
2021-04-29 07:49:36 +00:00
_timers: {},
2021-04-29 08:05:53 +00:00
_counters: {},
2020-11-04 07:41:56 +00:00
_messages: [],
2020-11-25 03:16:42 +00:00
_join: function(args, sep) {
args = args || [];
sep = sep || ' ';
var res = '';
for (var i = args.length - 1; i > -1; i--) {
res = (i ? sep : '') + args[i] + res;
}
return res;
},
2022-01-27 01:34:48 +00:00
_echoCallback: null,
2022-11-04 06:43:22 +00:00
_wshEcho: function(message) {
if (typeof WScript !== "undefined") {
WScript.echo("[*] " + message)
}
},
2020-11-18 04:13:38 +00:00
_echo: function(args, type) {
2022-02-09 10:09:33 +00:00
var message = "";
var params = {
type: type,
channel: 'default',
2022-11-28 17:49:58 +00:00
message: '',
2022-05-03 04:25:29 +00:00
datetime: new Date().toISOString()
2022-02-09 10:09:33 +00:00
};
if (args.length > 0) {
if (typeof args[0] === "string") {
// if not type is "log", then "{type}: {message}"
if (typeof type !== "undefined") {
message += (type + ": " + this._join(args));
} else {
message += this._join(args);
}
2022-11-04 06:43:22 +00:00
this._wshEcho(message);
2022-02-09 10:09:33 +00:00
this._messages.push(message);
params.message = message;
2022-02-09 10:09:33 +00:00
} else if (typeof args[0] === "object") {
if ('message' in args[0]) {
if (typeof type !== "undefined") {
message += (type + ": " + args[0].message);
} else {
message += args[0].message;
}
2022-02-09 10:09:33 +00:00
}
2022-11-04 06:43:22 +00:00
this._wshEcho(message);
2022-02-09 10:09:33 +00:00
this._messages.push(args[0].message);
for (var k in args[0]) {
params[k] = args[0][k];
}
}
2020-07-03 11:14:20 +00:00
}
2022-01-27 01:34:48 +00:00
if (params.channel != "default" && this._echoCallback != null) {
2022-02-25 07:17:29 +00:00
try {
this._echoCallback(params, type);
2022-02-25 07:17:29 +00:00
} catch (e) {
2022-11-04 06:43:22 +00:00
this._wshEcho("Exception on _echoCallback: " + e.message);
2022-02-25 07:17:29 +00:00
}
2022-01-27 01:34:48 +00:00
}
2020-07-07 15:55:50 +00:00
},
2021-04-28 07:45:56 +00:00
assert: function(assertion) {
if (arguments.length > 1 && assertion === arguments[0]) {
if(!assertion) {
this.error("Assertion failed: " + this._join(arguments.slice(1)));
}
}
},
2021-04-28 07:28:43 +00:00
clear: function() {
this._messages = [];
},
2020-11-18 04:13:38 +00:00
log: function() {
this._echo(arguments);
2020-07-23 02:41:33 +00:00
},
2020-11-18 04:13:38 +00:00
error: function() {
this._echo(arguments, "error");
2020-07-07 17:06:38 +00:00
},
2020-11-18 04:13:38 +00:00
info: function() {
this._echo(arguments, "info");
2020-07-07 17:06:38 +00:00
},
2020-11-18 04:13:38 +00:00
warn: function() {
this._echo(arguments, "warn");
2020-07-23 02:47:17 +00:00
},
2020-11-18 04:13:38 +00:00
debug: function() {
this._echo(arguments, "debug");
2021-04-29 07:49:36 +00:00
},
time: function(label) {
2021-04-29 08:05:53 +00:00
label = label || "default";
if (!(label in this._timers)) {
this._timers[label] = new Date();
}
2021-04-29 07:49:36 +00:00
},
timeLog: function(label, end) {
2021-04-29 08:05:53 +00:00
label = label || "default";
2021-04-29 07:49:36 +00:00
if (label in this._timers) {
2021-08-10 08:48:47 +00:00
console.debug(label + ":", ((new Date()).getTime() - this._timers[label].getTime()) + "ms", (end ? " - timer ended" : ""));
2021-04-29 07:49:36 +00:00
}
},
timeEnd: function(label) {
2021-04-29 08:05:53 +00:00
label = label || "default";
2021-04-29 07:49:36 +00:00
if (label in this._timers) {
this.timeLog();
delete this._timers[label];
}
2021-04-29 08:05:53 +00:00
},
count: function(label) {
label = label || "default";
if (!(label in this._counters)) {
this._counters[label] = 1;
}
},
countReset: function(label) {
label = label || "default";
if (label in this._counters) {
this.timeLog();
delete this._counters[label];
}
2020-07-07 17:06:38 +00:00
}
2020-06-28 14:22:57 +00:00
};
2022-11-04 06:43:22 +00:00
if (typeof CreateObject === "undefined") {
2020-11-10 09:13:41 +00:00
var CreateObject = function(progId, serverName, callback) {
2021-08-10 06:27:47 +00:00
var progIds = (progId instanceof Array ? progId : [progId]);
2020-10-20 05:18:00 +00:00
for (var i = 0; i < progIds.length; i++) {
try {
2023-09-04 18:27:00 +00:00
var obj = CreateObject.make(progIds[i], serverName);
2022-11-04 06:43:22 +00:00
if (typeof callback === "function") {
2020-11-10 09:13:41 +00:00
callback(obj, progIds[i]);
}
return obj;
2020-11-04 07:30:52 +00:00
} catch (e) {
console.error(e.message);
};
2020-10-20 05:18:00 +00:00
}
2020-07-23 10:39:24 +00:00
};
2023-09-04 18:27:00 +00:00
CreateObject.make = function(p, s) {
if (typeof WScript !== "undefined") {
return WScript.CreateObject(p, s);
} else if (typeof ActiveXObject !== "undefined") {
return new ActiveXObject(p);
}
};
2020-07-23 10:35:53 +00:00
}
/**
* @FN {string} The name of the file.
*/
2022-11-28 14:32:21 +00:00
function __include__(FN) {
2021-08-10 06:33:57 +00:00
if (FN.substr(FN.length - 3) !== '.js') FN += ".js";
return eval(require.__load__(FN));
2021-08-10 06:27:47 +00:00
}
2021-06-20 18:17:58 +00:00
2021-08-10 06:27:47 +00:00
/**
* @FN {string} The name of the file.
*/
function require(FN) {
var cache = require.__cache__ = require.__cache__ || {};
2022-11-29 11:28:13 +00:00
var suffix = (function(pos) {
return pos < 0 ? '.' : FN.substr(pos);
})(FN.lastIndexOf('.'));
2021-08-10 06:32:32 +00:00
if ('.js$.coffee$.ls$.ts$.re$'.indexOf(suffix + '$') < 0) FN += ".js";
2020-06-28 14:22:57 +00:00
if (cache[FN]) return cache[FN];
2022-11-28 08:32:21 +00:00
2020-07-23 02:05:57 +00:00
// get file and directory name
2021-08-10 06:27:47 +00:00
var __filename__ = require.__getCurrentScriptDirectory__() + "\\" + FN;
var __dirname__ = require.__getDirName__(__filename__);
2021-08-10 06:33:57 +00:00
var T = require.__load__(FN);
// transpile
2022-11-29 05:22:58 +00:00
switch (suffix) {
case '.coffee': // CoffeeScript 2
T = require.__msie9__("app/assets/js/coffeescript-legacy-2.7.0.min", [T], function(p, w, d, l) {
2022-11-29 05:22:58 +00:00
return w.CoffeeScript.compile(p[0], {
"header": true,
"sourceMap": false,
"bare": true
});
2022-11-28 14:32:21 +00:00
});
2022-11-29 05:22:58 +00:00
break;
case ".ls": // LiveScript
T = require.__msie9__("app/assets/js/livescript-1.6.1.min", [T, "app/assets/ls/prelude.ls"], function(p, w, d, l) {
2022-11-29 08:09:06 +00:00
return w.require("livescript").compile(require.__load__(p[1]) + "\n\n" + p[0], {
2022-11-29 05:22:58 +00:00
"header": true,
2022-11-29 08:12:19 +00:00
"bare": true
2022-11-29 05:22:58 +00:00
});
});
break;
2022-12-22 06:30:39 +00:00
2022-12-22 06:55:00 +00:00
case ".ts": // TypeScript
T = require.__modernie__("app/assets/js/typescript-4.9.4", [T], function(p, w, d, l) {
2022-12-22 06:30:39 +00:00
return w.ts.transpile(p[0]);
});
break;
case ".re": // Rescript (aka. BuckleScript, ReasonML)
T = require.__modernie__("app/assets/js/rescript-compiler-10.1.2", [T], function(p, w, d, l) {
var compiler = w.rescript_compiler.make();
var result = compiler.rescript.compile(p[0]);
return result.js_code;
});
break;
2022-11-28 08:32:21 +00:00
}
// compile
2022-11-28 17:38:11 +00:00
T = "(function(global){var module=new require.__ModulePrototype__();return(function(exports,require,module,__filename,__dirname){"
2021-04-29 12:17:15 +00:00
+ '"use strict";'
+ T
2021-08-10 06:27:47 +00:00
+ "\n\nreturn module.exports})(module.exports,global.require,module,__filename__,__dirname__)})(require.__global__);\n\n////@ sourceURL="
+ FN
2021-08-10 06:33:57 +00:00
;
2021-08-10 06:32:32 +00:00
// execute
2021-08-10 06:33:57 +00:00
try {
cache[FN] = eval(T);
} catch (e) {
2021-08-10 07:41:25 +00:00
console.error("PARSE ERROR!", e.number + ",", e.description + ",", "FN=" + FN);
2021-08-10 06:33:57 +00:00
}
2020-06-28 14:22:57 +00:00
2022-09-27 08:54:47 +00:00
// print VERSIONINFO and AUTHOR
2022-11-04 06:43:22 +00:00
if (typeof cache[FN] === "object") {
2022-09-27 08:54:47 +00:00
if ("VERSIONINFO" in cache[FN]) {
if ("AUTHOR" in cache[FN]) {
console.log(cache[FN].VERSIONINFO + " by " + cache[FN].AUTHOR);
} else {
console.log(cache[FN].VERSIONINFO);
}
}
2020-07-07 23:03:02 +00:00
}
return cache[FN];
2020-07-07 23:03:02 +00:00
}
2021-08-10 06:27:47 +00:00
require.__global__ = this;
2022-11-28 17:38:11 +00:00
require.__ModulePrototype__ = function() {
2021-08-10 06:27:47 +00:00
this.exports = {};
};
require.__getDirName__ = function(path) {
2021-08-10 06:33:57 +00:00
var delimiter = "\\";
var pos = path.lastIndexOf(delimiter);
return (pos > -1 ? path.substring(0, pos) : "");
2021-08-10 06:27:47 +00:00
};
require.__getCurrentScriptDirectory__ = function() {
2022-11-04 06:43:22 +00:00
if (typeof WScript !== "undefined") {
2021-08-10 06:33:57 +00:00
return require.__getDirName__(WScript.ScriptFullName);
2022-11-04 06:43:22 +00:00
} else if (typeof document !== "undefined") {
2021-08-10 06:33:57 +00:00
return require.__getDirName__(document.location.pathname);
} else {
return ".";
}
2021-08-10 06:27:47 +00:00
};
require.__load__ = function(FN) {
// if empty
if (FN == '') return '';
2021-08-10 06:33:57 +00:00
// get filename
var __filename__ = require.__getCurrentScriptDirectory__() + "\\" + FN;
// load script file
2022-11-28 16:56:58 +00:00
// use ADODB.Stream instead of Scripting.FileSystemObject, because of supporting UTF-8 (Unicode)
2021-08-10 06:33:57 +00:00
var objStream = CreateObject("ADODB.Stream");
var T = null;
try {
objStream.charSet = "utf-8";
objStream.open();
objStream.loadFromFile(__filename__);
T = objStream.readText();
objStream.close();
} catch (e) {
2021-08-10 07:41:25 +00:00
console.error("LOAD ERROR!", e.number + ",", e.description + ",", "FN=" + FN);
2021-08-10 06:33:57 +00:00
return;
}
return T;
2021-08-10 06:27:47 +00:00
};
2022-11-28 14:32:21 +00:00
require.__msie9__ = function(FN, params, callback) {
if (typeof FN !== "string" || FN == null) FN = '';
else if (FN.substr(FN.length - 3) !== '.js') FN += ".js";
2022-11-28 14:32:21 +00:00
var exports = null;
2022-11-28 16:56:58 +00:00
try {
2022-11-29 09:49:03 +00:00
var T = require.__load__("app/assets/js/core-js-3.26.1.minified.js")
+ "\n\n" + require.__load__("app/assets/js/html5shiv-printshiv-3.7.3.min.js")
+ "\n\n" + require.__load__("app/assets/js/modernizr-2.8.3.min.js")
+ "\n\n" + require.__load__(FN);
2022-11-28 16:56:58 +00:00
var htmlfile = CreateObject("htmlfile");
htmlfile.write('<meta http-equiv="X-UA-Compatible" content="IE=9">');
htmlfile.write('<script type="text/javascript">//<!--<![CDATA[\n' + T + '\n//]]>--></script>');
2022-11-29 09:49:03 +00:00
if (typeof callback === "function") {
2023-07-26 16:38:32 +00:00
var loadScript = function(FN) {
if (FN.indexOf('://') > -1) {
htmlfile.write('<script type="text/javascript" src="' + FN + '"></script>');
} else {
htmlfile.write('<script type="text/javascript">//<!--<![CDATA[\n' + require.__load__(FN) + '\n//]]>--></script>');
}
};
2022-11-29 09:49:03 +00:00
//console.log(htmlfile.parentWindow.navigator.userAgent);
2023-07-26 16:38:32 +00:00
exports = callback(params, htmlfile.parentWindow, htmlfile.parentWindow.document, loadScript);
2022-11-29 09:49:03 +00:00
}
htmlfile.close();
} catch (e) {
console.error("LOAD ERROR!", e.number + ",", e.description + ",", "FN=" + FN);
}
return exports;
};
require.__modernie__ = function(FN, params, callback) {
if (typeof FN !== "string" || FN == null) FN = '';
else if (FN.substr(FN.length - 3) !== '.js') FN += ".js";
2022-11-29 09:49:03 +00:00
var exports = null;
try {
2022-12-22 06:55:00 +00:00
var ua = '', T = '', htmlfile = CreateObject("htmlfile");
2022-12-22 06:30:39 +00:00
2022-11-29 09:49:03 +00:00
htmlfile.write('<meta http-equiv="X-UA-Compatible" content="IE=edge">');
2022-12-22 06:55:00 +00:00
htmlfile.write('<script type="text/javascript">//<!--<![CDATA[\n\nfunction __getUserAgent__(){return window.navigator.userAgent}\n\n//]]>--></script>');
ua = htmlfile.parentWindow.__getUserAgent__();
2022-12-22 06:30:39 +00:00
2022-12-22 06:55:00 +00:00
if (ua.indexOf('Trident/ ')) {
2022-12-22 06:30:39 +00:00
T = require.__load__("app/assets/js/core-js-3.26.1.minified.js")
+ "\n\n" + require.__load__("app/assets/js/modernizr-2.8.3.min.js")
+ "\n\n" + require.__load__("app/assets/js/babel-standalone-7.20.6.min.js")
+ "\n\n" + require.__load__(FN);
} else {
T = require.__load__("app/assets/js/core-js-3.26.1.minified.js")
+ "\n\n" + require.__load__("app/assets/js/html5shiv-printshiv-3.7.3.min.js")
+ "\n\n" + require.__load__("app/assets/js/modernizr-2.8.3.min.js")
+ "\n\n" + require.__load__(FN);
}
2022-11-29 09:49:03 +00:00
htmlfile.write('<script type="text/javascript">//<!--<![CDATA[\n' + T + '\n//]]>--></script>');
2022-12-22 06:30:39 +00:00
2022-11-28 16:56:58 +00:00
if (typeof callback === "function") {
var loadScript = function(src) {
if (src.indexOf('://') > -1) {
htmlfile.write('<script type="text/javascript" src="' + src + '"></script>');
2023-07-26 16:38:32 +00:00
} else {
htmlfile.write('<script type="text/javascript">//<!--<![CDATA[\n' + require.__load__(src) + '\n//]]>--></script>');
2023-07-26 16:38:32 +00:00
}
};
2022-11-28 16:56:58 +00:00
//console.log(htmlfile.parentWindow.navigator.userAgent);
2023-07-26 16:38:32 +00:00
exports = callback(params, htmlfile.parentWindow, htmlfile.parentWindow.document, loadScript);
2022-11-28 16:56:58 +00:00
}
htmlfile.close();
} catch (e) {
console.error("LOAD ERROR!", e.number + ",", e.description + ",", "FN=" + FN);
2022-11-28 14:32:21 +00:00
}
return exports;
};
2020-06-28 14:22:57 +00:00
/////////////////////////////////////////////////////////////////////////////////
// Load script, and call app.main()
/////////////////////////////////////////////////////////////////////////////////
2021-08-10 06:27:47 +00:00
function initializeConsole() {
2022-11-04 06:43:22 +00:00
if (typeof WScript === "undefined") {
2020-07-27 02:31:52 +00:00
console.error("Error, WScript is not defined");
exit(1);
}
2020-07-27 02:31:52 +00:00
var argl = WScript.arguments.length;
if (argl > 0) {
2020-06-28 14:22:57 +00:00
var args = [];
2020-07-27 02:31:52 +00:00
for (var i = 0; i < argl; i++) {
2020-06-28 14:22:57 +00:00
args.push(WScript.arguments(i));
}
var name = args.shift();
var app = require(name);
if (app) {
if (app.main) {
2021-08-10 06:35:32 +00:00
var exitStatus = app.main.call(this, args);
2022-11-04 06:43:22 +00:00
if (typeof exitStatus !== "undefined") {
2021-08-10 06:35:32 +00:00
exit(exitStatus);
2020-06-28 14:22:57 +00:00
}
} else {
2022-11-28 08:32:21 +00:00
console.error("Error, missing main entry point in", name);
2020-06-28 14:22:57 +00:00
}
} else {
2022-11-29 08:09:06 +00:00
console.error("Error, cannot find", name);
2020-06-28 14:22:57 +00:00
}
}
}
2021-08-10 06:27:47 +00:00
function initializeWindow(name, args, w, h) {
2022-11-04 06:43:22 +00:00
if (typeof window === "undefined") {
2020-07-27 02:31:52 +00:00
console.error("Error, window is not defined");
exit(1);
}
2020-06-28 14:22:57 +00:00
var app = require(name);
2020-07-03 09:15:23 +00:00
2020-07-04 12:49:30 +00:00
// "set default size of window";
2022-11-04 06:43:22 +00:00
if (typeof w !== "undefined" && typeof h !== "undefined") {
2020-07-03 09:15:23 +00:00
window.resizeTo(w, h);
}
2020-07-04 12:49:30 +00:00
// "load app";
2020-06-28 14:22:57 +00:00
if (app) {
if (app.main) {
2020-11-25 03:32:04 +00:00
var exitStatus = app.main.call(app, args);
if (exitStatus > 0) {
exit(exitStatus);
2020-07-04 12:49:30 +00:00
}
2020-06-28 14:22:57 +00:00
} else {
2021-08-10 06:36:55 +00:00
console.error("Error, missing main entry point in", name + ".js");
2020-07-23 02:41:33 +00:00
exit(1);
2020-06-28 14:22:57 +00:00
}
} else {
2021-08-10 06:36:55 +00:00
console.error("Error, cannot find", name + ".js");
2020-07-23 02:41:33 +00:00
exit(1);
2020-06-28 14:22:57 +00:00
}
}
// JSON 2
2022-11-28 14:32:21 +00:00
__include__("app/assets/js/json2");
// JSON 3 was a JSON polyfill for older JavaScript platforms
2021-06-20 18:17:58 +00:00
//var JSON = require("app/assets/js/json3-3.3.2.min");
2022-11-28 08:32:21 +00:00
// core-js (Formerly aka, babel-polyfill)
2022-11-29 09:19:49 +00:00
require("app/assets/js/core-js-3.26.1.minified");
2021-08-10 07:08:54 +00:00
// es5-shims
//require("app/assets/js/es5-shim-4.5.15.min");
//require("app/assets/js/es5-sham-4.5.15.min");
2020-11-14 14:32:30 +00:00
// Squel.js SQL query string builder for Javascript
2021-08-10 06:27:47 +00:00
var squel = require("app/assets/js/squel-basic-5.13.0.hiddentao-afa1cb5.wsh");
2020-11-14 14:32:30 +00:00
2022-02-08 02:47:07 +00:00
// JavaScript YAML parser and dumper.
var yaml = require("app/assets/js/js-yaml-4.1.0.wsh");
// is.js Micro check library
var is = require("app/assets/js/is-0.9.0.min");
2023-07-27 09:09:20 +00:00
// Intl (ECMA-402) polyfill
//var Intl = require("app/assets/js/Intl-1.2.5-e93b114.min");
//console.log(new Intl.NumberFormat().format(1234567890.123456));
// Dive into entrypoint
2021-08-10 06:27:47 +00:00
function __main__() {
2022-11-04 06:43:22 +00:00
if (typeof window === "undefined") {
2021-08-10 06:27:47 +00:00
initializeConsole();
2020-06-28 14:22:57 +00:00
} else {
console.log("welcome");
}
}
2021-08-10 06:27:47 +00:00
__main__();