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 @@ + + + +
+ +
+ | + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | + + | +
| + + | ++ + | +
| + + | ++ + | +