UNPKG

@yolkai/nx-workspace

Version:

Extensible Dev Tools for Monorepos

177 lines (176 loc) 6.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const schematics_1 = require("@angular-devkit/schematics"); const tasks_1 = require("@angular-devkit/schematics/tasks"); const ast_utils_1 = require("../../utils/ast-utils"); const name_utils_1 = require("../../utils/name-utils"); const format_files_1 = require("../../utils/rules/format-files"); const versions_1 = require("../../utils/versions"); const path = require("path"); const rxjs_1 = require("rxjs"); const child_process_1 = require("child_process"); const os_1 = require("os"); class RunPresetTask { toConfiguration() { return { name: 'RunPreset' }; } } function createPresetTaskExecutor(cli, opts) { const cliCommand = cli === 'angular' ? 'ng' : 'nx'; return { name: 'RunPreset', create: () => { return Promise.resolve(() => { const spawnOptions = { stdio: [process.stdin, process.stdout, process.stderr], shell: true, cwd: path.join(process.cwd(), opts.directory) }; const executable = os_1.platform() === 'win32' ? `.\\node_modules\\.bin\\${cliCommand}` : `./node_modules/.bin/${cliCommand}`; const args = [ `g`, `@yolkai/nx-workspace:preset`, `--name=${opts.appName}`, opts.style ? `--style=${opts.style}` : null, opts.npmScope ? `--npmScope=${opts.npmScope}` : `--npmScope=${opts.name}`, opts.preset ? `--preset=${opts.preset}` : null, `--cli=${cliCommand}` ].filter(e => !!e); return new rxjs_1.Observable(obs => { child_process_1.spawn(executable, args, spawnOptions).on('close', (code) => { if (code === 0) { obs.next(); obs.complete(); } else { const message = 'Workspace creation failed, see above.'; obs.error(new Error(message)); } }); }); }); } }; } function sharedNew(cli, options) { if (options.skipInstall && options.preset !== 'empty') { throw new Error(`Cannot select a preset when skipInstall is set to true.`); } options = normalizeOptions(options); const workspaceOpts = Object.assign({}, options, { preset: undefined }); return (host, context) => { const engineHost = context.engine.workflow.engineHost; engineHost.registerTaskExecutor(createPresetTaskExecutor(cli, options)); return schematics_1.chain([ schematics_1.schematic('workspace', Object.assign({}, workspaceOpts, { cli })), cli === 'angular' ? schematics_1.noop() : setDefaultLinter('eslint'), addDependencies(options), schematics_1.move('/', options.directory), addTasks(options), format_files_1.formatFiles() ])(schematics_1.Tree.empty(), context); }; } exports.sharedNew = sharedNew; function addDependencies(options) { if (options.preset === 'empty') { return schematics_1.noop(); } else if (options.preset === 'web-components') { return ast_utils_1.addDepsToPackageJson({}, { '@yolkai/nx-web': versions_1.nxVersion }, false); } else if (options.preset === 'angular') { return ast_utils_1.addDepsToPackageJson({ '@yolkai/nx-angular': versions_1.nxVersion }, {}, false); } else if (options.preset === 'angular-nest') { return ast_utils_1.addDepsToPackageJson({ '@yolkai/nx-angular': versions_1.nxVersion }, { '@yolkai/nx-nest': versions_1.nxVersion }, false); } else if (options.preset === 'react') { return ast_utils_1.addDepsToPackageJson({}, { '@yolkai/nx-react': versions_1.nxVersion }, false); } else if (options.preset === 'react-express') { return ast_utils_1.addDepsToPackageJson({}, { '@yolkai/nx-react': versions_1.nxVersion, '@yolkai/nx-express': versions_1.nxVersion }, false); } else if (options.preset === 'next') { return ast_utils_1.addDepsToPackageJson({}, { '@yolkai/nx-next': versions_1.nxVersion }, false); } else { return schematics_1.noop(); } } function addTasks(options) { return (host, context) => { let packageTask; let presetInstallTask; if (!options.skipInstall) { packageTask = context.addTask(new tasks_1.NodePackageInstallTask(options.directory)); } if (options.preset !== 'empty') { const createPresetTask = context.addTask(new RunPresetTask(), [ packageTask ]); presetInstallTask = context.addTask(new tasks_1.NodePackageInstallTask(options.directory), [createPresetTask]); } if (!options.skipGit) { const commit = typeof options.commit == 'object' ? options.commit : !!options.commit ? {} : false; context.addTask(new tasks_1.RepositoryInitializerTask(options.directory, commit), presetInstallTask ? [presetInstallTask] : packageTask ? [packageTask] : []); } }; } function normalizeOptions(options) { options.name = name_utils_1.toFileName(options.name); if (!options.directory) { options.directory = options.name; } return options; } function setDefaultLinter(linter) { return ast_utils_1.updateWorkspaceInTree(json => { if (!json.schematics) { json.schematics = {}; } json.schematics['@yolkai/nx-workspace'] = { library: { linter } }; json.schematics['@yolkai/nx-cypress'] = { 'cypress-project': { linter } }; json.schematics['@yolkai/nx-react'] = { application: { linter }, library: { linter } }; json.schematics['@yolkai/nx-next'] = { application: { linter } }; json.schematics['@yolkai/nx-web'] = { application: { linter } }; json.schematics['@yolkai/nx-node'] = { application: { linter } }; json.schematics['@yolkai/nx-nest'] = { application: { linter } }; json.schematics['@yolkai/nx-express'] = { application: { linter } }; return json; }); }