From 640b19228a73ade49889ab0361c2fd050b6f21a4 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Thu, 28 Jul 2016 22:35:22 -0400 Subject: [PATCH] improve bundler --- browser.js | 3 ++ bundler/bundle.js | 12 ++++---- bundler/cli.js | 22 +++++++++----- bundler/minify.js | 4 +-- index.js | 19 ++++-------- mithril.js | 55 ++++++++++++++++------------------- mithril.min.js | 74 +++++++++++++++++++++++------------------------ package.json | 5 +++- 8 files changed, 97 insertions(+), 97 deletions(-) create mode 100644 browser.js diff --git a/browser.js b/browser.js new file mode 100644 index 00000000..6c39538a --- /dev/null +++ b/browser.js @@ -0,0 +1,3 @@ +;(function() { +window.m = require("./index") +})() \ No newline at end of file diff --git a/bundler/bundle.js b/bundler/bundle.js index c0cf3fa8..4b0e00c6 100644 --- a/bundler/bundle.js +++ b/bundler/bundle.js @@ -3,7 +3,7 @@ var fs = require("fs") var path = require("path") -module.exports = function(input, output) { +module.exports = function(input, output, options) { function run(e, file) { var modules = {} var usedVariables = {} @@ -17,7 +17,7 @@ module.exports = function(input, output) { //resolve npm dependencies if (filename[0] !== ".") { - var meta = JSON.parse(fs.readFileSync("./node_modules/" + filename + "/package.json")) + var meta = fs.statSync("./node_modules/" + filename + "/package.json").isFile() ? JSON.parse(fs.readFileSync("./node_modules/" + filename + "/package.json")) : {} var dependencyEntry = "./node_modules/" + filename + "/" + (meta.main || filename + ".js") try {fs.statSync(dependencyEntry).isFile()} catch (e) {dependencyEntry = "./node_modules/" + filename + "/index.js"} return resolve(path.dirname(dependencyEntry), exportCode(dependencyEntry, def + variable + eq)) @@ -57,7 +57,7 @@ module.exports = function(input, output) { function fixCollisions(code) { for (var variable in usedVariables) { - var collision = new RegExp("\\b" + variable + "\\b(?![\"'`])", "g") + var collision = new RegExp("(?!.)\\b" + variable + "\\b(?![\"'`])", "g") var exported = new RegExp("module\\.exports\\s*=\\s*" + variable) if (collision.test(code) && !exported.test(code)) { var fixed = variable + usedVariables[variable]++ @@ -68,14 +68,14 @@ module.exports = function(input, output) { } function setVersion(code) { - var metadata = JSON.parse(fs.readFileSync("./package.json")) + var metadata = JSON.parse(fs.readFileSync(__dirname + "/../package.json")) return code.replace("bleeding-edge", metadata.version) } function bundle(input, output) { console.log("bundling...") var code = setVersion(resolve(path.dirname(input), fs.readFileSync(input, "utf8"))) - if (new Function(code)) fs.writeFileSync(output, code, "utf8") + /*if (new Function(code)) */fs.writeFileSync(output, code, "utf8") console.log("done") } @@ -83,5 +83,5 @@ module.exports = function(input, output) { } run() - //fs.watch(process.cwd(), {recursive: true}, run) + if (options && options.watch) fs.watch(process.cwd(), {recursive: true}, run) } diff --git a/bundler/cli.js b/bundler/cli.js index 1cfd778e..5f2e53a8 100644 --- a/bundler/cli.js +++ b/bundler/cli.js @@ -3,18 +3,24 @@ var bundle = require("./bundle") var minify = require("./minify") -var aliases = {o: "output"} +var aliases = {o: "output", m: "minify", w: "watch"} var params = {} var args = process.argv.slice(2), command = null for (var i = 0; i < args.length; i++) { - if (args[i][0] === '"') args[i] = args[i].slice(1, -1) - if (args[i][0] === "-") command = args[i].replace(/\-+/g, "") - else if (command != null) { - params[aliases[command] || command] = args[i] - command = null + if (args[i][0] === '"') args[i] = JSON.parse(args[i]) + if (args[i][0] === "-") { + if (command != null) add(true) + command = args[i].replace(/\-+/g, "") } + else if (command != null) add(args[i]) else params.input = args[i] } +if (command != null) add(true) -bundle(params.input, params.output) -minify(params.output, params.output.replace(/\.js$/, ".min.js")) \ No newline at end of file +function add(value) { + params[aliases[command] || command] = value + command = null +} + +bundle(params.input, params.output, {watch: params.watch}) +if (params.minify) minify(params.output, params.output, {watch: params.watch}) \ No newline at end of file diff --git a/bundler/minify.js b/bundler/minify.js index 59586451..3b6292d3 100644 --- a/bundler/minify.js +++ b/bundler/minify.js @@ -2,7 +2,7 @@ var http = require("http") var querystring = require("querystring") var fs = require("fs") -module.exports = function(input, output) { +module.exports = function(input, output, options) { function format(n) { return n.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") } @@ -61,5 +61,5 @@ module.exports = function(input, output) { } run() - //fs.watchFile(input, run) + if (options && options.watch) fs.watchFile(input, run) } diff --git a/index.js b/index.js index 8ee79ef4..710df2fb 100644 --- a/index.js +++ b/index.js @@ -1,33 +1,26 @@ "use strict" -;(function () { - var Stream = require("./util/stream") var m = require("./render/hyperscript") var renderService = require("./render/render")(window) -var redrawService = require("./api/pubsub")() var requestService = require("./request/request")(window) +var redrawService = require("./api/pubsub")() requestService.setCompletionCallback(redrawService.publish) -m.version = "bleeding-edge" -m.request = requestService.xhr -m.jsonp = requestService.jsonp m.route = require("./api/router")(window, renderService, redrawService) m.mount = require("./api/mount")(renderService, redrawService) m.trust = require("./render/trust") +m.withAttr = require("./util/withAttr") m.prop = Stream.stream m.prop.combine = Stream.combine m.prop.reject = Stream.reject m.prop.merge = Stream.merge m.prop.HALT = Stream.HALT -m.withAttr = require("./util/withAttr") m.render = renderService.render m.redraw = redrawService.publish +m.request = requestService.xhr +m.jsonp = requestService.jsonp +m.version = "bleeding-edge" -if (typeof module === "object") { - module.exports = m -} -else window.m = m - -})() +module.exports = m diff --git a/mithril.js b/mithril.js index 26d15a69..dc1aede4 100644 --- a/mithril.js +++ b/mithril.js @@ -1,5 +1,4 @@ "use strict" -;(function () { var guid = 0, noop = function() {}, HALT = {} function createStream() { function stream() { @@ -416,7 +415,7 @@ var renderService = function($window) { } if (end < start) break } - createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, undefined) + createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns) removeNodes(parent, old, oldStart, oldEnd + 1, vnodes) } } @@ -748,25 +747,12 @@ var renderService = function($window) { if (dom.vnodes == null) dom.vnodes = [] if (!(vnodes instanceof Array)) vnodes = [vnodes] updateNodes(dom, dom.vnodes, Node.normalizeChildren(vnodes), hooks, null, undefined) - for (var i = 0; i < hooks.length; i++) hooks[i]() dom.vnodes = vnodes + for (var i = 0; i < hooks.length; i++) hooks[i]() if ($doc.activeElement !== active) active.focus() } return {render: render, setEventCallback: setEventCallback} }(window) -var redrawService = function() { - var callbacks = [] - function unsubscribe(callback) { - var index = callbacks.indexOf(callback) - if (index > -1) callbacks.splice(index, 1) - } - function publish() { - for (var i = 0; i < callbacks.length; i++) { - callbacks[i].apply(this, arguments) - } - } - return {subscribe: callbacks.push.bind(callbacks), unsubscribe: unsubscribe, publish: publish} -}() var buildQueryString = function(object) { if (Object.prototype.toString.call(object) !== "[object Object]") return "" var args = [] @@ -799,7 +785,7 @@ var requestService = function($window) { var useBody = typeof args.useBody === "boolean" ? args.useBody : args.method !== "GET" && args.method !== "TRACE" - if (typeof args.serialize !== "function") args.serialize = JSON.stringify + if (typeof args.serialize !== "function") args.serialize = args.data instanceof FormData ? function(value) {return value} : JSON.stringify if (typeof args.deserialize !== "function") args.deserialize = deserialize if (typeof args.extract !== "function") args.extract = extract @@ -905,10 +891,20 @@ var requestService = function($window) { return {xhr: xhr, jsonp: jsonp, setCompletionCallback: setCompletionCallback} }(window) +var redrawService = function() { + var callbacks = [] + function unsubscribe(callback) { + var index = callbacks.indexOf(callback) + if (index > -1) callbacks.splice(index, 1) + } + function publish() { + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].apply(this, arguments) + } + } + return {subscribe: callbacks.push.bind(callbacks), unsubscribe: unsubscribe, publish: publish} +}() requestService.setCompletionCallback(redrawService.publish) -m.version = "1.0.0" -m.request = requestService.xhr -m.jsonp = requestService.jsonp var parseQueryString = function(string) { if (string === "" || string == null) return {} if (string.charAt(0) === "?") string = string.slice(1) @@ -1113,20 +1109,19 @@ m.mount = function(renderer, pubsub) { m.trust = function(html) { return Node("<", undefined, undefined, html, undefined, undefined) } -m.prop = Stream.stream -m.prop.combine = Stream.combine -m.prop.reject = Stream.reject -m.prop.merge = Stream.merge -m.prop.HALT = Stream.HALT m.withAttr = function(attrName, callback, context) { return function(e) { return callback.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName)) } } +m.prop = Stream.stream +m.prop.combine = Stream.combine +m.prop.reject = Stream.reject +m.prop.merge = Stream.merge +m.prop.HALT = Stream.HALT m.render = renderService.render m.redraw = redrawService.publish -if (typeof module === "object") { - module.exports = m -} -else window.m = m -})() +m.request = requestService.xhr +m.jsonp = requestService.jsonp +m.version = "1.0.0" +module.exports = m diff --git a/mithril.min.js b/mithril.min.js index 6e7b677e..dad08474 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -1,40 +1,40 @@ -(function(){function w(){function a(){0=r&&A>=z;){var t=c[r],v=f[z];if(t===v)r++,z++;else if(null!=t&&null!=v&&t.key===v.key&&t.tag===v.tag)r++,z++,k(a,t,v,d,e(c,r,g),q,B),q&&t.tag===v.tag&&n(a,l(t),g);else if(t=c[u],t===v)u--,z++;else if(null!=t&&null!=v&&t.key===v.key&&t.tag===v.tag)k(a,t,v,d,e(c,u+1,g),q,B),n(a,l(t),e(c,r,g)),u--,z++;else break}for(;u>= -r&&A>=z;){t=c[u];v=f[A];if(t===v)u--;else if(null!=t&&null!=v&&t.key===v.key&&t.tag===v.tag)k(a,t,v,d,e(c,u+1,g),q,B),q&&t.tag===v.tag&&n(a,l(t),g),null!=t.dom&&(g=t.dom),u--;else{if(!m){m=c;var t=u,p={},y;for(y=0;ya.indexOf("?")?"?":"&";a+=g+d}return a}function d(a){try{return""!==a?JSON.parse(a):null}catch(b){throw Error(a);}}function g(a){return a.responseText} -var k=0,l;return{xhr:function(e){var n=C.stream();void 0!==e.initialValue&&n(e.initialValue);var x="boolean"===typeof e.useBody?e.useBody:"GET"!==e.method&&"TRACE"!==e.method;"function"!==typeof e.serialize&&(e.serialize=JSON.stringify);"function"!==typeof e.deserialize&&(e.deserialize=d);"function"!==typeof e.extract&&(e.extract=g);e.url=b(e.url,e.data);x?e.data=e.serialize(e.data):e.url=h(e.url,e.data);var k=new a.XMLHttpRequest;k.open(e.method,e.url,"boolean"===typeof e.async?e.async:!0,"string"=== -typeof e.user?e.user:void 0,"string"===typeof e.password?e.password:void 0);e.serialize===JSON.stringify&&x&&k.setRequestHeader("Content-Type","application/json; charset=utf-8");e.deserialize===d&&k.setRequestHeader("Accept","application/json, text/*");"function"===typeof e.config&&(k=e.config(k,e)||k);k.onreadystatechange=function(){if(4===k.readyState){try{var a=e.deserialize(e.extract(k,e));if(200<=k.status&&300>k.status){if("function"===typeof e.type)if(a instanceof Array)for(var b=0;b=q&&z>=A;){var t=c[q],w=f[A];if(t===w)q++,A++;else if(null!=t&&null!=w&&t.key===w.key)q++,A++,k(a,t,w,d,e(c,q,g),p,B),p&&t.tag===w.tag&&n(a,m(t),g);else if(t=c[r],t===w)r--,A++;else if(null!=t&&null!=w&&t.key===w.key)k(a,t,w,d,e(c,r+1,g),p,B),n(a,m(t),e(c,q,g)),r--,A++;else break}for(;r>=q&&z>=A;){t=c[r];w=f[z]; +if(t===w)r--;else if(null!=t&&null!=w&&t.key===w.key)k(a,t,w,d,e(c,r+1,g),p,B),p&&t.tag===w.tag&&n(a,m(t),g),null!=t.dom&&(g=t.dom),r--;else{if(!u){u=c;var t=r,l={},x;for(x=0;xa.indexOf("?")?"?":"&";a+=g+d}return a}function d(a){try{return""!==a?JSON.parse(a):null}catch(b){throw Error(a);}}function g(a){return a.responseText}var k=0,m;return{xhr:function(e){var n=C.stream();void 0!==e.initialValue&&n(e.initialValue);var v="boolean"===typeof e.useBody?e.useBody:"GET"!==e.method&&"TRACE"!==e.method; +"function"!==typeof e.serialize&&(e.serialize=e.data instanceof FormData?function(a){return a}:JSON.stringify);"function"!==typeof e.deserialize&&(e.deserialize=d);"function"!==typeof e.extract&&(e.extract=g);e.url=b(e.url,e.data);v?e.data=e.serialize(e.data):e.url=h(e.url,e.data);var k=new a.XMLHttpRequest;k.open(e.method,e.url,"boolean"===typeof e.async?e.async:!0,"string"===typeof e.user?e.user:void 0,"string"===typeof e.password?e.password:void 0);e.serialize===JSON.stringify&&v&&k.setRequestHeader("Content-Type", +"application/json; charset=utf-8");e.deserialize===d&&k.setRequestHeader("Accept","application/json, text/*");"function"===typeof e.config&&(k=e.config(k,e)||k);k.onreadystatechange=function(){if(4===k.readyState){try{var a=e.deserialize(e.extract(k,e));if(200<=k.status&&300>k.status){if("function"===typeof e.type)if(a instanceof Array)for(var b=0;b