From c0c08c19220c2885b35e8494c71b7f88b9d655bf Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Thu, 6 Apr 2017 15:38:23 -0600 Subject: [PATCH 1/8] Make the ending comma/curlybrace after templateUrl optional. --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 587cf75..4774feb 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ var loaderUtils = require("loader-utils"); // using: regex, capture groups, and capture group variables. -var templateUrlRegex = /templateUrl\s*:(\s*['"`](.*?)['"`]\s*([,}]))/gm; +var templateUrlRegex = /templateUrl\s*:(\s*['"`](.*?)['"`]\s*([,}])?)/gm; var stylesRegex = /styleUrls *:(\s*\[[^\]]*?\])/g; var stringRegex = /(['`"])((?:[^\\]\\\1|.)*?)\1/g; From 57ed7fd48003d3236f75936dabd82eacc0b47767 Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Wed, 26 Apr 2017 19:14:52 -0600 Subject: [PATCH 2/8] Fix test for source with inner quotes. --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 4774feb..73a9ff5 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ var loaderUtils = require("loader-utils"); // using: regex, capture groups, and capture group variables. -var templateUrlRegex = /templateUrl\s*:(\s*['"`](.*?)['"`]\s*([,}])?)/gm; +var templateUrlRegex = /templateUrl\s*:(\s*['"`](.*?)([^\\]['"`])\s*)/gm; var stylesRegex = /styleUrls *:(\s*\[[^\]]*?\])/g; var stringRegex = /(['`"])((?:[^\\]\\\1|.)*?)\1/g; From 93e87a2dd51662c0ccb518ac3937f61c2ce67d6e Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Wed, 26 Apr 2017 19:34:20 -0600 Subject: [PATCH 3/8] Add test for templateUrl appearing last (and without comma) --- .../component_with_template_url_last.js | 12 ++++++++++++ test/fixtures/index.js | 2 ++ test/loader.spec.js | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 test/fixtures/component_with_template_url_last.js diff --git a/test/fixtures/component_with_template_url_last.js b/test/fixtures/component_with_template_url_last.js new file mode 100644 index 0000000..7f0a12c --- /dev/null +++ b/test/fixtures/component_with_template_url_last.js @@ -0,0 +1,12 @@ +var componentWithTemplateUrlLast = ` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + styleUrls: ['./app/css/styles.css'], + templateUrl: './some/path/to/file.html' + }) + export class TestComponent {} +`; + +module.exports = componentWithTemplateUrlLast; diff --git a/test/fixtures/index.js b/test/fixtures/index.js index b45a94a..2da0c36 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -5,6 +5,7 @@ var componentWithoutRelPeriodSlash = require('./component_without_relative_perio var componentWithSpacing = require('./component_with_spacing.js'); var componentWithSingleLineDecorator = require('./component_with_single_line_decorator.js'); var componentWithTemplateUrlEndingBySpace = require('./component_with_template_url_ending_by_space.js'); +var componentWithTemplateUrlLast = require('./component_with_template_url_last.js'); exports.simpleAngularTestComponentFileStringSimple = sampleAngularComponentSimpleFixture; exports.componentWithQuoteInUrls = componentWithQuoteInUrls; @@ -13,3 +14,4 @@ exports.componentWithoutRelPeriodSlash = componentWithoutRelPeriodSlash; exports.componentWithSpacing = componentWithSpacing; exports.componentWithSingleLineDecorator = componentWithSingleLineDecorator; exports.componentWithTemplateUrlEndingBySpace = componentWithTemplateUrlEndingBySpace; +exports.componentWithTemplateUrlLast = componentWithTemplateUrlLast; diff --git a/test/loader.spec.js b/test/loader.spec.js index ea730ac..cf5339e 100644 --- a/test/loader.spec.js +++ b/test/loader.spec.js @@ -194,4 +194,23 @@ describe("loader", function() { }); + it("Should convert templateUrl properties when they appear last.", function() { + + loader.call({}, fixtures.componentWithTemplateUrlEndingBySpace) + .should + .be + .eql(` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + template: require('./some/path/to/file.html'), + styles: [require('./app/css/styles.css')] + }) + export class TestComponent {} +` + ) + + }); + }); From 9de542342ff521b2c6e1c14938ff972de9558fc6 Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Wed, 26 Apr 2017 19:38:32 -0600 Subject: [PATCH 4/8] Fix new test to assert against correct fixture (copy/paste error) --- test/loader.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/loader.spec.js b/test/loader.spec.js index cf5339e..67bbc46 100644 --- a/test/loader.spec.js +++ b/test/loader.spec.js @@ -196,7 +196,7 @@ describe("loader", function() { it("Should convert templateUrl properties when they appear last.", function() { - loader.call({}, fixtures.componentWithTemplateUrlEndingBySpace) + loader.call({}, fixtures.componentWithTemplateUrlLast) .should .be .eql(` @@ -204,8 +204,8 @@ describe("loader", function() { @Component({ selector: 'test-component', - template: require('./some/path/to/file.html'), - styles: [require('./app/css/styles.css')] + styles: [require('./app/css/styles.css')], + template: require('./some/path/to/file.html') }) export class TestComponent {} ` From 9607688c7e3cf53b9b4bda1b5519ba9d7cec00ff Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Thu, 27 Apr 2017 09:45:31 -0600 Subject: [PATCH 5/8] Add test for when comment starts after templateUrl --- ...mponent_with_comment_after_template_url.js | 12 +++++++++++ test/fixtures/index.js | 2 ++ test/loader.spec.js | 20 ++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/component_with_comment_after_template_url.js diff --git a/test/fixtures/component_with_comment_after_template_url.js b/test/fixtures/component_with_comment_after_template_url.js new file mode 100644 index 0000000..b78a85b --- /dev/null +++ b/test/fixtures/component_with_comment_after_template_url.js @@ -0,0 +1,12 @@ +var componentWithCommentAfterTemplateUrl = ` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + templateUrl: './some/path/to/file.html', /*my awesome template*/ + styleUrls: ['./app/css/styles.css'] + }) + export class TestComponent {} +`; + +module.exports = componentWithCommentAfterTemplateUrl; diff --git a/test/fixtures/index.js b/test/fixtures/index.js index 2da0c36..a54eb07 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -6,6 +6,7 @@ var componentWithSpacing = require('./component_with_spacing.js'); var componentWithSingleLineDecorator = require('./component_with_single_line_decorator.js'); var componentWithTemplateUrlEndingBySpace = require('./component_with_template_url_ending_by_space.js'); var componentWithTemplateUrlLast = require('./component_with_template_url_last.js'); +var componentWithCommentAfterTemplateUrl = require('./component_with_comment_after_template_url'); exports.simpleAngularTestComponentFileStringSimple = sampleAngularComponentSimpleFixture; exports.componentWithQuoteInUrls = componentWithQuoteInUrls; @@ -15,3 +16,4 @@ exports.componentWithSpacing = componentWithSpacing; exports.componentWithSingleLineDecorator = componentWithSingleLineDecorator; exports.componentWithTemplateUrlEndingBySpace = componentWithTemplateUrlEndingBySpace; exports.componentWithTemplateUrlLast = componentWithTemplateUrlLast; +exports.componentWithCommentAfterTemplateUrl = componentWithCommentAfterTemplateUrl; diff --git a/test/loader.spec.js b/test/loader.spec.js index 67bbc46..1fb3980 100644 --- a/test/loader.spec.js +++ b/test/loader.spec.js @@ -193,7 +193,6 @@ describe("loader", function() { ) }); - it("Should convert templateUrl properties when they appear last.", function() { loader.call({}, fixtures.componentWithTemplateUrlLast) @@ -213,4 +212,23 @@ describe("loader", function() { }); + it("Should convert templateUrl properties there is a comment after them.", function() { + + loader.call({}, fixtures.componentWithCommentAfterTemplateUrl) + .should + .be + .eql(` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + template: require('./some/path/to/file.html'), /*my awesome template*/ + styles: [require('./app/css/styles.css')] + }) + export class TestComponent {} +` + ) + + }); + }); From 86e500230dc515789c16bccde8f323b1b73e545a Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Thu, 27 Apr 2017 09:48:35 -0600 Subject: [PATCH 6/8] Match more closely the trailing comment without comma scenario in test. --- test/fixtures/component_with_comment_after_template_url.js | 3 +-- test/loader.spec.js | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/test/fixtures/component_with_comment_after_template_url.js b/test/fixtures/component_with_comment_after_template_url.js index b78a85b..c6e8740 100644 --- a/test/fixtures/component_with_comment_after_template_url.js +++ b/test/fixtures/component_with_comment_after_template_url.js @@ -3,8 +3,7 @@ var componentWithCommentAfterTemplateUrl = ` @Component({ selector: 'test-component', - templateUrl: './some/path/to/file.html', /*my awesome template*/ - styleUrls: ['./app/css/styles.css'] + templateUrl: './some/path/to/file.html' /*my awesome template*/ }) export class TestComponent {} `; diff --git a/test/loader.spec.js b/test/loader.spec.js index 1fb3980..3ab52ec 100644 --- a/test/loader.spec.js +++ b/test/loader.spec.js @@ -222,8 +222,7 @@ describe("loader", function() { @Component({ selector: 'test-component', - template: require('./some/path/to/file.html'), /*my awesome template*/ - styles: [require('./app/css/styles.css')] + template: require('./some/path/to/file.html') /*my awesome template*/ }) export class TestComponent {} ` From a9931df8c2fb7e5df713f04d964ab12ea4babf74 Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Thu, 27 Apr 2017 15:40:46 -0600 Subject: [PATCH 7/8] Adding test for when there is a comment between the decorator and class. --- ...ith_comment_between_decorator_and_class.js | 16 +++++++++++++ test/fixtures/index.js | 2 ++ test/loader.spec.js | 24 ++++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/component_with_comment_between_decorator_and_class.js diff --git a/test/fixtures/component_with_comment_between_decorator_and_class.js b/test/fixtures/component_with_comment_between_decorator_and_class.js new file mode 100644 index 0000000..8159431 --- /dev/null +++ b/test/fixtures/component_with_comment_between_decorator_and_class.js @@ -0,0 +1,16 @@ +var componentWithCommentBetweenDecoratorAndClass = ` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + templateUrl: './some/path/to/file.html', + styleUrls : ['./app/css/styles.css'] + }) + + /* + * Comment + */ + export class TestComponent { } +`; + +module.exports = componentWithCommentBetweenDecoratorAndClass; diff --git a/test/fixtures/index.js b/test/fixtures/index.js index a54eb07..e4e3bfe 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -7,6 +7,7 @@ var componentWithSingleLineDecorator = require('./component_with_single_line_dec var componentWithTemplateUrlEndingBySpace = require('./component_with_template_url_ending_by_space.js'); var componentWithTemplateUrlLast = require('./component_with_template_url_last.js'); var componentWithCommentAfterTemplateUrl = require('./component_with_comment_after_template_url'); +var componentWithCommentBetweenDecoratorAndClass = require('./component_with_comment_between_decorator_and_class.js'); exports.simpleAngularTestComponentFileStringSimple = sampleAngularComponentSimpleFixture; exports.componentWithQuoteInUrls = componentWithQuoteInUrls; @@ -17,3 +18,4 @@ exports.componentWithSingleLineDecorator = componentWithSingleLineDecorator; exports.componentWithTemplateUrlEndingBySpace = componentWithTemplateUrlEndingBySpace; exports.componentWithTemplateUrlLast = componentWithTemplateUrlLast; exports.componentWithCommentAfterTemplateUrl = componentWithCommentAfterTemplateUrl; +exports.componentWithCommentBetweenDecoratorAndClass = componentWithCommentBetweenDecoratorAndClass; diff --git a/test/loader.spec.js b/test/loader.spec.js index 3ab52ec..7c97b41 100644 --- a/test/loader.spec.js +++ b/test/loader.spec.js @@ -212,7 +212,7 @@ describe("loader", function() { }); - it("Should convert templateUrl properties there is a comment after them.", function() { + it("Should convert templateUrl properties when there is a comment after them.", function() { loader.call({}, fixtures.componentWithCommentAfterTemplateUrl) .should @@ -230,4 +230,26 @@ describe("loader", function() { }); + it("Should convert templateUrl properties when there is a comment between decorator and class.", function() { + + loader.call({}, fixtures.componentWithCommentBetweenDecoratorAndClass) + .should + .be + .eql(` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + template: require('./some/path/to/file.html'), + styles: [require('./app/css/styles.css')] + }) + + /* + * Comment + */ + export class TestComponent { } +` + ) + + }); }); From df9ce1c5d3fb7a6f0a64aec0ffce0f92a9518b72 Mon Sep 17 00:00:00 2001 From: Jeremy Pridemore Date: Thu, 27 Apr 2017 15:55:26 -0600 Subject: [PATCH 8/8] Adding common problem case to tests of commented out styles property --- .../component_with_only_template_url.js | 12 ++++++++++++ test/fixtures/index.js | 4 +++- test/loader.spec.js | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/component_with_only_template_url.js diff --git a/test/fixtures/component_with_only_template_url.js b/test/fixtures/component_with_only_template_url.js new file mode 100644 index 0000000..42afec0 --- /dev/null +++ b/test/fixtures/component_with_only_template_url.js @@ -0,0 +1,12 @@ +var componentWithOnlyTemplateUrl = ` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + templateUrl: './some/path/to/file.html' + //styleUrls: ['./app/css/styles.css'] + }) + export class TestComponent {} +`; + +module.exports = componentWithOnlyTemplateUrl; diff --git a/test/fixtures/index.js b/test/fixtures/index.js index e4e3bfe..be37504 100644 --- a/test/fixtures/index.js +++ b/test/fixtures/index.js @@ -6,8 +6,9 @@ var componentWithSpacing = require('./component_with_spacing.js'); var componentWithSingleLineDecorator = require('./component_with_single_line_decorator.js'); var componentWithTemplateUrlEndingBySpace = require('./component_with_template_url_ending_by_space.js'); var componentWithTemplateUrlLast = require('./component_with_template_url_last.js'); -var componentWithCommentAfterTemplateUrl = require('./component_with_comment_after_template_url'); +var componentWithCommentAfterTemplateUrl = require('./component_with_comment_after_template_url.js'); var componentWithCommentBetweenDecoratorAndClass = require('./component_with_comment_between_decorator_and_class.js'); +var componentWithOnlyTemplateUrl = require('./component_with_only_template_url.js'); exports.simpleAngularTestComponentFileStringSimple = sampleAngularComponentSimpleFixture; exports.componentWithQuoteInUrls = componentWithQuoteInUrls; @@ -19,3 +20,4 @@ exports.componentWithTemplateUrlEndingBySpace = componentWithTemplateUrlEndingBy exports.componentWithTemplateUrlLast = componentWithTemplateUrlLast; exports.componentWithCommentAfterTemplateUrl = componentWithCommentAfterTemplateUrl; exports.componentWithCommentBetweenDecoratorAndClass = componentWithCommentBetweenDecoratorAndClass; +exports.componentWithOnlyTemplateUrl = componentWithOnlyTemplateUrl; diff --git a/test/loader.spec.js b/test/loader.spec.js index 7c97b41..7000591 100644 --- a/test/loader.spec.js +++ b/test/loader.spec.js @@ -252,4 +252,23 @@ describe("loader", function() { ) }); + + it("Should convert templateUrl properties when there is no styles or stylesUrl property.", function() { + + loader.call({}, fixtures.componentWithOnlyTemplateUrl) + .should + .be + .eql(` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test-component', + template: require('./some/path/to/file.html') + //styles: [require('./app/css/styles.css')] + }) + export class TestComponent {} +` + ) + + }); });