feat(nx): set default collection on ngadd

This commit is contained in:
Jason Jean 2019-05-20 23:49:43 -04:00 committed by Victor Savkin
parent 2d4d735d94
commit a5351c9d36
46 changed files with 563 additions and 127 deletions

View File

@ -19,6 +19,14 @@ Type: `string`
Test runner to use for end to end (e2e) tests
### skipFormat
Default: `false`
Type: `boolean`
Skip formatting files
### skipInstall
Default: `false`

View File

@ -1,4 +1,4 @@
# cypress-project
# cypress-project [hidden]
Add a Cypress E2E Project

View File

@ -8,3 +8,13 @@ Add @nrwl/express to a project
ng generate ng-add ...
```
## Options
### skipFormat
Default: `false`
Type: `boolean`
Skip formatting files

View File

@ -1,4 +1,4 @@
# jest-project
# jest-project [hidden]
Add Jest configuration to a project

View File

@ -8,3 +8,13 @@ Add @nrwl/nest to a project
ng generate ng-add ...
```
## Options
### skipFormat
Default: `false`
Type: `boolean`
Skip formatting files

View File

@ -8,3 +8,13 @@ Add @nrwl/node to a project
ng generate ng-add ...
```
## Options
### skipFormat
Default: `false`
Type: `boolean`
Skip formatting files

View File

@ -8,3 +8,13 @@ Add @nrwl/react to a project
ng generate ng-add ...
```
## Options
### skipFormat
Default: `false`
Type: `boolean`
Skip formatting files

View File

@ -8,3 +8,13 @@ Add @nrwl/web to a project
ng generate ng-add ...
```
## Options
### skipFormat
Default: `false`
Type: `boolean`
Skip formatting files

View File

@ -39,14 +39,6 @@ Type: `boolean`
Do not update tsconfig.json for development experience.
### style
Default: `css`
Type: `string`
The file extension to be used for style files.
### tags
Type: `string`

View File

@ -1,4 +1,4 @@
# ng-new
# ng-new [hidden]
Create a workspace

View File

@ -26,7 +26,7 @@ import {
} from '@nrwl/workspace';
import { formatFiles } from '@nrwl/workspace';
import { join, normalize } from '@angular-devkit/core';
import { addE2eTestRunner, addUnitTestRunner } from '../ng-add/ng-add';
import ngAdd from '../ng-add/ng-add';
import {
addImportToModule,
addImportToTestBed,
@ -317,10 +317,6 @@ function updateE2eProject(options: NormalizedSchema): Rule {
};
}
function setupTestRunners(options: NormalizedSchema): Rule {
return chain([addUnitTestRunner(options), addE2eTestRunner(options)]);
}
export default function(schema: Schema): Rule {
return (host: Tree, context: SchematicContext) => {
const options = normalizeOptions(host, schema);
@ -337,7 +333,10 @@ export default function(schema: Schema): Rule {
: `${options.name}/e2e`;
return chain([
setupTestRunners(options),
ngAdd({
...options,
skipFormat: true
}),
externalSchematic('@schematics/angular', 'application', {
name: options.name,
inlineStyle: options.inlineStyle,

View File

@ -1,7 +1,7 @@
import { Tree } from '@angular-devkit/schematics';
import { runSchematic } from '../../utils/testing';
import { runSchematic, callRule } from '../../utils/testing';
import { createEmptyWorkspace } from '@nrwl/workspace/testing';
import { readJsonInTree } from '@nrwl/workspace';
import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace';
describe('ng-add', () => {
let appTree: Tree;
@ -193,4 +193,44 @@ describe('ng-add', () => {
});
});
});
describe('defaultCollection', () => {
it('should be set if none was set before', async () => {
const result = await runSchematic('ng-add', {}, appTree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/react');
});
it('should be set if @nrwl/workspace was set before', async () => {
appTree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/workspace'
};
return json;
}),
appTree
);
const result = await runSchematic('ng-add', {}, appTree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/react');
});
it('should not be set if something else was set before', async () => {
appTree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/angular'
};
return json;
}),
appTree
);
const result = await runSchematic('ng-add', {}, appTree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular');
});
});
});

View File

@ -9,7 +9,8 @@ import {
import {
readJsonInTree,
addDepsToPackageJson,
updateJsonInTree
updateWorkspace,
formatFiles
} from '@nrwl/workspace';
import {
angularVersion,
@ -19,6 +20,7 @@ import {
import { Schema } from './schema';
import { UnitTestRunner, E2eTestRunner } from '../../utils/test-runners';
import { jestPresetAngularVersion } from '../../utils/versions';
import { JsonObject } from '@angular-devkit/core';
function updateDependencies(): Rule {
const deps = {
@ -117,31 +119,41 @@ export function addE2eTestRunner(options: Pick<Schema, 'e2eTestRunner'>): Rule {
}
}
function setDefaults(options: Schema): Rule {
return updateJsonInTree('angular.json', json => {
json.schematics = json.schematics || {};
json.schematics['@nrwl/angular:application'] =
json.schematics['@nrwl/angular:application'] || {};
json.schematics['@nrwl/angular:application'] = {
...json.schematics['@nrwl/angular:application'],
export function setDefaults(options: Schema): Rule {
return updateWorkspace(workspace => {
workspace.extensions.schematics = workspace.extensions.schematics || {};
workspace.extensions.schematics['@nrwl/angular:application'] =
workspace.extensions.schematics['@nrwl/angular:application'] || {};
workspace.extensions.schematics['@nrwl/angular:application'] = {
...workspace.extensions.schematics['@nrwl/angular:application'],
unitTestRunner: options.unitTestRunner,
e2eTestRunner: options.e2eTestRunner
};
json.schematics['@nrwl/angular:library'] =
json.schematics['@nrwl/angular:library'] || {};
json.schematics['@nrwl/angular:library'] = {
...json.schematics['@nrwl/angular:library'],
workspace.extensions.schematics['@nrwl/angular:library'] =
workspace.extensions.schematics['@nrwl/angular:library'] || {};
workspace.extensions.schematics['@nrwl/angular:library'] = {
...workspace.extensions.schematics['@nrwl/angular:library'],
unitTestRunner: options.unitTestRunner
};
return json;
workspace.extensions.cli = workspace.extensions.cli || {};
const defaultCollection: string =
workspace.extensions.cli &&
((workspace.extensions.cli as JsonObject).defaultCollection as string);
if (!defaultCollection || defaultCollection === '@nrwl/workspace') {
(workspace.extensions.cli as JsonObject).defaultCollection =
'@nrwl/react';
}
});
}
export default function(options: Schema): Rule {
return chain([
setDefaults(options),
updateDependencies(),
addUnitTestRunner(options),
addE2eTestRunner(options),
setDefaults(options)
formatFiles()
]);
}

View File

@ -2,5 +2,6 @@ import { UnitTestRunner } from '../../utils/test-runners';
export interface Schema {
unitTestRunner: UnitTestRunner;
e2eTestRunner: E2eTestRunner;
skipFormat: boolean;
skipInstall?: boolean;
}

View File

@ -49,6 +49,11 @@
"type": "boolean",
"description": "Skip installing after adding @nrwl/workspace",
"default": false
},
"skipFormat": {
"description": "Skip formatting files",
"type": "boolean",
"default": false
}
}
}

View File

@ -56,7 +56,7 @@ export default function(schema: Schema): Rule {
return (host: Tree, context: SchematicContext) => {
const options = normalizeOptions(schema);
return chain([
ngAdd(),
ngAdd({ skipFormat: true }),
externalSchematic('@nrwl/node', 'application', schema),
addMainFile(options),
addTypes(options)

View File

@ -2,7 +2,8 @@ import { Tree } from '@angular-devkit/schematics';
import { createEmptyWorkspace } from '@nrwl/workspace/testing';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { join } from 'path';
import { readJsonInTree } from '@nrwl/workspace';
import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace';
import { callRule, runSchematic } from '../../utils/testing';
describe('ng-add', () => {
let tree: Tree;
@ -27,4 +28,44 @@ describe('ng-add', () => {
expect(packageJson.dependencies['express']).toBeDefined();
expect(packageJson.devDependencies['@types/express']).toBeDefined();
});
describe('defaultCollection', () => {
it('should be set if none was set before', async () => {
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/express');
});
it('should be set if @nrwl/workspace was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/workspace'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/express');
});
it('should not be set if something else was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/angular'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular');
});
});
});

View File

@ -1,21 +1,18 @@
import {
Rule,
chain,
externalSchematic,
Tree,
noop
} from '@angular-devkit/schematics';
import { Rule, chain } from '@angular-devkit/schematics';
import {
addDepsToPackageJson,
updateJsonInTree,
readJsonInTree,
addPackageWithNgAdd
addPackageWithNgAdd,
updateWorkspace,
formatFiles
} from '@nrwl/workspace';
import { Schema } from './schema';
import {
expressTypingsVersion,
expressVersion,
nxVersion
} from '../../utils/versions';
import { JsonObject } from '@angular-devkit/core';
function addDependencies(): Rule {
return addDepsToPackageJson(
@ -38,11 +35,28 @@ function moveDependency(): Rule {
});
}
export default function() {
function setDefault(): Rule {
return updateWorkspace(workspace => {
workspace.extensions.cli = workspace.extensions.cli || {};
const defaultCollection: string =
workspace.extensions.cli &&
((workspace.extensions.cli as JsonObject).defaultCollection as string);
if (!defaultCollection || defaultCollection === '@nrwl/workspace') {
(workspace.extensions.cli as JsonObject).defaultCollection =
'@nrwl/express';
}
});
}
export default function(schema: Schema) {
return chain([
setDefault(),
addPackageWithNgAdd('@nrwl/node'),
addPackageWithNgAdd('@nrwl/jest'),
addDependencies(),
moveDependency()
moveDependency(),
formatFiles(schema)
]);
}

View File

@ -1 +1,3 @@
export interface Schema {}
export interface Schema {
skipFormat: boolean;
}

View File

@ -3,6 +3,12 @@
"id": "NxExpressNgAdd",
"title": "Add Nx Express Schematics",
"type": "object",
"properties": {},
"properties": {
"skipFormat": {
"description": "Skip formatting files",
"type": "boolean",
"default": false
}
},
"required": []
}

View File

@ -1,6 +1,6 @@
import { join } from 'path';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { Tree } from '@angular-devkit/schematics';
import { Rule, Tree } from '@angular-devkit/schematics';
const testRunner = new SchematicTestRunner(
'@nrwl/express',
@ -10,3 +10,7 @@ const testRunner = new SchematicTestRunner(
export function runSchematic(schematicName: string, options: any, tree: Tree) {
return testRunner.runSchematicAsync(schematicName, options, tree).toPromise();
}
export function callRule(rule: Rule, tree: Tree) {
return testRunner.callRule(rule, tree).toPromise();
}

View File

@ -65,7 +65,9 @@ export default function(schema: Schema): Rule {
return (host: Tree, context: SchematicContext) => {
const options = normalizeOptions(schema);
return chain([
ngAdd(),
ngAdd({
skipFormat: true
}),
externalSchematic('@nrwl/node', 'application', schema),
addMainFile(options),
addAppFiles(options)

View File

@ -1,30 +1,62 @@
import { Tree } from '@angular-devkit/schematics';
import { createEmptyWorkspace } from '@nrwl/workspace/testing';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { join } from 'path';
import { readJsonInTree } from '@nrwl/workspace';
import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace';
import { runSchematic, callRule } from '../../utils/testing';
describe('ng-add', () => {
let tree: Tree;
let testRunner: SchematicTestRunner;
beforeEach(() => {
tree = Tree.empty();
tree = createEmptyWorkspace(tree);
testRunner = new SchematicTestRunner(
'@nrwl/nest',
join(__dirname, '../../../collection.json')
);
});
it('should add dependencies', async () => {
const result = await testRunner
.runSchematicAsync('ng-add', {}, tree)
.toPromise();
const result = await runSchematic('ng-add', {}, tree);
const packageJson = readJsonInTree(result, 'package.json');
expect(packageJson.dependencies['@nrwl/nest']).toBeUndefined();
expect(packageJson.devDependencies['@nrwl/nest']).toBeDefined();
expect(packageJson.dependencies['@nestjs/core']).toBeDefined();
});
describe('defaultCollection', () => {
it('should be set if none was set before', async () => {
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/nest');
});
it('should be set if @nrwl/workspace was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/workspace'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/nest');
});
it('should not be set if something else was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/angular'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular');
});
});
});

View File

@ -2,8 +2,11 @@ import { chain, Rule } from '@angular-devkit/schematics';
import {
addDepsToPackageJson,
addPackageWithNgAdd,
updateJsonInTree
formatFiles,
updateJsonInTree,
updateWorkspace
} from '@nrwl/workspace';
import { Schema } from './schema';
import {
expressTypingsVersion,
nestJsSchematicsVersion,
@ -11,6 +14,7 @@ import {
nxVersion,
reflectMetadataVersion
} from '../../utils/versions';
import { JsonObject } from '@angular-devkit/core';
export function addDependencies(): Rule {
return addDepsToPackageJson(
@ -38,11 +42,27 @@ function moveDependency(): Rule {
});
}
export default function() {
function setDefault(): Rule {
return updateWorkspace(workspace => {
workspace.extensions.cli = workspace.extensions.cli || {};
const defaultCollection: string =
workspace.extensions.cli &&
((workspace.extensions.cli as JsonObject).defaultCollection as string);
if (!defaultCollection || defaultCollection === '@nrwl/workspace') {
(workspace.extensions.cli as JsonObject).defaultCollection = '@nrwl/nest';
}
});
}
export default function(schema: Schema) {
return chain([
setDefault(),
addPackageWithNgAdd('@nrwl/node'),
addPackageWithNgAdd('@nrwl/jest'),
addDependencies(),
moveDependency()
moveDependency(),
formatFiles(schema)
]);
}

View File

@ -1 +1,3 @@
export interface Schema {}
export interface Schema {
skipFormat: boolean;
}

View File

@ -3,6 +3,12 @@
"id": "NxNestNgAdd",
"title": "Add Nx Nest Schematics",
"type": "object",
"properties": {},
"properties": {
"skipFormat": {
"description": "Skip formatting files",
"type": "boolean",
"default": false
}
},
"required": []
}

View File

@ -1,6 +1,6 @@
import { join } from 'path';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { Tree } from '@angular-devkit/schematics';
import { Rule, Tree } from '@angular-devkit/schematics';
const testRunner = new SchematicTestRunner(
'@nrwl/nest',
@ -10,3 +10,7 @@ const testRunner = new SchematicTestRunner(
export function runSchematic(schematicName: string, options: any, tree: Tree) {
return testRunner.runSchematicAsync(schematicName, options, tree).toPromise();
}
export function callRule(rule: Rule, tree: Tree) {
return testRunner.callRule(rule, tree).toPromise();
}

View File

@ -146,7 +146,9 @@ export default function(schema: Schema): Rule {
return (host: Tree, context: SchematicContext) => {
const options = normalizeOptions(schema);
return chain([
ngAdd(),
ngAdd({
skipFormat: true
}),
addAppFiles(options),
updateAngularJson(options),
updateNxJson(options),

View File

@ -1,28 +1,60 @@
import { Tree } from '@angular-devkit/schematics';
import { createEmptyWorkspace } from '@nrwl/workspace/testing';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { join } from 'path';
import { readJsonInTree } from '@nrwl/workspace';
import { readJsonInTree, updateJsonInTree } from '@nrwl/workspace';
import { callRule, runSchematic } from '../../utils/testing';
describe('ng-add', () => {
let tree: Tree;
let testRunner: SchematicTestRunner;
beforeEach(() => {
tree = Tree.empty();
tree = createEmptyWorkspace(tree);
testRunner = new SchematicTestRunner(
'@nrwl/node',
join(__dirname, '../../../collection.json')
);
});
it('should add dependencies', async () => {
const result = await testRunner
.runSchematicAsync('ng-add', {}, tree)
.toPromise();
const result = await runSchematic('ng-add', {}, tree);
const packageJson = readJsonInTree(result, 'package.json');
expect(packageJson.dependencies['@nrwl/node']).toBeUndefined();
expect(packageJson.devDependencies['@nrwl/node']).toBeDefined();
});
describe('defaultCollection', () => {
it('should be set if none was set before', async () => {
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/node');
});
it('should be set if @nrwl/workspace was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/workspace'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/node');
});
it('should not be set if something else was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/angular'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular');
});
});
});

View File

@ -2,9 +2,13 @@ import { Rule, chain } from '@angular-devkit/schematics';
import {
addDepsToPackageJson,
updateJsonInTree,
addPackageWithNgAdd
addPackageWithNgAdd,
updateWorkspace,
formatFiles
} from '@nrwl/workspace';
import { Schema } from './schema';
import { nxVersion } from '../../utils/versions';
import { JsonObject } from '@angular-devkit/core';
function addDependencies(): Rule {
return addDepsToPackageJson(
@ -24,10 +28,26 @@ function moveDependency(): Rule {
});
}
export default function() {
function setDefault(): Rule {
return updateWorkspace(workspace => {
workspace.extensions.cli = workspace.extensions.cli || {};
const defaultCollection: string =
workspace.extensions.cli &&
((workspace.extensions.cli as JsonObject).defaultCollection as string);
if (!defaultCollection || defaultCollection === '@nrwl/workspace') {
(workspace.extensions.cli as JsonObject).defaultCollection = '@nrwl/node';
}
});
}
export default function(schema: Schema) {
return chain([
setDefault(),
addPackageWithNgAdd('@nrwl/jest'),
addDependencies(),
moveDependency()
moveDependency(),
formatFiles(schema)
]);
}

View File

@ -1 +1,3 @@
export interface Schema {}
export interface Schema {
skipFormat: boolean;
}

View File

@ -3,6 +3,12 @@
"id": "NxNodeNgAdd",
"title": "Add Nx Node Schematics",
"type": "object",
"properties": {},
"properties": {
"skipFormat": {
"description": "Skip formatting files",
"type": "boolean",
"default": false
}
},
"required": []
}

View File

@ -1,6 +1,6 @@
import { join } from 'path';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { Tree } from '@angular-devkit/schematics';
import { Rule, Tree } from '@angular-devkit/schematics';
import {
TestingArchitectHost,
TestLogger
@ -18,6 +18,10 @@ export function runSchematic(schematicName: string, options: any, tree: Tree) {
return testRunner.runSchematicAsync(schematicName, options, tree).toPromise();
}
export function callRule(rule: Rule, tree: Tree) {
return testRunner.callRule(rule, tree).toPromise();
}
export async function getTestArchitect() {
const architectHost = new TestingArchitectHost('/root', '/root');
const registry = new schema.CoreSchemaRegistry();

View File

@ -3,7 +3,6 @@ import {
chain,
Rule,
Tree,
SchematicContext,
mergeWith,
apply,
template,
@ -148,7 +147,9 @@ export default function(schema: Schema): Rule {
const options = normalizeOptions(host, schema);
return chain([
ngAdd(),
ngAdd({
skipFormat: true
}),
createApplicationFiles(options),
updateNxJson(options),
addProject(options),

View File

@ -1,26 +1,19 @@
import { Tree } from '@angular-devkit/schematics';
import { createEmptyWorkspace } from '@nrwl/workspace/testing';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { join } from 'path';
import { readJsonInTree } from '@nrwl/workspace';
import { updateJsonInTree } from '@nrwl/workspace';
import { runSchematic, callRule } from '../../utils/testing';
describe('ng-add', () => {
let tree: Tree;
let testRunner: SchematicTestRunner;
beforeEach(() => {
tree = Tree.empty();
tree = createEmptyWorkspace(tree);
testRunner = new SchematicTestRunner(
'@nrwl/react',
join(__dirname, '../../../collection.json')
);
});
it('should add react dependencies', async () => {
const result = await testRunner
.runSchematicAsync('ng-add', {}, tree)
.toPromise();
const result = await runSchematic('ng-add', {}, tree);
const packageJson = readJsonInTree(result, 'package.json');
expect(packageJson.dependencies['@nrwl/react']).toBeUndefined();
expect(packageJson.dependencies['react']).toBeDefined();
@ -30,4 +23,44 @@ describe('ng-add', () => {
expect(packageJson.devDependencies['@types/react-dom']).toBeDefined();
expect(packageJson.devDependencies['react-testing-library']).toBeDefined();
});
describe('defaultCollection', () => {
it('should be set if none was set before', async () => {
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/react');
});
it('should be set if @nrwl/workspace was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/workspace'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/react');
});
it('should not be set if something else was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/angular'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular');
});
});
});

View File

@ -1,16 +1,11 @@
import {
Rule,
chain,
externalSchematic,
noop,
Tree
} from '@angular-devkit/schematics';
import { chain, Rule } from '@angular-devkit/schematics';
import {
addDepsToPackageJson,
updateJsonInTree,
readJsonInTree,
addPackageWithNgAdd
addPackageWithNgAdd,
updateWorkspace
} from '@nrwl/workspace';
import { Schema } from './schema';
import {
frameworkVersion,
typesVersion,
@ -18,6 +13,7 @@ import {
testingLibraryVersion,
nxVersion
} from '../../utils/versions';
import { JsonObject } from '@angular-devkit/core';
export function addDependencies(): Rule {
return addDepsToPackageJson(
@ -43,8 +39,24 @@ function moveDependency(): Rule {
});
}
export default function() {
function setDefault(): Rule {
return updateWorkspace(workspace => {
workspace.extensions.cli = workspace.extensions.cli || {};
const defaultCollection: string =
workspace.extensions.cli &&
((workspace.extensions.cli as JsonObject).defaultCollection as string);
if (!defaultCollection || defaultCollection === '@nrwl/workspace') {
(workspace.extensions.cli as JsonObject).defaultCollection =
'@nrwl/react';
}
});
}
export default function(schema: Schema) {
return chain([
setDefault(),
addPackageWithNgAdd('@nrwl/jest'),
addPackageWithNgAdd('@nrwl/cypress'),
addPackageWithNgAdd('@nrwl/web'),

View File

@ -1 +1,3 @@
export interface Schema {}
export interface Schema {
skipFormat: boolean;
}

View File

@ -3,6 +3,12 @@
"id": "NxReactNgAdd",
"title": "Add Nx React Schematics",
"type": "object",
"properties": {},
"properties": {
"skipFormat": {
"description": "Skip formatting files",
"type": "boolean",
"default": false
}
},
"required": []
}

View File

@ -1,6 +1,6 @@
import { join } from 'path';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { Tree } from '@angular-devkit/schematics';
import { Rule, Tree } from '@angular-devkit/schematics';
const testRunner = new SchematicTestRunner(
'@nrwl/react',
@ -10,3 +10,7 @@ const testRunner = new SchematicTestRunner(
export function runSchematic(schematicName: string, options: any, tree: Tree) {
return testRunner.runSchematicAsync(schematicName, options, tree).toPromise();
}
export function callRule(rule: Rule, tree: Tree) {
return testRunner.callRule(rule, tree).toPromise();
}

View File

@ -148,7 +148,9 @@ export default function(schema: Schema): Rule {
const options = normalizeOptions(host, schema);
return chain([
ngAdd(),
ngAdd({
skipFormat: true
}),
createApplicationFiles(options),
updateNxJson(options),
addProject(options),

View File

@ -1,29 +1,62 @@
import { Tree } from '@angular-devkit/schematics';
import { createEmptyWorkspace } from '@nrwl/workspace/testing';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { join } from 'path';
import { readJsonInTree } from '@nrwl/workspace';
import { callRule, runSchematic } from '../../utils/testing';
import { updateJsonInTree } from '@nrwl/workspace/src/utils/ast-utils';
describe('ng-add', () => {
let tree: Tree;
let testRunner: SchematicTestRunner;
beforeEach(() => {
tree = Tree.empty();
tree = createEmptyWorkspace(tree);
testRunner = new SchematicTestRunner(
'@nrwl/web',
join(__dirname, '../../../collection.json')
);
});
it('should add web dependencies', async () => {
const result = await testRunner
.runSchematicAsync('ng-add', {}, tree)
.toPromise();
const result = await runSchematic('ng-add', {}, tree);
const packageJson = readJsonInTree(result, 'package.json');
expect(packageJson.dependencies['@nrwl/web']).toBeUndefined();
expect(packageJson.dependencies['document-register-element']).toBeDefined();
expect(packageJson.devDependencies['@nrwl/web']).toBeDefined();
});
describe('defaultCollection', () => {
it('should be set if none was set before', async () => {
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/web');
});
it('should be set if @nrwl/workspace was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/workspace'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/web');
});
it('should not be set if something else was set before', async () => {
tree = await callRule(
updateJsonInTree('angular.json', json => {
json.cli = {
defaultCollection: '@nrwl/angular'
};
return json;
}),
tree
);
const result = await runSchematic('ng-add', {}, tree);
const angularJson = readJsonInTree(result, 'angular.json');
expect(angularJson.cli.defaultCollection).toEqual('@nrwl/angular');
});
});
});

View File

@ -1,10 +1,17 @@
import { Rule, chain } from '@angular-devkit/schematics';
import { updateJsonInTree, addPackageWithNgAdd } from '@nrwl/workspace';
import {
updateJsonInTree,
addPackageWithNgAdd,
formatFiles
} from '@nrwl/workspace';
import { addDepsToPackageJson } from '@nrwl/workspace';
import { Schema } from './schema';
import {
nxVersion,
documentRegisterElementVersion
} from '../../utils/versions';
import { updateWorkspace } from '@nrwl/workspace';
import { JsonObject } from '@angular-devkit/core';
function addDependencies(): Rule {
return addDepsToPackageJson(
@ -26,11 +33,27 @@ function moveDependency(): Rule {
});
}
export default function() {
function setDefault(): Rule {
return updateWorkspace(workspace => {
workspace.extensions.cli = workspace.extensions.cli || {};
const defaultCollection: string =
workspace.extensions.cli &&
((workspace.extensions.cli as JsonObject).defaultCollection as string);
if (!defaultCollection || defaultCollection === '@nrwl/workspace') {
(workspace.extensions.cli as JsonObject).defaultCollection = '@nrwl/web';
}
});
}
export default function(schema: Schema) {
return chain([
setDefault(),
addPackageWithNgAdd('@nrwl/jest'),
addPackageWithNgAdd('@nrwl/cypress'),
addDependencies(),
moveDependency()
moveDependency(),
formatFiles(schema)
]);
}

View File

@ -1 +1,3 @@
export interface Schema {}
export interface Schema {
skipFormat: boolean;
}

View File

@ -3,6 +3,12 @@
"id": "NxWebNgAdd",
"title": "Add Nx Web Schematics",
"type": "object",
"properties": {},
"properties": {
"skipFormat": {
"description": "Skip formatting files",
"type": "boolean",
"default": false
}
},
"required": []
}

View File

@ -1,6 +1,6 @@
import { join } from 'path';
import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { Tree } from '@angular-devkit/schematics';
import { Rule, Tree } from '@angular-devkit/schematics';
import {
BuilderContext,
Architect,
@ -22,6 +22,10 @@ export function runSchematic(schematicName: string, options: any, tree: Tree) {
return testRunner.runSchematicAsync(schematicName, options, tree).toPromise();
}
export function callRule(rule: Rule, tree: Tree) {
return testRunner.callRule(rule, tree).toPromise();
}
export async function getTestArchitect() {
const architectHost = new TestingArchitectHost('/root', '/root');
const registry = new schema.CoreSchemaRegistry();

View File

@ -46,6 +46,8 @@ export {
serializeTarget
} from './src/utils/cli-config-utils';
export { getWorkspace, updateWorkspace } from './src/utils/workspace';
export { formatFiles } from './src/utils/rules/format-files';
export { deleteFile } from './src/utils/rules/deleteFile';
export * from './src/utils/rules/ng-add';