OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// Transformer used for pub serve and pub build | 5 /// Transformer used for pub serve and pub build |
6 library web_components.build.web_components; | 6 library web_components.build.web_components; |
7 | 7 |
8 import 'dart:async'; | 8 import 'dart:async'; |
9 import 'package:barback/barback.dart'; | 9 import 'package:barback/barback.dart'; |
10 import 'package:code_transformers/assets.dart'; | 10 import 'package:code_transformers/assets.dart'; |
11 import 'package:code_transformers/messages/build_logger.dart'; | 11 import 'package:code_transformers/messages/build_logger.dart'; |
12 import 'package:code_transformers/resolver.dart'; | 12 import 'package:code_transformers/resolver.dart'; |
13 import 'package:html5lib/dom.dart' as dom; | 13 import 'package:html5lib/dom.dart' as dom; |
14 import 'package:initialize/transformer.dart' show generateBootstrapFile; | 14 import 'package:initialize/transformer.dart' show generateBootstrapFile; |
| 15 import 'package:initialize/build/initializer_plugin.dart'; |
15 import 'package:path/path.dart' as path; | 16 import 'package:path/path.dart' as path; |
16 import 'package:web_components/transformer.dart'; | 17 import 'package:web_components/transformer.dart'; |
17 import 'common.dart'; | 18 import 'common.dart'; |
18 | 19 |
| 20 /// Public method that can be used inside any [Transformer] which already has a |
| 21 /// [Resolver] and [Transform] to generate a bootstrap file for the |
| 22 /// web_components package. |
| 23 Asset generateWebComponentsBootstrap(Resolver resolver, Transform transform, |
| 24 dom.Document document, AssetId scriptId, AssetId newScriptId, |
| 25 {List<InitializerPlugin> extraPlugins: const []}) { |
| 26 var htmlImportRecorder = new HtmlImportAnnotationRecorder(); |
| 27 var plugins = [htmlImportRecorder]..addAll(extraPlugins); |
| 28 |
| 29 // Bootstrap the application using the `initialize` package and our |
| 30 // plugins. |
| 31 var initializeBootstrap = generateBootstrapFile( |
| 32 resolver, transform, scriptId, newScriptId, |
| 33 errorIfNotFound: false, plugins: plugins); |
| 34 |
| 35 // Add all seen imports to the document. |
| 36 for (var importPath in htmlImportRecorder.importPaths) { |
| 37 document.head.append(new dom.Element.tag('link') |
| 38 ..attributes = {'rel': 'import', 'href': importPath,}); |
| 39 } |
| 40 |
| 41 return initializeBootstrap; |
| 42 } |
| 43 |
19 /// A [Transformer] which runs the `initialize` transformer with | 44 /// A [Transformer] which runs the `initialize` transformer with |
20 /// some special plugins and also inlines the html imports. | 45 /// some special plugins and also inlines the html imports. |
21 class WebComponentsTransformer extends Transformer { | 46 class WebComponentsTransformer extends Transformer { |
22 final Resolvers _resolvers; | 47 final Resolvers _resolvers; |
23 TransformOptions options; | 48 TransformOptions options; |
24 | 49 |
25 WebComponentsTransformer(this.options) : _resolvers = new Resolvers.fromMock({ | 50 WebComponentsTransformer(this.options) : _resolvers = new Resolvers.fromMock({ |
26 // The list of types below is derived from: | 51 // The list of types below is derived from: |
27 // * types that are used internally by the resolver (see | 52 // * types that are used internally by the resolver (see |
28 // _initializeFrom in resolver.dart). | 53 // _initializeFrom in resolver.dart). |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 // Find the dart script in the page. | 109 // Find the dart script in the page. |
85 var doc = parseHtml(html, primaryInput.id.path); | 110 var doc = parseHtml(html, primaryInput.id.path); |
86 var mainScriptTag = doc.querySelector('script[type="$dartType"]'); | 111 var mainScriptTag = doc.querySelector('script[type="$dartType"]'); |
87 var scriptId = uriToAssetId(primaryInput.id, | 112 var scriptId = uriToAssetId(primaryInput.id, |
88 mainScriptTag.attributes['src'], logger, mainScriptTag.sourceSpan); | 113 mainScriptTag.attributes['src'], logger, mainScriptTag.sourceSpan); |
89 | 114 |
90 return _resolvers.get(transform, [scriptId]).then((resolver) { | 115 return _resolvers.get(transform, [scriptId]).then((resolver) { |
91 var newScriptId = new AssetId(scriptId.package, | 116 var newScriptId = new AssetId(scriptId.package, |
92 '${path.url.withoutExtension(scriptId.path)}.initialize.dart'); | 117 '${path.url.withoutExtension(scriptId.path)}.initialize.dart'); |
93 | 118 |
94 // Bootstrap the application using the `initialize` package and the | 119 var bootstrap = generateWebComponentsBootstrap( |
95 // html import annotation recorder plugin. | 120 resolver, transform, doc, scriptId, newScriptId); |
96 var htmlImportRecorder = new HtmlImportAnnotationRecorder(); | |
97 var initializeBootstrap = generateBootstrapFile( | |
98 resolver, transform, scriptId, newScriptId, | |
99 errorIfNotFound: false, plugins: [htmlImportRecorder]); | |
100 transform.addOutput(initializeBootstrap); | |
101 | |
102 // Add all seen imports to the document. | |
103 for (var importPath in htmlImportRecorder.importPaths) { | |
104 doc.head.append(new dom.Element.tag('link') | |
105 ..attributes = {'rel': 'import', 'href': importPath,}); | |
106 } | |
107 | 121 |
108 // Swap out the main script tag for the bootstrap version. | 122 // Swap out the main script tag for the bootstrap version. |
109 mainScriptTag.attributes['src'] = path.url.relative( | 123 mainScriptTag.attributes['src'] = path.url.relative(bootstrap.id.path, |
110 initializeBootstrap.id.path, | |
111 from: path.url.dirname(primaryInput.id.path)); | 124 from: path.url.dirname(primaryInput.id.path)); |
112 | 125 |
| 126 // Output the new document and bootstrap file. |
113 transform | 127 transform |
114 .addOutput(new Asset.fromString(primaryInput.id, doc.outerHtml)); | 128 .addOutput(new Asset.fromString(primaryInput.id, doc.outerHtml)); |
| 129 transform.addOutput(bootstrap); |
115 }); | 130 }); |
116 }); | 131 }); |
117 } | 132 } |
118 } | 133 } |
OLD | NEW |