aboutsummaryrefslogtreecommitdiff
path: root/src/js/lib/require/json.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/lib/require/json.js')
-rw-r--r--src/js/lib/require/json.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/js/lib/require/json.js b/src/js/lib/require/json.js
new file mode 100644
index 0000000..40e4da1
--- /dev/null
+++ b/src/js/lib/require/json.js
@@ -0,0 +1,84 @@
+/** @license
+ * RequireJS plugin for loading JSON files
+ * - depends on Text plugin and it was HEAVILY "inspired" by it as well.
+ * Author: Miller Medeiros
+ * Version: 0.4.0 (2014/04/10)
+ * Released under the MIT license
+ *
+ * Patched (2013/10/10):
+ * - supports JS-like comments which are beginning from /* or //
+ */
+define(['text'], function (text) {
+
+ var CACHE_BUST_QUERY_PARAM = 'bust',
+ CACHE_BUST_FLAG = '!bust',
+ jsonParse = (typeof JSON !== 'undefined' && typeof JSON.parse === 'function') ? JSON.parse : function (val) {
+ return eval('(' + val + ')'); //quick and dirty
+ },
+ PROTECTION_PREFIX = /^\)\]\}',?\n/,
+ buildMap = {};
+
+ function cacheBust(url) {
+ url = url.replace(CACHE_BUST_FLAG, '');
+ url += (url.indexOf('?') < 0) ? '?' : '&';
+ return url + CACHE_BUST_QUERY_PARAM + '=' + Math.round(2147483647 * Math.random());
+ }
+
+ //API
+ return {
+ load: function(name, req, onLoad, config) {
+ // Make sure file part of url ends with .json, add it if not
+ name = name.replace(new RegExp("^[^?]*"), function(base) {
+ return base.substr(-5) === ".json" ? base : base + ".json";
+ });
+ var url = req.toUrl(name);
+ if (config.isBuild && (config.inlineJSON === false || name.indexOf(CACHE_BUST_QUERY_PARAM + '=') !== -1)) {
+ //avoid inlining cache busted JSON or if inlineJSON:false
+ onLoad(null);
+ } else if (url.indexOf('empty:') === 0) {
+ //and don't inline files marked as empty: urls
+ onLoad(null);
+ } else {
+ text.get(url,
+ function (data) {
+ // Need to check if the JSON data has been formatted for the JSON array security vulnerability
+ var cleaned_data = ('' + data).replace(PROTECTION_PREFIX, '');
+ cleaned_data = cleaned_data.replace(/\/\*.+?\*\/|\/\/[^\n\r]*/g, '');
+ var parsed = null;
+ try {
+ parsed = jsonParse(cleaned_data);
+ if (config.isBuild) {
+ buildMap[name] = parsed;
+ }
+ onLoad(parsed);
+ } catch (e) {
+ onLoad.error(e);
+ //onLoad(null); -- should we really call onLoad???
+ }
+ },
+ onLoad.error, {
+ accept: 'application/json'
+ }
+ );
+ }
+ },
+
+ normalize: function (name, normalize) {
+ // used normalize to avoid caching references to a "cache busted" request
+ if (name.indexOf(CACHE_BUST_FLAG) !== -1) {
+ name = cacheBust(name);
+ }
+ // resolve any relative paths
+ return normalize(name);
+ },
+
+ // write method based on RequireJS official text plugin by James Burke
+ // https://github.com/jrburke/requirejs/blob/master/text.js
+ write: function (pluginName, moduleName, write) {
+ if (moduleName in buildMap) {
+ var content = buildMap[moduleName];
+ write('define("' + pluginName + '!' + moduleName + '", function () { return ' + (content ? JSON.stringify(content) : content) + '; });\n');
+ }
+ }
+ };
+});