diff --git a/docs/map.json b/docs/map.json index c658541a6cd58f..8c56824ce03d3c 100644 --- a/docs/map.json +++ b/docs/map.json @@ -360,6 +360,11 @@ "name": "CLI", "id": "cli", "itemList": [ + { + "name": "create-nx-workspace", + "id": "create-nx-workspace", + "file": "generated/cli/create-nx-workspace" + }, { "name": "generate", "id": "generate", diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index de872008a7530a..fe4e0d4ec5e880 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -115,9 +115,7 @@ const cliVersion = 'NX_VERSION'; const nxVersion = 'NX_VERSION'; const prettierVersion = 'PRETTIER_VERSION'; -export const commandsObject: yargs.Argv = yargs( - process.argv.slice(2) -) +export const commandsObject: yargs.Argv = yargs .wrap(yargs.terminalWidth()) .parserConfiguration({ 'strip-dashed': true, @@ -193,8 +191,6 @@ export const commandsObject: yargs.Argv = yargs( .help('help', 'Show this help') .version(nxVersion); -commandsObject.argv; - async function main(parsedArgs: yargs.Arguments) { const { name, diff --git a/packages/create-nx-workspace/bin/index.ts b/packages/create-nx-workspace/bin/index.ts new file mode 100644 index 00000000000000..a923ec09fcdedf --- /dev/null +++ b/packages/create-nx-workspace/bin/index.ts @@ -0,0 +1,3 @@ +import { commandsObject } from './create-nx-workspace'; + +commandsObject.argv; diff --git a/packages/create-nx-workspace/package.json b/packages/create-nx-workspace/package.json index d42ae383b8f6d3..e19139e94de3c1 100644 --- a/packages/create-nx-workspace/package.json +++ b/packages/create-nx-workspace/package.json @@ -19,7 +19,7 @@ "CLI" ], "bin": { - "create-nx-workspace": "./bin/create-nx-workspace.js" + "create-nx-workspace": "./bin/index.js" }, "author": "Victor Savkin", "license": "MIT", diff --git a/scripts/documentation/documentation.ts b/scripts/documentation/documentation.ts index e5f844907204e4..3fa53fe9f22c7c 100644 --- a/scripts/documentation/documentation.ts +++ b/scripts/documentation/documentation.ts @@ -1,6 +1,7 @@ import * as chalk from 'chalk'; import { execSync } from 'child_process'; import { generateCLIDocumentation } from './generate-cli-data'; +import { generateCNWocumentation } from './generate-cnw-documentation'; import { generateDevkitDocumentation } from './generate-devkit-documentation'; import { generatePackageSchemas } from './package-schemas/generatePackageSchemas'; @@ -10,6 +11,7 @@ async function generate() { generatePackageSchemas(); generateDevkitDocumentation(); await generateCLIDocumentation(); + await generateCNWocumentation(); console.log(`\n${chalk.green('✓')} Generated Documentation\n`); } catch (e) { diff --git a/scripts/documentation/generate-cnw-documentation.ts b/scripts/documentation/generate-cnw-documentation.ts new file mode 100644 index 00000000000000..9ba6eede00644a --- /dev/null +++ b/scripts/documentation/generate-cnw-documentation.ts @@ -0,0 +1,121 @@ +import * as chalk from 'chalk'; +import { join } from 'path'; +import { dedent } from 'tslint/lib/utils'; +import { + formatDeprecated, + sortAlphabeticallyFunction, + generateMarkdownFile, +} from './utils'; +const importFresh = require('import-fresh'); + +export async function generateCNWocumentation() { + process.env.NX_GENERATE_DOCS_PROCESS = 'true'; + + console.log( + `\n${chalk.blue( + 'i' + )} Generating Documentation for Create Nx Workspace Command` + ); + + const { commandsObject } = importFresh( + '../../packages/create-nx-workspace/bin/create-nx-workspace' + ); + + const commandsOutputDirectory = join( + __dirname, + '../../docs/', + 'generated', + 'cli' + ); + + const command = commandsObject.getCommandInstance().getCommandHandlers()[ + '$0' + ]; + const parsedCommand = await parseCommand(command); + const markdown = generateMarkdown(parsedCommand); + generateMarkdownFile(commandsOutputDirectory, markdown); + + delete process.env.NX_GENERATE_DOCS_PROCESS; + + console.log( + `${chalk.green( + '✓' + )} Generated Documentation for Create Nx Workspace Command` + ); +} + +interface ParsedCommandOption { + name: string; + description: string; + default: string; + deprecated: boolean | string; +} + +interface ParsedCommand { + commandString: string; + description: string; + options?: Array; +} + +async function parseCommand(command: any): Promise { + const builder = await command.builder(importFresh('yargs')().resetOptions()); + const builderDescriptions = builder.getUsageInstance().getDescriptions(); + const builderDefaultOptions = builder.getOptions().default; + const builderAutomatedOptions = builder.getOptions().defaultDescription; + const builderDeprecatedOptions = builder.getDeprecatedOptions(); + + return { + description: command.description, + commandString: command.original.replace('$0', 'create-nx-workspace'), + options: + Object.keys(builderDescriptions).map((key) => ({ + name: key, + description: builderDescriptions[key] + ? builderDescriptions[key].replace('__yargsString__:', '') + : '', + default: builderDefaultOptions[key] || builderAutomatedOptions[key], + deprecated: builderDeprecatedOptions[key], + })) || null, + }; +} + +function generateMarkdown(command: ParsedCommand) { + let template = dedent` + --- + title: "create-nx-workspace - CLI command" + description: "${command.description}" + --- + # create-nx-workspace + + ${command.description} + + ## Usage + + \`\`\`bash + nx ${command.commandString} + \`\`\` + + [Install \`create-nx-workspace\` globally](/getting-started/nx-setup#install-nx) to invoke the command directly using \`create-nx-workspace\`, or use \`npx create-nx-workspace\`, \`yarn create nx-workspace\`, or \`pnpx create-nx-workspace\`.\n`; + + template += '\n## Options'; + command.options + .sort((a, b) => sortAlphabeticallyFunction(a.name, b.name)) + .forEach((option) => { + template += dedent` + ### ${option.deprecated ? `~~${option.name}~~` : option.name} + ${ + option.default === undefined || option.default === '' + ? '' + : `Default: \`${option.default}\`\n` + } + `; + template += dedent` + ${formatDeprecated(option.description, option.deprecated)} + `; + }); + + return { + name: 'create-nx-workspace', + template, + }; +}