mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-21 14:02:43 +08:00
187 lines
4.6 KiB
JavaScript
187 lines
4.6 KiB
JavaScript
var Concat = require('broccoli-concat');
|
|
var configReplace = require('./broccoli-config-replace');
|
|
var compileWithTypescript = require('./broccoli-typescript').default;
|
|
var fs = require('fs');
|
|
var Funnel = require('broccoli-funnel');
|
|
var mergeTrees = require('broccoli-merge-trees');
|
|
var Project = require('ember-cli/lib//models/project');
|
|
var stew = require('broccoli-stew');
|
|
|
|
module.exports = Angular2App;
|
|
|
|
function Angular2App(defaults, options) {
|
|
this._initProject();
|
|
this._notifyAddonIncluded();
|
|
}
|
|
|
|
Angular2App.prototype.toTree = function () {
|
|
var sourceTree = 'src';
|
|
|
|
var tsConfigCompilerOptions = JSON.parse(fs.readFileSync('src/tsconfig.json', 'utf-8')).compilerOptions;
|
|
var tsTree = compileWithTypescript(sourceTree, tsConfigCompilerOptions);
|
|
var tsSrcTree = new Funnel(sourceTree, {
|
|
include: ['**/*.ts'],
|
|
allowEmpty: true
|
|
});
|
|
|
|
var jsTree = new Funnel(sourceTree, {
|
|
include: ['**/*.js'],
|
|
allowEmpty: true
|
|
});
|
|
|
|
var assetTree = new Funnel(sourceTree, {
|
|
include: ['**/*.*'],
|
|
exclude: ['**/*.ts', '**/*.js'],
|
|
allowEmpty: true
|
|
});
|
|
|
|
var vendorJsTree = new Funnel('node_modules', {
|
|
files: [
|
|
'angular2/bundles/angular2.dev.js',
|
|
'angular2/bundles/router.dev.js',
|
|
'angular2/bundles/http.dev.js',
|
|
'systemjs/dist/system.src.js'
|
|
],
|
|
destDir: 'vendor'
|
|
})
|
|
|
|
// var appJs = new Concat(mergeTrees([tsTree, jsTree]), {
|
|
// inputFiles: [
|
|
// '*.js',
|
|
// '**/*.js'
|
|
// ],
|
|
// outputFile: '/app.js'
|
|
// });
|
|
|
|
return mergeTrees([assetTree, tsSrcTree, tsTree, jsTree, this.index(), vendorJsTree], { overwrite: true });
|
|
};
|
|
|
|
/**
|
|
@private
|
|
@method _initProject
|
|
@param {Object} options
|
|
*/
|
|
Angular2App.prototype._initProject = function() {
|
|
this.project = Project.closestSync(process.cwd());
|
|
|
|
/*if (options.configPath) {
|
|
this.project.configPath = function() { return options.configPath; };
|
|
}*/
|
|
};
|
|
|
|
/**
|
|
@private
|
|
@method _notifyAddonIncluded
|
|
*/
|
|
Angular2App.prototype._notifyAddonIncluded = function() {
|
|
this.initializeAddons();
|
|
this.project.addons = this.project.addons.filter(function(addon) {
|
|
addon.app = this;
|
|
|
|
if (!addon.isEnabled || addon.isEnabled()) {
|
|
if (addon.included) {
|
|
addon.included(this);
|
|
}
|
|
|
|
return addon;
|
|
}
|
|
}, this);
|
|
};
|
|
|
|
/**
|
|
Loads and initializes addons for this project.
|
|
Calls initializeAddons on the Project.
|
|
|
|
@private
|
|
@method initializeAddons
|
|
*/
|
|
Angular2App.prototype.initializeAddons = function() {
|
|
this.project.initializeAddons();
|
|
};
|
|
|
|
/**
|
|
Returns the content for a specific type (section) for index.html.
|
|
|
|
Currently supported types:
|
|
- 'head'
|
|
//- 'config-module'
|
|
//- 'app'
|
|
//- 'head-footer'
|
|
//- 'test-header-footer'
|
|
//- 'body-footer'
|
|
//- 'test-body-footer'
|
|
|
|
Addons can also implement this method and could also define additional
|
|
types (eg. 'some-addon-section').
|
|
|
|
@private
|
|
@method contentFor
|
|
@param {RegExP} match Regular expression to match against
|
|
@param {String} type Type of content
|
|
@return {String} The content.
|
|
*/
|
|
Angular2App.prototype.contentFor = function(match, type) {
|
|
var content = [];
|
|
|
|
/*switch (type) {
|
|
case 'head': this._contentForHead(content, config); break;
|
|
case 'config-module': this._contentForConfigModule(content, config); break;
|
|
case 'app-boot': this._contentForAppBoot(content, config); break;
|
|
}*/
|
|
|
|
content = this.project.addons.reduce(function(content, addon) {
|
|
var addonContent = addon.contentFor ? addon.contentFor(type) : null;
|
|
if (addonContent) {
|
|
return content.concat(addonContent);
|
|
}
|
|
|
|
return content;
|
|
}, content);
|
|
|
|
|
|
return content.join('\n');
|
|
};
|
|
|
|
/**
|
|
@private
|
|
@method _configReplacePatterns
|
|
@return
|
|
*/
|
|
Angular2App.prototype._configReplacePatterns = function() {
|
|
return [/*{
|
|
match: /\{\{EMBER_ENV\}\}/g,
|
|
replacement: calculateEmberENV
|
|
}, */{
|
|
match: /\{\{content-for ['"](.+)["']\}\}/g,
|
|
replacement: this.contentFor.bind(this)
|
|
}/*, {
|
|
match: /\{\{MODULE_PREFIX\}\}/g,
|
|
replacement: calculateModulePrefix
|
|
}*/];
|
|
};
|
|
|
|
|
|
/**
|
|
Returns the tree for app/index.html
|
|
|
|
@private
|
|
@method index
|
|
@return {Tree} Tree for app/index.html
|
|
*/
|
|
Angular2App.prototype.index = function() {
|
|
var htmlName = 'index.html';
|
|
var files = [
|
|
'index.html'
|
|
];
|
|
|
|
var index = new Funnel('src', {
|
|
files: files,
|
|
description: 'Funnel: index.html'
|
|
});
|
|
|
|
|
|
return configReplace(index, {
|
|
files: [ htmlName ],
|
|
patterns: this._configReplacePatterns()
|
|
});
|
|
}; |