mxgraph-map-fix
Version:
mxGraph is a fully client side JavaScript diagramming library that uses SVG and HTML for rendering.
193 lines (169 loc) • 7.1 kB
JavaScript
var path = require("path"),
fs = require("fs"),
parentFolderName = path.basename(path.resolve('..')),
mxClientContent,
deps;
// Production steps of ECMA-262, Edition 5, 15.4.4.19
// Reference: http://es5.github.io/#x15.4.4.19
(function () {
if (!Array.prototype.map) {
Array.prototype.map = function (callback/*, thisArg*/) {
var T, A, k;
if (this == null) {
throw new TypeError('this is null or not defined');
}
// 1. Let O be the result of calling ToObject passing the |this|
// value as the argument.
var O = Object(this);
// 2. Let lenValue be the result of calling the Get internal
// method of O with the argument "length".
// 3. Let len be ToUint32(lenValue).
var len = O.length >>> 0;
// 4. If IsCallable(callback) is false, throw a TypeError exception.
// See: http://es5.github.com/#x9.11
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
// 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
if (arguments.length > 1) {
T = arguments[1];
}
// 6. Let A be a new array created as if by the expression new Array(len)
// where Array is the standard built-in constructor with that name and
// len is the value of len.
A = new Array(len);
// 7. Let k be 0
k = 0;
// 8. Repeat, while k < len
while (k < len) {
var kValue, mappedValue;
// a. Let Pk be ToString(k).
// This is implicit for LHS operands of the in operator
// b. Let kPresent be the result of calling the HasProperty internal
// method of O with argument Pk.
// This step can be combined with c
// c. If kPresent is true, then
if (k in O) {
// i. Let kValue be the result of calling the Get internal
// method of O with argument Pk.
kValue = O[k];
// ii. Let mappedValue be the result of calling the Call internal
// method of callback with T as the this value and argument
// list containing kValue, k, and O.
mappedValue = callback.call(T, kValue, k, O);
// iii. Call the DefineOwnProperty internal method of A with arguments
// Pk, Property Descriptor
// { Value: mappedValue,
// Writable: true,
// Enumerable: true,
// Configurable: true },
// and false.
// In browsers that support Object.defineProperty, use the following:
// Object.defineProperty(A, k, {
// value: mappedValue,
// writable: true,
// enumerable: true,
// configurable: true
// });
// For best browser support, use the following:
A[k] = mappedValue;
}
// d. Increase k by 1.
k++;
}
// 9. return A
return A;
};
}
})();
module.exports = function (grunt) {
// To get the dependencies for the project, read the filenames by matching
// mxClient.include([...]) in mxClient.js. This is not perfect, but the list is
// required in mxClient.js for compatibility.
mxClientContent = fs.readFileSync(
path.join(process.cwd(), "./javascript/src/js/mxClient.js"),
"utf8"
);
deps = mxClientContent.match(/mxClient\.include\([^"']+["'](.*?)["']/gi).map(function (str) {
return "." + str.match(/mxClient\.include\([^"']+["'](.*?)["']/)[1];
});
deps = ["./js/mxClient.js"].concat(deps.slice(0));
grunt.initConfig({
copy: {
main: {
files: [{
expand: true,
cwd: "./javascript/src",
src: deps,
dest: "./javascript/dist"
}],
options: {
// After each module, add the object to the '__mxOutput' namespace
// E.g. __mxOutput.mxLog, etc.
process: function (content, srcpath) {
var afterContent = "",
moduleName = path.basename(srcpath, ".js");
afterContent += "\n__mxOutput." + path.basename(srcpath, ".js") +
" = typeof " + moduleName + " !== 'undefined' ? " + moduleName + " : undefined;\n";
return content + afterContent;
}
}
}
},
concat: {
dist: {
src: deps.map(function (dep) {
return path.join("./javascript/dist", dep);
}),
dest: './javascript/dist/build.js'
},
options: {
banner: "(function (root, factory) {\n" +
"if (typeof define === 'function' && define.amd) {\n" +
"define([], factory);\n" +
"} else if (typeof module === 'object' && module.exports) {\n" +
"module.exports = factory();\n" +
"} else {\n" +
"root.mxgraph = factory();\n" +
"}\n" +
"}(this, function () {\n" +
"return function (opts) {\n" +
// Opts will be passed into this function, expand them out as if
// they were globals so they can get picked up by the logic in
// mxClient.js.
"for (var name in opts) { this[name] = opts[name]; }\n" +
"var __mxOutput = {};\n",
footer: "return __mxOutput;\n" +
"};\n" +
"}));"
}
},
webpack: {
examples: {
entry: "./javascript/examples/webpack/src/anchors.js",
output: {
path: path.resolve(process.cwd(), "./javascript/examples/webpack/dist"),
filename: "anchors.js"
}
}
},
watch: {
javascripts: {
files: "javascript/src/**/*.js",
tasks: ["umdify"],
options: {
interrupt: true
}
}
},
});
require(parentFolderName === "node_modules" ? "load-grunt-parent-tasks" : "load-grunt-tasks")(grunt);
grunt.registerTask("default", [
"copy",
"concat",
"webpack"
]);
grunt.registerTask("build", [
"default"
]);
};