Skip to content

Commit d13b09f

Browse files
committed
Refactor and reorganize ember-cli-build.js
1 parent 607bd69 commit d13b09f

File tree

4 files changed

+159
-118
lines changed

4 files changed

+159
-118
lines changed

ember-cli-build.js

Lines changed: 51 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ module.exports = function(defaults) {
44

55
const EmberApp = require('ember-cli/lib/broccoli/ember-app');
66
const funnel = require('broccoli-funnel');
7-
const concat = require('broccoli-concat');
87
const mergeTrees = require('broccoli-merge-trees');
98
const babelTranspiler = require('broccoli-babel-transpiler');
10-
const Rollup = require('broccoli-rollup');
119
const browserify = require('browserify');
1210
const path = require('path');
1311
const fs = require('fs');
12+
const babelOpts = require('./lib/babel-opts');
1413

1514
const env = EmberApp.env();
1615
const deployTarget = process.env.DEPLOY_TARGET;
@@ -27,7 +26,7 @@ module.exports = function(defaults) {
2726
}
2827
}
2928

30-
const blueprintsCode = getEmberCLIBlueprints();
29+
const blueprintsCode = require('./lib/get-ember-cli-blueprints')();
3130

3231
let app = new EmberApp(defaults, {
3332
SRI: {
@@ -129,41 +128,40 @@ module.exports = function(defaults) {
129128
});
130129
testLoaderTree = babelTranspiler(testLoaderTree, babelOpts());
131130

132-
let emberDataShims = funnel('vendor', {
133-
files: ['ember-data-shims.js']
134-
});
135-
136-
let bowerTree = funnel('bower_components');
137-
let shimsTree = funnel('node_modules/ember-cli-shims/vendor/ember-cli-shims' , {
138-
destDir: 'ember-cli-shims'
139-
});
140-
141-
let baseResolverTree = funnel('node_modules/ember-resolver/addon', {
142-
destDir: 'ember-resolver'
143-
});
131+
let finalQUnitTree = buildQUnitTree(app);
144132

145-
let transpiledResolverTree = babelTranspiler(baseResolverTree, babelOpts());
133+
let twiddleVendorTree = buildTwiddleVendorTree();
146134

147-
let baseInitializersTree = funnel('node_modules/ember-load-initializers/addon', {
148-
destDir: 'ember-load-initializers'
149-
});
135+
return app.toTree(mergeTrees([twiddleVendorTree, loaderTree, testLoaderTree, finalQUnitTree]));
136+
};
150137

151-
let transpiledInitializersTree = babelTranspiler(baseInitializersTree, babelOpts());
138+
function buildQUnitTree(app) {
139+
const funnel = require('broccoli-funnel');
140+
const concat = require('broccoli-concat');
141+
const mergeTrees = require('broccoli-merge-trees');
142+
const babelTranspiler = require('broccoli-babel-transpiler');
143+
const Rollup = require('broccoli-rollup');
144+
const path = require('path');
145+
const babelOpts = require('./lib/babel-opts');
152146

153147
let preprocessJs = app.registry.registry.js[0].toTree;
148+
154149
let buildPreprocessedAddon = function(addonName) {
155150
return preprocessJs(path.dirname(require.resolve(addonName)) + '/addon-test-support', {
156151
registry: app.registry
157152
});
158153
};
154+
159155
let qunitTree = buildPreprocessedAddon('ember-qunit');
160156
let testHelpersTreeForQUnit = buildPreprocessedAddon('@ember/test-helpers');
157+
161158
let testLoaderTreeForQUnit = funnel("node_modules/ember-cli-test-loader/addon-test-support", {
162159
files: ['index.js'],
163160
getDestinationPath: function() {
164161
return "ember-cli-test-loader/test-support/index.js";
165162
}
166163
});
164+
167165
testLoaderTreeForQUnit = new Rollup(testLoaderTreeForQUnit, {
168166
rollup: {
169167
input: 'ember-cli-test-loader/test-support/index.js',
@@ -176,121 +174,56 @@ module.exports = function(defaults) {
176174
]
177175
}
178176
});
177+
179178
testLoaderTreeForQUnit = babelTranspiler(testLoaderTreeForQUnit, babelOpts());
179+
180180
let finalQUnitTree = concat(mergeTrees([qunitTree, testHelpersTreeForQUnit, testLoaderTreeForQUnit]), {
181181
inputFiles: ['**/*.js'],
182182
outputFile: '/assets/ember-qunit.js'
183183
});
184184

185-
let mergedDepsTree = mergeTrees([bowerTree, shimsTree, transpiledInitializersTree, transpiledResolverTree, emberDataShims]);
186-
187-
let twiddleVendorTree = concat(mergedDepsTree, {
188-
inputFiles: [
189-
'ember-cli-shims/app-shims.js',
190-
'ember-load-initializers/**/*.js',
191-
'ember-resolver/**/*.js',
192-
'ember-data-shims.js'
193-
],
194-
outputFile: '/assets/twiddle-deps.js'
195-
});
196-
197-
return app.toTree(mergeTrees([twiddleVendorTree, loaderTree, testLoaderTree, finalQUnitTree]));
198-
};
185+
return finalQUnitTree;
186+
}
199187

200-
function buildAddonTree(addonName) {
188+
function buildTwiddleVendorTree() {
201189
const funnel = require('broccoli-funnel');
202190
const concat = require('broccoli-concat');
191+
const mergeTrees = require('broccoli-merge-trees');
203192
const babelTranspiler = require('broccoli-babel-transpiler');
204-
const path = require('path');
193+
const babelOpts = require('./lib/babel-opts');
205194

206-
let baseTree = funnel(path.dirname(require.resolve(addonName)), {
207-
include: ['**/*.js'],
208-
exclude: ['index.js', 'ember-cli-build.js', 'testem.js', 'lib/**/*.js', 'config/**/*.js', 'tests/**/*.js']
195+
let emberDataShims = funnel('vendor', {
196+
files: ['ember-data-shims.js']
209197
});
210198

211-
let transpiledTree = babelTranspiler(baseTree, babelOpts());
199+
let bowerTree = funnel('bower_components');
200+
let shimsTree = funnel('node_modules/ember-cli-shims/vendor/ember-cli-shims' , {
201+
destDir: 'ember-cli-shims'
202+
});
212203

213-
return concat(transpiledTree, {
214-
inputFiles: ['**/*.js'],
215-
outputFile: '/assets/' + addonName + '.js'
204+
let baseResolverTree = funnel('node_modules/ember-resolver/addon', {
205+
destDir: 'ember-resolver'
216206
});
217-
}
218207

219-
function babelOpts() {
220-
return {
221-
presets: ['babel-preset-es2017'].map(require.resolve),
222-
moduleIds: true,
223-
plugins: [
224-
['transform-es2015-modules-amd', {
225-
loose: true,
226-
noInterop: true
227-
}],
228-
['babel-plugin-ember-modules-api-polyfill']
229-
]
230-
};
231-
}
208+
let transpiledResolverTree = babelTranspiler(baseResolverTree, babelOpts());
232209

233-
// This copies code out of ember-cli's blueprints into
234-
// app/lib/blueprints so we don't have to maintain our
235-
// own blueprints
236-
function getEmberCLIBlueprints() {
237-
const fs = require('fs');
238-
const path = require('path');
239-
let fileMap = {};
240-
241-
let blueprintFiles = {
242-
"cliBlueprintFiles": {
243-
"path": "node_modules/ember-cli",
244-
"files": {
245-
"app": "app/files/app/app.js",
246-
"router": "app/files/app/router.js",
247-
"test-helper": 'app/files/tests/test-helper.js',
248-
"test-resolver": 'app/files/tests/helpers/resolver.js',
249-
"test-destroy-app": 'app/files/tests/helpers/destroy-app.js',
250-
"test-module-for-acceptance": 'app/files/tests/helpers/module-for-acceptance.js'
251-
}
252-
},
253-
"legacyBlueprintFiles": {
254-
"path": path.dirname(require.resolve('ember-cli-legacy-blueprints')),
255-
"files": {
256-
'component-hbs': 'component/files/__root__/__templatepath__/__templatename__.hbs',
257-
'component-js': 'component/files/__root__/__path__/__name__.js',
258-
'controller': 'controller/files/__root__/__path__/__name__.js',
259-
'route': 'route/files/__root__/__path__/__name__.js',
260-
'service': 'service/files/__root__/__path__/__name__.js',
261-
'template': 'template/files/__root__/__path__/__name__.hbs',
262-
'helper': 'helper/files/__root__/helpers/__name__.js',
263-
'controller-test': 'controller-test/qunit-files/tests/unit/__path__/__test__.js',
264-
'route-test': 'route-test/qunit-files/tests/unit/__path__/__test__.js',
265-
'service-test': 'service-test/qunit-files/tests/unit/__path__/__test__.js',
266-
'component-test': 'component-test/qunit-files/tests/__testType__/__path__/__test__.js',
267-
'acceptance-test': 'acceptance-test/qunit-files/tests/acceptance/__name__-test.js'
268-
}
269-
}
270-
};
210+
let baseInitializersTree = funnel('node_modules/ember-load-initializers/addon', {
211+
destDir: 'ember-load-initializers'
212+
});
271213

272-
for (let list in blueprintFiles) {
273-
let blueprintPath = blueprintFiles[list].path;
274-
let files = blueprintFiles[list].files;
275-
for (let blueprintName in files) {
276-
let filePath = blueprintPath + '/blueprints/' + files[blueprintName];
277-
fileMap[blueprintName] = fs.readFileSync(filePath).toString();
278-
}
279-
}
214+
let transpiledInitializersTree = babelTranspiler(baseInitializersTree, babelOpts());
215+
216+
let mergedDepsTree = mergeTrees([bowerTree, shimsTree, transpiledInitializersTree, transpiledResolverTree, emberDataShims]);
217+
218+
let twiddleVendorTree = concat(mergedDepsTree, {
219+
inputFiles: [
220+
'ember-cli-shims/app-shims.js',
221+
'ember-load-initializers/**/*.js',
222+
'ember-resolver/**/*.js',
223+
'ember-data-shims.js'
224+
],
225+
outputFile: '/assets/twiddle-deps.js'
226+
});
280227

281-
// Location should be 'none' in router.js
282-
fileMap['router'] = fileMap['router'].replace(/config\.locationType/, "'none'");
283-
284-
fileMap['resolver'] = fs.readFileSync('app/resolver.js').toString();
285-
fileMap['twiddle.json'] = fs.readFileSync('blueprints/twiddle.json').toString();
286-
fileMap['initializers/router'] = fs.readFileSync('blueprints/router_initializer.js').toString();
287-
fileMap['initializers/mouse-events'] = fs.readFileSync('blueprints/mouse_events_initializer.js').toString();
288-
fileMap['controllers/application'] = fs.readFileSync('blueprints/application_controller.js').toString();
289-
fileMap['templates/application'] = fs.readFileSync('blueprints/application_template.hbs').toString();
290-
fileMap['app.css'] = fs.readFileSync('blueprints/app.css').toString();
291-
fileMap['index.html'] = fs.readFileSync('blueprints/index.html').toString();
292-
fileMap['test-start-app'] = fs.readFileSync('blueprints/start-app.js').toString();
293-
fileMap['model'] = fs.readFileSync('blueprints/model.js').toString();
294-
295-
return 'export default ' + JSON.stringify(fileMap);
228+
return twiddleVendorTree;
296229
}

lib/babel-opts.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/* global module, require */
2+
3+
function babelOpts() {
4+
return {
5+
presets: ['babel-preset-es2017'].map(require.resolve),
6+
moduleIds: true,
7+
plugins: [
8+
['transform-es2015-modules-amd', {
9+
loose: true,
10+
noInterop: true
11+
}],
12+
['babel-plugin-ember-modules-api-polyfill']
13+
]
14+
};
15+
}
16+
17+
module.exports = babelOpts;

lib/build-addon-tree.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* global require, module */
2+
function buildAddonTree(addonName) {
3+
const funnel = require('broccoli-funnel');
4+
const concat = require('broccoli-concat');
5+
const babelTranspiler = require('broccoli-babel-transpiler');
6+
const path = require('path');
7+
const babelOpts = require('./babel-opts');
8+
9+
let baseTree = funnel(path.dirname(require.resolve(addonName)), {
10+
include: ['**/*.js'],
11+
exclude: ['index.js', 'ember-cli-build.js', 'testem.js', 'lib/**/*.js', 'config/**/*.js', 'tests/**/*.js']
12+
});
13+
14+
let transpiledTree = babelTranspiler(baseTree, babelOpts());
15+
16+
return concat(transpiledTree, {
17+
inputFiles: ['**/*.js'],
18+
outputFile: '/assets/' + addonName + '.js'
19+
});
20+
}
21+
22+
module.exports = buildAddonTree;

lib/get-ember-cli-blueprints.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/* global require, module */
2+
3+
// This copies code out of ember-cli's blueprints into
4+
// app/lib/blueprints so we don't have to maintain our
5+
// own blueprints
6+
function getEmberCLIBlueprints() {
7+
const fs = require('fs');
8+
const path = require('path');
9+
let fileMap = {};
10+
11+
let blueprintFiles = {
12+
"cliBlueprintFiles": {
13+
"path": "node_modules/ember-cli",
14+
"files": {
15+
"app": "app/files/app/app.js",
16+
"router": "app/files/app/router.js",
17+
"test-helper": 'app/files/tests/test-helper.js',
18+
"test-resolver": 'app/files/tests/helpers/resolver.js',
19+
"test-destroy-app": 'app/files/tests/helpers/destroy-app.js',
20+
"test-module-for-acceptance": 'app/files/tests/helpers/module-for-acceptance.js'
21+
}
22+
},
23+
"legacyBlueprintFiles": {
24+
"path": path.dirname(require.resolve('ember-cli-legacy-blueprints')),
25+
"files": {
26+
'component-hbs': 'component/files/__root__/__templatepath__/__templatename__.hbs',
27+
'component-js': 'component/files/__root__/__path__/__name__.js',
28+
'controller': 'controller/files/__root__/__path__/__name__.js',
29+
'route': 'route/files/__root__/__path__/__name__.js',
30+
'service': 'service/files/__root__/__path__/__name__.js',
31+
'template': 'template/files/__root__/__path__/__name__.hbs',
32+
'helper': 'helper/files/__root__/helpers/__name__.js',
33+
'controller-test': 'controller-test/qunit-files/tests/unit/__path__/__test__.js',
34+
'route-test': 'route-test/qunit-files/tests/unit/__path__/__test__.js',
35+
'service-test': 'service-test/qunit-files/tests/unit/__path__/__test__.js',
36+
'component-test': 'component-test/qunit-files/tests/__testType__/__path__/__test__.js',
37+
'acceptance-test': 'acceptance-test/qunit-files/tests/acceptance/__name__-test.js'
38+
}
39+
}
40+
}
41+
42+
for (let list in blueprintFiles) {
43+
let blueprintPath = blueprintFiles[list].path;
44+
let files = blueprintFiles[list].files;
45+
for (let blueprintName in files) {
46+
let filePath = blueprintPath + '/blueprints/' + files[blueprintName];
47+
fileMap[blueprintName] = fs.readFileSync(filePath).toString();
48+
}
49+
}
50+
51+
// Location should be 'none' in router.js
52+
fileMap['router'] = fileMap['router'].replace(/config\.locationType/, "'none'");
53+
54+
fileMap['resolver'] = fs.readFileSync('app/resolver.js').toString();
55+
fileMap['twiddle.json'] = fs.readFileSync('blueprints/twiddle.json').toString();
56+
fileMap['initializers/router'] = fs.readFileSync('blueprints/router_initializer.js').toString();
57+
fileMap['initializers/mouse-events'] = fs.readFileSync('blueprints/mouse_events_initializer.js').toString();
58+
fileMap['controllers/application'] = fs.readFileSync('blueprints/application_controller.js').toString();
59+
fileMap['templates/application'] = fs.readFileSync('blueprints/application_template.hbs').toString();
60+
fileMap['app.css'] = fs.readFileSync('blueprints/app.css').toString();
61+
fileMap['index.html'] = fs.readFileSync('blueprints/index.html').toString();
62+
fileMap['test-start-app'] = fs.readFileSync('blueprints/start-app.js').toString();
63+
fileMap['model'] = fs.readFileSync('blueprints/model.js').toString();
64+
65+
return 'export default ' + JSON.stringify(fileMap);
66+
}
67+
68+
module.exports = getEmberCLIBlueprints;
69+

0 commit comments

Comments
 (0)