Skip to content

Commit

Permalink
feat(rules): add ion-radio-group-is-now-an-element rule
Browse files Browse the repository at this point in the history
  • Loading branch information
imhoffd committed Jul 6, 2018
1 parent 591b10a commit eb933cc
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 14 deletions.
19 changes: 5 additions & 14 deletions src/helpers/directiveToElement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,13 @@ export function generateDescription(directive: string, resultantElement: string)
export function createDirectiveToElementTemplateVisitorClass(directive: string, resultantElement: string) {
return class extends BasicTemplateAstVisitor {
visitElement(element: ast.ElementAst, context: any): any {
if (element.name) {
const InvalidSyntaxBoxRe = new RegExp(`<\\w+[\\s\\S]+?(${directive})[\\s\\S]*?>`, 'gi');
const foundAttr = element.attrs.find(attr => attr.name === directive);

let error = generateDescription(directive, resultantElement);
if (foundAttr) {
const start = foundAttr.sourceSpan.start.offset;
const absolutePosition = this.getSourcePosition(start - 1);

const expr = element.sourceSpan.toString();

let matches;

while ((matches = InvalidSyntaxBoxRe.exec(expr)) !== null) {
const index = expr.indexOf(directive);
const start = element.sourceSpan.start.offset + index;
const absolutePosition = this.getSourcePosition(start - 1);

this.addFailure(this.createFailure(start, directive.length, error));
}
this.addFailure(this.createFailure(start, directive.length, generateDescription(directive, resultantElement)));
}

super.visitElement(element, context);
Expand Down
6 changes: 6 additions & 0 deletions src/ionRadioGroupIsNowAnElementRule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { createDirectiveToElementRuleClass } from './helpers/directiveToElement';

const directive = 'radio-group';

export const ruleName = 'ion-radio-group-is-now-an-element';
export const Rule = createDirectiveToElementRuleClass(ruleName, directive, 'ion-radio-group');
50 changes: 50 additions & 0 deletions test/ionRadioGroupIsNowAnElement.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { ruleName } from '../src/ionRadioGroupIsNowAnElementRule';
import { assertAnnotated, assertSuccess } from './testHelper';

describe(ruleName, () => {
describe('success', () => {
it('should work with proper style', () => {
let source = `
@Component({
template: \`
<ion-list>
<ion-radio-group>
<ion-item>
<ion-label>Apple</ion-label>
<ion-radio slot="start" value="apple"></ion-radio>
</ion-item>
</ion-radio-group>
</ion-list>
\`
})
class Bar{}
`;
assertSuccess(ruleName, source);
});
});

describe('failure', () => {
it('should fail when radio-group attribute is used on ion-list', () => {
let source = `
@Component({
template: \`
<ion-list radio-group>
~~~~~~~~~~~
<ion-item>
<ion-label>Apple</ion-label>
<ion-radio value="apple"></ion-radio>
</ion-item>
</ion-list>
\`
})
class Bar{}
`;

assertAnnotated({
ruleName,
message: 'radio-group is now an ion-radio-group element instead of an Angular directive.',
source
});
});
});
});

0 comments on commit eb933cc

Please sign in to comment.