Skip to content

Commit 4e585bc

Browse files
committed
feat(build): add an option to disable type checks when running tests
Since editors and IDEs do typechecking and show errors in place, often there is no benefit to running type checking in our test pipeline. This PR allows you to disable type checking: gulp test.unit.js --noTypeChecks This commit also makes es6 generation optional. fix(build): removes unnecessary circular dependencies Closes #5299
1 parent 94cf671 commit 4e585bc

9 files changed

Lines changed: 103 additions & 72 deletions

File tree

gulpfile.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,14 @@ if (cliArgs.projects) {
5858

5959
// --projects=angular2,angular2_material => {angular2: true, angular2_material: true}
6060
var allProjects =
61-
'angular1_router,angular2,angular2_material,benchmarks,benchmarks_external,benchpress,playground';
61+
'angular1_router,angular2,angular2_material,benchmarks,benchmarks_external,benchpress,playground,bundle_deps';
6262
var cliArgsProjects = (cliArgs.projects || allProjects)
6363
.split(',')
6464
.reduce((map, projectName) => {
6565
map[projectName] = true;
6666
return map;
6767
}, {});
68+
var generateEs6 = !cliArgs.projects;
6869

6970
function printModulesWarning() {
7071
if (!cliArgs.projects && !process.env.CI) {
@@ -302,11 +303,11 @@ gulp.task('lint', ['build.tools'], function() {
302303
// ------------
303304
// check circular dependencies in Node.js context
304305
gulp.task('build/checkCircularDependencies', function(done) {
305-
var dependencyObject = madge(CONFIG.dest.js.dev.es6, {
306-
format: 'es6',
307-
paths: [CONFIG.dest.js.dev.es6],
306+
var dependencyObject = madge(CONFIG.dest.js.dev.es5, {
307+
format: 'cjs',
308+
paths: [CONFIG.dest.js.dev.es5],
308309
extensions: ['.js'],
309-
onParseFile: function(data) { data.src = data.src.replace(/import \* as/g, "//import * as"); }
310+
onParseFile: function(data) { data.src = data.src.replace(/\/\* circular \*\//g, "//"); }
310311
});
311312
var circularDependencies = dependencyObject.circular().getArray();
312313
if (circularDependencies.length > 0) {
@@ -841,11 +842,15 @@ gulp.task('!build.tools', function() {
841842
gulp.task('broccoli.js.dev', ['build.tools'],
842843
function(done) { runSequence('!broccoli.js.dev', sequenceComplete(done)); });
843844

844-
gulp.task('!broccoli.js.dev',
845-
() => { return angularBuilder.rebuildBrowserDevTree(cliArgsProjects); });
845+
gulp.task(
846+
'!broccoli.js.dev',
847+
() => angularBuilder.rebuildBrowserDevTree(
848+
{generateEs6: generateEs6, projects: cliArgsProjects, noTypeChecks: cliArgs.noTypeChecks}));
846849

847-
gulp.task('!broccoli.js.prod',
848-
function() { return angularBuilder.rebuildBrowserProdTree(cliArgsProjects); });
850+
gulp.task(
851+
'!broccoli.js.prod',
852+
() => angularBuilder.rebuildBrowserProdTree(
853+
{generateEs6: generateEs6, projects: cliArgsProjects, noTypeChecks: cliArgs.noTypeChecks}));
849854

850855
gulp.task('build.js.dev', ['build/clean.js'], function(done) {
851856
runSequence('broccoli.js.dev', 'build.css.material', sequenceComplete(done));
@@ -868,7 +873,9 @@ var firstBuildJsCjs = true;
868873
* private task
869874
*/
870875
gulp.task('!build.js.cjs', function() {
871-
return angularBuilder.rebuildNodeTree(cliArgsProjects)
876+
return angularBuilder
877+
.rebuildNodeTree(
878+
{generateEs6: generateEs6, projects: cliArgsProjects, noTypeChecks: cliArgs.noTypeChecks})
872879
.then(function() {
873880
if (firstBuildJsCjs) {
874881
firstBuildJsCjs = false;

modules/angular2/src/common/forms/directives/checkbox_value_accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {Self, forwardRef, Provider} from 'angular2/src/core/di';
55

66
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from './control_value_accessor';
77
import {CONST_EXPR} from 'angular2/src/facade/lang';
8-
import {setProperty} from './shared';
98

109
const CHECKBOX_VALUE_ACCESSOR = CONST_EXPR(new Provider(
1110
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => CheckboxControlValueAccessor), multi: true}));
@@ -30,7 +29,9 @@ export class CheckboxControlValueAccessor implements ControlValueAccessor {
3029

3130
constructor(private _renderer: Renderer, private _elementRef: ElementRef) {}
3231

33-
writeValue(value: any): void { setProperty(this._renderer, this._elementRef, "checked", value); }
32+
writeValue(value: any): void {
33+
this._renderer.setElementProperty(this._elementRef, 'checked', value);
34+
}
3435
registerOnChange(fn: (_: any) => {}): void { this.onChange = fn; }
3536
registerOnTouched(fn: () => {}): void { this.onTouched = fn; }
3637
}

modules/angular2/src/common/forms/directives/default_value_accessor.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {Renderer} from 'angular2/src/core/render';
44
import {Self, forwardRef, Provider} from 'angular2/src/core/di';
55
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from './control_value_accessor';
66
import {isBlank, CONST_EXPR} from 'angular2/src/facade/lang';
7-
import {setProperty} from './shared';
87

98
const DEFAULT_VALUE_ACCESSOR = CONST_EXPR(new Provider(
109
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => DefaultValueAccessor), multi: true}));
@@ -39,9 +38,9 @@ export class DefaultValueAccessor implements ControlValueAccessor {
3938

4039
writeValue(value: any): void {
4140
var normalizedValue = isBlank(value) ? '' : value;
42-
setProperty(this._renderer, this._elementRef, 'value', normalizedValue);
41+
this._renderer.setElementProperty(this._elementRef, 'value', normalizedValue);
4342
}
4443

4544
registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
4645
registerOnTouched(fn: () => void): void { this.onTouched = fn; }
47-
}
46+
}

modules/angular2/src/common/forms/directives/number_value_accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {Renderer} from 'angular2/src/core/render';
44
import {Self, forwardRef, Provider} from 'angular2/src/core/di';
55
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from './control_value_accessor';
66
import {isBlank, CONST_EXPR, NumberWrapper} from 'angular2/src/facade/lang';
7-
import {setProperty} from './shared';
87

98
const NUMBER_VALUE_ACCESSOR = CONST_EXPR(new Provider(
109
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => NumberValueAccessor), multi: true}));
@@ -34,7 +33,9 @@ export class NumberValueAccessor implements ControlValueAccessor {
3433

3534
constructor(private _renderer: Renderer, private _elementRef: ElementRef) {}
3635

37-
writeValue(value: number): void { setProperty(this._renderer, this._elementRef, 'value', value); }
36+
writeValue(value: number): void {
37+
this._renderer.setElementProperty(this._elementRef, 'value', value);
38+
}
3839

3940
registerOnChange(fn: (_: number) => void): void {
4041
this.onChange = (value) => { fn(NumberWrapper.parseFloat(value)); };

modules/angular2/src/common/forms/directives/select_control_value_accessor.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {Query, Directive} from 'angular2/src/core/metadata';
66
import {ObservableWrapper} from 'angular2/src/facade/async';
77
import {NG_VALUE_ACCESSOR, ControlValueAccessor} from './control_value_accessor';
88
import {CONST_EXPR} from 'angular2/src/facade/lang';
9-
import {setProperty} from './shared';
109

1110
const SELECT_VALUE_ACCESSOR = CONST_EXPR(new Provider(
1211
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => SelectControlValueAccessor), multi: true}));
@@ -50,7 +49,7 @@ export class SelectControlValueAccessor implements ControlValueAccessor {
5049

5150
writeValue(value: any): void {
5251
this.value = value;
53-
setProperty(this._renderer, this._elementRef, "value", value);
52+
this._renderer.setElementProperty(this._elementRef, 'value', value);
5453
}
5554

5655
registerOnChange(fn: () => any): void { this.onChange = fn; }

modules/angular2/src/common/forms/directives/shared.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import {NgControlGroup} from './ng_control_group';
99
import {Control, ControlGroup} from '../model';
1010
import {Validators} from '../validators';
1111
import {ControlValueAccessor} from './control_value_accessor';
12-
import {ElementRef, QueryList} from 'angular2/src/core/linker';
13-
import {Renderer} from 'angular2/src/core/render';
1412
import {DefaultValueAccessor} from './default_value_accessor';
1513
import {NumberValueAccessor} from './number_value_accessor';
1614
import {CheckboxControlValueAccessor} from './checkbox_value_accessor';
@@ -57,11 +55,6 @@ function _throwError(dir: AbstractControlDirective, message: string): void {
5755
throw new BaseException(`${message} '${path}'`);
5856
}
5957

60-
export function setProperty(renderer: Renderer, elementRef: ElementRef, propName: string,
61-
propValue: any) {
62-
renderer.setElementProperty(elementRef, propName, propValue);
63-
}
64-
6558
export function composeValidators(validators: /* Array<Validator|Function> */ any[]): Function {
6659
return isPresent(validators) ? Validators.compose(validators.map(normalizeValidator)) : null;
6760
}

modules/angular2/src/core/linker/element_injector.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ import {resolveProvider, ResolvedFactory, ResolvedProvider_} from 'angular2/src/
3434

3535
import {AttributeMetadata, QueryMetadata} from '../metadata/di';
3636

37-
import * as viewModule from './view';
38-
import * as avmModule from './view_manager';
37+
import {AppViewContainer, AppView} from './view';
38+
/* circular */ import * as avmModule from './view_manager';
3939
import {ViewContainerRef} from './view_container_ref';
4040
import {ElementRef} from './element_ref';
4141
import {TemplateRef} from './template_ref';
@@ -183,8 +183,8 @@ export class DirectiveProvider extends ResolvedProvider_ {
183183

184184
// TODO(rado): benchmark and consider rolling in as ElementInjector fields.
185185
export class PreBuiltObjects {
186-
nestedView: viewModule.AppView = null;
187-
constructor(public viewManager: avmModule.AppViewManager, public view: viewModule.AppView,
186+
nestedView: AppView = null;
187+
constructor(public viewManager: avmModule.AppViewManager, public view: AppView,
188188
public elementRef: ElementRef, public templateRef: TemplateRef) {}
189189
}
190190

@@ -195,7 +195,7 @@ export class QueryMetadataWithSetter {
195195
export class EventEmitterAccessor {
196196
constructor(public eventName: string, public getter: Function) {}
197197

198-
subscribe(view: viewModule.AppView, boundElementIndex: number, directive: Object): Object {
198+
subscribe(view: AppView, boundElementIndex: number, directive: Object): Object {
199199
var eventEmitter = this.getter(directive);
200200
return ObservableWrapper.subscribe<Event>(
201201
eventEmitter,
@@ -235,7 +235,7 @@ function _createProtoQueryRefs(providers: ProviderWithVisibility[]): ProtoQueryR
235235
}
236236

237237
export class ProtoElementInjector {
238-
view: viewModule.AppView;
238+
view: AppView;
239239
attributes: Map<string, string>;
240240
eventEmitterAccessors: EventEmitterAccessor[][];
241241
protoQueryRefs: ProtoQueryRef[];
@@ -451,9 +451,9 @@ export class ElementInjector extends TreeNode<ElementInjector> implements Depend
451451
return new ViewContainerRef_(this._preBuiltObjects.viewManager, this.getElementRef());
452452
}
453453

454-
getNestedView(): viewModule.AppView { return this._preBuiltObjects.nestedView; }
454+
getNestedView(): AppView { return this._preBuiltObjects.nestedView; }
455455

456-
getView(): viewModule.AppView { return this._preBuiltObjects.view; }
456+
getView(): AppView { return this._preBuiltObjects.view; }
457457

458458
directParent(): ElementInjector { return this._proto.distanceToParent < 2 ? this.parent : null; }
459459

@@ -1044,13 +1044,13 @@ export class QueryRef {
10441044
}
10451045
}
10461046

1047-
private _visitViewContainer(vc: viewModule.AppViewContainer, aggregator: any[]) {
1047+
private _visitViewContainer(vc: AppViewContainer, aggregator: any[]) {
10481048
for (var j = 0; j < vc.views.length; j++) {
10491049
this._visitView(vc.views[j], aggregator);
10501050
}
10511051
}
10521052

1053-
private _visitView(view: viewModule.AppView, aggregator: any[]) {
1053+
private _visitView(view: AppView, aggregator: any[]) {
10541054
for (var i = view.elementOffset; i < view.elementOffset + view.ownBindersCount; i++) {
10551055
var inj = view.elementInjectors[i];
10561056
if (isBlank(inj)) continue;

tools/broccoli/angular_builder.ts

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ type ProjectMap = {
1111
[key: string]: boolean
1212
};
1313

14+
type Options = {
15+
projects: ProjectMap;
16+
noTypeChecks: boolean;
17+
generateEs6: boolean;
18+
}
19+
;
20+
1421
/**
1522
* BroccoliBuilder facade for all of our build pipelines.
1623
*/
@@ -25,20 +32,20 @@ export class AngularBuilder {
2532
constructor(public options: AngularBuilderOptions) { this.outputPath = options.outputPath; }
2633

2734

28-
public rebuildBrowserDevTree(projects: ProjectMap): Promise<BuildResult> {
29-
this.browserDevBuilder = this.browserDevBuilder || this.makeBrowserDevBuilder(projects);
35+
public rebuildBrowserDevTree(opts: Options): Promise<BuildResult> {
36+
this.browserDevBuilder = this.browserDevBuilder || this.makeBrowserDevBuilder(opts);
3037
return this.rebuild(this.browserDevBuilder, 'js.dev');
3138
}
3239

3340

34-
public rebuildBrowserProdTree(projects: ProjectMap): Promise<BuildResult> {
35-
this.browserProdBuilder = this.browserProdBuilder || this.makeBrowserProdBuilder(projects);
41+
public rebuildBrowserProdTree(opts: Options): Promise<BuildResult> {
42+
this.browserProdBuilder = this.browserProdBuilder || this.makeBrowserProdBuilder(opts);
3643
return this.rebuild(this.browserProdBuilder, 'js.prod');
3744
}
3845

3946

40-
public rebuildNodeTree(projects: ProjectMap): Promise<BuildResult> {
41-
this.nodeBuilder = this.nodeBuilder || this.makeNodeBuilder(projects);
47+
public rebuildNodeTree(opts: Options): Promise<BuildResult> {
48+
this.nodeBuilder = this.nodeBuilder || this.makeNodeBuilder(opts.projects);
4249
return this.rebuild(this.nodeBuilder, 'js.cjs');
4350
}
4451

@@ -58,16 +65,30 @@ export class AngularBuilder {
5865
}
5966

6067

61-
private makeBrowserDevBuilder(projects: ProjectMap): BroccoliBuilder {
62-
let tree = makeBrowserTree({name: 'dev', typeAssertions: true, projects: projects},
63-
path.join(this.outputPath, 'js', 'dev'));
68+
private makeBrowserDevBuilder(opts: Options): BroccoliBuilder {
69+
let tree = makeBrowserTree(
70+
{
71+
name: 'dev',
72+
typeAssertions: true,
73+
projects: opts.projects,
74+
noTypeChecks: opts.noTypeChecks,
75+
generateEs6: opts.generateEs6
76+
},
77+
path.join(this.outputPath, 'js', 'dev'));
6478
return new broccoli.Builder(tree);
6579
}
6680

6781

68-
private makeBrowserProdBuilder(projects: ProjectMap): BroccoliBuilder {
69-
let tree = makeBrowserTree({name: 'prod', typeAssertions: false, projects: projects},
70-
path.join(this.outputPath, 'js', 'prod'));
82+
private makeBrowserProdBuilder(opts: Options): BroccoliBuilder {
83+
let tree = makeBrowserTree(
84+
{
85+
name: 'prod',
86+
typeAssertions: false,
87+
projects: opts.projects,
88+
noTypeChecks: opts.noTypeChecks,
89+
generateEs6: opts.generateEs6
90+
},
91+
path.join(this.outputPath, 'js', 'prod'));
7192
return new broccoli.Builder(tree);
7293
}
7394

@@ -128,11 +149,14 @@ function broccoliNodeToBuildNode(broccoliNode) {
128149

129150
return new BuildNode(tree.description || tree.constructor.name,
130151
tree.inputPath ? [tree.inputPath] : tree.inputPaths, tree.cachePath,
131-
tree.outputPath, broccoliNode.subtrees.map(broccoliNodeToBuildNode));
152+
tree.outputPath, broccoliNode.selfTime / (1000 * 1000 * 1000),
153+
broccoliNode.totalTime / (1000 * 1000 * 1000),
154+
broccoliNode.subtrees.map(broccoliNodeToBuildNode));
132155
}
133156

134157

135158
class BuildNode {
136159
constructor(public pluginName: string, public inputPaths: string[], public cachePath: string,
137-
public outputPath: string, public inputNodes: BroccoliNode[]) {}
160+
public outputPath: string, public selfTime: number, public totalTime: number,
161+
public inputNodes: BroccoliNode[]) {}
138162
}

0 commit comments

Comments
 (0)