src/boot.js
/**
* @file Host detection, non-UMD loader
* @since 0.1.5
*/
/*#ifndef(UMD)*/
"use strict";
/*exported _GPF_FS_WSCRIPT_READING*/ // WScript OpenTextFile for reading value
/*exported _GPF_HOST*/ // Host types
/*exported _GPF_NOT_FOUND*/ // -1
/*exported _GPF_START*/ // 0
/*exported _GpfFunc*/ // Function
/*exported _gpfDosPath*/ // DOS-like path
/*exported _gpfEmptyFunc*/ // An empty function
/*exported _gpfExit*/ // Exit function
/*exported _gpfHost*/ // Host type
/*exported _gpfIgnore*/ // Helper to remove unused parameter warning
/*exported _gpfMainContext*/ // Main context object
/*exported _gpfMsFSO*/ // Scripting.FileSystemObject activeX
/*exported _gpfNodeFs*/ // Node/PhantomJS require("fs")
/*exported _gpfSyncReadSourceJSON*/ // Reads a source json file (only in source mode)
/*exported _gpfVersion*/ // GPF version
/*exported _gpfWebDocument*/ // Browser document object
/*exported _gpfWebWindow*/ // Browser window object
/*eslint-disable no-unused-vars*/
/*#endif*/
/*jshint browser: true, node: true, phantom: true, rhino: true, wsh: true*/
/*eslint-env browser, node, phantomjs, rhino, wsh*/
// An empty function
function _gpfEmptyFunc () {}
var
/**
* GPF Version
* @since 0.1.5
*/
_gpfVersion = "1.0.1-alpha",
_GPF_NOT_FOUND = -1,
_GPF_START = 0,
_GPF_FS_WSCRIPT_READING = 1,
/**
* Host constants
* @since 0.1.5
*/
_GPF_HOST = {
BROWSER: "browser",
NASHORN: "nashorn",
NODEJS: "nodejs",
PHANTOMJS: "phantomjs",
RHINO: "rhino",
UNKNOWN: "unknown",
WSCRIPT: "wscript"
},
/**
* Current host type
*
* @type {_GPF_HOST}
* @since 0.1.5
*/
_gpfHost = _GPF_HOST.UNKNOWN,
/**
* Indicates that paths are DOS-like (i.e. case insensitive with /)
* @since 0.1.5
*/
_gpfDosPath = false,
// https://github.com/jshint/jshint/issues/525
_GpfFunc = Function, // avoid JSHint error
/*jshint -W040*/ // This is the common way to get the global context
/**
* Main context object
*
* @type {Object}
* @since 0.1.5
*/
_gpfMainContext = new _GpfFunc("return this")(), // Non-strict function returns global context
/*jshint +W040*/
/**
* Helper to ignore unused parameter
*
* @param {*} param
* @since 0.1.5
*/
/*gpf:nop*/ _gpfIgnore = _gpfEmptyFunc,
/**
* Exit function
*
* @param {Number} code
* @since 0.1.5
*/
_gpfExit = _gpfEmptyFunc,
/**
* Browser window object
*
* @type {Object}
* @since 0.1.5
*/
_gpfWebWindow,
/**
* Browser [document](https://developer.mozilla.org/en-US/docs/Web/API/Document) object
*
* @type {Object}
* @since 0.1.5
*/
_gpfWebDocument,
/**
* [Scripting.FileSystemObject](https://msdn.microsoft.com/en-us/library/aa711216(v=vs.71).aspx) Object
*
* @type {Object}
* @since 0.1.5
*/
_gpfMsFSO,
/**
* Node [require("fs")](https://nodejs.org/api/fs.html)
*
* @type {Object}
* @since 0.1.5
*/
_gpfNodeFs;
/*#ifdef(DEBUG)*/
_gpfVersion += "-debug";
/*#endif*/
/*#ifndef(UMD)*/
_gpfVersion += "-source";
/**
* Synchronous read function
*
* @param {String} srcFileName
* @return {String} content of the srcFileName
* @since 0.1.5
*/
var _gpfSyncReadForBoot;
/*#endif*/
/* Host detection */
// Microsoft cscript / wscript
if (typeof WScript !== "undefined") {
_gpfHost = _GPF_HOST.WSCRIPT;
/*#ifndef(UMD)*/
/*eslint-disable new-cap*/
_gpfMsFSO = new ActiveXObject("Scripting.FileSystemObject");
_gpfSyncReadForBoot = function (srcFileName) {
var srcFile = _gpfMsFSO.OpenTextFile(srcFileName, _GPF_FS_WSCRIPT_READING),
srcContent = srcFile.ReadAll();
srcFile.Close();
return srcContent;
};
/*eslint-enable new-cap*/
/*#endif*/
} else if (typeof print !== "undefined" && typeof java !== "undefined") {
if (typeof readFile === "undefined") {
_gpfHost = _GPF_HOST.NASHORN;
/*#ifndef(UMD)*/
_gpfSyncReadForBoot = function (srcFileName) {
return [].join.call(java.nio.file.Files.readAllLines(java.nio.file.Paths.get(srcFileName)), "\n");
};
/*#endif*/
} else {
_gpfHost = _GPF_HOST.RHINO;
/*#ifndef(UMD)*/
_gpfSyncReadForBoot = readFile;
/*#endif*/
}
// PhantomJS - When used as a command line (otherwise considered as a browser)
} else if (typeof phantom !== "undefined" && phantom.version && !document.currentScript) {
_gpfHost = _GPF_HOST.PHANTOMJS;
_gpfMainContext = window;
/*#ifndef(UMD)*/
_gpfNodeFs = require("fs");
_gpfSyncReadForBoot = function (srcFileName) {
return _gpfNodeFs.read(srcFileName);
};
/*#endif*/
// Nodejs
} else if (typeof module !== "undefined" && module.exports) {
_gpfHost = _GPF_HOST.NODEJS;
_gpfMainContext = global;
/*#ifndef(UMD)*/
/*eslint-disable no-sync*/ // Simpler this way
_gpfNodeFs = require("fs");
_gpfSyncReadForBoot = function (srcFileName) {
return _gpfNodeFs.readFileSync(srcFileName).toString();
};
/*#endif*/
// Browser
/* istanbul ignore else */ // unknown.1
} else if (typeof window !== "undefined") {
_gpfHost = _GPF_HOST.BROWSER;
_gpfMainContext = window;
/*#ifndef(UMD)*/
_gpfSyncReadForBoot = function (srcFileName) {
var xhr = new XMLHttpRequest();
xhr.open("GET", srcFileName, false);
xhr.send();
return xhr.responseText;
};
/*#endif*/
}
/*#ifndef(UMD)*/
/**
* Loading sources occurs here for the non UMD version.
* UMD versions (debug / release) will have everything concatenated.
* @since 0.1.5
*/
// Need to create the gpf name 'manually'
_gpfMainContext.gpf = {
internals: {} // To support testable internals
};
/**
* Contains the root path of GPF sources
*
* @name gpfSourcesPath
* @type {String}
* @private
* @since 0.0.1
*/
/**
* Reads a source file (only in source mode)
*
* NOTE this method is available only when running the source version
*
* @param {String} sourceFileName Source file name (relative to src folder)
* @return {String} Source content
* @since 0.1.7
*/
function _gpfSyncReadSourceJSON (sourceFileName) {
/*jslint evil: true*/
var result;
eval("result = " + _gpfSyncReadForBoot(gpfSourcesPath + sourceFileName) + ";"); //eslint-disable-line no-eval
return result;
}
function _gpfProcessSource (source, allContent) {
if (source.name !== "boot") {
allContent.push(_gpfSyncReadForBoot(gpfSourcesPath + source.name + ".js"));
}
}
/**
* Load content of all sources
*
* @return {String} Consolidated sources
* @since 0.1.9
*/
function _gpfLoadSources () { //jshint ignore:line
var sourceListContent = _gpfSyncReadForBoot(gpfSourcesPath + "sources.json"),
_gpfSources = _GpfFunc("return " + sourceListContent)(),
allContent = [],
idx = 0;
for (; idx < _gpfSources.length; ++idx) {
_gpfProcessSource(_gpfSources[idx], allContent);
}
return allContent.join("\n");
}
/*jshint ignore:start*/ // Best way I found
eval(_gpfLoadSources()); //eslint-disable-line no-eval
/*jshint ignore:end*/
/*#endif*/