Implement deferred libraries to work with dependency injection and other angular codegen. This is done by not initializing the library in the parent ng_deps file when it is declared as deferred, rewriting the import and, chaining a future that initializes the library in any files that are using deferred libraries which need angular codegen.
50 lines
1.6 KiB
Dart
50 lines
1.6 KiB
Dart
library angular2.transform.deferred_rewriter.transformer;
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:angular2/src/transform/common/asset_reader.dart';
|
|
import 'package:angular2/src/transform/common/logging.dart' as log;
|
|
import 'package:angular2/src/transform/common/names.dart';
|
|
import 'package:angular2/src/transform/common/options.dart';
|
|
import 'package:barback/barback.dart';
|
|
|
|
import 'rewriter.dart';
|
|
|
|
/// Transformer responsible for rewriting deferred library loads to enable
|
|
/// initializing the reflector in a deferred way to keep the code with the
|
|
/// deferred library.
|
|
class DeferredRewriter extends Transformer {
|
|
final TransformerOptions options;
|
|
|
|
DeferredRewriter(this.options);
|
|
|
|
@override
|
|
bool isPrimary(AssetId id) =>
|
|
id.extension.endsWith('dart') && !id.path.endsWith(DEPS_EXTENSION);
|
|
|
|
@override
|
|
Future apply(Transform transform) async {
|
|
log.init(transform);
|
|
|
|
try {
|
|
var asset = transform.primaryInput;
|
|
var reader = new AssetReader.fromTransform(transform);
|
|
var transformedCode = await rewriteDeferredLibraries(reader, asset.id);
|
|
if (transformedCode != null) {
|
|
transform.addOutput(
|
|
new Asset.fromString(transform.primaryInput.id, transformedCode));
|
|
}
|
|
} catch (ex, stackTrace) {
|
|
log.logger.warning('Rewritting deferred libraries failed.\n'
|
|
'Exception: $ex\n'
|
|
'Stack Trace: $stackTrace');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Visible for testing
|
|
Future<String> rewriteDeferredLibraries(AssetReader reader, AssetId id) async {
|
|
var rewriter = new Rewriter(id, reader);
|
|
return await rewriter.rewrite();
|
|
}
|