(bugfix) fix unmatched selector error when template didnt contain any html

This commit is contained in:
Kim Biesbjerg 2019-06-13 12:32:18 +02:00
parent 3e43fde1cc
commit e0178b5a97
2 changed files with 30 additions and 3 deletions

View File

@ -4,7 +4,7 @@ import { isPathAngularComponent, extractComponentInlineTemplate } from '../utils
import * as cheerio from 'cheerio';
const $ = cheerio.load('', {xmlMode: true});
const $ = cheerio.load('', { xmlMode: true });
export class DirectiveParser implements ParserInterface {
@ -19,9 +19,9 @@ export class DirectiveParser implements ParserInterface {
protected parseTemplate(template: string): TranslationCollection {
let collection: TranslationCollection = new TranslationCollection();
template = this.normalizeTemplateAttributes(template);
const selector = '[translate], [ng2-translate]';
template = this.prepareTemplate(template);
$(template)
.find(selector)
.addBack(selector)
@ -45,6 +45,12 @@ export class DirectiveParser implements ParserInterface {
return collection;
}
protected prepareTemplate(template: string): string {
return this.wrapTemplate(
this.normalizeTemplateAttributes(template)
);
}
/**
* Angular's `[attr]="'val'"` syntax is not valid HTML,
* so it can't be parsed by standard HTML parsers.
@ -54,4 +60,11 @@ export class DirectiveParser implements ParserInterface {
return template.replace(/\[([^\]]+)\]="'([^']*)'"/g, '$1="$2"');
}
/**
* Wraps template in tag
*/
protected wrapTemplate(template: string, tag: string = 'div'): string {
return `<${tag}>${template}</${tag}>`;
}
}

View File

@ -124,4 +124,18 @@ describe('DirectiveParser', () => {
expect(keys).to.deep.equal(['Hello World']);
});
it('should not cause error when no html is present in template', () => {
const contents = `
import { Component } from '@angular/core';
@Component({
template: '{{ variable }}'
})
export class MyComponent {
variable: string
}
`;
const keys = parser.extract(contents, componentFilename).keys();
expect(keys).to.deep.equal([]);
});
});