@yolkai/nx-workspace
Version:
177 lines (176 loc) • 6.81 kB
JavaScript
;
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;
});
}