From c39ccb12fd99bff161b5049bd3b5eec3f1a7d14a Mon Sep 17 00:00:00 2001 From: mhartington Date: Thu, 28 Jun 2018 15:04:33 -0400 Subject: [PATCH 1/2] feat(ionItemOptions): add rule ion-item-options --- .angulardoc.json | 4 -- src/ionItemOptionMarkupHasChangedRule.ts | 45 ++++++++++++++++++ src/ionNavbarIsNowIonToolbarRule.ts | 2 +- test/ionItemOptionMarkupHasChanged.spec.ts | 55 ++++++++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-) delete mode 100644 .angulardoc.json create mode 100644 src/ionItemOptionMarkupHasChangedRule.ts create mode 100644 test/ionItemOptionMarkupHasChanged.spec.ts diff --git a/.angulardoc.json b/.angulardoc.json deleted file mode 100644 index f5b8146..0000000 --- a/.angulardoc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "repoId": "a74b340a-2476-460e-8399-b773fa83fda6", - "lastSync": 0 -} \ No newline at end of file diff --git a/src/ionItemOptionMarkupHasChangedRule.ts b/src/ionItemOptionMarkupHasChangedRule.ts new file mode 100644 index 0000000..0898ce9 --- /dev/null +++ b/src/ionItemOptionMarkupHasChangedRule.ts @@ -0,0 +1,45 @@ +import * as ast from '@angular/compiler'; +import { NgWalker } from 'codelyzer/angular/ngWalker'; +import { BasicTemplateAstVisitor } from 'codelyzer/angular/templates/basicTemplateAstVisitor'; +import * as Lint from 'tslint'; +import * as ts from 'typescript'; + +export const ruleName = 'ion-item-option-markup-has-changed'; +export const ruleMessage = 'Inside of ion-item-options, ion-item-option must be used instead of ion-button.'; + +class IonItemOptionMarkupChangedTemplateVisitor extends BasicTemplateAstVisitor { + visitElement(element: ast.ElementAst, context: any): any { + if (element.name && element.name === 'ion-item-options') { + element.children.forEach(child => { + if ( + (child instanceof ast.ElementAst && child.name === 'ion-button') || + (child instanceof ast.ElementAst && child.name === 'button' && !!child.attrs.find(attr => attr.name === 'ion-button')) + ) { + const start = child.sourceSpan.start.offset; + this.addFailure(this.createFailure(start + 1, child.name.length, ruleMessage)); + } + }); + } + super.visitElement(element, context); + } +} + +export class Rule extends Lint.Rules.AbstractRule { + public static metadata: Lint.IRuleMetadata = { + ruleName: ruleName, + type: 'functionality', + description: 'Buttons in ion-item-options have been renamed.', + options: null, + optionsDescription: 'Not configurable.', + typescriptOnly: false, + hasFix: true + }; + + public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { + return this.applyWithWalker( + new NgWalker(sourceFile, this.getOptions(), { + templateVisitorCtrl: IonItemOptionMarkupChangedTemplateVisitor + }) + ); + } +} diff --git a/src/ionNavbarIsNowIonToolbarRule.ts b/src/ionNavbarIsNowIonToolbarRule.ts index 52e3709..577d880 100644 --- a/src/ionNavbarIsNowIonToolbarRule.ts +++ b/src/ionNavbarIsNowIonToolbarRule.ts @@ -8,7 +8,7 @@ import * as ts from 'typescript'; export const ruleName = 'ion-navbar-is-now-ion-toolbar'; const InvalidSyntaxBoxOpen = ''; const InvalidSyntaxBoxClose = ''; -const InvalidSyntaxBoxRe = new RegExp(']*>((.|\n)*?)', 's'); +const InvalidSyntaxBoxRe = new RegExp(']*>((.|\n)*?)'); const ValidSyntaxOpen = ` diff --git a/test/ionItemOptionMarkupHasChanged.spec.ts b/test/ionItemOptionMarkupHasChanged.spec.ts new file mode 100644 index 0000000..8291358 --- /dev/null +++ b/test/ionItemOptionMarkupHasChanged.spec.ts @@ -0,0 +1,55 @@ +import { ruleName, ruleMessage as message } from '../src/ionItemOptionMarkupHasChangedRule'; +import { assertAnnotated, assertSuccess } from './testHelper'; + +describe(ruleName, () => { + describe('success', () => { + it('should work when ion-chip-button is used', () => { + let source = ` + @Component({ + template: \` + + + Item 1 + + + + + + + + \` + }) + class Bar{} + `; + assertSuccess(ruleName, source); + }); + }); + + describe('failure', () => { + it('should fail when ion-button is used', () => { + let source = ` + @Component({ + template: \` + + + Item 1 + + + + + + }) + class Bar{} + `; + + assertAnnotated({ + ruleName, + message, + source + }); + }); + }); +}); From ecf404e1115a6ef18457047dd4b6b704dfba55db Mon Sep 17 00:00:00 2001 From: Daniel Imhoff Date: Thu, 28 Jun 2018 15:04:53 -0500 Subject: [PATCH 2/2] test(rules): add escaped backtick --- test/ionItemOptionMarkupHasChanged.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/ionItemOptionMarkupHasChanged.spec.ts b/test/ionItemOptionMarkupHasChanged.spec.ts index 8291358..14cc637 100644 --- a/test/ionItemOptionMarkupHasChanged.spec.ts +++ b/test/ionItemOptionMarkupHasChanged.spec.ts @@ -41,6 +41,7 @@ describe(ruleName, () => { + \` }) class Bar{} `;