refactor(transformer): precompile stylesheets

Part of #3605
This commit is contained in:
Yegor Jbanov
2015-09-29 17:27:44 -07:00
committed by Tobias Bosch
parent 52236bd765
commit 841f8789fd
10 changed files with 771 additions and 17 deletions

View File

@ -0,0 +1,37 @@
library angular2.transform.stylesheet_compiler.processor;
import 'dart:async';
import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/code/source_module.dart';
import 'package:angular2/src/transform/common/names.dart';
import 'package:angular2/src/transform/common/ng_compiler.dart';
import 'package:angular2/src/compiler/source_module.dart';
import 'package:barback/barback.dart';
AssetId shimmedStylesheetAssetId(AssetId cssAssetId) => new AssetId(
cssAssetId.package, toShimmedStylesheetExtension(cssAssetId.path));
AssetId nonShimmedStylesheetAssetId(AssetId cssAssetId) => new AssetId(
cssAssetId.package, toNonShimmedStylesheetExtension(cssAssetId.path));
Future<Iterable<Asset>> processStylesheet(
AssetReader reader, AssetId stylesheetId) async {
final stylesheetUrl = '${stylesheetId.package}|${stylesheetId.path}';
final templateCompiler = createTemplateCompiler(reader);
final cssText = await reader.readAsString(stylesheetId);
final sourceModules =
templateCompiler.compileStylesheetCodeGen(stylesheetUrl, cssText);
var libraryIdx = 0;
return sourceModules.map((SourceModule module) => new Asset.fromString(
new AssetId.parse('${module.moduleUrl}'),
writeSourceModule(module,
libraryName: '${_getLibBase(module.moduleUrl)}${libraryIdx++}')));
}
final _unsafeCharsPattern = new RegExp(r'[^a-zA-Z0-9_]');
String _getLibBase(String libraryName) {
return libraryName.replaceAll('/', '.').replaceAll(_unsafeCharsPattern, '_');
}

View File

@ -0,0 +1,40 @@
library angular2.transform.stylesheet_compiler.transformer;
import 'dart:async';
import 'package:angular2/src/core/dom/html_adapter.dart';
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:barback/barback.dart';
import 'processor.dart';
/// Pre-compiles CSS stylesheet files to Dart code for Angular 2.
class StylesheetCompiler extends Transformer implements DeclaringTransformer {
StylesheetCompiler();
@override
bool isPrimary(AssetId id) {
return id.path.endsWith(CSS_EXTENSION);
}
@override
declareOutputs(DeclaringTransform transform) {
transform.declareOutput(nonShimmedStylesheetAssetId(transform.primaryId));
transform.declareOutput(shimmedStylesheetAssetId(transform.primaryId));
}
@override
Future apply(Transform transform) async {
await log.initZoned(transform, () async {
Html5LibDomAdapter.makeCurrent();
var reader = new AssetReader.fromTransform(transform);
var outputs = await processStylesheet(reader, transform.primaryInput.id);
outputs.forEach((Asset compiledStylesheet) {
transform.addOutput(compiledStylesheet);
});
});
}
}