From e7ae685bb2575538ef65b32188a99441b7b2d067 Mon Sep 17 00:00:00 2001 From: Maurizio Vitale Date: Wed, 31 Oct 2018 12:59:23 +0000 Subject: [PATCH] Provide a way to specify external license file (#3932) Create another tslint rule adf-enterprise-license --- demo-shell/tslint.json | 3 +- lib/tslint.json | 3 +- license-community.txt | 16 +++++ .../adfEnterpriseLicenseBannerRule.js | 46 +++++++++++++ .../adfEnterpriseLicenseBannerRule.ts | 69 +++++++++++++++++++ tools/tslint-rules/adfLicenseBannerRule.js | 23 ++----- tools/tslint-rules/adfLicenseBannerRule.ts | 27 ++------ tools/tslint-rules/package.json | 2 +- tslint.json | 3 +- 9 files changed, 147 insertions(+), 45 deletions(-) create mode 100644 license-community.txt create mode 100644 tools/tslint-rules/adfEnterpriseLicenseBannerRule.js create mode 100644 tools/tslint-rules/adfEnterpriseLicenseBannerRule.ts diff --git a/demo-shell/tslint.json b/demo-shell/tslint.json index 2a2ae4d21f..ac4d6b382e 100644 --- a/demo-shell/tslint.json +++ b/demo-shell/tslint.json @@ -6,7 +6,8 @@ "rules": { "adf-license-banner": [ true, - "e2e/**/*.ts" + "e2e/**/*.ts", + "./license-community.txt" ], "align": [ true, diff --git a/lib/tslint.json b/lib/tslint.json index bab7f57074..0390b52088 100644 --- a/lib/tslint.json +++ b/lib/tslint.json @@ -9,7 +9,8 @@ "rules": { "adf-license-banner": [ true, - "lib/+(core|content-services|process-services|insights)/**/*.ts" + "lib/+(core|content-services|process-services|insights)/**/*.ts", + "./license-community.txt" ], "align": [ true, diff --git a/license-community.txt b/license-community.txt new file mode 100644 index 0000000000..58ad8b656b --- /dev/null +++ b/license-community.txt @@ -0,0 +1,16 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/tools/tslint-rules/adfEnterpriseLicenseBannerRule.js b/tools/tslint-rules/adfEnterpriseLicenseBannerRule.js new file mode 100644 index 0000000000..086af14e20 --- /dev/null +++ b/tools/tslint-rules/adfEnterpriseLicenseBannerRule.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const Lint = require("tslint"); +const minimatch = require("minimatch"); +const fs = require("fs"); +class Rule extends Lint.Rules.AbstractRule { + apply(sourceFile) { + return this.applyWithWalker(new ADFEnterpriseLicenseBannerRule(sourceFile, this.getOptions())); + } +} +Rule.metadata = { + ruleName: 'adf-enterprise-license-banner', + type: 'maintainability', + description: ``, + descriptionDetails: ``, + rationale: ``, + options: null, + optionsDescription: `Not configurable.`, + typescriptOnly: true, +}; +Rule.FAILURE_STRING = 'Missing license header in this TypeScript ' + + 'file Every TypeScript file of the library needs to have the Alfresco license banner at the top.'; +exports.Rule = Rule; +class ADFEnterpriseLicenseBannerRule extends Lint.RuleWalker { + 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); + } +} diff --git a/tools/tslint-rules/adfEnterpriseLicenseBannerRule.ts b/tools/tslint-rules/adfEnterpriseLicenseBannerRule.ts new file mode 100644 index 0000000000..cad56809de --- /dev/null +++ b/tools/tslint-rules/adfEnterpriseLicenseBannerRule.ts @@ -0,0 +1,69 @@ +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-enterprise-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: ts.SourceFile): Lint.RuleFailure[] { + return this.applyWithWalker( + new ADFEnterpriseLicenseBannerRule(sourceFile, + this.getOptions())); + } +} + +class ADFEnterpriseLicenseBannerRule extends Lint.RuleWalker { + + /** Whether the walker should check the current source file. */ + private _enabled: boolean; + private licensePath: string; + + constructor(sourceFile: ts.SourceFile, options: Lint.IOptions) { + super(sourceFile, options); + + // Globs that are used to determine which files to lint. + const fileGlobs = options.ruleArguments; + this.licensePath = options.ruleArguments[1]; + + // Relative path for the current TypeScript source file. + const relativeFilePath = path.relative(process.cwd(), sourceFile.fileName); + // Whether the file should be checked at all. + this._enabled = fileGlobs.some(p => minimatch(relativeFilePath, p)); + } + + visitSourceFile(sourceFile: ts.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); + } +} diff --git a/tools/tslint-rules/adfLicenseBannerRule.js b/tools/tslint-rules/adfLicenseBannerRule.js index 7a41f4223d..e46c2d0ec0 100644 --- a/tools/tslint-rules/adfLicenseBannerRule.js +++ b/tools/tslint-rules/adfLicenseBannerRule.js @@ -3,23 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const Lint = require("tslint"); const minimatch = require("minimatch"); -const licenseBanner = `/*! - * @license - * Copyright 2016 Alfresco Software, Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */`; -const tslintFix = Lint.Replacement.appendText(0, licenseBanner + '\n\n'); +const fs = require("fs"); class Rule extends Lint.Rules.AbstractRule { apply(sourceFile) { return this.applyWithWalker(new ADFLicenseBannerRule(sourceFile, this.getOptions())); @@ -42,17 +26,18 @@ class ADFLicenseBannerRule extends Lint.RuleWalker { 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); } diff --git a/tools/tslint-rules/adfLicenseBannerRule.ts b/tools/tslint-rules/adfLicenseBannerRule.ts index 1bae758819..077d109dc6 100644 --- a/tools/tslint-rules/adfLicenseBannerRule.ts +++ b/tools/tslint-rules/adfLicenseBannerRule.ts @@ -2,28 +2,7 @@ import * as path from 'path'; import * as ts from 'typescript'; import * as Lint from 'tslint'; import * as minimatch from 'minimatch'; - -/** License banner that is placed at the top of every public TypeScript file. */ -const licenseBanner = `/*! - * @license - * Copyright 2016 Alfresco Software, Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */`; - - -/** TSLint fix that can be used to add the license banner easily. */ -const tslintFix = Lint.Replacement.appendText(0, licenseBanner + '\n\n'); +import * as fs from 'fs'; /** * Rule that walks through all TypeScript files of public packages and shows failures if a @@ -56,12 +35,14 @@ class ADFLicenseBannerRule extends Lint.RuleWalker { /** Whether the walker should check the current source file. */ private _enabled: boolean; + private licensePath: string; constructor(sourceFile: ts.SourceFile, options: Lint.IOptions) { super(sourceFile, options); // Globs that are used to determine which files to lint. const fileGlobs = options.ruleArguments; + this.licensePath = options.ruleArguments[1]; // Relative path for the current TypeScript source file. const relativeFilePath = path.relative(process.cwd(), sourceFile.fileName); @@ -75,8 +56,10 @@ class ADFLicenseBannerRule extends Lint.RuleWalker { } 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); } diff --git a/tools/tslint-rules/package.json b/tools/tslint-rules/package.json index 823341ab5a..a7d317ff2f 100644 --- a/tools/tslint-rules/package.json +++ b/tools/tslint-rules/package.json @@ -1,7 +1,7 @@ { "name": "adf-tslint-rules", "description": "Custom Rules for the ADF project", - "version": "0.0.4", + "version": "0.0.5", "author": "Alfresco Software, Ltd.", "scripts": { "build": "tsc", diff --git a/tslint.json b/tslint.json index 0ef8843f54..949c43858c 100644 --- a/tslint.json +++ b/tslint.json @@ -9,7 +9,8 @@ "rules": { "adf-license-banner": [ true, - "e2e/**/*.ts" + "e2e/**/*.ts", + "./license-community.txt" ], "align": [ true,