151 lines
4.5 KiB
TypeScript

import {
formatFiles,
installPackagesTask,
names,
readNxJson,
Tree,
updateNxJson,
} from '@nrwl/devkit';
import { Schema } from './schema';
import { Preset } from '../utils/presets';
export async function presetGenerator(tree: Tree, options: Schema) {
options = normalizeOptions(options);
await createPreset(tree, options);
await formatFiles(tree);
return () => {
installPackagesTask(tree);
};
}
export default presetGenerator;
async function createPreset(tree: Tree, options: Schema) {
if (options.preset === Preset.Empty || options.preset === Preset.Apps) {
return;
} else if (options.preset === Preset.AngularMonorepo) {
const {
applicationGenerator: angularApplicationGenerator,
} = require('@nrwl' + '/angular/generators');
await angularApplicationGenerator(tree, {
name: options.name,
style: options.style,
linter: options.linter,
routing: options.routing,
});
} else if (options.preset === Preset.AngularStandalone) {
const {
applicationGenerator: angularApplicationGenerator,
} = require('@nrwl' + '/angular/generators');
await angularApplicationGenerator(tree, {
name: options.name,
style: options.style,
linter: options.linter,
routing: options.routing,
rootProject: true,
});
} else if (options.preset === Preset.ReactMonorepo) {
const {
applicationGenerator: reactApplicationGenerator,
} = require('@nrwl' + '/react');
await reactApplicationGenerator(tree, {
name: options.name,
style: options.style,
linter: options.linter,
bundler: options.bundler ?? 'webpack',
});
} else if (options.preset === Preset.ReactStandalone) {
const {
applicationGenerator: reactApplicationGenerator,
} = require('@nrwl' + '/react');
await reactApplicationGenerator(tree, {
name: options.name,
style: options.style,
linter: options.linter,
rootProject: true,
bundler: options.bundler ?? 'vite',
e2eTestRunner: 'cypress',
unitTestRunner: options.bundler === 'vite' ? 'vitest' : 'jest',
});
} else if (options.preset === Preset.NextJs) {
const { applicationGenerator: nextApplicationGenerator } = require('@nrwl' +
'/next');
await nextApplicationGenerator(tree, {
name: options.name,
style: options.style,
linter: options.linter,
});
} else if (options.preset === Preset.WebComponents) {
const { applicationGenerator: webApplicationGenerator } = require('@nrwl' +
'/web');
await webApplicationGenerator(tree, {
name: options.name,
style: options.style,
linter: options.linter,
bundler: 'vite',
});
} else if (options.preset === Preset.Nest) {
const { applicationGenerator: nestApplicationGenerator } = require('@nrwl' +
'/nest');
await nestApplicationGenerator(tree, {
name: options.name,
linter: options.linter,
});
} else if (options.preset === Preset.Express) {
const {
applicationGenerator: expressApplicationGenerator,
} = require('@nrwl' + '/express');
await expressApplicationGenerator(tree, {
name: options.name,
linter: options.linter,
});
} else if (options.preset === Preset.ReactNative) {
const { reactNativeApplicationGenerator } = require('@nrwl' +
'/react-native');
await reactNativeApplicationGenerator(tree, {
name: options.name,
linter: options.linter,
e2eTestRunner: 'detox',
});
} else if (options.preset === Preset.Expo) {
const { expoApplicationGenerator } = require('@nrwl' + '/expo');
await expoApplicationGenerator(tree, {
name: options.name,
linter: options.linter,
e2eTestRunner: 'detox',
});
} else if (options.preset === Preset.TS) {
const c = readNxJson(tree);
c.workspaceLayout = {
appsDir: 'packages',
libsDir: 'packages',
};
updateNxJson(tree, c);
} else if (options.preset === Preset.NodeServer) {
const { applicationGenerator: nodeApplicationGenerator } = require('@nrwl' +
'/node');
await nodeApplicationGenerator(tree, {
name: options.name,
linter: options.linter,
standaloneConfig: options.standaloneConfig,
framework: options.framework,
docker: options.docker,
rootProject: true,
});
} else {
throw new Error(`Invalid preset ${options.preset}`);
}
}
function normalizeOptions(options: Schema): Schema {
options.name = names(options.name).fileName;
return options;
}