Skip to content

Instantly share code, notes, and snippets.

@joliss
Created February 1, 2014 16:00
Show Gist options
  • Save joliss/8754125 to your computer and use it in GitHub Desktop.
Save joliss/8754125 to your computer and use it in GitHub Desktop.
Ember core build definition - proof-of-concept for API
module.exports = function (factory, broccoli) {
var UglifyJSFilter = require('broccoli-uglify-js')(broccoli)
var ES6ConcatenatorCompiler = require('broccoli-es6-concatenator')(broccoli)
var StaticCompiler = require('broccoli-static-compiler')(broccoli)
var featuresJSON = JSON.parse(fs.readFileSync('features.json', { encoding: 'ascii' }}))
var devDefeaturifyFilter = new DefeaturifyFilter({
features: featuresJSON.features,
debugStatements: features.debugStatements
})
var prodDefeaturifyFilter = new DefeaturifyFilter({
features: featuresJSON.features
})
var devEmberTree = factory.makeTree()
.map('packages/ember-core/lib', '/') // should perhaps move to simply 'lib'
// Let ember-core contain all of the following:
// .map('packages/ember/lib', '/')
// .map('packages/ember-handlebars/lib', '/')
// .map('packages/ember-handlebars-compiler/lib', '/')
// .map('packages/ember-metal/lib', '/')
// .map('packages/ember-routing/lib', '/')
// .map('packages/ember-runtime/lib', '/')
// .map('packages/ember-views/lib', '/')
// .map('packages/ember-application/lib', '/')
// .map('packages/ember-extension-support/lib', '/')
.map('packages/ember-debug/lib', '/')
.map('packages/ember-testing/lib', '/')
.addTransformer(devDefeaturifyFilter)
var prodEmberTree = factory.makeTree()
.map('packages/ember-core/lib', '/')
// We may need a no-op replacement for ember-debug here
.addTransformer(prodDefeaturifyFilter)
var containerTree = factory.makeTree()
.map('packages/container/lib', '/')
var metamorphTree = factory.makeTree()
.map('packages/metamorph/lib', '/')
var rsvpTree = factory.makeTree()
.map('packages/rsvp/lib', '/')
// We pick-and-choose which dependencies we include, so we need to manually
// make a tree for each bower package
var backburnerTree = factory.makeTree()
.map('bower_components/backburner/lib', '/')
var routeRecognizerTree = factory.makeTree()
.map('bower_components/route-recognizer/lib', '/')
var routerTree = factory.makeTree()
.map('bower_components/router/lib', '/')
var handlebarsTree = factory.makeTree()
.map('bower_components/handlebars/lib', '') // includes runtime
var jQueryTree = factory.makeTree()
.map('bower_components/jquery/lib', '/')
var testTrees = [
// need QUnit too
factory.makeTree().map('packages/ember-core/tests', 'ember/tests'),
factory.makeTree().map('packages/ember-testing/tests', 'ember/tests'),
factory.makeTree().map('packages/container/tests', 'ember-testing/tests'),
]
var includedDependencies = [
containerTree,
metamorphTree,
rsvpTree,
backburnerTree,
routeRecognizerTree,
routerTree
]
var excludedDependencies = [
handlebarsTree,
jQueryTree
]
// Global exports
function globalES6Concatenator (trees, outputFile, wrapInEval) {
return new ES6ConcatenatorCompiler({
loadPaths: trees.concat(includedDependencies),
importGlobalMapping: {
'jquery': 'jQuery',
'handlebars': 'Handlebars'
},
exportGlobalMapping: {
'ember': 'Ember',
'rsvp': 'RSVP'
},
wrapInEval: wrapInEval, // should have source maps eventually
outputFile: outputFile
})
}
var emberJs = globalES6Concatenator([devEmberTree], 'ember.js', true)
var emberProdJs = globalES6Concatenator([prodEmberTree], 'ember.prod.js', false)
var emberMinJs = globalES6Concatenator([prodEmberTree], 'ember.min.js', false)
// Chain methods must stop mutating
.addTransformer(new UglifyJSFilter())
// ES6 (defeaturified); this should be pushed onto bower eventually
var es6LibDev = new MergedTree([
devEmberTree,
// The following should become bower dependencies. For now they are
// included.
containerTree, rsvpTree, metamorphTree
])
.addTransformer(new Renamer({
srcDir: '/',
files: ['**']
destDir: '/lib-dev'
}))
var es6LibProd = new MergedTree({
prodEmberTree,
containerTree, rsvpTree, metamorphTree
})
.addTransformer(new Renamer({
srcDir: '/',
files: ['**']
destDir: '/lib-prod'
}))
// Test
var emberTestsJs = new ES6ConcatenatorCompiler({
loadPaths: [devEmberTree, testTrees].concat(includedDependencies),
wrapInEval: true,
// Um. It's not clear how we should expose this.
// ember-dev/support/tests/index.html.erb has a scary line count.
// Maybe we just load one particular main module.
mainModule: 'ember/test/main',
outputFile: 'ember-tests.js'
})
return [emberJs, emberProdJs, emberMinJs, es6LibDev, es6LibProd, emberTestsJs]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment