| Index: third_party/pkg/angular/lib/application.dart
|
| diff --git a/third_party/pkg/angular/lib/application.dart b/third_party/pkg/angular/lib/application.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8cdf7a2eacafb26aeb5428a7d4036788e0d9cf09
|
| --- /dev/null
|
| +++ b/third_party/pkg/angular/lib/application.dart
|
| @@ -0,0 +1,188 @@
|
| +/**
|
| + * Bootstrapping for Angular applications via [app:factory](#angular-app-factory) for development,
|
| + * or [app:factory:static](#angular-app-factory-static) for production.
|
| + *
|
| + * In your `main()` function, you bootstrap Angular by explicitly defining and adding a module for
|
| + * your application:
|
| + *
|
| + * import 'package:angular/angular.dart';
|
| + * import 'package:angular/application_factory.dart';
|
| + *
|
| + * class MyModule extends Module {
|
| + * MyModule() {
|
| + * type(HelloWorldController);
|
| + * }
|
| + * }
|
| + *
|
| + * main() {
|
| + * applicationFactory()
|
| + * .addModule(new MyModule())
|
| + * .run();
|
| + * }
|
| + *
|
| + * In the code above, we use [applicationFactory](#angular-app-factory) to
|
| + * take advantage of [dart:mirrors]
|
| + * (https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-mirrors) during
|
| + * development. When you run the app in Dartium the [app:factory](#angular-app-factory)
|
| + * implementation allows for quick edit-test development cycle.
|
| + *
|
| + * Note that you must explicitly import both `angular.dart` and `application_factory.dart` at
|
| + * the start of your file.
|
| + *
|
| + * For production, transformers defined in your `pubspec.yaml` file convert the code to
|
| + * use the [app:factory:static](#angular-app-factory-static) when you run `pub build`. Instead of
|
| + * relying on mirrors (which disable tree-shaking and thus generate large JS size), the transformers
|
| + * generate getters, setters, annotations, and factories needed by Angular. The result is that
|
| + * `dart2js` can than enable tree-shaking and produce smaller output.
|
| + *
|
| + * To enable the transformers add this rule as shown below to your `pubspec.yaml`:
|
| + *
|
| + * name: angular_dart_example
|
| + * version: 0.0.1
|
| + * dependencies:
|
| + * angular: '>= 0.9.11'
|
| + * browser: any
|
| + * unittest: any
|
| + *
|
| + * transformers:
|
| + * - angular
|
| + *
|
| + * If your app structure makes use of directories for storing your templates,
|
| + * you must also specify rules for `html_files` to ensure that the transformers pick up those
|
| + * files. You only need to specify the HTML files; the parser will infer the correct `.dart` and
|
| + * CSS files to include.
|
| + *
|
| + * For example:
|
| + *
|
| + * transformers:
|
| + * - angular:
|
| + * html_files:
|
| + * - lib/_some_library_/_some_component_.html
|
| + *
|
| + * If you need a way to build your app without transformers, you can use
|
| + * [staticApplicationFactory](#angular-app-factory-static@id_staticApplicationFactory) directly,
|
| + * instead of [applicationFactory](#angular-app-factory@id_dynamicApplication). See the
|
| + * documentation for the [app:factory:static](#angular-app-factory-static) library definition for
|
| + * more on this use case.
|
| + */
|
| +library angular.app;
|
| +
|
| +import 'dart:html' as dom;
|
| +
|
| +import 'package:intl/date_symbol_data_local.dart';
|
| +import 'package:di/di.dart';
|
| +import 'package:angular/angular.dart';
|
| +import 'package:angular/perf/module.dart';
|
| +import 'package:angular/core/module_internal.dart';
|
| +import 'package:angular/core/registry.dart';
|
| +import 'package:angular/core_dom/module_internal.dart';
|
| +import 'package:angular/directive/module.dart';
|
| +import 'package:angular/formatter/module_internal.dart';
|
| +import 'package:angular/routing/module.dart';
|
| +import 'package:angular/introspection_js.dart';
|
| +
|
| +/**
|
| + * This is the top level module which describes all Angular components,
|
| + * including services, formatters and directives. When instantiating an Angular application
|
| + * through [applicationFactory](#angular-app-factory), AngularModule is automatically included.
|
| + *
|
| + * You can use AngularModule explicitly when creating a custom Injector that needs to know
|
| + * about Angular services, formatters, and directives. When writing tests, this is typically done for
|
| + * you by the [SetUpInjector](#angular-mock@id_setUpInjector) method.
|
| + *
|
| +
|
| + */
|
| +class AngularModule extends Module {
|
| + AngularModule() {
|
| + install(new CoreModule());
|
| + install(new CoreDomModule());
|
| + install(new DecoratorFormatter());
|
| + install(new FormatterModule());
|
| + install(new PerfModule());
|
| + install(new RoutingModule());
|
| +
|
| + type(MetadataExtractor);
|
| + value(Expando, elementExpando);
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * The Application class provides the mechanism by which Angular creates, configures,
|
| + * and runs an application. There are two implementations for this abstract class:
|
| + *
|
| + * - [app:factory](#angular-app-factory), which is intended for development. In this
|
| + * mode Angular uses
|
| + * [dart:mirrors](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-mirrors)
|
| + * to dynamically generate getters, setters, annotations, and factories at runtime.
|
| + * - [app:factory:static](#angular-app-factory-static) is used as part of `pub
|
| + * build` by transformers that generate the getters, setters, annotations,
|
| + * and factories needed by Angular.
|
| + * Because the code is statically generated, `dart2js` can then use full tree-shaking for
|
| + * minimal output size.
|
| + *
|
| + * Refer to the documentation for [angular.app](#angular-app) for details of how to use
|
| + * applicationFactory to bootstrap your Angular application.
|
| + *
|
| + */
|
| +abstract class Application {
|
| + static _find(String selector, [dom.Element defaultElement]) {
|
| + var element = dom.window.document.querySelector(selector);
|
| + if (element == null) element = defaultElement;
|
| + if (element == null) {
|
| + throw "Could not find application element '$selector'.";
|
| + }
|
| + return element;
|
| + }
|
| +
|
| + final VmTurnZone zone = new VmTurnZone();
|
| + final AngularModule ngModule = new AngularModule();
|
| + final List<Module> modules = <Module>[];
|
| + dom.Element element;
|
| +
|
| +/**
|
| +* Creates a selector for a DOM element.
|
| +*/
|
| + dom.Element selector(String selector) => element = _find(selector);
|
| +
|
| + Application(): element = _find('[ng-app]', dom.window.document.documentElement) {
|
| + modules.add(ngModule);
|
| + ngModule..value(VmTurnZone, zone)
|
| + ..value(Application, this)
|
| + ..factory(dom.Node, (i) => i.get(Application).element);
|
| + }
|
| +
|
| +/**
|
| +* Returns the injector for this module.
|
| +*/
|
| + Injector injector;
|
| +
|
| + Application addModule(Module module) {
|
| + modules.add(module);
|
| + return this;
|
| + }
|
| +
|
| + Injector run() {
|
| + publishToJavaScript();
|
| + return zone.run(() {
|
| + var rootElements = [element];
|
| + Injector injector = createInjector();
|
| + ExceptionHandler exceptionHandler = injector.get(ExceptionHandler);
|
| + initializeDateFormatting(null, null).then((_) {
|
| + try {
|
| + var compiler = injector.get(Compiler);
|
| + var viewFactory = compiler(rootElements, injector.get(DirectiveMap));
|
| + viewFactory(injector, rootElements);
|
| + } catch (e, s) {
|
| + exceptionHandler(e, s);
|
| + }
|
| + });
|
| + return injector;
|
| + });
|
| + }
|
| +
|
| +/**
|
| +* Creates an injector function that can be used for retrieving services as well as for
|
| +* dependency injection.
|
| +*/
|
| + Injector createInjector();
|
| +}
|
|
|