From 3788c54d61f8c882254f82a0229d2058fce44b18 Mon Sep 17 00:00:00 2001 From: James deBoer <james@huronbox.com> Date: Fri, 24 Jan 2014 13:36:24 -0800 Subject: [PATCH] feat(js size): Add a default @MirrorsUsed to Angular. Closes #409, #237 --- demo/todo/web/todo.dart | 4 ++++ lib/angular.dart | 37 +++++++++++++++++++++++++++++++++ lib/playback/playback_http.dart | 2 ++ 3 files changed, 43 insertions(+) diff --git a/demo/todo/web/todo.dart b/demo/todo/web/todo.dart index ff3db815c..edba59764 100644 --- a/demo/todo/web/todo.dart +++ b/demo/todo/web/todo.dart @@ -2,6 +2,10 @@ library todo; import 'package:angular/angular.dart'; +// Everything in this library should be preserved by MirrorsUsed +@MirrorsUsed(targets: const['todo']) +import 'dart:mirrors'; + class Item { String text; bool done; diff --git a/lib/angular.dart b/lib/angular.dart index 904efd6ac..dab61a6f8 100644 --- a/lib/angular.dart +++ b/lib/angular.dart @@ -15,6 +15,43 @@ import 'dart:js' as js; import 'package:di/di.dart'; import 'package:di/dynamic_injector.dart'; +/** +* This @MirrorsUsed annotation is doing two things: +* - setting "override: *", which will cause any library that is not tagged +* with @MirrorsUsed to be potentially shaken out of the production binary. +* - setting targets. All classes inside of Angular will be preserved, as +* well as any class tagged with the annotations listed in metaTargets. +* +* If you are writing code accessed from Angular expressions, you must include +* your own @MirrorsUsed annotation or ensure that everything is tagged with +* the Ng annotations. +* +* This is a short-term fix until we implement a transformer-based solution +* which does not rely on mirrors. +*/ +@MirrorsUsed(targets: const[ + 'angular', + 'angular.core', + 'angular.core.dom', + 'angular.filter', + 'angular.perf', + 'angular.directive', + 'angular.routing', + 'angular.core.parser.dynamic_parser', + 'angular.core.parser.lexer', + 'perf_api', + 'List', + 'NodeTreeSanitizer', +], +metaTargets: const[ + 'NgInjectableService', + 'NgDirective', + 'NgController', + 'NgComponent' +], +override: '*') +import 'dart:mirrors'; + import 'package:angular/core/module.dart'; import 'package:angular/core_dom/module.dart'; import 'package:angular/directive/module.dart'; diff --git a/lib/playback/playback_http.dart b/lib/playback/playback_http.dart index 0298c3235..e9ec44cbe 100644 --- a/lib/playback/playback_http.dart +++ b/lib/playback/playback_http.dart @@ -5,10 +5,12 @@ import 'dart:convert' show JSON; import 'dart:html'; import 'package:angular/core_dom/module.dart'; +import 'package:angular/core/service.dart'; import 'package:angular/mock/module.dart' as mock; import 'playback_data.dart' as playback_data; +@NgInjectableService() class PlaybackHttpBackendConfig { requestKey(String url, {String method, bool withCredentials, String responseType,