import * as path from 'path' ; import * as ts from 'typescript' ; import * as Lint from 'tslint' ; import * as minimatch from 'minimatch' ; import * as fs from 'fs' ; /**
 * Rule that walks through all TypeScript files of public packages and shows failures if a
 * file does not have the license banner at the top of the file.
 */ export class Rule extends Lint . Rules . AbstractRule { public static metadata : Lint . IRuleMetadata = { ruleName : 'adf-license-banner' , type : 'maintainability' , description : `` , descriptionDetails : `` , rationale : `` , options : null , optionsDescription : `Not configurable.` , typescriptOnly : true , } ; static FAILURE_STRING : string = 'Missing license header in this TypeScript ' + 'file Every TypeScript file of the library needs to have the Alfresco license banner at the top.' ; public apply ( sourceFile ) { return this . applyWithWalker ( new ADFLicenseBannerRule ( sourceFile , this . getOptions ( ) ) ) ; } } class ADFLicenseBannerRule extends Lint . RuleWalker { /** Whether the walker should check the current source file. */ private _enabled : boolean ; private licensePath : string ; constructor ( sourceFile , options ) { super ( sourceFile , options ) ; const fileGlobs = options . ruleArguments ; this . licensePath = options . ruleArguments [ 1 ] ; const relativeFilePath = path . relative ( process . cwd ( ) , sourceFile . fileName ) ; this . _enabled = fileGlobs . some ( p => minimatch ( relativeFilePath , p ) ) ; } visitSourceFile ( sourceFile ) { if ( ! this . _enabled ) { return ; } const fileContent = sourceFile . getFullText ( ) ; const licenseBanner = fs . readFileSync ( this . licensePath , 'utf8' ) ; const licenseCommentPos = fileContent . indexOf ( licenseBanner ) ; const tslintFix = Lint . Replacement . appendText ( 0 , licenseBanner + '\n\n' ) ; if ( licenseCommentPos !== 0 ) { return this . addFailureAt ( 0 , 0 , Rule . FAILURE_STRING , tslintFix ) ; } super . visitSourceFile ( sourceFile ) ; } }