diff --git a/packages/eslint-plugin-nx/src/rules/enforce-module-boundaries.ts b/packages/eslint-plugin-nx/src/rules/enforce-module-boundaries.ts index 6d047c102f..e7835ec99a 100644 --- a/packages/eslint-plugin-nx/src/rules/enforce-module-boundaries.ts +++ b/packages/eslint-plugin-nx/src/rules/enforce-module-boundaries.ts @@ -18,6 +18,7 @@ import { createESLintRule } from '../utils/create-eslint-rule'; import { normalize } from '@angular-devkit/core'; import { createProjectGraph, + isNpmProject, ProjectGraph, ProjectType, } from '@nrwl/workspace/src/core/project-graph'; @@ -169,6 +170,10 @@ export default createESLintRule({ return; } + // project => npm package + if (isNpmProject(targetProject)) { + return; + } // check constraints between libs and apps // check for circular dependency const circularPath = checkCircularPath( diff --git a/packages/eslint-plugin-nx/tests/rules/enforce-module-boundaries.spec.ts b/packages/eslint-plugin-nx/tests/rules/enforce-module-boundaries.spec.ts index 5bb1a043b5..8f83447bcc 100644 --- a/packages/eslint-plugin-nx/tests/rules/enforce-module-boundaries.spec.ts +++ b/packages/eslint-plugin-nx/tests/rules/enforce-module-boundaries.spec.ts @@ -248,6 +248,15 @@ describe('Enforce Module Boundaries', () => { files: [createFile(`libs/untagged/src/index.ts`)], }, }, + npmPackage: { + name: 'npm:npm-package', + type: 'npm', + data: { + packageName: 'npm-package', + version: '0.0.0', + files: [], + }, + }, }, dependencies: {}, }; @@ -280,6 +289,18 @@ describe('Enforce Module Boundaries', () => { ); }); + it('should allow imports to npm packages', () => { + const failures = runRule( + depConstraints, + `${process.cwd()}/proj/libs/api/src/index.ts`, + ` + import 'npm-package'; + `, + graph + ); + expect(failures.length).toEqual(0); + }); + it('should error when the target library is untagged', () => { const failures = runRule( depConstraints, diff --git a/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.spec.ts b/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.spec.ts index 061655d12a..984afbc772 100644 --- a/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.spec.ts +++ b/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.spec.ts @@ -244,6 +244,18 @@ describe('Enforce Module Boundaries', () => { files: [createFile(`libs/untagged/src/index.ts`)], }, }, + npmPackage: { + name: 'npmPackage', + type: 'npm', + data: { + packageName: 'npm-package', + version: '0.0.0', + tags: [], + implicitDependencies: [], + architect: {}, + files: [], + }, + }, }, dependencies: {}, }; @@ -276,6 +288,19 @@ describe('Enforce Module Boundaries', () => { ); }); + it('should allow imports to npm projects', () => { + const failures = runRule( + depConstraints, + `${process.cwd()}/proj/libs/api/src/index.ts`, + ` + import 'npm-package'; + `, + graph + ); + + expect(failures.length).toEqual(0); + }); + it('should error when the target library is untagged', () => { const failures = runRule( depConstraints, diff --git a/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts b/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts index 2413727f0a..78bf682673 100644 --- a/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts +++ b/packages/workspace/src/tslint/nxEnforceModuleBoundariesRule.ts @@ -3,6 +3,7 @@ import { IOptions } from 'tslint'; import * as ts from 'typescript'; import { createProjectGraph, + isNpmProject, ProjectGraph, ProjectType, } from '../core/project-graph'; @@ -160,6 +161,12 @@ class EnforceModuleBoundariesWalker extends Lint.RuleWalker { return; } + // project => npm package + if (isNpmProject(targetProject)) { + super.visitImportDeclaration(node); + return; + } + // check for circular dependency const circularPath = checkCircularPath( this.projectGraph,