У нас аналогичная настройка, и мы внедрили 2 пользовательских правила lint:
- импорт из
my-lib
с относительным импортом запрещен
- импорт из
@my-comp/my-lib
внутри самой библиотеки запрещен
Возможно, лучшей настройкой будет использование nx-workspace (см. Раздел «Предварительно собранные ограничения»). Это идет с подобными правилами и добавляет больше:
- Lib не может импортировать приложения.
- Проект, загружающий библиотеку через loadChildren, также не может импортировать ее с помощью импорта ESM.
- Круговые зависимости не допускаются.
- Lib не могут быть импортированы с использованием относительного импорта.
Это наша реализация правила, запрещающего относительный импорт из библиотеки. Это работает, но может иметь некоторые серьезные проблемы, которые мы еще не обнаружили (например, замедление задержки:)
import * as ts from 'typescript';
import * as Lint from 'tslint';
export class Rule extends Lint.Rules.AbstractRule {
static readonly FAILURE_STRING = `Import should be from '${Rule.SHARED_IMPORT}'`;
static readonly SHARED_IMPORT = 'my-lib';
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
return this.applyWithFunction(sourceFile, walk);
}
}
function walk(ctx: Lint.WalkContext<void>) {
return ts.forEachChild(ctx.sourceFile, cb);
function cb(node: ts.Node): void {
if (node.kind !== ts.SyntaxKind.ImportDeclaration) {
return;
}
const importLocation = getImportLocation(node.getText());
if (containsIncorrectImportFromSharedFolder(importLocation)) {
const locationWidth = importLocation.length + 3;
const fix = new Lint.Replacement(node.getEnd() - locationWidth, locationWidth, `'${Rule.SHARED_IMPORT}';`);
return ctx.addFailureAtNode(node, Rule.FAILURE_STRING, fix);
}
return ts.forEachChild(node, cb);
}
function containsIncorrectImportFromSharedFolder(importLocation: String): boolean {
return importLocation.indexOf(Rule.SHARED_IMPORT) > -1 && importLocation !== Rule.SHARED_IMPORT;
}
function getImportLocation(location: string): string {
const importLocation = location.match(/'(.*?[^'])'/);
return importLocation !== null ? importLocation[1] : '';
}
}
Вы должны скомпилировать правило в js
с помощью tsc
:
node "node_modules/typescript/bin/tsc" tools/tslint-rules/myLibImportRule.ts
и вы должны добавить его к tslint.json
:
"rulesDirectory": [
...
"tools/tslint-rules",
...
],
"rules": {
...,
"my-lib-import": true,
...
}
Имя правила - это имя файла myLibImportRule.js
=> my-lib-import
.