blob: 19f9b4e7d7409c3dd522c8db6d6989c8a63491b3 [file] [log] [blame]
/*
* Copyright (C) 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
// Portable environment: one of ["node", "web", "worker", "shell"].
const _environment =
((typeof process === "object" && typeof require === "function") ? "node"
: (typeof window === "object" ? "web"
: (typeof importScripts === "function" ? "worker"
: "shell")));
let _global = (typeof global !== 'object' || !global || global.Math !== Math || global.Array !== Array)
? ((typeof self !== 'undefined') ? self
: (typeof window !== 'undefined') ? window
: (typeof global !== 'undefined') ? global
: Function('return this')())
: global;
const _eval = x => eval.call(null, x);
const _read = filename => {
switch (_environment) {
case "node": return read(filename);
case "web": // fallthrough
case "worker": let xhr = new XMLHttpRequest(); xhr.open("GET", filename, /*async=*/false); return xhr.responseText;
case "shell": return read(filename);
}
}
const _load = filename => {
switch (_environment) {
case "node": // fallthrough
case "web": // fallthrough
case "shell": return _eval(_read(filename));
case "worker": return importScripts(filename);
}
}
const _json = filename => {
switch (_environment) {
case "node": // fallthrough
case "shell": return JSON.parse(_read(filename));
case "web": // fallthrough
case "worker": let xhr = new XMLHttpRequest(); xhr.overrideMimeType("application/json"); xhr.open("GET", filename, /*async=*/false); return xhr.response;
}
}
const _dump = (what, name, pad = ' ') => {
const value = v => {
try { return `"${v}"`; }
catch (e) { return `Error: "${e.message}"`; }
};
let s = `${pad}${name} ${typeof what}: ${value(what)}`;
for (let p in what) {
s += `\n${pad}${pad}${p}: ${value(what[p])} ${typeof v}`;
s += '\n' + _dump(what[p], p, pad + pad);
}
return s;
};
// Use underscore names to avoid clashing with builtin names.
export {
_dump as dump,
_eval as eval,
_read as read,
_load as load,
_json as json,
_global as global
};