From 67abf80c4eba1a205066fc59f2aaaad0a7f9293c Mon Sep 17 00:00:00 2001 From: cadorn Date: Wed, 29 Feb 2012 16:03:18 -0800 Subject: [PATCH 1/6] sourcemint loader support --- demo/kitchen-sink/package.json | 16 +++ lib/ace/worker/worker_client.js | 9 +- lib/ace/worker/worker_sourcemint.js | 73 ++++++++++ package.json | 27 +++- sourcemint/.gitignore | 2 + sourcemint/README.md | 60 ++++++++ sourcemint/dev.js | 67 +++++++++ sourcemint/index.html | 16 +++ sourcemint/kitchen-sink.html | 209 ++++++++++++++++++++++++++++ sourcemint/package.json | 12 ++ 10 files changed, 489 insertions(+), 2 deletions(-) create mode 100644 demo/kitchen-sink/package.json create mode 100644 lib/ace/worker/worker_sourcemint.js create mode 100644 sourcemint/.gitignore create mode 100644 sourcemint/README.md create mode 100644 sourcemint/dev.js create mode 100644 sourcemint/index.html create mode 100644 sourcemint/kitchen-sink.html create mode 100644 sourcemint/package.json diff --git a/demo/kitchen-sink/package.json b/demo/kitchen-sink/package.json new file mode 100644 index 00000000..2345fccd --- /dev/null +++ b/demo/kitchen-sink/package.json @@ -0,0 +1,16 @@ +{ + "main": "./demo.js", + "mappings": { + "ace": "../.." + }, + "config": { + "github.com/sourcemint/bundler-js/0/-meta/config/0": { + "adapter": "github.com/sourcemint/sdk-requirejs/0", + "resources": [ + "./icons/*", + "./logo.png", + "./styles.css" + ] + } + } +} \ No newline at end of file diff --git a/lib/ace/worker/worker_client.js b/lib/ace/worker/worker_client.js index 31cc9a5d..2e0bd826 100644 --- a/lib/ace/worker/worker_client.js +++ b/lib/ace/worker/worker_client.js @@ -50,7 +50,14 @@ var WorkerClient = function(topLevelNamespaces, packagedJs, mod, classname) { this.$worker = new Worker(base + packagedJs); } else { - var workerUrl = this.$normalizePath(require.nameToUrl("ace/worker/worker", null, "_")); + var workerUrl; + if (require.supports.indexOf("ucjs2-pinf-0") >= 0) { + // We are running in the sourcemint loader. + workerUrl = require.nameToUrl("ace/worker/worker_sourcemint"); + } else { + // We are running in RequireJS. + workerUrl = this.$normalizePath(require.nameToUrl("ace/worker/worker", null, "_")); + } this.$worker = new Worker(workerUrl); var tlns = {}; diff --git a/lib/ace/worker/worker_sourcemint.js b/lib/ace/worker/worker_sourcemint.js new file mode 100644 index 00000000..bc305b79 --- /dev/null +++ b/lib/ace/worker/worker_sourcemint.js @@ -0,0 +1,73 @@ + +define(function(require, exports, module) { + + "no use strict"; + + exports.main = function() + { + var console = { + log: function(msg) { + postMessage({type: "log", data: msg}); + } + }; + + // NOTE: This sets the global `window` object used by workers. + // TODO: Pass into worker what it needs and don't set global here. + window = { + console: console + }; + + function initSender() { + + var EventEmitter = require("ace/lib/event_emitter").EventEmitter; + var oop = require("ace/lib/oop"); + + var Sender = function() {}; + + (function() { + + oop.implement(this, EventEmitter); + + this.callback = function(data, callbackId) { + postMessage({ + type: "call", + id: callbackId, + data: data + }); + }; + + this.emit = function(name, data) { + postMessage({ + type: "event", + name: name, + data: data + }); + }; + + }).call(Sender.prototype); + + return new Sender(); + } + + var main; + var sender; + + onmessage = function(e) { + var msg = e.data; + if (msg.command) { + main[msg.command].apply(main, msg.args); + } + else if (msg.init) { + require("ace/lib/fixoldbrowsers"); + sender = initSender(); + require.async(msg.module, function(WORKER) { + var clazz = WORKER[msg.classname]; + main = new clazz(sender); + }); + } + else if (msg.event && sender) { + sender._emit(msg.event, msg.data); + } + }; + } +}); diff --git a/package.json b/package.json index 6029ad59..af6b9a19 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,9 @@ "libxml": "0.0.x", "dryice": ">=0.4.1" }, - + "mappings": { + "ace": "." + }, "licenses": [{ "type": "MPL", "url": "http://www.mozilla.org/MPL/" @@ -38,5 +40,28 @@ }, "scripts": { "test": "node lib/ace/test/all.js" + }, + "config": { + "github.com/sourcemint/bundler-js/0/-meta/config/0": { + "adapter": "github.com/sourcemint/sdk-requirejs/0", + "modules": { + "/lib/ace/virtual_renderer.js": { + "dynamicLinks": [ + "/lib/ace/theme/*.js" + ] + }, + "/lib/ace/worker/worker_client.js": { + "dynamicLinks": [ + "/lib/ace/worker/worker_sourcemint.js" + ] + }, + "/lib/ace/worker/worker_sourcemint.js": { + "bundleLoader": true, + "dynamicLinks": [ + "/lib/ace/mode/*_worker.js" + ] + } + } + } } } \ No newline at end of file diff --git a/sourcemint/.gitignore b/sourcemint/.gitignore new file mode 100644 index 00000000..81ce55f2 --- /dev/null +++ b/sourcemint/.gitignore @@ -0,0 +1,2 @@ +/dist/ +/node_modules/ \ No newline at end of file diff --git a/sourcemint/README.md b/sourcemint/README.md new file mode 100644 index 00000000..36cacb13 --- /dev/null +++ b/sourcemint/README.md @@ -0,0 +1,60 @@ +Develop & Distribute ACE using the Sourcemint Loader +==================================================== + +The [Sourcemint JavaScript Loader](https://github.com/sourcemint/loader-js) is an optimized +module loader that boots sets of *statically linked* modules from *bundles*. An application may +load additional bundles by using *dynamic links*. + +*Bundles* are generated from the AMD formatted source files on the fly during development (using a server helper) +and in-batch for production builds. To generate bundles the Sourcemint [RequireJS SDK](https://github.com/sourcemint/sdk-requirejs) +and [Platform NodeJS](https://github.com/sourcemint/platform-nodejs) projects are used. + + +Development +=========== + +**Requirements:** + + * [NodeJS](http://nodejs.org/) + +**Install:** + + git clone git://github.com/ajaxorg/ace.git + cd ace/sourcemint + npm install + +**Start development server:** + + node dev + +**NOTE:** Modified source files are automatically reloaded on browser refresh so there is no +need to restart the server during development. + + +Production +========== + +To generate production bundles, use the same setup as for *Development*, then run: + + // NOT YET IMPLEMENTED + node build ../demo/kitchen-sink ./dist + +Where `../demo/kitchen-sink` is the path to your ACE bootstrap package which embeds ACE in the page +or provides an interface for the rest of your application to interact with ACE. + +Everything needed for ACE (and your bootstrap package) to run will be written to the `./dist` directory which can be +used in a production application by serving these static files via a web server. To load the bootstrap file use: + + + + + + +See `` for an example of how to write an ACE bootstrap package. + +See [Embedding Ace](https://github.com/ajaxorg/ace) and [Embedding API](https://github.com/ajaxorg/ace/wiki/Embedding---API) +for more information on how to embed and interact with ACE. diff --git a/sourcemint/dev.js b/sourcemint/dev.js new file mode 100644 index 00000000..baf24102 --- /dev/null +++ b/sourcemint/dev.js @@ -0,0 +1,67 @@ + +var PATH = require("path"), + FS = require("fs"), + CONNECT = require("connect"), + BUNDLER = require("sourcemint-platform-nodejs/lib/bundler"); + + +exports.main = function(options) { + + // Rebuild bundles to get a clean start. + + console.log("Building fresh bundles from source ..."); + + if (!PATH.existsSync(__dirname + "/dist")) { + FS.mkdir(__dirname + "/dist", 0755); + } + + BUNDLER.bundle(PATH.dirname(__dirname) + "/demo/kitchen-sink", __dirname + "/dist", { + packageIdHashSeed: "__ACE__", + forceCompleteBuild: true, + writeManifest: true + }).then(function() { + + console.log("... Done. Bundles will be updated as changes are detected in source files."); + + var server = CONNECT(); + + server.use(CONNECT.router(function(app) { + + app.get(/^\/loader.js/, CONNECT.static(PATH.dirname(require.resolve("sourcemint-loader-js/loader.js")))); + + app.get(/^(\/demo\/kitchen-sink)(\.js)?(\/(.*))?$/, function (req, res) { + + req.url = req.params[2] || ""; + + BUNDLER.Middleware(PATH.dirname(__dirname) + "/demo/kitchen-sink", __dirname + "/dist", { + packageIdHashSeed: "__ACE__", + // TODO: https://github.com/sourcemint/bundler-js/issues/3 + rebuildChanges: false + }).handle(req, res); + }); + + app.get(/^\//, function(req, res) + { + CONNECT.static(__dirname)(req, res, function() + { + res.writeHead(404); + res.end("Not found!"); + }); + }); + })); + + server.listen(options.port, "127.0.0.1"); + + console.log("ACE development server running at http://127.0.0.1:" + options.port + "/"); + + }, function(err) { + console.error(err.stack); + }); +} + +if (require.main === module) { + // TODO: Make configurable via command-line flag. + exports.main({ + port: 8888 + }); +} diff --git a/sourcemint/index.html b/sourcemint/index.html new file mode 100644 index 00000000..b149a1c5 --- /dev/null +++ b/sourcemint/index.html @@ -0,0 +1,16 @@ + + + + + + Ace Development Server + + + +

Demos

+ +

Kitchen Sink

+ + + diff --git a/sourcemint/kitchen-sink.html b/sourcemint/kitchen-sink.html new file mode 100644 index 00000000..035d17d2 --- /dev/null +++ b/sourcemint/kitchen-sink.html @@ -0,0 +1,209 @@ + + + + + + Ace Kitchen Sink + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+
+ + + + + + diff --git a/sourcemint/package.json b/sourcemint/package.json new file mode 100644 index 00000000..6e186a9f --- /dev/null +++ b/sourcemint/package.json @@ -0,0 +1,12 @@ +{ + "name": "ajaxorg-ace-sourcemint", + "version": "0.1.0", + "engines": { + "node": "0.x" + }, + "dependencies": { + "connect": "1.x", + "sourcemint-platform-nodejs": "0.x", + "sourcemint-loader-js": "0.x" + } +} \ No newline at end of file From 1dd9d03de8832404bb0a6584b408e2b4562f5130 Mon Sep 17 00:00:00 2001 From: cadorn Date: Wed, 29 Feb 2012 16:04:23 -0800 Subject: [PATCH 2/6] doc --- sourcemint/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sourcemint/README.md b/sourcemint/README.md index 36cacb13..b8dfb23c 100644 --- a/sourcemint/README.md +++ b/sourcemint/README.md @@ -20,7 +20,10 @@ Development **Install:** git clone git://github.com/ajaxorg/ace.git - cd ace/sourcemint + cd ace + # TMP: Switch to sourcemint branch + git checkout sourcemint + cd sourcemint npm install **Start development server:** From 65e56a5eaf47f30d2243fe0893813bd5cdc366e2 Mon Sep 17 00:00:00 2001 From: cadorn Date: Wed, 29 Feb 2012 16:07:23 -0800 Subject: [PATCH 3/6] docs --- sourcemint/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sourcemint/README.md b/sourcemint/README.md index b8dfb23c..7fb47659 100644 --- a/sourcemint/README.md +++ b/sourcemint/README.md @@ -31,7 +31,7 @@ Development node dev **NOTE:** Modified source files are automatically reloaded on browser refresh so there is no -need to restart the server during development. +need to restart the server during development. (**NOT YET IMPLEMENTED**) Production @@ -57,7 +57,7 @@ used in a production application by serving these static files via a web server. }); -See `` for an example of how to write an ACE bootstrap package. +See `../demo/kitchen-sink` for an example of how to write an ACE bootstrap package. See [Embedding Ace](https://github.com/ajaxorg/ace) and [Embedding API](https://github.com/ajaxorg/ace/wiki/Embedding---API) for more information on how to embed and interact with ACE. From 3824403206eb986e236e32260e6f1782e91d5655 Mon Sep 17 00:00:00 2001 From: cadorn Date: Mon, 5 Mar 2012 10:52:42 -0800 Subject: [PATCH 4/6] switch to incremental bundle rebuild on source change middleware --- sourcemint/dev.js | 66 +++++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 43 deletions(-) diff --git a/sourcemint/dev.js b/sourcemint/dev.js index baf24102..5ce51b03 100644 --- a/sourcemint/dev.js +++ b/sourcemint/dev.js @@ -7,56 +7,36 @@ var PATH = require("path"), exports.main = function(options) { - // Rebuild bundles to get a clean start. + var server = CONNECT(); - console.log("Building fresh bundles from source ..."); - - if (!PATH.existsSync(__dirname + "/dist")) { - FS.mkdir(__dirname + "/dist", 0755); - } + server.use(CONNECT.router(function(app) { - BUNDLER.bundle(PATH.dirname(__dirname) + "/demo/kitchen-sink", __dirname + "/dist", { - packageIdHashSeed: "__ACE__", - forceCompleteBuild: true, - writeManifest: true - }).then(function() { + app.get(/^\/loader.js/, CONNECT.static(PATH.dirname(require.resolve("sourcemint-loader-js/loader.js")))); - console.log("... Done. Bundles will be updated as changes are detected in source files."); - - var server = CONNECT(); - - server.use(CONNECT.router(function(app) { - - app.get(/^\/loader.js/, CONNECT.static(PATH.dirname(require.resolve("sourcemint-loader-js/loader.js")))); - - app.get(/^(\/demo\/kitchen-sink)(\.js)?(\/(.*))?$/, function (req, res) { - - req.url = req.params[2] || ""; - - BUNDLER.Middleware(PATH.dirname(__dirname) + "/demo/kitchen-sink", __dirname + "/dist", { - packageIdHashSeed: "__ACE__", - // TODO: https://github.com/sourcemint/bundler-js/issues/3 - rebuildChanges: false - }).handle(req, res); - }); - - app.get(/^\//, function(req, res) - { - CONNECT.static(__dirname)(req, res, function() - { - res.writeHead(404); - res.end("Not found!"); - }); - }); + app.get(/^(?:\/demo\/kitchen-sink)(?:\.js)?(\/.*)?$/, BUNDLER.hoist(PATH.dirname(__dirname) + "/demo/kitchen-sink", { + distributionBasePath: __dirname + "/dist", + packageIdHashSeed: "__ACE__", + bundleLoader: false, + logger: { + log: function() { + console.log.apply(null, arguments); + } + } })); - server.listen(options.port, "127.0.0.1"); + app.get(/^\//, function(req, res) + { + CONNECT.static(__dirname)(req, res, function() + { + res.writeHead(404); + res.end("Not found!"); + }); + }); + })); - console.log("ACE development server running at http://127.0.0.1:" + options.port + "/"); + server.listen(options.port, "127.0.0.1"); - }, function(err) { - console.error(err.stack); - }); + console.log("ACE development server running at http://127.0.0.1:" + options.port + "/"); } if (require.main === module) { From fdce161412c89585810c424bad438c953f57d6ae Mon Sep 17 00:00:00 2001 From: Christoph Dorn Date: Mon, 5 Mar 2012 15:54:19 -0800 Subject: [PATCH 5/6] sourcemint loader detection fix --- lib/ace/worker/worker_client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/worker/worker_client.js b/lib/ace/worker/worker_client.js index 2e0bd826..82800e10 100644 --- a/lib/ace/worker/worker_client.js +++ b/lib/ace/worker/worker_client.js @@ -51,7 +51,7 @@ var WorkerClient = function(topLevelNamespaces, packagedJs, mod, classname) { } else { var workerUrl; - if (require.supports.indexOf("ucjs2-pinf-0") >= 0) { + if (typeof require.supports !== "undefined" && require.supports.indexOf("ucjs2-pinf-0") >= 0) { // We are running in the sourcemint loader. workerUrl = require.nameToUrl("ace/worker/worker_sourcemint"); } else { From eeeaf7d66b921c549b1c0a740c6090e78fa5872c Mon Sep 17 00:00:00 2001 From: Christoph Dorn Date: Sun, 11 Mar 2012 16:12:27 -0700 Subject: [PATCH 6/6] doc fix --- sourcemint/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sourcemint/README.md b/sourcemint/README.md index 7fb47659..47e33462 100644 --- a/sourcemint/README.md +++ b/sourcemint/README.md @@ -31,7 +31,7 @@ Development node dev **NOTE:** Modified source files are automatically reloaded on browser refresh so there is no -need to restart the server during development. (**NOT YET IMPLEMENTED**) +need to restart the server during development. Production