mirror of
https://github.com/aspnet/JavaScriptServices.git
synced 2025-12-22 17:47:53 +00:00
53 lines
2.2 KiB
TypeScript
53 lines
2.2 KiB
TypeScript
import * as childProcess from 'child_process';
|
|
import * as path from 'path';
|
|
import * as rimraf from 'rimraf';
|
|
import * as mkdirp from 'mkdirp';
|
|
|
|
const generatorDirRelative = '../templates/package-builder/dist/generator-aspnetcore-spa';
|
|
const yoPackageDirAbsolute = path.resolve('./node_modules/yo');
|
|
|
|
export interface GeneratorOptions {
|
|
framework: string;
|
|
name: string;
|
|
tests?: boolean;
|
|
}
|
|
|
|
export function generateProjectSync(targetDir: string, generatorOptions: GeneratorOptions) {
|
|
const generatorDirAbsolute = path.resolve(generatorDirRelative);
|
|
console.log(`Running NPM install to prepare Yeoman generator at ${ generatorDirAbsolute }`);
|
|
childProcess.execSync(`npm install`, { stdio: 'inherit', cwd: generatorDirAbsolute });
|
|
|
|
console.log(`Ensuring empty output directory at ${ targetDir }`);
|
|
rimraf.sync(targetDir);
|
|
mkdirp.sync(targetDir);
|
|
|
|
const yoExecutableAbsolute = findYeomanCliScript();
|
|
console.log(`Will invoke Yeoman at ${ yoExecutableAbsolute } to generate application in ${ targetDir } with options:`);
|
|
console.log(JSON.stringify(generatorOptions, null, 2));
|
|
const command = `node "${ yoExecutableAbsolute }" "${ path.resolve(generatorDirAbsolute, './app/index.js') }"`;
|
|
const args = makeYeomanCommandLineArgs(generatorOptions);
|
|
childProcess.execSync(`${ command } ${ args }`, {
|
|
stdio: 'inherit',
|
|
cwd: targetDir
|
|
});
|
|
}
|
|
|
|
function findYeomanCliScript() {
|
|
// On Windows, you can't invoke ./node_modules/.bin/yo from the shell for some reason.
|
|
// So instead, we'll locate the CLI entrypoint that yeoman would expose if it was installed globally.
|
|
const yeomanPackageJsonPath = path.join(yoPackageDirAbsolute, './package.json');
|
|
const yeomanPackageJson = require(yeomanPackageJsonPath);
|
|
const yeomanCliScriptRelative = yeomanPackageJson.bin.yo;
|
|
if (!yeomanCliScriptRelative) {
|
|
throw new Error(`Could not find Yeoman CLI script. Looked for a bin/yo entry in ${ yeomanPackageJsonPath }`);
|
|
}
|
|
|
|
return path.join(yoPackageDirAbsolute, yeomanCliScriptRelative);
|
|
}
|
|
|
|
function makeYeomanCommandLineArgs(generatorOptions: GeneratorOptions) {
|
|
return Object.getOwnPropertyNames(generatorOptions)
|
|
.map(key => `--${ key }="${ generatorOptions[key] }"`)
|
|
.join(' ');
|
|
}
|