| 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 library web_components.build.import_inliner; | 4 library web_components.build.import_inliner; |
| 5 | 5 |
| 6 import 'dart:async'; | 6 import 'dart:async'; |
| 7 import 'dart:collection' show LinkedHashMap; | 7 import 'dart:collection' show LinkedHashMap; |
| 8 import 'package:barback/barback.dart'; | 8 import 'package:barback/barback.dart'; |
| 9 import 'package:code_transformers/assets.dart'; | 9 import 'package:code_transformers/assets.dart'; |
| 10 import 'package:code_transformers/messages/build_logger.dart'; | 10 import 'package:code_transformers/messages/build_logger.dart'; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 if (entryPoints != null) return entryPoints.contains(id.path); | 31 if (entryPoints != null) return entryPoints.contains(id.path); |
| 32 // If no entry point is supplied, then any html file under web/ or test/ is | 32 // If no entry point is supplied, then any html file under web/ or test/ is |
| 33 // an entry point. | 33 // an entry point. |
| 34 return (id.path.startsWith('web/') || id.path.startsWith('test/')) && | 34 return (id.path.startsWith('web/') || id.path.startsWith('test/')) && |
| 35 id.path.endsWith('.html'); | 35 id.path.endsWith('.html'); |
| 36 } | 36 } |
| 37 | 37 |
| 38 apply(Transform transform) { | 38 apply(Transform transform) { |
| 39 var logger = new BuildLogger(transform, convertErrorsToWarnings: true); | 39 var logger = new BuildLogger(transform, convertErrorsToWarnings: true); |
| 40 return new ImportInliner(transform, transform.primaryInput.id, logger, | 40 return new ImportInliner(transform, transform.primaryInput.id, logger, |
| 41 bindingStartDelimiters: bindingStartDelimiters).run(); | 41 bindingStartDelimiters: bindingStartDelimiters) |
| 42 .run(); |
| 42 } | 43 } |
| 43 } | 44 } |
| 44 | 45 |
| 45 /// Helper class which actually does all the inlining of html imports for a | 46 /// Helper class which actually does all the inlining of html imports for a |
| 46 /// single entry point. | 47 /// single entry point. |
| 47 class ImportInliner { | 48 class ImportInliner { |
| 48 // Can be an AggregateTransform or Transform | 49 // Can be an AggregateTransform or Transform |
| 49 final transform; | 50 final transform; |
| 50 // The primary input to start from. | 51 // The primary input to start from. |
| 51 final AssetId primaryInput; | 52 final AssetId primaryInput; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 64 | 65 |
| 65 // Normalize urls in the entry point. | 66 // Normalize urls in the entry point. |
| 66 var changed = new _UrlNormalizer( | 67 var changed = new _UrlNormalizer( |
| 67 primaryInput, primaryInput, logger, bindingStartDelimiters) | 68 primaryInput, primaryInput, logger, bindingStartDelimiters) |
| 68 .visit(primaryDocument); | 69 .visit(primaryDocument); |
| 69 | 70 |
| 70 // Inline things if needed, always have at least one (the entry point). | 71 // Inline things if needed, always have at least one (the entry point). |
| 71 if (imports.length > 1) { | 72 if (imports.length > 1) { |
| 72 _inlineImports(primaryDocument, imports); | 73 _inlineImports(primaryDocument, imports); |
| 73 } else if (!changed && | 74 } else if (!changed && |
| 74 primaryDocument.querySelectorAll('link[rel="import"]').where( | 75 primaryDocument |
| 75 (import) => import.attributes['type'] != 'css').length == | 76 .querySelectorAll('link[rel="import"]') |
| 77 .where((import) => import.attributes['type'] != 'css') |
| 78 .length == |
| 76 0) { | 79 0) { |
| 77 // If there were no url changes and no imports, then we are done. | 80 // If there were no url changes and no imports, then we are done. |
| 78 return; | 81 return; |
| 79 } | 82 } |
| 80 | 83 |
| 81 primaryDocument | 84 primaryDocument |
| 82 .querySelectorAll('link[rel="import"]') | 85 .querySelectorAll('link[rel="import"]') |
| 83 .where((import) => import.attributes['type'] != 'css') | 86 .where((import) => import.attributes['type'] != 'css') |
| 84 .forEach((element) => element.remove()); | 87 .forEach((element) => element.remove()); |
| 85 | 88 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 // polymer package. We should consolidate this logic by either removing it | 169 // polymer package. We should consolidate this logic by either removing it |
| 167 // completely from polymer or exposing it publicly here and using that in | 170 // completely from polymer or exposing it publicly here and using that in |
| 168 // polymer. | 171 // polymer. |
| 169 class _UrlNormalizer extends TreeVisitor { | 172 class _UrlNormalizer extends TreeVisitor { |
| 170 /// [AssetId] for the main entry point. | 173 /// [AssetId] for the main entry point. |
| 171 final AssetId primaryInput; | 174 final AssetId primaryInput; |
| 172 | 175 |
| 173 /// Asset where the original content (and original url) was found. | 176 /// Asset where the original content (and original url) was found. |
| 174 final AssetId sourceId; | 177 final AssetId sourceId; |
| 175 | 178 |
| 176 /// Counter used to ensure that every library name we inject is unique. | |
| 177 int _count = 0; | |
| 178 | |
| 179 /// Path to the top level folder relative to the transform primaryInput. | 179 /// Path to the top level folder relative to the transform primaryInput. |
| 180 /// This should just be some arbitrary # of ../'s. | 180 /// This should just be some arbitrary # of ../'s. |
| 181 final String topLevelPath; | 181 final String topLevelPath; |
| 182 | 182 |
| 183 /// Whether or not the normalizer has changed something in the tree. | 183 /// Whether or not the normalizer has changed something in the tree. |
| 184 bool changed = false; | 184 bool changed = false; |
| 185 | 185 |
| 186 // The start delimiters for template bindings, such as '{{' or '[['. If these | 186 // The start delimiters for template bindings, such as '{{' or '[['. If these |
| 187 // are found before the first `/` in a url, then the url will not be | 187 // are found before the first `/` in a url, then the url will not be |
| 188 // normalized. | 188 // normalized. |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 if (newPath.startsWith('lib/')) { | 296 if (newPath.startsWith('lib/')) { |
| 297 return '${topLevelPath}packages/${id.package}/${newPath.substring(4)}'; | 297 return '${topLevelPath}packages/${id.package}/${newPath.substring(4)}'; |
| 298 } | 298 } |
| 299 | 299 |
| 300 if (newPath.startsWith('asset/')) { | 300 if (newPath.startsWith('asset/')) { |
| 301 return '${topLevelPath}assets/${id.package}/${newPath.substring(6)}'; | 301 return '${topLevelPath}assets/${id.package}/${newPath.substring(6)}'; |
| 302 } | 302 } |
| 303 | 303 |
| 304 if (primaryInput.package != id.package) { | 304 if (primaryInput.package != id.package) { |
| 305 // Technically we shouldn't get there | 305 // Technically we shouldn't get there |
| 306 logger.error(internalErrorDontKnowHowToImport | 306 logger.error( |
| 307 internalErrorDontKnowHowToImport |
| 307 .create({'target': id, 'source': primaryInput, 'extra': ''}), | 308 .create({'target': id, 'source': primaryInput, 'extra': ''}), |
| 308 span: span); | 309 span: span); |
| 309 return href; | 310 return href; |
| 310 } | 311 } |
| 311 | 312 |
| 312 var builder = path.url; | 313 var builder = path.url; |
| 313 return builder.normalize(builder.relative(builder.join('/', newPath), | 314 return builder.normalize(builder.relative(builder.join('/', newPath), |
| 314 from: builder.join('/', builder.dirname(primaryInput.path)))); | 315 from: builder.join('/', builder.dirname(primaryInput.path)))); |
| 315 } | 316 } |
| 316 } | 317 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 '_href', // in a, area, link, base, command | 358 '_href', // in a, area, link, base, command |
| 358 'icon', | 359 'icon', |
| 359 '_icon', // in command | 360 '_icon', // in command |
| 360 'manifest', | 361 'manifest', |
| 361 '_manifest', // in html | 362 '_manifest', // in html |
| 362 'poster', | 363 'poster', |
| 363 '_poster', // in video | 364 '_poster', // in video |
| 364 'src', | 365 'src', |
| 365 '_src', // in audio, embed, iframe, img, input, script, source, track,video | 366 '_src', // in audio, embed, iframe, img, input, script, source, track,video |
| 366 ]; | 367 ]; |
| OLD | NEW |