cleanup(core): use the use generator instead of schematic
This commit is contained in:
parent
ea17900378
commit
06e13dae2f
@ -14630,7 +14630,7 @@ export const mediumGraph = {
|
||||
},
|
||||
{
|
||||
file:
|
||||
'apps/nx-docs-site/src/assets/content/shared/tools-workspace-schematics.md',
|
||||
'apps/nx-docs-site/src/assets/content/shared/tools-workspace-generators.md',
|
||||
hash: '36a8e3fdd9166bebbc14220e92feb4e32f0d2f96',
|
||||
ext: '.md',
|
||||
},
|
||||
|
||||
@ -1,25 +1,29 @@
|
||||
# workspace-schematic
|
||||
# workspace-generator
|
||||
|
||||
Generates a workspace schematic
|
||||
Generates a workspace generator
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
nx generate workspace-schematic ...
|
||||
nx generate workspace-generator ...
|
||||
```
|
||||
|
||||
By default, Nx will search for `workspace-schematic` in the default collection provisioned in `angular.json`.
|
||||
```bash
|
||||
nx g workspace-schematic ... # same
|
||||
```
|
||||
|
||||
By default, Nx will search for `workspace-generator` in the default collection provisioned in `angular.json`.
|
||||
|
||||
You can specify the collection explicitly as follows:
|
||||
|
||||
```bash
|
||||
nx g @nrwl/workspace:workspace-schematic ...
|
||||
nx g @nrwl/workspace:workspace-generator ...
|
||||
```
|
||||
|
||||
Show what will be generated without writing to disk:
|
||||
|
||||
```bash
|
||||
nx g workspace-schematic ... --dry-run
|
||||
nx g workspace-generator ... --dry-run
|
||||
```
|
||||
|
||||
## Options
|
||||
@ -1,11 +1,11 @@
|
||||
# workspace-schematic
|
||||
# workspace-generator
|
||||
|
||||
Runs a workspace schematic from the tools/schematics directory
|
||||
Runs a workspace generator from the tools/generators directory
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
nx workspace-schematic
|
||||
nx workspace-generator
|
||||
```
|
||||
|
||||
Install `nx` globally to invoke the command directly using `nx`, or use `npm run nx` or `yarn nx`.
|
||||
@ -16,13 +16,13 @@ Install `nx` globally to invoke the command directly using `nx`, or use `npm run
|
||||
|
||||
Show help
|
||||
|
||||
### list-schematics
|
||||
### list-generators
|
||||
|
||||
List the available workspace-schematics
|
||||
List the available workspace-generators
|
||||
|
||||
### name
|
||||
|
||||
The name of your schematic`
|
||||
The name of your generator`
|
||||
|
||||
### version
|
||||
|
||||
@ -236,9 +236,9 @@
|
||||
"file": "angular/cli/workspace-lint"
|
||||
},
|
||||
{
|
||||
"name": "workspace-schematic",
|
||||
"id": "workspace-schematic",
|
||||
"file": "angular/cli/workspace-schematic"
|
||||
"name": "workspace-generator",
|
||||
"id": "workspace-generator",
|
||||
"file": "angular/cli/workspace-generator"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -287,9 +287,9 @@
|
||||
"file": "angular/api-workspace/schematics/run-commands"
|
||||
},
|
||||
{
|
||||
"name": "workspace-schematic",
|
||||
"id": "workspace-schematic",
|
||||
"file": "angular/api-workspace/schematics/workspace-schematic"
|
||||
"name": "workspace-generator",
|
||||
"id": "workspace-generator",
|
||||
"file": "angular/api-workspace/schematics/workspace-generator"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -941,8 +941,8 @@
|
||||
},
|
||||
{
|
||||
"name": "Workspace Schematics",
|
||||
"id": "workspace-schematics",
|
||||
"file": "shared/tools-workspace-schematics"
|
||||
"id": "workspace-generators",
|
||||
"file": "shared/tools-workspace-generators"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -1329,9 +1329,9 @@
|
||||
"file": "react/cli/workspace-lint"
|
||||
},
|
||||
{
|
||||
"name": "workspace-schematic",
|
||||
"id": "workspace-schematic",
|
||||
"file": "react/cli/workspace-schematic"
|
||||
"name": "workspace-generator",
|
||||
"id": "workspace-generator",
|
||||
"file": "react/cli/workspace-generator"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -1380,9 +1380,9 @@
|
||||
"file": "react/api-workspace/schematics/run-commands"
|
||||
},
|
||||
{
|
||||
"name": "workspace-schematic",
|
||||
"id": "workspace-schematic",
|
||||
"file": "react/api-workspace/schematics/workspace-schematic"
|
||||
"name": "workspace-generator",
|
||||
"id": "workspace-generator",
|
||||
"file": "react/api-workspace/schematics/workspace-generator"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -2034,8 +2034,8 @@
|
||||
},
|
||||
{
|
||||
"name": "Workspace Schematics",
|
||||
"id": "workspace-schematics",
|
||||
"file": "shared/tools-workspace-schematics"
|
||||
"id": "workspace-generators",
|
||||
"file": "shared/tools-workspace-generators"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -2375,9 +2375,9 @@
|
||||
"file": "node/cli/workspace-lint"
|
||||
},
|
||||
{
|
||||
"name": "workspace-schematic",
|
||||
"id": "workspace-schematic",
|
||||
"file": "node/cli/workspace-schematic"
|
||||
"name": "workspace-generator",
|
||||
"id": "workspace-generator",
|
||||
"file": "node/cli/workspace-generator"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -2426,9 +2426,9 @@
|
||||
"file": "node/api-workspace/schematics/run-commands"
|
||||
},
|
||||
{
|
||||
"name": "workspace-schematic",
|
||||
"id": "workspace-schematic",
|
||||
"file": "node/api-workspace/schematics/workspace-schematic"
|
||||
"name": "workspace-generator",
|
||||
"id": "workspace-generator",
|
||||
"file": "node/api-workspace/schematics/workspace-generator"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -3074,8 +3074,8 @@
|
||||
},
|
||||
{
|
||||
"name": "Workspace Schematics",
|
||||
"id": "workspace-schematics",
|
||||
"file": "shared/tools-workspace-schematics"
|
||||
"id": "workspace-generators",
|
||||
"file": "shared/tools-workspace-generators"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@ -1,25 +1,29 @@
|
||||
# workspace-schematic
|
||||
# workspace-generator
|
||||
|
||||
Generates a workspace schematic
|
||||
Generates a workspace generator
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
nx generate workspace-schematic ...
|
||||
nx generate workspace-generator ...
|
||||
```
|
||||
|
||||
By default, Nx will search for `workspace-schematic` in the default collection provisioned in `workspace.json`.
|
||||
```bash
|
||||
nx g workspace-schematic ... # same
|
||||
```
|
||||
|
||||
By default, Nx will search for `workspace-generator` in the default collection provisioned in `workspace.json`.
|
||||
|
||||
You can specify the collection explicitly as follows:
|
||||
|
||||
```bash
|
||||
nx g @nrwl/workspace:workspace-schematic ...
|
||||
nx g @nrwl/workspace:workspace-generator ...
|
||||
```
|
||||
|
||||
Show what will be generated without writing to disk:
|
||||
|
||||
```bash
|
||||
nx g workspace-schematic ... --dry-run
|
||||
nx g workspace-generator ... --dry-run
|
||||
```
|
||||
|
||||
## Options
|
||||
@ -1,11 +1,11 @@
|
||||
# workspace-schematic
|
||||
# workspace-generator
|
||||
|
||||
Runs a workspace schematic from the tools/schematics directory
|
||||
Runs a workspace generator from the tools/generators directory
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
nx workspace-schematic
|
||||
nx workspace-generator
|
||||
```
|
||||
|
||||
Install `nx` globally to invoke the command directly using `nx`, or use `npm run nx` or `yarn nx`.
|
||||
@ -16,13 +16,13 @@ Install `nx` globally to invoke the command directly using `nx`, or use `npm run
|
||||
|
||||
Show help
|
||||
|
||||
### list-schematics
|
||||
### list-generators
|
||||
|
||||
List the available workspace-schematics
|
||||
List the available workspace-generators
|
||||
|
||||
### name
|
||||
|
||||
The name of your schematic`
|
||||
The name of your generator`
|
||||
|
||||
### version
|
||||
|
||||
@ -1,25 +1,29 @@
|
||||
# workspace-schematic
|
||||
# workspace-generator
|
||||
|
||||
Generates a workspace schematic
|
||||
Generates a workspace generator
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
nx generate workspace-schematic ...
|
||||
nx generate workspace-generator ...
|
||||
```
|
||||
|
||||
By default, Nx will search for `workspace-schematic` in the default collection provisioned in `workspace.json`.
|
||||
```bash
|
||||
nx g workspace-schematic ... # same
|
||||
```
|
||||
|
||||
By default, Nx will search for `workspace-generator` in the default collection provisioned in `workspace.json`.
|
||||
|
||||
You can specify the collection explicitly as follows:
|
||||
|
||||
```bash
|
||||
nx g @nrwl/workspace:workspace-schematic ...
|
||||
nx g @nrwl/workspace:workspace-generator ...
|
||||
```
|
||||
|
||||
Show what will be generated without writing to disk:
|
||||
|
||||
```bash
|
||||
nx g workspace-schematic ... --dry-run
|
||||
nx g workspace-generator ... --dry-run
|
||||
```
|
||||
|
||||
## Options
|
||||
@ -1,11 +1,11 @@
|
||||
# workspace-schematic
|
||||
# workspace-generator
|
||||
|
||||
Runs a workspace schematic from the tools/schematics directory
|
||||
Runs a workspace generator from the tools/generators directory
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
nx workspace-schematic
|
||||
nx workspace-generator
|
||||
```
|
||||
|
||||
Install `nx` globally to invoke the command directly using `nx`, or use `npm run nx` or `yarn nx`.
|
||||
@ -16,13 +16,13 @@ Install `nx` globally to invoke the command directly using `nx`, or use `npm run
|
||||
|
||||
Show help
|
||||
|
||||
### list-schematics
|
||||
### list-generators
|
||||
|
||||
List the available workspace-schematics
|
||||
List the available workspace-generators
|
||||
|
||||
### name
|
||||
|
||||
The name of your schematic`
|
||||
The name of your generator`
|
||||
|
||||
### version
|
||||
|
||||
@ -88,7 +88,7 @@ forEachCli('angular', () => {
|
||||
'update:check': 'ng update',
|
||||
postinstall: 'node ./decorate-angular-cli.js',
|
||||
'dep-graph': 'nx dep-graph',
|
||||
'workspace-schematic': 'nx workspace-schematic',
|
||||
'workspace-generator': 'nx workspace-generator',
|
||||
help: 'nx help',
|
||||
});
|
||||
expect(
|
||||
|
||||
@ -16,6 +16,7 @@ forEachCli('nx', () => {
|
||||
describe('Help', () => {
|
||||
it('should show help', async () => {
|
||||
newProject();
|
||||
// sss
|
||||
const myapp = uniq('myapp');
|
||||
runCLI(`generate @nrwl/web:app ${myapp}`);
|
||||
|
||||
|
||||
@ -215,27 +215,27 @@ forEachCli((cli) => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('workspace-schematic', () => {
|
||||
describe('workspace-generator', () => {
|
||||
let custom: string;
|
||||
let failing: string;
|
||||
|
||||
beforeEach(() => {
|
||||
custom = uniq('custom');
|
||||
failing = uniq('custom-failing');
|
||||
runCLI(`g workspace-schematic ${custom} --no-interactive`);
|
||||
runCLI(`g workspace-schematic ${failing} --no-interactive`);
|
||||
runCLI(`g workspace-generator ${custom} --no-interactive`);
|
||||
runCLI(`g workspace-generator ${failing} --no-interactive`);
|
||||
|
||||
checkFilesExist(
|
||||
`tools/schematics/${custom}/index.ts`,
|
||||
`tools/schematics/${custom}/schema.json`
|
||||
`tools/generators/${custom}/index.ts`,
|
||||
`tools/generators/${custom}/schema.json`
|
||||
);
|
||||
checkFilesExist(
|
||||
`tools/schematics/${failing}/index.ts`,
|
||||
`tools/schematics/${failing}/schema.json`
|
||||
`tools/generators/${failing}/index.ts`,
|
||||
`tools/generators/${failing}/schema.json`
|
||||
);
|
||||
});
|
||||
|
||||
it('should compile only schematic files with dependencies', () => {
|
||||
it('should compile only generator files with dependencies', () => {
|
||||
const workspace = uniq('workspace');
|
||||
|
||||
updateFile(
|
||||
@ -251,12 +251,12 @@ forEachCli((cli) => {
|
||||
`
|
||||
);
|
||||
updateFile(
|
||||
`tools/schematics/utils.ts`,
|
||||
`tools/generators/utils.ts`,
|
||||
`
|
||||
export const noop = ()=>{}
|
||||
`
|
||||
);
|
||||
updateFile(`tools/schematics/${custom}/index.ts`, (content) => {
|
||||
updateFile(`tools/generators/${custom}/index.ts`, (content) => {
|
||||
return `
|
||||
import { log } from '../../utils/logger'; \n
|
||||
${content}
|
||||
@ -264,13 +264,13 @@ forEachCli((cli) => {
|
||||
});
|
||||
|
||||
runCommand(
|
||||
`nx workspace-schematic ${custom} ${workspace} --no-interactive -d`
|
||||
`nx workspace-generator ${custom} ${workspace} --no-interactive -d`
|
||||
);
|
||||
|
||||
expect(() =>
|
||||
checkFilesExist(
|
||||
`dist/out-tsc/tools/schematics/${custom}/index.js`,
|
||||
`dist/out-tsc/tools/schematics/utils.js`,
|
||||
`dist/out-tsc/tools/generators/${custom}/index.js`,
|
||||
`dist/out-tsc/tools/generators/utils.js`,
|
||||
`dist/out-tsc/tools/utils/logger.js`
|
||||
)
|
||||
).not.toThrow();
|
||||
@ -279,8 +279,8 @@ forEachCli((cli) => {
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
it('should support workspace-specific schematics', async () => {
|
||||
const json = readJson(`tools/schematics/${custom}/schema.json`);
|
||||
it('should support workspace-specific generators', async () => {
|
||||
const json = readJson(`tools/generators/${custom}/schema.json`);
|
||||
json.properties['directory'] = {
|
||||
type: 'string',
|
||||
description: 'lib directory',
|
||||
@ -290,13 +290,13 @@ forEachCli((cli) => {
|
||||
description: 'skip changes to tsconfig',
|
||||
};
|
||||
updateFile(
|
||||
`tools/schematics/${custom}/schema.json`,
|
||||
`tools/generators/${custom}/schema.json`,
|
||||
JSON.stringify(json)
|
||||
);
|
||||
|
||||
const indexFile = readFile(`tools/schematics/${custom}/index.ts`);
|
||||
const indexFile = readFile(`tools/generators/${custom}/index.ts`);
|
||||
updateFile(
|
||||
`tools/schematics/${custom}/index.ts`,
|
||||
`tools/generators/${custom}/index.ts`,
|
||||
indexFile.replace(
|
||||
'name: schema.name',
|
||||
'name: schema.name, directory: schema.directory, skipTsConfig: schema.skipTsConfig'
|
||||
@ -305,29 +305,29 @@ forEachCli((cli) => {
|
||||
|
||||
const workspace = uniq('workspace');
|
||||
const dryRunOutput = runCLI(
|
||||
`workspace-schematic ${custom} ${workspace} --no-interactive --directory=dir --skipTsConfig=true -d`
|
||||
`workspace-generator ${custom} ${workspace} --no-interactive --directory=dir --skipTsConfig=true -d`
|
||||
);
|
||||
expect(exists(`libs/dir/${workspace}/src/index.ts`)).toEqual(false);
|
||||
expect(dryRunOutput).toContain(`UPDATE ${workspaceConfigName()}`);
|
||||
expect(dryRunOutput).toContain('UPDATE nx.json');
|
||||
|
||||
const output = runCLI(
|
||||
`workspace-schematic ${custom} ${workspace} --no-interactive --directory=dir`
|
||||
`workspace-generator ${custom} ${workspace} --no-interactive --directory=dir`
|
||||
);
|
||||
checkFilesExist(`libs/dir/${workspace}/src/index.ts`);
|
||||
expect(output).toContain(`UPDATE ${workspaceConfigName()}`);
|
||||
expect(output).toContain('UPDATE nx.json');
|
||||
|
||||
const jsonFailing = readJson(`tools/schematics/${failing}/schema.json`);
|
||||
const jsonFailing = readJson(`tools/generators/${failing}/schema.json`);
|
||||
jsonFailing.properties = {};
|
||||
jsonFailing.required = [];
|
||||
updateFile(
|
||||
`tools/schematics/${failing}/schema.json`,
|
||||
`tools/generators/${failing}/schema.json`,
|
||||
JSON.stringify(jsonFailing)
|
||||
);
|
||||
|
||||
updateFile(
|
||||
`tools/schematics/${failing}/index.ts`,
|
||||
`tools/generators/${failing}/index.ts`,
|
||||
`
|
||||
export default function() {
|
||||
throw new Error();
|
||||
@ -336,15 +336,13 @@ forEachCli((cli) => {
|
||||
);
|
||||
|
||||
try {
|
||||
await runCLI(`workspace-schematic ${failing} --no-interactive`);
|
||||
fail(`Should exit 1 for a workspace-schematic that throws an error`);
|
||||
await runCLI(`workspace-generator ${failing} --no-interactive`);
|
||||
fail(`Should exit 1 for a workspace-generator that throws an error`);
|
||||
} catch (e) {}
|
||||
|
||||
const listSchematicsOutput = runCLI(
|
||||
'workspace-schematic --list-schematics'
|
||||
);
|
||||
expect(listSchematicsOutput).toContain(custom);
|
||||
expect(listSchematicsOutput).toContain(failing);
|
||||
const listOutput = runCLI('workspace-generator --list-generators');
|
||||
expect(listOutput).toContain(custom);
|
||||
expect(listOutput).toContain(failing);
|
||||
}, 1000000);
|
||||
});
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nrwl/nx-source",
|
||||
"version": "11.0.0-beta.2",
|
||||
"version": "11.0.0-beta.4",
|
||||
"description": "Extensible Dev Tools for Monorepos",
|
||||
"homepage": "https://nx.dev",
|
||||
"main": "index.js",
|
||||
|
||||
@ -2,7 +2,7 @@ import * as path from 'path';
|
||||
import * as fs from 'fs';
|
||||
import { Workspace } from './workspace';
|
||||
import { parseRunOneOptions } from './parse-run-one-options';
|
||||
import { useNxToRunNxBuilderOrSchematic } from './use-nx-to-run-nx-builder-or-schematic';
|
||||
import { useNxToRunNxBuilderOrGenerator } from './use-nx-to-run-nx-builder-or-generator';
|
||||
|
||||
/**
|
||||
* Nx is being run inside a workspace.
|
||||
@ -27,7 +27,7 @@ export function initLocal(workspace: Workspace) {
|
||||
} else {
|
||||
// not using the tasks runner
|
||||
if (runOpts === false || process.env.NX_SKIP_TASKS_RUNNER) {
|
||||
loadCli(workspace, useNxToRunNxBuilderOrSchematic());
|
||||
loadCli(workspace, useNxToRunNxBuilderOrGenerator());
|
||||
} else {
|
||||
require('@nrwl/workspace' + '/src/command-line/run-one').runOne(runOpts);
|
||||
}
|
||||
|
||||
@ -8,12 +8,12 @@ import {
|
||||
} from '@nrwl/tao/src/shared/workspace';
|
||||
|
||||
const ws = new Workspaces();
|
||||
export function useNxToRunNxBuilderOrSchematic() {
|
||||
export function useNxToRunNxBuilderOrGenerator() {
|
||||
try {
|
||||
const dir = findWorkspaceRoot(__dirname).dir;
|
||||
const args = process.argv.slice(2);
|
||||
const wd = ws.readWorkspaceConfiguration(dir);
|
||||
return isNxBuilder(dir, args, wd) || isNxSchematic(dir, args, wd);
|
||||
return isNxBuilder(dir, args, wd) || isNxGenerator(dir, args, wd);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
@ -33,17 +33,17 @@ function isNxBuilder(dir: string, args: string[], wd: WorkspaceDefinition) {
|
||||
}
|
||||
}
|
||||
|
||||
function isNxSchematic(dir: string, args: string[], wd: WorkspaceDefinition) {
|
||||
function isNxGenerator(dir: string, args: string[], wd: WorkspaceDefinition) {
|
||||
try {
|
||||
if (args[0] != 'g' && args[0] != 'generate') return false;
|
||||
const defaultCollection = wd.cli ? wd.cli.defaultCollection : null;
|
||||
|
||||
let [collectionName, schematicName] = args[1].split(':');
|
||||
if (!schematicName) {
|
||||
schematicName = collectionName;
|
||||
let [collectionName, generatorName] = args[1].split(':');
|
||||
if (!generatorName) {
|
||||
generatorName = collectionName;
|
||||
collectionName = defaultCollection;
|
||||
}
|
||||
return ws.isNxSchematic(collectionName, schematicName);
|
||||
return ws.isNxGenerator(collectionName, generatorName);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
@ -1,13 +1,13 @@
|
||||
import * as minimist from 'minimist';
|
||||
import { getLogger } from '../shared/logger';
|
||||
import {
|
||||
combineOptionsForSchematic,
|
||||
combineOptionsForGenerator,
|
||||
convertToCamelCase,
|
||||
handleErrors,
|
||||
Options,
|
||||
Schema,
|
||||
} from '../shared/params';
|
||||
import { commandName, printHelp } from '../shared/print-help';
|
||||
import { printHelp } from '../shared/print-help';
|
||||
import { WorkspaceDefinition, Workspaces } from '../shared/workspace';
|
||||
import { statSync, unlinkSync, writeFileSync } from 'fs';
|
||||
import { mkdirpSync, rmdirSync } from 'fs-extra';
|
||||
@ -18,8 +18,8 @@ const chalk = require('chalk');
|
||||
|
||||
export interface GenerateOptions {
|
||||
collectionName: string;
|
||||
schematicName: string;
|
||||
schematicOptions: Options;
|
||||
generatorName: string;
|
||||
generatorOptions: Options;
|
||||
help: boolean;
|
||||
debug: boolean;
|
||||
dryRun: boolean;
|
||||
@ -30,7 +30,7 @@ export interface GenerateOptions {
|
||||
|
||||
function throwInvalidInvocation() {
|
||||
throw new Error(
|
||||
`Specify the schematic name (e.g., ${commandName} generate collection-name:schematic-name)`
|
||||
`Specify the generator name (e.g., nx generate @nrwl/workspace:library)`
|
||||
);
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ function parseGenerateOpts(
|
||||
mode: 'generate' | 'new',
|
||||
defaultCollection: string | null
|
||||
): GenerateOptions {
|
||||
const schematicOptions = convertToCamelCase(
|
||||
const generatorOptions = convertToCamelCase(
|
||||
minimist(args, {
|
||||
boolean: ['help', 'dryRun', 'debug', 'force', 'interactive'],
|
||||
alias: {
|
||||
@ -55,24 +55,24 @@ function parseGenerateOpts(
|
||||
);
|
||||
|
||||
let collectionName: string | null = null;
|
||||
let schematicName: string | null = null;
|
||||
let generatorName: string | null = null;
|
||||
if (mode === 'generate') {
|
||||
if (
|
||||
!schematicOptions['_'] ||
|
||||
(schematicOptions['_'] as string[]).length === 0
|
||||
!generatorOptions['_'] ||
|
||||
(generatorOptions['_'] as string[]).length === 0
|
||||
) {
|
||||
throwInvalidInvocation();
|
||||
}
|
||||
[collectionName, schematicName] = (schematicOptions['_'] as string[])
|
||||
[collectionName, generatorName] = (generatorOptions['_'] as string[])
|
||||
.shift()
|
||||
.split(':');
|
||||
if (!schematicName) {
|
||||
schematicName = collectionName;
|
||||
if (!generatorName) {
|
||||
generatorName = collectionName;
|
||||
collectionName = defaultCollection;
|
||||
}
|
||||
} else {
|
||||
collectionName = schematicOptions.collection as string;
|
||||
schematicName = '';
|
||||
collectionName = generatorOptions.collection as string;
|
||||
generatorName = '';
|
||||
}
|
||||
|
||||
if (!collectionName) {
|
||||
@ -81,24 +81,24 @@ function parseGenerateOpts(
|
||||
|
||||
const res = {
|
||||
collectionName,
|
||||
schematicName,
|
||||
schematicOptions,
|
||||
help: schematicOptions.help as boolean,
|
||||
debug: schematicOptions.debug as boolean,
|
||||
dryRun: schematicOptions.dryRun as boolean,
|
||||
force: schematicOptions.force as boolean,
|
||||
interactive: schematicOptions.interactive as boolean,
|
||||
defaults: schematicOptions.defaults as boolean,
|
||||
generatorName,
|
||||
generatorOptions,
|
||||
help: generatorOptions.help as boolean,
|
||||
debug: generatorOptions.debug as boolean,
|
||||
dryRun: generatorOptions.dryRun as boolean,
|
||||
force: generatorOptions.force as boolean,
|
||||
interactive: generatorOptions.interactive as boolean,
|
||||
defaults: generatorOptions.defaults as boolean,
|
||||
};
|
||||
|
||||
delete schematicOptions.debug;
|
||||
delete schematicOptions.d;
|
||||
delete schematicOptions.dryRun;
|
||||
delete schematicOptions.force;
|
||||
delete schematicOptions.interactive;
|
||||
delete schematicOptions.defaults;
|
||||
delete schematicOptions.help;
|
||||
delete schematicOptions['--'];
|
||||
delete generatorOptions.debug;
|
||||
delete generatorOptions.d;
|
||||
delete generatorOptions.dryRun;
|
||||
delete generatorOptions.force;
|
||||
delete generatorOptions.interactive;
|
||||
delete generatorOptions.defaults;
|
||||
delete generatorOptions.help;
|
||||
delete generatorOptions['--'];
|
||||
|
||||
return res;
|
||||
}
|
||||
@ -109,7 +109,7 @@ export function printGenHelp(
|
||||
logger: Console
|
||||
) {
|
||||
printHelp(
|
||||
`${commandName} generate ${opts.collectionName}:${opts.schematicName}`,
|
||||
`nx generate ${opts.collectionName}:${opts.generatorName}`,
|
||||
{
|
||||
...schema,
|
||||
properties: {
|
||||
@ -186,10 +186,10 @@ export async function generate(
|
||||
readDefaultCollection(workspaceDefinition)
|
||||
);
|
||||
|
||||
if (ws.isNxSchematic(opts.collectionName, opts.schematicName)) {
|
||||
const { schema, implementation } = ws.readSchematic(
|
||||
if (ws.isNxGenerator(opts.collectionName, opts.generatorName)) {
|
||||
const { schema, implementation } = ws.readGenerator(
|
||||
opts.collectionName,
|
||||
opts.schematicName
|
||||
opts.generatorName
|
||||
);
|
||||
|
||||
if (opts.help) {
|
||||
@ -197,10 +197,10 @@ export async function generate(
|
||||
return 0;
|
||||
}
|
||||
|
||||
const combinedOpts = await combineOptionsForSchematic(
|
||||
opts.schematicOptions,
|
||||
const combinedOpts = await combineOptionsForGenerator(
|
||||
opts.generatorOptions,
|
||||
opts.collectionName,
|
||||
opts.schematicName,
|
||||
opts.generatorName,
|
||||
workspaceDefinition,
|
||||
schema,
|
||||
opts.interactive
|
||||
|
||||
@ -1,42 +1,35 @@
|
||||
import { tags, terminal } from '@angular-devkit/core';
|
||||
import { getLogger } from '../shared/logger';
|
||||
import { commandName, toolDescription } from '../shared/print-help';
|
||||
|
||||
export function help() {
|
||||
const logger = getLogger(true);
|
||||
|
||||
logger.info(tags.stripIndent`
|
||||
${terminal.bold(toolDescription)}
|
||||
${terminal.bold('Nx - Extensible Dev Tools for Monorepos.')}
|
||||
|
||||
${terminal.bold('Create a new project.')}
|
||||
${commandName} new ${terminal.grey(
|
||||
'[project-name] [--collection=schematic-collection] [options, ...]'
|
||||
)}
|
||||
nx new ${terminal.grey(
|
||||
'[project-name] [--collection=collection] [options, ...]'
|
||||
)}
|
||||
|
||||
${terminal.bold('Generate code.')}
|
||||
${commandName} generate ${terminal.grey(
|
||||
'[schematic-collection:][schematic] [options, ...]'
|
||||
)}
|
||||
${commandName} g ${terminal.grey(
|
||||
'[schematic-collection:][schematic] [options, ...]'
|
||||
)}
|
||||
nx generate ${terminal.grey('[collection:][generator] [options, ...]')}
|
||||
nx g ${terminal.grey('[collection:][generator] [options, ...]')}
|
||||
|
||||
${terminal.bold('Run target.')}
|
||||
${commandName} run ${terminal.grey(
|
||||
'[project][:target][:configuration] [options, ...]'
|
||||
)}
|
||||
${commandName} r ${terminal.grey(
|
||||
'[project][:target][:configuration] [options, ...]'
|
||||
)}
|
||||
nx run ${terminal.grey(
|
||||
'[project][:target][:configuration] [options, ...]'
|
||||
)}
|
||||
nx r ${terminal.grey('[project][:target][:configuration] [options, ...]')}
|
||||
|
||||
You can also use the infix notation to run a target:
|
||||
${commandName} [target] [project] [options, ...]
|
||||
nx [target] [project] [options, ...]
|
||||
|
||||
${terminal.bold('Migrate packages and create migrations.json.')}
|
||||
${commandName} migrate ${terminal.grey('[package-name]')}
|
||||
nx migrate ${terminal.grey('[package-name]')}
|
||||
|
||||
${terminal.bold('Run migrations.')}
|
||||
${commandName} migrate ${terminal.grey('--run-migrations=[filename]')}
|
||||
nx migrate ${terminal.grey('--run-migrations=[filename]')}
|
||||
|
||||
`);
|
||||
return 0;
|
||||
|
||||
@ -96,8 +96,8 @@ async function createWorkflow(
|
||||
registry: new schema.CoreSchemaRegistry(formats.standardFormats),
|
||||
resolvePaths: [process.cwd(), root],
|
||||
});
|
||||
const _params = opts.schematicOptions._;
|
||||
delete opts.schematicOptions._;
|
||||
const _params = opts.generatorOptions._;
|
||||
delete opts.generatorOptions._;
|
||||
workflow.registry.addSmartDefaultProvider('argv', (schema: JsonObject) => {
|
||||
if ('index' in schema) {
|
||||
return _params[Number(schema['index'])];
|
||||
@ -272,25 +272,25 @@ async function runSchematic(
|
||||
}
|
||||
|
||||
const defaults =
|
||||
opts.schematicName === 'tao-new' || opts.schematicName === 'ng-new'
|
||||
opts.generatorName === 'tao-new' || opts.generatorName === 'ng-new'
|
||||
? {}
|
||||
: await getSchematicDefaults(
|
||||
root,
|
||||
opts.collectionName,
|
||||
opts.schematicName
|
||||
opts.generatorName
|
||||
);
|
||||
const record = { loggingQueue: [] as string[], error: false };
|
||||
workflow.reporter.subscribe(recorder || createRecorder(record, logger));
|
||||
|
||||
const schematicOptions = normalizeOptions(
|
||||
opts.schematicOptions,
|
||||
opts.generatorOptions,
|
||||
flattenedSchema
|
||||
);
|
||||
|
||||
if (schematicOptions['--'] && !allowAdditionalArgs) {
|
||||
schematicOptions['--'].forEach((unmatched) => {
|
||||
const message =
|
||||
`Could not match option '${unmatched.name}' to the ${opts.collectionName}:${opts.schematicName} schema.` +
|
||||
`Could not match option '${unmatched.name}' to the ${opts.collectionName}:${opts.generatorName} schema.` +
|
||||
(unmatched.possible.length > 0
|
||||
? ` Possible matches : ${unmatched.possible.join()}`
|
||||
: '');
|
||||
@ -303,7 +303,7 @@ async function runSchematic(
|
||||
await workflow
|
||||
.execute({
|
||||
collection: opts.collectionName,
|
||||
schematic: opts.schematicName,
|
||||
schematic: opts.generatorName,
|
||||
options: { ...defaults, ...schematicOptions },
|
||||
debug: opts.debug,
|
||||
logger,
|
||||
@ -335,13 +335,13 @@ export async function generate(
|
||||
);
|
||||
const workflow = await createWorkflow(fsHost, root, opts);
|
||||
const collection = getCollection(workflow, opts.collectionName);
|
||||
const schematic = collection.createSchematic(opts.schematicName, true);
|
||||
const schematic = collection.createSchematic(opts.generatorName, true);
|
||||
return (
|
||||
await runSchematic(
|
||||
root,
|
||||
workflow,
|
||||
logger,
|
||||
{ ...opts, schematicName: schematic.description.name },
|
||||
{ ...opts, generatorName: schematic.description.name },
|
||||
schematic
|
||||
)
|
||||
).status;
|
||||
@ -349,9 +349,9 @@ export async function generate(
|
||||
|
||||
export function wrapAngularDevkitSchematic(
|
||||
collectionName: string,
|
||||
schematicName: string
|
||||
generatorName: string
|
||||
) {
|
||||
return (schematicOptions: { [k: string]: any }) => {
|
||||
return (generatorOptions: { [k: string]: any }) => {
|
||||
return async (host: taoTree.Tree) => {
|
||||
const emptyLogger = {
|
||||
log: (e) => {},
|
||||
@ -394,19 +394,19 @@ export function wrapAngularDevkitSchematic(
|
||||
);
|
||||
|
||||
const options = {
|
||||
schematicOptions: { ...schematicOptions, _: [] },
|
||||
generatorOptions: { ...generatorOptions, _: [] },
|
||||
dryRun: true,
|
||||
interactive: false,
|
||||
help: false,
|
||||
debug: false,
|
||||
collectionName,
|
||||
schematicName,
|
||||
generatorName,
|
||||
force: false,
|
||||
defaults: false,
|
||||
};
|
||||
const workflow = await createWorkflow(fsHost, host.root, options);
|
||||
const collection = getCollection(workflow, collectionName);
|
||||
const schematic = collection.createSchematic(schematicName, true);
|
||||
const schematic = collection.createSchematic(generatorName, true);
|
||||
const res = await runSchematic(
|
||||
host.root,
|
||||
workflow,
|
||||
@ -437,7 +437,7 @@ export async function invokeNew(
|
||||
const workflow = await createWorkflow(fsHost, root, opts);
|
||||
const collection = getCollection(workflow, opts.collectionName);
|
||||
const schematic = collection.createSchematic(
|
||||
opts.schematicOptions.cli === 'ng' ? 'ng-new' : 'tao-new',
|
||||
opts.generatorOptions.cli === 'ng' ? 'ng-new' : 'tao-new',
|
||||
true
|
||||
);
|
||||
const allowAdditionalArgs = true; // we can't yet know the schema to validate against
|
||||
@ -446,7 +446,7 @@ export async function invokeNew(
|
||||
root,
|
||||
workflow,
|
||||
logger,
|
||||
{ ...opts, schematicName: schematic.description.name },
|
||||
{ ...opts, generatorName: schematic.description.name },
|
||||
schematic,
|
||||
allowAdditionalArgs
|
||||
)
|
||||
|
||||
@ -7,7 +7,7 @@ import {
|
||||
Options,
|
||||
Schema,
|
||||
} from '../shared/params';
|
||||
import { commandName, printHelp } from '../shared/print-help';
|
||||
import { printHelp } from '../shared/print-help';
|
||||
import {
|
||||
TargetDefinition,
|
||||
WorkspaceDefinition,
|
||||
@ -26,7 +26,7 @@ export interface RunOptions {
|
||||
|
||||
function throwInvalidInvocation() {
|
||||
throw new Error(
|
||||
`Specify the project name and the target (e.g., ${commandName} run proj:build)`
|
||||
`Specify the project name and the target (e.g., nx run proj:build)`
|
||||
);
|
||||
}
|
||||
|
||||
@ -86,11 +86,7 @@ export function printRunHelp(
|
||||
schema: Schema,
|
||||
logger: Console
|
||||
) {
|
||||
printHelp(
|
||||
`${commandName} run ${opts.project}:${opts.target}`,
|
||||
schema,
|
||||
logger as any
|
||||
);
|
||||
printHelp(`nx run ${opts.project}:${opts.target}`, schema, logger as any);
|
||||
}
|
||||
|
||||
export function validateTargetAndConfiguration(
|
||||
|
||||
@ -41,7 +41,7 @@ export async function handleErrors(
|
||||
return await fn();
|
||||
} catch (err) {
|
||||
if (err.constructor.name === 'UnsuccessfulWorkflowExecution') {
|
||||
logger.error('The Schematic workflow failed. See above.');
|
||||
logger.error('The generator workflow failed. See above.');
|
||||
} else {
|
||||
logger.error(err.message);
|
||||
}
|
||||
@ -287,10 +287,10 @@ export function combineOptionsForBuilder(
|
||||
return combined;
|
||||
}
|
||||
|
||||
export async function combineOptionsForSchematic(
|
||||
export async function combineOptionsForGenerator(
|
||||
commandLineOpts: Options,
|
||||
collectionName: string,
|
||||
schematicName: string,
|
||||
generatorName: string,
|
||||
ws: WorkspaceDefinition,
|
||||
schema: Schema,
|
||||
isInteractive: boolean
|
||||
@ -298,11 +298,20 @@ export async function combineOptionsForSchematic(
|
||||
const schematicDefaults =
|
||||
ws.schematics &&
|
||||
ws.schematics[collectionName] &&
|
||||
ws.schematics[collectionName][schematicName]
|
||||
? ws.schematics[collectionName][schematicName]
|
||||
ws.schematics[collectionName][generatorName]
|
||||
? ws.schematics[collectionName][generatorName]
|
||||
: {};
|
||||
const generatorDefaults =
|
||||
ws.generators &&
|
||||
ws.generators[collectionName] &&
|
||||
ws.generators[collectionName][generatorName]
|
||||
? ws.generators[collectionName][generatorName]
|
||||
: {};
|
||||
let combined = convertAliases(
|
||||
coerceTypesInOptions({ ...schematicDefaults, ...commandLineOpts }, schema),
|
||||
coerceTypesInOptions(
|
||||
{ ...schematicDefaults, ...generatorDefaults, ...commandLineOpts },
|
||||
schema
|
||||
),
|
||||
schema,
|
||||
false
|
||||
);
|
||||
|
||||
@ -33,14 +33,3 @@ ${args}
|
||||
${formatOption('help', 'Show available options for project target.')}
|
||||
`);
|
||||
}
|
||||
|
||||
export let commandName = 'nx';
|
||||
export let toolDescription = 'Nx - Extensible Dev Tools for Monorepos.';
|
||||
|
||||
export function setCommandNameAndDescription(
|
||||
name: string,
|
||||
description: string
|
||||
) {
|
||||
commandName = name;
|
||||
toolDescription = description;
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@ export interface WorkspaceDefinition {
|
||||
projects: { [projectName: string]: ProjectDefinition };
|
||||
defaultProject: string | undefined;
|
||||
schematics: { [collectionName: string]: { [schematicName: string]: any } };
|
||||
generators: { [collectionName: string]: { [generatorName: string]: any } };
|
||||
cli: { defaultCollection: string };
|
||||
}
|
||||
|
||||
@ -43,8 +44,8 @@ export class Workspaces {
|
||||
return schema['cli'] === 'nx';
|
||||
}
|
||||
|
||||
isNxSchematic(collectionName: string, schematicName: string) {
|
||||
const schema = this.readSchematic(collectionName, schematicName).schema;
|
||||
isNxGenerator(collectionName: string, generatorName: string) {
|
||||
const schema = this.readGenerator(collectionName, generatorName).schema;
|
||||
return schema['cli'] === 'nx';
|
||||
}
|
||||
|
||||
@ -65,29 +66,29 @@ export class Workspaces {
|
||||
}
|
||||
}
|
||||
|
||||
readSchematic(collectionName: string, schematicName: string) {
|
||||
readGenerator(collectionName: string, generatorName: string) {
|
||||
try {
|
||||
const {
|
||||
schematicsFilePath,
|
||||
schematicsJson,
|
||||
normalizedSchematicName,
|
||||
} = this.readSchematicsJson(collectionName, schematicName);
|
||||
const schematicsDir = path.dirname(schematicsFilePath);
|
||||
const schematicConfig =
|
||||
schematicsJson.schematics[normalizedSchematicName];
|
||||
const schemaPath = path.join(schematicsDir, schematicConfig.schema || '');
|
||||
generatorsFilePath,
|
||||
generatorsJson,
|
||||
normalizedGeneratorName,
|
||||
} = this.readGeneratorsJson(collectionName, generatorName);
|
||||
const generatorsDir = path.dirname(generatorsFilePath);
|
||||
const generatorConfig = (generatorsJson.generators ||
|
||||
generatorsJson.schematics)[normalizedGeneratorName];
|
||||
const schemaPath = path.join(generatorsDir, generatorConfig.schema || '');
|
||||
const schema = JSON.parse(fs.readFileSync(schemaPath).toString());
|
||||
const module = require(path.join(
|
||||
schematicsDir,
|
||||
schematicConfig.implementation
|
||||
? schematicConfig.implementation
|
||||
: schematicConfig.factory
|
||||
generatorsDir,
|
||||
generatorConfig.implementation
|
||||
? generatorConfig.implementation
|
||||
: generatorConfig.factory
|
||||
));
|
||||
const implementation = module.default;
|
||||
return { schema, implementation };
|
||||
} catch (e) {
|
||||
throw new Error(
|
||||
`Unable to resolve ${collectionName}:${schematicName}.\n${e.message}`
|
||||
`Unable to resolve ${collectionName}:${generatorName}.\n${e.message}`
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -111,50 +112,50 @@ export class Workspaces {
|
||||
return { builder, buildersFilePath, buildersJson };
|
||||
}
|
||||
|
||||
private readSchematicsJson(collectionName: string, schematic: string) {
|
||||
let schematicsFilePath;
|
||||
private readGeneratorsJson(collectionName: string, generator: string) {
|
||||
let generatorsFilePath;
|
||||
if (collectionName.endsWith('.json')) {
|
||||
schematicsFilePath = require.resolve(collectionName);
|
||||
generatorsFilePath = require.resolve(collectionName);
|
||||
} else {
|
||||
const packageJsonPath = require.resolve(`${collectionName}/package.json`);
|
||||
const packageJson = JSON.parse(
|
||||
fs.readFileSync(packageJsonPath).toString()
|
||||
);
|
||||
const schematicsFile = packageJson.schematics;
|
||||
schematicsFilePath = require.resolve(
|
||||
path.join(path.dirname(packageJsonPath), schematicsFile)
|
||||
const generatorsFile = packageJson.generators
|
||||
? packageJson.generators
|
||||
: packageJson.schematics;
|
||||
generatorsFilePath = require.resolve(
|
||||
path.join(path.dirname(packageJsonPath), generatorsFile)
|
||||
);
|
||||
}
|
||||
const schematicsJson = JSON.parse(
|
||||
fs.readFileSync(schematicsFilePath).toString()
|
||||
const generatorsJson = JSON.parse(
|
||||
fs.readFileSync(generatorsFilePath).toString()
|
||||
);
|
||||
|
||||
let normalizedSchematicName;
|
||||
for (let k of Object.keys(schematicsJson.schematics)) {
|
||||
if (k === schematic) {
|
||||
normalizedSchematicName = k;
|
||||
let normalizedGeneratorName;
|
||||
const gens = generatorsJson.generators || generatorsJson.schematics;
|
||||
for (let k of Object.keys(gens)) {
|
||||
if (k === generator) {
|
||||
normalizedGeneratorName = k;
|
||||
break;
|
||||
}
|
||||
if (
|
||||
schematicsJson.schematics[k].aliases &&
|
||||
schematicsJson.schematics[k].aliases.indexOf(schematic) > -1
|
||||
) {
|
||||
normalizedSchematicName = k;
|
||||
if (gens[k].aliases && gens[k].aliases.indexOf(generator) > -1) {
|
||||
normalizedGeneratorName = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!normalizedSchematicName) {
|
||||
for (let parent of schematicsJson.extends || []) {
|
||||
if (!normalizedGeneratorName) {
|
||||
for (let parent of generatorsJson.extends || []) {
|
||||
try {
|
||||
return this.readSchematicsJson(parent, schematic);
|
||||
return this.readGeneratorsJson(parent, generator);
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Cannot find schematic '${schematic}' in ${schematicsFilePath}.`
|
||||
`Cannot find generator '${generator}' in ${generatorsFilePath}.`
|
||||
);
|
||||
}
|
||||
return { schematicsFilePath, schematicsJson, normalizedSchematicName };
|
||||
return { generatorsFilePath, generatorsJson, normalizedGeneratorName };
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,10 +58,11 @@
|
||||
"description": "Create a library"
|
||||
},
|
||||
|
||||
"workspace-schematic": {
|
||||
"factory": "./src/schematics/workspace-schematic/workspace-schematic",
|
||||
"schema": "./src/schematics/workspace-schematic/schema.json",
|
||||
"description": "Generates a workspace schematic"
|
||||
"workspace-generator": {
|
||||
"factory": "./src/schematics/workspace-generator/workspace-generator",
|
||||
"schema": "./src/schematics/workspace-generator/schema.json",
|
||||
"aliases": ["workspace-schematic"],
|
||||
"description": "Generates a workspace generator"
|
||||
},
|
||||
|
||||
"run-commands": {
|
||||
|
||||
@ -87,6 +87,6 @@ import * as strings from './src/utils/strings';
|
||||
export { checkAndCleanWithSemver } from './src/utils/version-utils';
|
||||
export { updatePackagesInPackageJson } from './src/utils/update-packages-in-package-json';
|
||||
|
||||
export { librarySchematic } from './src/schematics/library/library';
|
||||
export { libraryGenerator } from './src/schematics/library/library';
|
||||
|
||||
export const stringUtils = strings;
|
||||
|
||||
@ -8,7 +8,7 @@ import { format } from './format';
|
||||
import { workspaceLint } from './lint';
|
||||
import { list } from './list';
|
||||
import { report } from './report';
|
||||
import { workspaceSchematic } from './workspace-schematic';
|
||||
import { workspaceGenerators } from './workspace-generators';
|
||||
import { affected } from './affected';
|
||||
import { runMany } from './run-many';
|
||||
|
||||
@ -34,7 +34,7 @@ export const commandsObject = yargs
|
||||
`
|
||||
)
|
||||
.command(
|
||||
'generate [schematic-collection:][schematic] [options, ...]',
|
||||
'generate [collection:][generator] [options, ...]',
|
||||
`
|
||||
Generate code
|
||||
(e.g., nx generate @nrwl/web:app myapp).
|
||||
@ -150,26 +150,26 @@ export const commandsObject = yargs
|
||||
(_) => workspaceLint()
|
||||
)
|
||||
.command(
|
||||
'workspace-schematic [name]',
|
||||
'Runs a workspace schematic from the tools/schematics directory',
|
||||
['workspace-generator [name]', 'workspace-schematic [name]'],
|
||||
'Runs a workspace generator from the tools/generators directory',
|
||||
(yargs) => {
|
||||
yargs.option('list-schematics', {
|
||||
describe: 'List the available workspace-schematics',
|
||||
yargs.option('list-generators', {
|
||||
describe: 'List the available workspace-generators',
|
||||
type: 'boolean',
|
||||
});
|
||||
/**
|
||||
* Don't require `name` if only listing available
|
||||
* schematics
|
||||
*/
|
||||
if (yargs.argv.listSchematics !== true) {
|
||||
if (yargs.argv.listGenerators !== true) {
|
||||
yargs.demandOption(['name']).positional('name', {
|
||||
type: 'string',
|
||||
describe: 'The name of your schematic`',
|
||||
describe: 'The name of your generator`',
|
||||
});
|
||||
}
|
||||
return yargs;
|
||||
},
|
||||
() => workspaceSchematic(process.argv.slice(3))
|
||||
() => workspaceGenerators(process.argv.slice(3))
|
||||
)
|
||||
.command(
|
||||
'migrate',
|
||||
|
||||
@ -13,6 +13,7 @@ export const supportedNxCommands = [
|
||||
'format:check',
|
||||
'format:write',
|
||||
'workspace-schematic',
|
||||
'workspace-generator',
|
||||
'workspace-lint',
|
||||
'migrate',
|
||||
'report',
|
||||
|
||||
@ -46,7 +46,7 @@ type TsConfig = {
|
||||
references?: Array<{ path: string }>;
|
||||
};
|
||||
|
||||
export async function workspaceSchematic(args: string[]) {
|
||||
export async function workspaceGenerators(args: string[]) {
|
||||
const outDir = compileTools();
|
||||
const parsedArgs = parseOptions(args, outDir);
|
||||
const logger = createConsoleLogger(
|
||||
@ -54,16 +54,16 @@ export async function workspaceSchematic(args: string[]) {
|
||||
process.stdout,
|
||||
process.stderr
|
||||
);
|
||||
const collectionFile = path.join(outDir, 'workspace-schematics.json');
|
||||
if (parsedArgs.listSchematics) {
|
||||
return listSchematics(collectionFile, logger);
|
||||
const collectionFile = path.join(outDir, 'workspace-generators.json');
|
||||
if (parsedArgs.listGenerators) {
|
||||
return listGenerators(collectionFile, logger);
|
||||
}
|
||||
const schematicName = args[0];
|
||||
const generatorName = args[0];
|
||||
const ws = new Workspaces();
|
||||
if (ws.isNxSchematic(collectionFile, schematicName)) {
|
||||
if (ws.isNxGenerator(collectionFile, generatorName)) {
|
||||
try {
|
||||
execSync(
|
||||
`npx tao g "${collectionFile}":${schematicName} ${args
|
||||
`npx tao g "${collectionFile}":${generatorName} ${args
|
||||
.slice(1)
|
||||
.join(' ')}`,
|
||||
{ stdio: ['inherit', 'inherit', 'inherit'] }
|
||||
@ -74,8 +74,8 @@ export async function workspaceSchematic(args: string[]) {
|
||||
} else {
|
||||
try {
|
||||
const workflow = createWorkflow(parsedArgs.dryRun);
|
||||
await executeSchematic(
|
||||
schematicName,
|
||||
await executeAngularDevkitSchematic(
|
||||
generatorName,
|
||||
parsedArgs,
|
||||
workflow,
|
||||
outDir,
|
||||
@ -93,10 +93,10 @@ function compileTools() {
|
||||
removeSync(toolsOutDir);
|
||||
compileToolsDir(toolsOutDir);
|
||||
|
||||
const schematicsOutDir = path.join(toolsOutDir, 'schematics');
|
||||
const generatorsOutDir = path.join(toolsOutDir, 'generators');
|
||||
const collectionData = constructCollection();
|
||||
saveCollection(schematicsOutDir, collectionData);
|
||||
return schematicsOutDir;
|
||||
saveCollection(generatorsOutDir, collectionData);
|
||||
return generatorsOutDir;
|
||||
}
|
||||
|
||||
function getToolsOutDir() {
|
||||
@ -104,10 +104,10 @@ function getToolsOutDir() {
|
||||
}
|
||||
|
||||
function compileToolsDir(outDir: string) {
|
||||
copySync(schematicsDir(), path.join(outDir, 'schematics'));
|
||||
copySync(generatorsDir(), path.join(outDir, 'generators'));
|
||||
|
||||
const tmpTsConfigPath = createTmpTsConfig(toolsTsConfigPath(), {
|
||||
include: [path.join(schematicsDir(), '**/*.ts')],
|
||||
include: [path.join(generatorsDir(), '**/*.ts')],
|
||||
});
|
||||
|
||||
const packageExec = getPackageManagerExecuteCommand();
|
||||
@ -123,11 +123,11 @@ function compileToolsDir(outDir: string) {
|
||||
}
|
||||
|
||||
function constructCollection() {
|
||||
const schematics = {};
|
||||
fs.readdirSync(schematicsDir()).forEach((c) => {
|
||||
const childDir = path.join(schematicsDir(), c);
|
||||
const generators = {};
|
||||
fs.readdirSync(generatorsDir()).forEach((c) => {
|
||||
const childDir = path.join(generatorsDir(), c);
|
||||
if (exists(path.join(childDir, 'schema.json'))) {
|
||||
schematics[c] = {
|
||||
generators[c] = {
|
||||
factory: `./${c}`,
|
||||
schema: `./${path.join(c, 'schema.json')}`,
|
||||
description: `Schematic ${c}`,
|
||||
@ -135,21 +135,21 @@ function constructCollection() {
|
||||
}
|
||||
});
|
||||
return {
|
||||
name: 'workspace-schematics',
|
||||
name: 'workspace-generators',
|
||||
version: '1.0',
|
||||
schematics,
|
||||
schematics: generators, // TODO vsavkin: remove this
|
||||
};
|
||||
}
|
||||
|
||||
function saveCollection(dir: string, collection: any) {
|
||||
writeFileSync(
|
||||
path.join(dir, 'workspace-schematics.json'),
|
||||
path.join(dir, 'workspace-generators.json'),
|
||||
JSON.stringify(collection)
|
||||
);
|
||||
}
|
||||
|
||||
function schematicsDir() {
|
||||
return path.join(rootDirectory, 'tools', 'schematics');
|
||||
function generatorsDir() {
|
||||
return path.join(rootDirectory, 'tools', 'generators');
|
||||
}
|
||||
|
||||
function toolsDir() {
|
||||
@ -176,7 +176,7 @@ function createWorkflow(dryRun: boolean) {
|
||||
});
|
||||
}
|
||||
|
||||
function listSchematics(collectionName: string, logger: logging.Logger) {
|
||||
function listGenerators(collectionName: string, logger: logging.Logger) {
|
||||
try {
|
||||
const engineHost = new NodeModulesEngineHost();
|
||||
const engine = new SchematicEngine(engineHost);
|
||||
@ -234,7 +234,7 @@ function createPromptProvider(): schema.PromptProvider {
|
||||
}
|
||||
|
||||
// execute schematic
|
||||
async function executeSchematic(
|
||||
async function executeAngularDevkitSchematic(
|
||||
schematicName: string,
|
||||
options: { [p: string]: any },
|
||||
workflow: NodeWorkflow,
|
||||
@ -374,7 +374,7 @@ function parseOptions(args: string[], outDir: string): { [k: string]: any } {
|
||||
}
|
||||
}
|
||||
return yargsParser(args, {
|
||||
boolean: ['dryRun', 'listSchematics', 'interactive', ...booleanProps],
|
||||
boolean: ['dryRun', 'listGenerators', 'interactive', ...booleanProps],
|
||||
alias: {
|
||||
dryRun: ['d'],
|
||||
listSchematics: ['l'],
|
||||
@ -143,7 +143,7 @@ export default function (schema: Schema): Rule {
|
||||
};
|
||||
}
|
||||
|
||||
export const librarySchematic = wrapAngularDevkitSchematic(
|
||||
export const libraryGenerator = wrapAngularDevkitSchematic(
|
||||
'@nrwl/workspace',
|
||||
'library'
|
||||
);
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import { Tree, formatFiles, installPackagesTask } from '@nrwl/devkit';
|
||||
import { librarySchematic } from '@nrwl/workspace';
|
||||
import { libraryGenerator } from '@nrwl/workspace';
|
||||
|
||||
export default async function(host: Tree, schema: any) {
|
||||
await librarySchematic({name: schema.name})(host);
|
||||
await libraryGenerator({name: schema.name})(host);
|
||||
await formatFiles(host);
|
||||
return () => {
|
||||
installPackagesTask(host)
|
||||
@ -1,7 +1,7 @@
|
||||
import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing';
|
||||
import workspaceSchematic from './workspace-schematic';
|
||||
import workspaceGenerator from './workspace-generator';
|
||||
|
||||
describe('workspace-schematic', () => {
|
||||
describe('workspace-generator', () => {
|
||||
it('should generate a target', async () => {
|
||||
const tree = createTreeWithEmptyWorkspace();
|
||||
const opts = {
|
||||
@ -9,9 +9,9 @@ describe('workspace-schematic', () => {
|
||||
skipFormat: true,
|
||||
};
|
||||
|
||||
await workspaceSchematic(tree, opts);
|
||||
await workspaceGenerator(tree, opts);
|
||||
|
||||
expect(tree.exists('tools/schematics/custom/index.ts')).toBeTruthy();
|
||||
expect(tree.exists('tools/schematics/custom/schema.json')).toBeTruthy();
|
||||
expect(tree.exists('tools/generators/custom/index.ts')).toBeTruthy();
|
||||
expect(tree.exists('tools/generators/custom/schema.json')).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@ -8,7 +8,7 @@ export default async function (host: Tree, schema: Schema) {
|
||||
generateFiles(
|
||||
host,
|
||||
path.join(__dirname, 'files'),
|
||||
path.join('tools/schematics', schema.name),
|
||||
path.join('tools/generators', schema.name),
|
||||
options
|
||||
);
|
||||
if (!schema.skipFormat) {
|
||||
@ -24,16 +24,8 @@
|
||||
"format": "nx format:write",
|
||||
"format:write": "nx format:write",
|
||||
"format:check": "nx format:check",
|
||||
|
||||
<% if(cli === 'angular') { %>
|
||||
"update": "ng update @nrwl/workspace",
|
||||
<% } %>
|
||||
|
||||
<% if(cli === 'nx') { %>
|
||||
"update": "nx migrate latest",
|
||||
<% } %>
|
||||
|
||||
"workspace-schematic": "nx workspace-schematic",
|
||||
"workspace-generator": "nx workspace-generator",
|
||||
"dep-graph": "nx dep-graph",
|
||||
"help": "nx help"
|
||||
},
|
||||
|
||||
@ -6,19 +6,19 @@ export function fetchCorePlugins() {
|
||||
const corePlugins: CorePlugin[] = [
|
||||
{
|
||||
name: '@nrwl/angular',
|
||||
capabilities: 'schematics',
|
||||
capabilities: 'generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/cypress',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/express',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/jest',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/linter',
|
||||
@ -26,35 +26,35 @@ export function fetchCorePlugins() {
|
||||
},
|
||||
{
|
||||
name: '@nrwl/nest',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/next',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/node',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/nx-plugin',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/react',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/storybook',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/web',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
{
|
||||
name: '@nrwl/workspace',
|
||||
capabilities: 'builders,schematics',
|
||||
capabilities: 'builders,generators',
|
||||
},
|
||||
];
|
||||
return corePlugins;
|
||||
|
||||
@ -32,7 +32,7 @@ export function getInstalledPluginsFromPackageJson(
|
||||
})
|
||||
.sort()
|
||||
.map((name) => getPluginCapabilities(workspaceRoot, name))
|
||||
.filter((x) => x && !!(x.schematics || x.builders));
|
||||
.filter((x) => x && !!(x.generators || x.builders));
|
||||
}
|
||||
|
||||
export function listInstalledPlugins(installedPlugins: PluginCapabilities[]) {
|
||||
@ -43,8 +43,8 @@ export function listInstalledPlugins(installedPlugins: PluginCapabilities[]) {
|
||||
if (hasElements(p.builders)) {
|
||||
capabilities.push('builders');
|
||||
}
|
||||
if (hasElements(p.schematics)) {
|
||||
capabilities.push('schematics');
|
||||
if (hasElements(p.generators)) {
|
||||
capabilities.push('generators');
|
||||
}
|
||||
return `${terminal.bold(p.name)} (${capabilities.join()})`;
|
||||
}),
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
export interface PluginSchematic {
|
||||
export interface PluginGenerator {
|
||||
factory: string;
|
||||
schema: string;
|
||||
description: string;
|
||||
@ -15,12 +15,12 @@ export interface PluginBuilder {
|
||||
export interface PluginCapabilities {
|
||||
name: string;
|
||||
builders: { [name: string]: PluginBuilder };
|
||||
schematics: { [name: string]: PluginSchematic };
|
||||
generators: { [name: string]: PluginGenerator };
|
||||
}
|
||||
|
||||
export interface CorePlugin {
|
||||
name: string;
|
||||
capabilities: 'builders' | 'schematics' | 'builders,schematics';
|
||||
capabilities: 'builders' | 'generators' | 'builders,generators';
|
||||
link?: string;
|
||||
}
|
||||
|
||||
|
||||
@ -40,12 +40,19 @@ export function getPluginCapabilities(
|
||||
const packageJson = readJsonFile(packageJsonPath);
|
||||
return {
|
||||
name: pluginName,
|
||||
schematics: tryGetCollection(
|
||||
workspaceRoot,
|
||||
pluginName,
|
||||
packageJson.schematics,
|
||||
'schematics'
|
||||
),
|
||||
generators:
|
||||
tryGetCollection(
|
||||
workspaceRoot,
|
||||
pluginName,
|
||||
packageJson.generators,
|
||||
'generators'
|
||||
) ||
|
||||
tryGetCollection(
|
||||
workspaceRoot,
|
||||
pluginName,
|
||||
packageJson.schematics,
|
||||
'schematics'
|
||||
),
|
||||
builders: tryGetCollection(
|
||||
workspaceRoot,
|
||||
pluginName,
|
||||
@ -77,22 +84,22 @@ export function listPluginCapabilities(pluginName: string) {
|
||||
}
|
||||
|
||||
const hasBuilders = hasElements(plugin.builders);
|
||||
const hasSchematics = hasElements(plugin.schematics);
|
||||
const hasGenerators = hasElements(plugin.generators);
|
||||
|
||||
if (!hasBuilders && !hasSchematics) {
|
||||
if (!hasBuilders && !hasGenerators) {
|
||||
output.warn({ title: `No capabilities found in ${pluginName}` });
|
||||
return;
|
||||
}
|
||||
|
||||
const bodyLines = [];
|
||||
|
||||
if (hasSchematics) {
|
||||
bodyLines.push(terminal.bold(terminal.green('SCHEMATICS')));
|
||||
if (hasGenerators) {
|
||||
bodyLines.push(terminal.bold(terminal.green('GENERATORS')));
|
||||
bodyLines.push('');
|
||||
bodyLines.push(
|
||||
...Object.keys(plugin.schematics).map(
|
||||
...Object.keys(plugin.generators).map(
|
||||
(name) =>
|
||||
`${terminal.bold(name)} : ${plugin.schematics[name].description}`
|
||||
`${terminal.bold(name)} : ${plugin.generators[name].description}`
|
||||
)
|
||||
);
|
||||
if (hasBuilders) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user