|
1 | | -var path = require('path'); |
2 | | -var Concat = require('broccoli-concat'); |
3 | | -var configReplace = require('./broccoli-config-replace'); |
4 | | -var compileWithTypescript = require('./broccoli-typescript').default; |
5 | | -var SwManifest = require('./service-worker-manifest').default; |
6 | | -var fs = require('fs'); |
7 | | -var Funnel = require('broccoli-funnel'); |
8 | | -var mergeTrees = require('broccoli-merge-trees'); |
9 | | -var Project = require('ember-cli/lib/models/project'); |
10 | | - |
11 | | -module.exports = Angular2App; |
12 | | - |
13 | | -function Angular2App(defaults, options, additionalPaths) { |
14 | | - this._initProject(); |
15 | | - this._notifyAddonIncluded(); |
16 | | - this.options = options; |
17 | | - this.additionalPaths = additionalPaths || []; |
| 1 | +/* jshint node: true, esnext: true */ |
| 2 | +'use strict'; |
| 3 | + |
| 4 | +const path = require('path'); |
| 5 | +const Funnel = require('broccoli-funnel'); |
| 6 | +const mergeTrees = require('broccoli-merge-trees'); |
| 7 | +const ts = require('./broccoli-typescript'); |
| 8 | +const sass = require('./broccoli-sass'); |
| 9 | +const less = require('./broccoli-less'); |
| 10 | +const configReplace = require('./broccoli-config-replace'); |
| 11 | +const SWManifest = require('./service-worker-manifest'); |
| 12 | +const Project = require('ember-cli/lib/models/project'); |
| 13 | +const sh = require('shelljs'); |
| 14 | + |
| 15 | +module.exports = Ng2App; |
| 16 | + |
| 17 | +function Ng2App(defaults, options, additionalPaths) { |
| 18 | + this._initProject(); |
| 19 | + this._notifyAddonIncluded(); |
| 20 | + this.options = options; |
| 21 | + this.additionalPaths = additionalPaths || []; |
18 | 22 | } |
19 | 23 |
|
20 | | -Angular2App.prototype.toTree = function() { |
21 | | - var sourceTree = 'src'; |
22 | | - var vendorNpmFiles = [ |
23 | | - 'systemjs/dist/system-polyfills.js', |
24 | | - 'systemjs/dist/system.src.js', |
25 | | - 'es6-shim/es6-shim.js', |
26 | | - 'angular2/bundles/angular2-polyfills.js', |
27 | | - 'rxjs/bundles/Rx.js', |
28 | | - 'angular2/bundles/angular2.dev.js', |
29 | | - 'angular2/bundles/http.dev.js', |
30 | | - 'angular2/bundles/router.dev.js', |
31 | | - 'angular2/bundles/upgrade.dev.js' |
32 | | - ]; |
33 | | - |
34 | | - if (this.options && this.options.vendorNpmFiles) { |
35 | | - vendorNpmFiles = vendorNpmFiles.concat(this.options.vendorNpmFiles); |
36 | | - } |
37 | | - |
38 | | - var tsConfigCompilerOptions = JSON.parse(fs.readFileSync('src/tsconfig.json', 'utf-8')).compilerOptions; |
39 | | - tsConfigCompilerOptions.rootFilePaths = ['typings.d.ts'].concat(this.additionalPaths) |
40 | | - .map(function(name) { |
41 | | - return path.join(process.cwd(), sourceTree, name) |
42 | | - }); |
43 | | - |
44 | | - var tsTree = compileWithTypescript(sourceTree, tsConfigCompilerOptions); |
45 | | - var tsSrcTree = new Funnel(sourceTree, { |
46 | | - include: ['**/*.ts'], |
47 | | - allowEmpty: true |
48 | | - }); |
49 | | - |
50 | | - var jsTree = new Funnel(sourceTree, { |
51 | | - include: ['**/*.js'], |
52 | | - allowEmpty: true |
53 | | - }); |
54 | | - |
55 | | - var assetTree = new Funnel(sourceTree, { |
56 | | - include: ['**/*.*'], |
57 | | - exclude: ['**/*.ts', '**/*.js'], |
58 | | - allowEmpty: true |
59 | | - }); |
60 | | - |
61 | | - var vendorNpmTree = new Funnel('node_modules', { |
62 | | - include: vendorNpmFiles, |
63 | | - destDir: 'vendor' |
64 | | - }); |
65 | | - |
66 | | - var thirdPartyJsTree = new Funnel('node_modules', { |
67 | | - include: ['ng2*/bundles/*.js'], |
68 | | - exclude: ['ng2*/bundles/*.min.js', 'ng2*/bundles/*.standalone.js'], |
69 | | - }); |
70 | | - |
71 | | - var thirdPartyJs = new Concat(thirdPartyJsTree, { |
72 | | - inputFiles: ['**/*.js'], |
73 | | - outputFile: '/thirdparty/libs.js', |
74 | | - allowNone: true |
75 | | - }); |
76 | | - |
77 | | - var merged = mergeTrees([ |
78 | | - assetTree, |
79 | | - tsSrcTree, |
80 | | - tsTree, |
81 | | - jsTree, |
82 | | - this.index(), |
83 | | - vendorNpmTree, |
84 | | - thirdPartyJs |
85 | | - ], { overwrite: true }); |
86 | | - |
87 | | - return mergeTrees([merged, new SwManifest(merged)]); |
| 24 | +Ng2App.prototype.toTree = function() { |
| 25 | + const src = 'src'; |
| 26 | + |
| 27 | + let tsCompilerOptions = require(path.resolve(process.cwd(), 'src/tsconfig.json')).compilerOptions; |
| 28 | + const tsNodeTree = new ts([src], tsCompilerOptions); |
| 29 | + |
| 30 | + const vendorNpmFiles = [ |
| 31 | + 'systemjs/dist/system-polyfills.js', |
| 32 | + 'systemjs/dist/system.src.js', |
| 33 | + 'es6-shim/es6-shim.js', |
| 34 | + 'angular2/bundles/angular2-polyfills.js', |
| 35 | + 'rxjs/bundles/Rx.js', |
| 36 | + 'angular2/bundles/angular2.dev.js', |
| 37 | + 'angular2/bundles/http.dev.js', |
| 38 | + 'angular2/bundles/router.dev.js', |
| 39 | + 'angular2/bundles/upgrade.dev.js' |
| 40 | + ]; |
| 41 | + |
| 42 | + const vendorNpmTree = new Funnel('node_modules', { |
| 43 | + include: vendorNpmFiles, |
| 44 | + destDir: 'vendor' |
| 45 | + }); |
| 46 | + |
| 47 | + const jsTree = new Funnel(src, { |
| 48 | + include: ['**/*.js'], |
| 49 | + allowEmpty: true |
| 50 | + }); |
| 51 | + |
| 52 | + const assetTree = new Funnel(src, { |
| 53 | + include: ['**/*.*'], |
| 54 | + exclude: ['**/*.ts', '**/*.js', '**/*.scss', '**/*.sass', '**/*.less'], |
| 55 | + allowEmpty: true |
| 56 | + }); |
| 57 | + |
| 58 | + let trees = [vendorNpmTree, assetTree, tsNodeTree, jsTree, this.index()]; |
| 59 | + |
| 60 | + if (require.resolve('node-sass') && sh.which('sass')) { |
| 61 | + const sassTree = new sass([src]); |
| 62 | + trees.push(sassTree); |
| 63 | + } |
| 64 | + |
| 65 | + if (require.resolve('less')) { |
| 66 | + const lessTree = new less([src]); |
| 67 | + trees.push(lessTree); |
| 68 | + } |
| 69 | + |
| 70 | + trees.push(new SWManifest([src])); |
| 71 | + |
| 72 | + return mergeTrees(trees, { overwrite: true }); |
88 | 73 | }; |
89 | 74 |
|
90 | | -/** |
91 | | - @private |
92 | | - @method _initProject |
93 | | - @param {Object} options |
94 | | - */ |
95 | | -Angular2App.prototype._initProject = function() { |
96 | | - this.project = Project.closestSync(process.cwd()); |
97 | | - |
98 | | - /*if (options.configPath) { |
99 | | - this.project.configPath = function() { return options.configPath; }; |
100 | | - }*/ |
| 75 | +Ng2App.prototype._initProject = function() { |
| 76 | + this.project = Project.closestSync(process.cwd()); |
101 | 77 | }; |
102 | 78 |
|
103 | | -/** |
104 | | - @private |
105 | | - @method _notifyAddonIncluded |
106 | | - */ |
107 | | -Angular2App.prototype._notifyAddonIncluded = function() { |
108 | | - this.initializeAddons(); |
109 | | - this.project.addons = this.project.addons.filter(function(addon) { |
110 | | - addon.app = this; |
111 | | - |
112 | | - if (!addon.isEnabled || addon.isEnabled()) { |
113 | | - if (addon.included) { |
114 | | - addon.included(this); |
115 | | - } |
116 | | - |
117 | | - return addon; |
118 | | - } |
119 | | - }, this); |
120 | | -}; |
| 79 | +Ng2App.prototype._notifyAddonIncluded = function() { |
| 80 | + this.initializeAddons(); |
| 81 | + this.project.addons = this.project.addons.filter(function(addon) { |
| 82 | + addon.app = this; |
121 | 83 |
|
122 | | -/** |
123 | | - Loads and initializes addons for this project. |
124 | | - Calls initializeAddons on the Project. |
| 84 | + if (!addon.isEnabled || addon.isEnabled()) { |
| 85 | + if (addon.included) { |
| 86 | + addon.included(this); |
| 87 | + } |
125 | 88 |
|
126 | | - @private |
127 | | - @method initializeAddons |
128 | | - */ |
129 | | -Angular2App.prototype.initializeAddons = function() { |
130 | | - this.project.initializeAddons(); |
| 89 | + return addon; |
| 90 | + } |
| 91 | + }, this); |
131 | 92 | }; |
132 | 93 |
|
133 | | -/** |
134 | | - Returns the content for a specific type (section) for index.html. |
135 | | -
|
136 | | - Currently supported types: |
137 | | - - 'head' |
138 | | - //- 'config-module' |
139 | | - //- 'app' |
140 | | - //- 'head-footer' |
141 | | - //- 'test-header-footer' |
142 | | - //- 'body-footer' |
143 | | - //- 'test-body-footer' |
144 | | -
|
145 | | - Addons can also implement this method and could also define additional |
146 | | - types (eg. 'some-addon-section'). |
147 | | -
|
148 | | - @private |
149 | | - @method contentFor |
150 | | - @param {RegExP} match Regular expression to match against |
151 | | - @param {String} type Type of content |
152 | | - @return {String} The content. |
153 | | - */ |
154 | | -Angular2App.prototype.contentFor = function(match, type) { |
155 | | - var content = []; |
| 94 | +Ng2App.prototype.initializeAddons = function() { |
| 95 | + this.project.initializeAddons(); |
| 96 | +}; |
156 | 97 |
|
157 | | - /*switch (type) { |
158 | | - case 'head': this._contentForHead(content, config); break; |
159 | | - case 'config-module': this._contentForConfigModule(content, config); break; |
160 | | - case 'app-boot': this._contentForAppBoot(content, config); break; |
161 | | - }*/ |
| 98 | +Ng2App.prototype.contentFor = function(match, type) { |
| 99 | + var content = []; |
162 | 100 |
|
163 | 101 | content = this.project.addons.reduce(function(content, addon) { |
164 | | - var addonContent = addon.contentFor ? addon.contentFor(type) : null; |
165 | | - if (addonContent) { |
166 | | - return content.concat(addonContent); |
167 | | - } |
| 102 | + var addonContent = addon.contentFor ? addon.contentFor(type) : null; |
| 103 | + if (addonContent) { |
| 104 | + return content.concat(addonContent); |
| 105 | + } |
168 | 106 |
|
169 | | - return content; |
| 107 | + return content; |
170 | 108 | }, content); |
171 | 109 |
|
172 | | - |
173 | 110 | return content.join('\n'); |
174 | 111 | }; |
175 | 112 |
|
176 | | -/** |
177 | | - @private |
178 | | - @method _configReplacePatterns |
179 | | - @return |
180 | | - */ |
181 | | -Angular2App.prototype._configReplacePatterns = function() { |
182 | | - return [/*{ |
183 | | - match: /\{\{EMBER_ENV\}\}/g, |
184 | | - replacement: calculateEmberENV |
185 | | - }, */{ |
186 | | - match: /\{\{content-for ['"](.+)["']\}\}/g, |
187 | | - replacement: this.contentFor.bind(this) |
188 | | - }/*, { |
189 | | - match: /\{\{MODULE_PREFIX\}\}/g, |
190 | | - replacement: calculateModulePrefix |
191 | | - }*/]; |
| 113 | +Ng2App.prototype._configReplacePatterns = function() { |
| 114 | + return [{ |
| 115 | + match: /\{\{content-for ['"](.+)["']\}\}/g, |
| 116 | + replacement: this.contentFor.bind(this) |
| 117 | + }]; |
192 | 118 | }; |
193 | 119 |
|
194 | | - |
195 | | -/** |
196 | | - Returns the tree for app/index.html |
197 | | -
|
198 | | - @private |
199 | | - @method index |
200 | | - @return {Tree} Tree for app/index.html |
201 | | - */ |
202 | | -Angular2App.prototype.index = function() { |
203 | | - var htmlName = 'index.html'; |
204 | | - var files = [ |
205 | | - 'index.html' |
206 | | - ]; |
207 | | - |
208 | | - var index = new Funnel('src', { |
209 | | - files: files, |
210 | | - description: 'Funnel: index.html' |
211 | | - }); |
212 | | - |
213 | | - |
214 | | - return configReplace(index, { |
215 | | - files: [ htmlName ], |
216 | | - patterns: this._configReplacePatterns() |
217 | | - }); |
| 120 | +Ng2App.prototype.index = function() { |
| 121 | + var htmlName = 'index.html'; |
| 122 | + var files = [ |
| 123 | + 'index.html' |
| 124 | + ]; |
| 125 | + |
| 126 | + var index = new Funnel('src', { |
| 127 | + files: files, |
| 128 | + description: 'Funnel: index.html' |
| 129 | + }); |
| 130 | + |
| 131 | + return configReplace(index, { |
| 132 | + files: [ htmlName ], |
| 133 | + patterns: this._configReplacePatterns() |
| 134 | + }); |
218 | 135 | }; |
0 commit comments