2015-03-20 15:37:09 -07:00
|
|
|
library angular2.transform.directive_linker.linker;
|
2015-02-27 14:42:21 -08:00
|
|
|
|
|
|
|
import 'dart:async';
|
|
|
|
|
2015-03-18 10:41:54 -07:00
|
|
|
import 'package:angular2/src/transform/common/asset_reader.dart';
|
2015-02-27 14:42:21 -08:00
|
|
|
import 'package:angular2/src/transform/common/logging.dart';
|
|
|
|
import 'package:angular2/src/transform/common/names.dart';
|
2015-03-18 10:41:54 -07:00
|
|
|
import 'package:angular2/src/transform/common/parser.dart';
|
2015-02-27 14:42:21 -08:00
|
|
|
import 'package:barback/barback.dart';
|
|
|
|
import 'package:code_transformers/assets.dart';
|
|
|
|
import 'package:path/path.dart' as path;
|
|
|
|
|
2015-03-18 10:41:54 -07:00
|
|
|
Future<String> linkNgDeps(AssetReader reader, AssetId entryPoint) async {
|
|
|
|
var parser = new Parser(reader);
|
|
|
|
NgDeps ngDeps = await parser.parse(entryPoint);
|
2015-02-27 14:42:21 -08:00
|
|
|
|
2015-03-18 10:41:54 -07:00
|
|
|
if (ngDeps == null) return null;
|
|
|
|
if (ngDeps.imports.isEmpty) return ngDeps.code;
|
2015-02-27 14:42:21 -08:00
|
|
|
|
2015-03-18 10:41:54 -07:00
|
|
|
var allDeps = ngDeps.imports.toList()..addAll(ngDeps.exports);
|
|
|
|
var depList = await _processNgImports(
|
|
|
|
reader, entryPoint, allDeps.map((node) => node.uri.stringValue));
|
2015-02-27 14:42:21 -08:00
|
|
|
|
2015-03-18 10:41:54 -07:00
|
|
|
if (depList.isEmpty) return ngDeps.code;
|
2015-02-27 14:42:21 -08:00
|
|
|
|
2015-03-18 10:41:54 -07:00
|
|
|
var importBuf = new StringBuffer();
|
|
|
|
var declarationBuf = new StringBuffer();
|
|
|
|
for (var i = 0; i < depList.length; ++i) {
|
|
|
|
importBuf.write('''
|
|
|
|
import '${depList[i]}' as i${i};
|
|
|
|
''');
|
2015-02-27 14:42:21 -08:00
|
|
|
declarationBuf.write('i${i}.${SETUP_METHOD_NAME}(${REFLECTOR_VAR_NAME});');
|
|
|
|
}
|
|
|
|
|
2015-03-18 10:41:54 -07:00
|
|
|
var code = ngDeps.code;
|
|
|
|
var importSeamIdx = ngDeps.imports.last.end;
|
|
|
|
var declarationSeamIdx = ngDeps.setupMethod.end - 1;
|
|
|
|
return '${code.substring(0, importSeamIdx)}'
|
|
|
|
'$importBuf'
|
|
|
|
'${code.substring(importSeamIdx, declarationSeamIdx)}'
|
|
|
|
'$declarationBuf'
|
|
|
|
'${code.substring(declarationSeamIdx)}';
|
2015-02-27 14:42:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
String _toDepsUri(String importUri) =>
|
|
|
|
'${path.withoutExtension(importUri)}${DEPS_EXTENSION}';
|
|
|
|
|
|
|
|
bool _isNotDartImport(String importUri) {
|
|
|
|
return !importUri.startsWith('dart:');
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<List<String>> _processNgImports(
|
2015-03-18 10:41:54 -07:00
|
|
|
AssetReader reader, AssetId entryPoint, Iterable<String> imports) {
|
|
|
|
final nullFuture = new Future.value(null);
|
2015-02-27 14:42:21 -08:00
|
|
|
var retVal = <String>[];
|
|
|
|
return Future
|
|
|
|
.wait(imports.where(_isNotDartImport).map(_toDepsUri).map((ngDepsUri) {
|
2015-03-18 10:41:54 -07:00
|
|
|
var importAsset =
|
|
|
|
uriToAssetId(entryPoint, ngDepsUri, logger, null /* span */);
|
|
|
|
if (importAsset == entryPoint) return nullFuture;
|
|
|
|
return reader.hasInput(importAsset).then((hasInput) {
|
|
|
|
if (hasInput) retVal.add(ngDepsUri);
|
2015-02-27 14:42:21 -08:00
|
|
|
});
|
|
|
|
})).then((_) => retVal);
|
|
|
|
}
|