UNPKG

nx

Version:

Smart, Fast and Extensible Build System

269 lines • 12.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generate = exports.newWorkspace = exports.printGenHelp = exports.printChanges = void 0; const tslib_1 = require("tslib"); const chalk = require("chalk"); const enquirer_1 = require("enquirer"); const fileutils_1 = require("nx/src/utils/fileutils"); const configuration_1 = require("../config/configuration"); const workspaces_1 = require("../config/workspaces"); const tree_1 = require("../generators/tree"); const project_graph_1 = require("../project-graph/project-graph"); const logger_1 = require("../utils/logger"); const params_1 = require("../utils/params"); const local_plugins_1 = require("../utils/plugins/local-plugins"); const print_help_1 = require("../utils/print-help"); const workspace_root_1 = require("../utils/workspace-root"); function printChanges(fileChanges) { fileChanges.forEach((f) => { if (f.type === 'CREATE') { console.log(`${chalk.green('CREATE')} ${f.path}`); } else if (f.type === 'UPDATE') { console.log(`${chalk.white('UPDATE')} ${f.path}`); } else if (f.type === 'DELETE') { console.log(`${chalk.yellow('DELETE')} ${f.path}`); } }); } exports.printChanges = printChanges; function promptForCollection(generatorName, ws, interactive, projectsConfiguration) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const packageJson = (0, fileutils_1.readJsonFile)(`${workspace_root_1.workspaceRoot}/package.json`); const localPlugins = (0, local_plugins_1.getLocalWorkspacePlugins)(projectsConfiguration); const installedCollections = Array.from(new Set([ ...Object.keys(packageJson.dependencies || {}), ...Object.keys(packageJson.devDependencies || {}), ])); const choicesMap = new Set(); for (const collectionName of installedCollections) { try { const { resolvedCollectionName, normalizedGeneratorName } = ws.readGenerator(collectionName, generatorName); choicesMap.add(`${resolvedCollectionName}:${normalizedGeneratorName}`); } catch (_a) { } } const choicesFromLocalPlugins = []; for (const [name] of localPlugins) { try { const { resolvedCollectionName, normalizedGeneratorName } = ws.readGenerator(name, generatorName); const value = `${resolvedCollectionName}:${normalizedGeneratorName}`; if (!choicesMap.has(value)) { choicesFromLocalPlugins.push({ name: value, message: chalk.bold(value), value, }); } } catch (_b) { } } if (choicesFromLocalPlugins.length) { choicesFromLocalPlugins[choicesFromLocalPlugins.length - 1].message += '\n'; } const choices = choicesFromLocalPlugins.concat(...choicesMap); if (choices.length === 1) { return typeof choices[0] === 'string' ? choices[0] : choices[0].value; } else if (!interactive && choices.length > 1) { throwInvalidInvocation(Array.from(choicesMap)); } else if (interactive && choices.length > 1) { const noneOfTheAbove = `\nNone of the above`; choices.push(noneOfTheAbove); let { generator, customCollection } = yield (0, enquirer_1.prompt)([ { name: 'generator', message: `Which generator would you like to use?`, type: 'autocomplete', // enquirer's typings are incorrect here... It supports (string | Choice)[], but is typed as (string[] | Choice[]) choices: choices, }, { name: 'customCollection', type: 'input', message: `Which collection would you like to use?`, skip: function () { // Skip this question if the user did not answer None of the above return this.state.answers.generator !== noneOfTheAbove; }, validate: function (value) { if (this.skipped) { return true; } try { ws.readGenerator(value, generatorName); return true; } catch (_a) { logger_1.logger.error(`\nCould not find ${value}:${generatorName}`); return false; } }, }, ]); return customCollection ? `${customCollection}:${generatorName}` : generator; } else { throw new Error(`Could not find any generators named "${generatorName}"`); } }); } function parseGeneratorString(value) { const separatorIndex = value.lastIndexOf(':'); if (separatorIndex > 0) { return { collection: value.slice(0, separatorIndex), generator: value.slice(separatorIndex + 1), }; } else { return { generator: value, }; } } function convertToGenerateOptions(generatorOptions, ws, defaultCollectionName, mode, projectsConfiguration) { return tslib_1.__awaiter(this, void 0, void 0, function* () { let collectionName = null; let generatorName = null; const interactive = generatorOptions.interactive; if (mode === 'generate') { const generatorDescriptor = generatorOptions['generator']; const { collection, generator } = parseGeneratorString(generatorDescriptor); if (collection) { collectionName = collection; generatorName = generator; } else if (!defaultCollectionName) { const generatorString = yield promptForCollection(generatorDescriptor, ws, interactive, projectsConfiguration); const parsedGeneratorString = parseGeneratorString(generatorString); collectionName = parsedGeneratorString.collection; generatorName = parsedGeneratorString.generator; } else { collectionName = defaultCollectionName; generatorName = generatorDescriptor; } } else { collectionName = generatorOptions.collection; generatorName = 'new'; } if (!collectionName) { throwInvalidInvocation(['@nrwl/workspace:library']); } const res = { collectionName, generatorName, generatorOptions, help: generatorOptions.help, dryRun: generatorOptions.dryRun, interactive, defaults: generatorOptions.defaults, }; delete generatorOptions.d; delete generatorOptions.dryRun; delete generatorOptions['dry-run']; delete generatorOptions.interactive; delete generatorOptions.help; delete generatorOptions.collection; delete generatorOptions.verbose; delete generatorOptions.generator; delete generatorOptions['--']; delete generatorOptions['$0']; return res; }); } function throwInvalidInvocation(availableGenerators) { throw new Error(`Specify the generator name (e.g., nx generate ${availableGenerators.join(', ')})`); } function readDefaultCollection(nxConfig) { return nxConfig.cli ? nxConfig.cli.defaultCollection : null; } function printGenHelp(opts, schema, normalizedGeneratorName, aliases) { (0, print_help_1.printHelp)(`generate ${opts.collectionName}:${normalizedGeneratorName}`, Object.assign(Object.assign({}, schema), { properties: schema.properties }), { mode: 'generate', plugin: opts.collectionName, entity: normalizedGeneratorName, aliases, }); } exports.printGenHelp = printGenHelp; function newWorkspace(cwd, args) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const ws = new workspaces_1.Workspaces(null); const isVerbose = args['verbose']; return (0, params_1.handleErrors)(isVerbose, () => tslib_1.__awaiter(this, void 0, void 0, function* () { const opts = yield convertToGenerateOptions(args, ws, null, 'new'); const { normalizedGeneratorName, schema, implementationFactory } = ws.readGenerator(opts.collectionName, opts.generatorName); logger_1.logger.info(`NX Generating ${opts.collectionName}:${normalizedGeneratorName}`); const combinedOpts = yield (0, params_1.combineOptionsForGenerator)(opts.generatorOptions, opts.collectionName, normalizedGeneratorName, null, schema, opts.interactive, null, null, isVerbose); if (ws.isNxGenerator(opts.collectionName, normalizedGeneratorName)) { const host = new tree_1.FsTree(cwd, isVerbose); const implementation = implementationFactory(); const task = yield implementation(host, combinedOpts); const changes = host.listChanges(); printChanges(changes); if (!opts.dryRun) { (0, tree_1.flushChanges)(cwd, changes); if (task) { yield task(); } } else { logger_1.logger.warn(`\nNOTE: The "dryRun" flag means no changes were made.`); } } else { return (yield Promise.resolve().then(() => require('../adapter/ngcli-adapter'))).generate(cwd, Object.assign(Object.assign({}, opts), { generatorOptions: combinedOpts }), isVerbose); } })); }); } exports.newWorkspace = newWorkspace; function generate(cwd, args) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const ws = new workspaces_1.Workspaces(workspace_root_1.workspaceRoot); const nxJson = (0, configuration_1.readNxJson)(); const projectGraph = yield (0, project_graph_1.createProjectGraphAsync)(); const projectsConfiguration = (0, project_graph_1.readProjectsConfigurationFromProjectGraph)(projectGraph); const workspaceConfiguration = Object.assign(Object.assign({}, nxJson), projectsConfiguration); const isVerbose = args['verbose']; return (0, params_1.handleErrors)(isVerbose, () => tslib_1.__awaiter(this, void 0, void 0, function* () { const opts = yield convertToGenerateOptions(args, ws, readDefaultCollection(nxJson), 'generate', projectsConfiguration); const { normalizedGeneratorName, schema, implementationFactory, aliases } = ws.readGenerator(opts.collectionName, opts.generatorName); logger_1.logger.info(`NX Generating ${opts.collectionName}:${normalizedGeneratorName}`); if (opts.help) { printGenHelp(opts, schema, normalizedGeneratorName, aliases); return 0; } const combinedOpts = yield (0, params_1.combineOptionsForGenerator)(opts.generatorOptions, opts.collectionName, normalizedGeneratorName, workspaceConfiguration, schema, opts.interactive, ws.calculateDefaultProjectName(cwd, workspaceConfiguration), ws.relativeCwd(cwd), isVerbose); if (ws.isNxGenerator(opts.collectionName, normalizedGeneratorName)) { const host = new tree_1.FsTree(workspace_root_1.workspaceRoot, isVerbose); const implementation = implementationFactory(); const task = yield implementation(host, combinedOpts); const changes = host.listChanges(); printChanges(changes); if (!opts.dryRun) { (0, tree_1.flushChanges)(workspace_root_1.workspaceRoot, changes); if (task) { yield task(); } } else { logger_1.logger.warn(`\nNOTE: The "dryRun" flag means no changes were made.`); } } else { require('../adapter/compat'); return (yield Promise.resolve().then(() => require('../adapter/ngcli-adapter'))).generate(workspace_root_1.workspaceRoot, Object.assign(Object.assign({}, opts), { generatorOptions: combinedOpts }), isVerbose); } })); }); } exports.generate = generate; //# sourceMappingURL=generate.js.map