diff --git a/packages/angular/src/schematics/application/application.ts b/packages/angular/src/schematics/application/application.ts index 5d14a5663e..ecce222c1f 100644 --- a/packages/angular/src/schematics/application/application.ts +++ b/packages/angular/src/schematics/application/application.ts @@ -369,7 +369,7 @@ export default function(schema: Schema): Rule { ...options, skipFormat: true }), - addLintFiles(options.appProjectRoot, 'tslint', true), + addLintFiles(options.appProjectRoot, options.linter, true), externalSchematic('@schematics/angular', 'application', { name: options.name, inlineStyle: options.inlineStyle, @@ -394,7 +394,8 @@ export default function(schema: Schema): Rule { ? externalSchematic('@nrwl/cypress', 'cypress-project', { name: options.e2eProjectName, directory: options.directory, - project: options.name + project: options.name, + linter: options.linter }) : noop(), move(appProjectRoot, options.appProjectRoot), diff --git a/packages/angular/src/schematics/application/schema.d.ts b/packages/angular/src/schematics/application/schema.d.ts index b430cae65a..125ff5635c 100644 --- a/packages/angular/src/schematics/application/schema.d.ts +++ b/packages/angular/src/schematics/application/schema.d.ts @@ -1,5 +1,6 @@ import { E2eTestRunner } from '../../utils/test-runners'; import { UnitTestRunner } from '../../utils/UnitTestRunner'; +import { Linter } from '@nrwl/workspace'; export interface Schema { name: string; @@ -14,7 +15,7 @@ export interface Schema { skipTests?: boolean; directory?: string; tags?: string; - linter: string; + linter: Linter; unitTestRunner: UnitTestRunner; e2eTestRunner: E2eTestRunner; } diff --git a/packages/angular/src/schematics/library/library.ts b/packages/angular/src/schematics/library/library.ts index 88e5e168e6..a55843f0c7 100644 --- a/packages/angular/src/schematics/library/library.ts +++ b/packages/angular/src/schematics/library/library.ts @@ -1,38 +1,41 @@ import { join, normalize } from '@angular-devkit/core'; import { + apply, chain, externalSchematic, - noop, - Rule, - Tree, - SchematicContext, - schematic, - url, - apply, + MergeStrategy, mergeWith, move, + noop, + Rule, + schematic, + SchematicContext, template, - MergeStrategy + Tree, + url } from '@angular-devkit/schematics'; import { Schema } from './schema'; import * as path from 'path'; import * as ts from 'typescript'; import { - NxJson, - updateJsonInTree, - readJsonInTree, - offsetFromRoot, - addLintFiles -} from '@nrwl/workspace'; -import { addGlobal, addIncludeToTsConfig, insert } from '@nrwl/workspace'; -import { toClassName, toFileName, toPropertyName } from '@nrwl/workspace'; -import { + addGlobal, + addIncludeToTsConfig, + addLintFiles, + formatFiles, getNpmScope, getWorkspacePath, - replaceAppNameWithPath + insert, + Linter, + NxJson, + offsetFromRoot, + readJsonInTree, + replaceAppNameWithPath, + toClassName, + toFileName, + toPropertyName, + updateJsonInTree } from '@nrwl/workspace'; -import { formatFiles } from '@nrwl/workspace'; import { addUnitTestRunner } from '../ng-add/ng-add'; import { addImportToModule, addRoute } from '../../utils/ast-utils'; import { insertImport } from '@nrwl/workspace/src/utils/ast-utils'; @@ -431,7 +434,7 @@ export default function(schema: Schema): Rule { } return chain([ - addLintFiles(options.projectRoot, 'tslint', true), + addLintFiles(options.projectRoot, Linter.TsLint, true), addUnitTestRunner(options), externalSchematic('@schematics/angular', 'library', { name: options.name, diff --git a/packages/angular/src/schematics/library/schema.d.ts b/packages/angular/src/schematics/library/schema.d.ts index 2166faa685..5e4b2ed44f 100644 --- a/packages/angular/src/schematics/library/schema.d.ts +++ b/packages/angular/src/schematics/library/schema.d.ts @@ -1,5 +1,4 @@ import { UnitTestRunner } from '../../utils/test-runners'; -import { Framework } from '../../utils/framework'; export interface Schema { name: string; diff --git a/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts b/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts index 2f3543c557..a684fb4ce9 100644 --- a/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts +++ b/packages/cypress/src/schematics/cypress-project/cypress-project.spec.ts @@ -1,8 +1,7 @@ import { Tree } from '@angular-devkit/schematics'; import { createEmptyWorkspace } from '@nrwl/workspace/testing'; import { runSchematic } from '../../utils/testing'; -import { readJsonInTree } from '@nrwl/workspace'; -import { join, normalize } from '@angular-devkit/core'; +import { readJsonInTree, Linter } from '@nrwl/workspace'; describe('schematic:cypress-project', () => { let appTree: Tree; @@ -40,7 +39,7 @@ describe('schematic:cypress-project', () => { it('should add update `workspace.json` file', async () => { const tree = await runSchematic( 'cypress-project', - { name: 'my-app-e2e', project: 'my-app' }, + { name: 'my-app-e2e', project: 'my-app', linter: Linter.TsLint }, appTree ); const workspaceJson = readJsonInTree(tree, 'workspace.json'); @@ -49,9 +48,8 @@ describe('schematic:cypress-project', () => { expect(project.root).toEqual('apps/my-app-e2e'); expect(project.architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', tsConfig: ['apps/my-app-e2e/tsconfig.e2e.json'], exclude: ['**/node_modules/**', '!apps/my-app-e2e/**'] } @@ -71,6 +69,26 @@ describe('schematic:cypress-project', () => { }); }); + it('should add update `workspace.json` file properly when eslint is passed', async () => { + const tree = await runSchematic( + 'cypress-project', + { name: 'my-app-e2e', project: 'my-app', linter: Linter.EsLint }, + appTree + ); + const workspaceJson = readJsonInTree(tree, 'workspace.json'); + const project = workspaceJson.projects['my-app-e2e']; + + expect(project.architect.lint).toEqual({ + builder: '@nrwl/linter:lint', + options: { + linter: 'eslint', + config: 'apps/my-app-e2e/.eslintrc', + tsConfig: ['apps/my-app-e2e/tsconfig.e2e.json'], + exclude: ['**/node_modules/**', '!apps/my-app-e2e/**'] + } + }); + }); + it('should set right path names in `cypress.json`', async () => { const tree = await runSchematic( 'cypress-project', @@ -111,7 +129,12 @@ describe('schematic:cypress-project', () => { it('should update workspace.json', async () => { const tree = await runSchematic( 'cypress-project', - { name: 'my-app-e2e', project: 'my-dir-my-app', directory: 'my-dir' }, + { + name: 'my-app-e2e', + project: 'my-dir-my-app', + directory: 'my-dir', + linter: Linter.TsLint + }, appTree ); const projectConfig = readJsonInTree(tree, 'workspace.json').projects[ @@ -120,9 +143,8 @@ describe('schematic:cypress-project', () => { expect(projectConfig).toBeDefined(); expect(projectConfig.architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', tsConfig: ['apps/my-dir/my-app-e2e/tsconfig.e2e.json'], exclude: ['**/node_modules/**', '!apps/my-dir/my-app-e2e/**'] } diff --git a/packages/cypress/src/schematics/cypress-project/schema.d.ts b/packages/cypress/src/schematics/cypress-project/schema.d.ts index 1670b779eb..7fffe32f8d 100644 --- a/packages/cypress/src/schematics/cypress-project/schema.d.ts +++ b/packages/cypress/src/schematics/cypress-project/schema.d.ts @@ -1,6 +1,8 @@ +import { Linter } from '@nrwl/workspace'; + export interface Schema { project: string; name: string; directory: string; - linter: 'eslint' | 'tslint'; + linter: Linter; } diff --git a/packages/express/src/schematics/application/schema.d.ts b/packages/express/src/schematics/application/schema.d.ts index 6f4ba8cd8c..31d0109d19 100644 --- a/packages/express/src/schematics/application/schema.d.ts +++ b/packages/express/src/schematics/application/schema.d.ts @@ -1,4 +1,6 @@ import { UnitTestRunner } from '../../utils/test-runners'; +import { Linter } from '@nrwl/workspace'; + export interface Schema { name: string; skipFormat: boolean; @@ -6,6 +8,6 @@ export interface Schema { directory?: string; unitTestRunner: UnitTestRunner; tags?: string; - linter: string; + linter: Linter; frontendProject?: string; } diff --git a/packages/jest/src/schematics/jest-project/jest-project.spec.ts b/packages/jest/src/schematics/jest-project/jest-project.spec.ts index be355e133f..18e2f72270 100644 --- a/packages/jest/src/schematics/jest-project/jest-project.spec.ts +++ b/packages/jest/src/schematics/jest-project/jest-project.spec.ts @@ -15,9 +15,8 @@ describe('jestProject', () => { root: 'libs/lib1', architect: { lint: { - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', tsConfig: [] } } diff --git a/packages/nest/src/schematics/application/schema.d.ts b/packages/nest/src/schematics/application/schema.d.ts index 6f4ba8cd8c..a2fcb16756 100644 --- a/packages/nest/src/schematics/application/schema.d.ts +++ b/packages/nest/src/schematics/application/schema.d.ts @@ -1,4 +1,6 @@ import { UnitTestRunner } from '../../utils/test-runners'; +import { Linter } from 'tslint'; + export interface Schema { name: string; skipFormat: boolean; @@ -6,6 +8,6 @@ export interface Schema { directory?: string; unitTestRunner: UnitTestRunner; tags?: string; - linter: string; + linter: Linter; frontendProject?: string; } diff --git a/packages/node/src/schematics/application/application.spec.ts b/packages/node/src/schematics/application/application.spec.ts index c6e001c2bf..d1bf4eaf57 100644 --- a/packages/node/src/schematics/application/application.spec.ts +++ b/packages/node/src/schematics/application/application.spec.ts @@ -53,9 +53,8 @@ describe('app', () => { }) ); expect(workspaceJson.projects['my-node-app'].architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', tsConfig: [ 'apps/my-node-app/tsconfig.app.json', 'apps/my-node-app/tsconfig.spec.json' @@ -125,9 +124,8 @@ describe('app', () => { expect( workspaceJson.projects['my-dir-my-node-app'].architect.lint ).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', tsConfig: [ 'apps/my-dir/my-node-app/tsconfig.app.json', 'apps/my-dir/my-node-app/tsconfig.spec.json' diff --git a/packages/node/src/schematics/application/schema.d.ts b/packages/node/src/schematics/application/schema.d.ts index 4a42c9e1e9..9b2d3bcac8 100644 --- a/packages/node/src/schematics/application/schema.d.ts +++ b/packages/node/src/schematics/application/schema.d.ts @@ -1,10 +1,12 @@ +import { Linter } from '@nrwl/workspace'; + export interface Schema { name: string; skipFormat: boolean; skipPackageJson: boolean; directory?: string; unitTestRunner: 'jest' | 'none'; - linter: 'eslint' | 'tslint'; + linter: Linter; tags?: string; frontendProject?: string; } diff --git a/packages/react/src/schematics/application/application.spec.ts b/packages/react/src/schematics/application/application.spec.ts index ac466d1acd..504e5ef472 100644 --- a/packages/react/src/schematics/application/application.spec.ts +++ b/packages/react/src/schematics/application/application.spec.ts @@ -292,9 +292,8 @@ describe('app', () => { ); const workspaceJson = readJsonInTree(tree, 'workspace.json'); expect(workspaceJson.projects['my-app'].architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', exclude: ['**/node_modules/**', '!apps/my-app/**'], tsConfig: [ 'apps/my-app/tsconfig.app.json', diff --git a/packages/react/src/schematics/application/schema.d.ts b/packages/react/src/schematics/application/schema.d.ts index dabc4e8d64..82bce48426 100644 --- a/packages/react/src/schematics/application/schema.d.ts +++ b/packages/react/src/schematics/application/schema.d.ts @@ -1,3 +1,5 @@ +import { Linter } from '@nrwl/workspace'; + export interface Schema { name: string; style?: string; @@ -6,7 +8,7 @@ export interface Schema { tags?: string; unitTestRunner: 'jest' | 'none'; e2eTestRunner: 'cypress' | 'none'; - linter: 'eslint' | 'tslint'; + linter: Linter; pascalCaseFiles?: boolean; classComponent?: boolean; routing?: boolean; diff --git a/packages/react/src/schematics/library/library.spec.ts b/packages/react/src/schematics/library/library.spec.ts index 2b2cdf4627..ad62865983 100644 --- a/packages/react/src/schematics/library/library.spec.ts +++ b/packages/react/src/schematics/library/library.spec.ts @@ -19,9 +19,8 @@ describe('lib', () => { expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib'); expect(workspaceJson.projects['my-lib'].architect.build).toBeUndefined(); expect(workspaceJson.projects['my-lib'].architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', exclude: ['**/node_modules/**', '!libs/my-lib/**'], tsConfig: [ 'libs/my-lib/tsconfig.lib.json', @@ -184,9 +183,8 @@ describe('lib', () => { 'libs/my-dir/my-lib' ); expect(workspaceJson.projects['my-dir-my-lib'].architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', exclude: ['**/node_modules/**', '!libs/my-dir/my-lib/**'], tsConfig: [ 'libs/my-dir/my-lib/tsconfig.lib.json', diff --git a/packages/react/src/schematics/library/schema.d.ts b/packages/react/src/schematics/library/schema.d.ts index 0ba6d4e459..b33e36c42b 100644 --- a/packages/react/src/schematics/library/schema.d.ts +++ b/packages/react/src/schematics/library/schema.d.ts @@ -1,3 +1,5 @@ +import { Linter } from '@nrwl/workspace'; + export interface Schema { name: string; directory?: string; @@ -10,5 +12,5 @@ export interface Schema { routing?: boolean; parentRoute?: string; unitTestRunner: 'jest' | 'none'; - linter: 'eslint' | 'tslint'; + linter: Linter; } diff --git a/packages/web/src/schematics/application/application.spec.ts b/packages/web/src/schematics/application/application.spec.ts index 8528c3e329..99f752e313 100644 --- a/packages/web/src/schematics/application/application.spec.ts +++ b/packages/web/src/schematics/application/application.spec.ts @@ -284,9 +284,8 @@ describe('app', () => { const workspaceJson = readJsonInTree(tree, 'workspace.json'); expect(workspaceJson.projects['my-app'].architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', exclude: ['**/node_modules/**', '!apps/my-app/**'], tsConfig: [ 'apps/my-app/tsconfig.app.json', diff --git a/packages/web/src/schematics/application/schema.d.ts b/packages/web/src/schematics/application/schema.d.ts index 786900442e..08135fe3a0 100644 --- a/packages/web/src/schematics/application/schema.d.ts +++ b/packages/web/src/schematics/application/schema.d.ts @@ -7,5 +7,5 @@ export interface Schema { tags?: string; unitTestRunner: 'jest' | 'none'; e2eTestRunner: 'cypress' | 'none'; - linter: 'eslint' | 'tslint'; + linter: Linter; } diff --git a/packages/workspace/index.ts b/packages/workspace/index.ts index 50f9ca4435..d33ef0580d 100644 --- a/packages/workspace/index.ts +++ b/packages/workspace/index.ts @@ -58,7 +58,7 @@ export { export { getWorkspace, updateWorkspace } from './src/utils/workspace'; export { addUpdateTask } from './src/utils/update-task'; -export { addLintFiles, generateProjectLint } from './src/utils/lint'; +export { addLintFiles, generateProjectLint, Linter } from './src/utils/lint'; export { formatFiles } from './src/utils/rules/format-files'; export { deleteFile } from './src/utils/rules/deleteFile'; diff --git a/packages/workspace/src/schematics/library/library.spec.ts b/packages/workspace/src/schematics/library/library.spec.ts index d25a2c3ef1..c5af8c33c2 100644 --- a/packages/workspace/src/schematics/library/library.spec.ts +++ b/packages/workspace/src/schematics/library/library.spec.ts @@ -20,9 +20,8 @@ describe('lib', () => { expect(workspaceJson.projects['my-lib'].root).toEqual('libs/my-lib'); expect(workspaceJson.projects['my-lib'].architect.build).toBeUndefined(); expect(workspaceJson.projects['my-lib'].architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', exclude: ['**/node_modules/**', '!libs/my-lib/**'], tsConfig: [ 'libs/my-lib/tsconfig.lib.json', @@ -167,9 +166,8 @@ describe('lib', () => { 'libs/my-dir/my-lib' ); expect(workspaceJson.projects['my-dir-my-lib'].architect.lint).toEqual({ - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', exclude: ['**/node_modules/**', '!libs/my-dir/my-lib/**'], tsConfig: [ 'libs/my-dir/my-lib/tsconfig.lib.json', diff --git a/packages/workspace/src/schematics/library/schema.d.ts b/packages/workspace/src/schematics/library/schema.d.ts index d597b860ab..b4f1132b02 100644 --- a/packages/workspace/src/schematics/library/schema.d.ts +++ b/packages/workspace/src/schematics/library/schema.d.ts @@ -1,4 +1,4 @@ -import { UnitTestRunner } from '../../utils/test-runners'; +import { Linter } from '@nrwl/workspace/src/utils/lint'; export interface Schema { name: string; @@ -8,5 +8,5 @@ export interface Schema { tags?: string; simpleModuleName: boolean; unitTestRunner: 'jest' | 'none'; - linter: 'eslint' | 'tslint'; + linter: Linter; } diff --git a/packages/workspace/src/utils/lint.ts b/packages/workspace/src/utils/lint.ts index 34ea3aec1d..b38b3828e8 100644 --- a/packages/workspace/src/utils/lint.ts +++ b/packages/workspace/src/utils/lint.ts @@ -13,21 +13,26 @@ import { eslintConfigPrettierVersion } from './versions'; +export const enum Linter { + TsLint = 'tslint', + EsLint = 'eslint', + None = 'none' +} + export function generateProjectLint( projectRoot: string, tsConfigPath: string, - linter: 'tslint' | 'eslint' | 'none' + linter: Linter ) { - if (linter === 'tslint') { + if (linter === Linter.TsLint) { return { - builder: '@nrwl/linter:lint', + builder: '@angular-devkit/build-angular:tslint', options: { - linter: 'tslint', tsConfig: [tsConfigPath], exclude: ['**/node_modules/**', '!' + projectRoot + '/**'] } }; - } else if (linter === 'eslint') { + } else if (linter === Linter.EsLint) { return { builder: '@nrwl/linter:lint', options: { @@ -44,7 +49,7 @@ export function generateProjectLint( export function addLintFiles( projectRoot: string, - linter: 'tslint' | 'eslint' | 'none', + linter: Linter, onlyGlobal = false ): Rule { return (host: Tree, context: SchematicContext) => {