From f5f68f455fc6e7b05cf9954bce4e52e0916b91d8 Mon Sep 17 00:00:00 2001 From: WenheLI Date: Tue, 23 Jul 2019 02:21:39 +0800 Subject: [PATCH] add .tslint (#1477) DEV This PR is about #1402 I wrote a custom tslintClass that prevent directly importing files from ``@tensorflow/tfjs-core/dist`` --- .tslint/noImportsFromDistRule.js | 44 +++++++++++++++++++++++++++++ .tslint/noImportsFromDistRule.ts | 30 ++++++++++++++++++++ integration_tests/models/common.ts | 3 +- integration_tests/run_node_tests.ts | 1 + tslint.json | 2 ++ 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 .tslint/noImportsFromDistRule.js create mode 100644 .tslint/noImportsFromDistRule.ts diff --git a/.tslint/noImportsFromDistRule.js b/.tslint/noImportsFromDistRule.js new file mode 100644 index 0000000000..11c5375834 --- /dev/null +++ b/.tslint/noImportsFromDistRule.js @@ -0,0 +1,44 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +exports.__esModule = true; +var Lint = require("tslint"); +var Rule = /** @class */ (function (_super) { + __extends(Rule, _super); + function Rule() { + return _super !== null && _super.apply(this, arguments) || this; + } + Rule.prototype.apply = function (sourceFile) { + return this.applyWithWalker(new NoImportsFromDistWalker(sourceFile, this.getOptions())); + }; + Rule.FAILURE_STRING = "importing from dist/ is prohibited. Please use public API"; + return Rule; +}(Lint.Rules.AbstractRule)); +exports.Rule = Rule; +var NoImportsFromDistWalker = /** @class */ (function (_super) { + __extends(NoImportsFromDistWalker, _super); + function NoImportsFromDistWalker() { + return _super !== null && _super.apply(this, arguments) || this; + } + NoImportsFromDistWalker.prototype.visitImportDeclaration = function (node) { + var importFrom = node.moduleSpecifier.getText(); + var reg = /@tensorflow\/tfjs[-a-z]*\/dist/; + if (importFrom.match(reg)) { + var fix = new Lint.Replacement(node.moduleSpecifier.getStart(), node.moduleSpecifier.getWidth(), importFrom.replace(/\/dist[\/]*/, '')); + this.addFailure(this.createFailure(node.moduleSpecifier.getStart(), node.moduleSpecifier.getWidth(), Rule.FAILURE_STRING, fix)); + } + _super.prototype.visitImportDeclaration.call(this, node); + }; + return NoImportsFromDistWalker; +}(Lint.RuleWalker)); diff --git a/.tslint/noImportsFromDistRule.ts b/.tslint/noImportsFromDistRule.ts new file mode 100644 index 0000000000..26317e5dbc --- /dev/null +++ b/.tslint/noImportsFromDistRule.ts @@ -0,0 +1,30 @@ +import * as Lint from "tslint"; +import * as ts from "typescript"; + +export class Rule extends Lint.Rules.AbstractRule { + public static FAILURE_STRING = "importing from dist/ is prohibited. Please use public API"; + + public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { + return this.applyWithWalker( + new NoImportsFromDistWalker(sourceFile, this.getOptions())); + } +} + +class NoImportsFromDistWalker extends Lint.RuleWalker { + public visitImportDeclaration(node: ts.ImportDeclaration) { + const importFrom = node.moduleSpecifier.getText(); + const reg = /@tensorflow\/tfjs[-a-z]*\/dist/; + if (importFrom.match(reg)) { + const fix = new Lint.Replacement(node.moduleSpecifier.getStart(), + node.moduleSpecifier.getWidth(), + importFrom.replace(/\/dist[\/]*/, '')); + + this.addFailure(this.createFailure(node.moduleSpecifier.getStart(), + node.moduleSpecifier.getWidth(), + Rule.FAILURE_STRING, fix)); + } + + super.visitImportDeclaration(node); + } + +} diff --git a/integration_tests/models/common.ts b/integration_tests/models/common.ts index d4a9469e28..b1ee3c7683 100644 --- a/integration_tests/models/common.ts +++ b/integration_tests/models/common.ts @@ -16,7 +16,8 @@ * ============================================================================= */ import * as tfconverter from '@tensorflow/tfjs-converter'; -import {NamedTensorMap} from '@tensorflow/tfjs-converter/dist/src/data/types'; +// tslint:disable-next-line: no-imports-from-dist +import {NamedTensorMap} from '@tensorflow/tfjs-core'; import * as tfc from '@tensorflow/tfjs-core'; import * as tfl from '@tensorflow/tfjs-layers'; import * as detectBrowser from 'detect-browser'; diff --git a/integration_tests/run_node_tests.ts b/integration_tests/run_node_tests.ts index 53a2447cbb..059a43f9c9 100644 --- a/integration_tests/run_node_tests.ts +++ b/integration_tests/run_node_tests.ts @@ -15,6 +15,7 @@ * ============================================================================= */ +// tslint:disable-next-line: no-imports-from-dist import * as jasmineUtil from '@tensorflow/tfjs-core/dist/jasmine_util'; import * as fs from 'fs'; diff --git a/tslint.json b/tslint.json index 99b5da219e..a31006a51c 100644 --- a/tslint.json +++ b/tslint.json @@ -1,4 +1,5 @@ { + "rulesDirectory": ".tslint", "rules": { "array-type": [true, "array-simple"], "arrow-return-shorthand": true, @@ -32,6 +33,7 @@ "no-consecutive-blank-lines": true, "no-debugger": true, "no-default-export": true, + "no-imports-from-dist": true, "no-inferrable-types": true, "no-namespace": [true, "allow-declarations"], "no-reference": true,