piral-cli
Version:
The standard CLI for creating and building a Piral instance or a Pilet.
214 lines (177 loc) • 5.38 kB
text/typescript
import { resolve, basename } from 'path';
import { frameworkKeys } from '../helpers';
import { SourceLanguage, LogLevels, Framework, NpmClientType } from '../types';
import {
ForceOverwrite,
installNpmPackage,
patchPiralPackage,
scaffoldPiralSourceFiles,
createDirectory,
createFileIfNotExists,
logDone,
installNpmDependencies,
combinePackageRef,
setLogLevel,
fail,
progress,
determineNpmClient,
cliVersion,
getPiralScaffoldData,
config,
initNpmProject,
piralJson,
ensure,
} from '../common';
export interface NewPiralOptions {
/**
* The package registry to use for resolving the specified Piral app.
*/
registry?: string;
/**
* Sets the path to the app's source HTML file.
*/
app?: string;
/**
* Sets the framework/library to use.
*/
framework?: Framework;
/**
* Sets the target directory where the generated files should be placed.
*/
target?: string;
/**
* The initial version that will also be written into the package.json
*/
version?: string;
/**
* Determines if files should be overwritten by the installation.
*/
forceOverwrite?: ForceOverwrite;
/**
* Determines the programming language for the new Piral instance. (e.g. 'ts')
*/
language?: SourceLanguage;
/**
* States if the npm dependecies should be installed when scaffolding.
*/
install?: boolean;
/**
* Sets the boilerplate template to be used when scaffolding.
*/
template?: string;
/**
* The log level that should be used within the scaffolding process.
*/
logLevel?: LogLevels;
/**
* Sets the npm client to be used when scaffolding. (e.g. 'yarn')
*/
npmClient?: NpmClientType;
/**
* Sets the default bundler to install. (e.g. 'parcel').
*/
bundlerName?: string;
/**
* Places additional variables that should used when scaffolding.
*/
variables?: Record<string, string>;
/**
* Sets new app name
*/
name?: string;
}
export const newPiralDefaults: NewPiralOptions = {
app: './src/index.html',
registry: config.registry,
framework: 'piral',
target: '.',
version: cliVersion,
forceOverwrite: ForceOverwrite.no,
language: config.language,
install: true,
template: 'default',
logLevel: LogLevels.info,
npmClient: undefined,
bundlerName: 'none',
variables: {},
name: undefined,
};
export async function newPiral(baseDir = process.cwd(), options: NewPiralOptions = {}) {
const {
app = newPiralDefaults.app,
registry = newPiralDefaults.registry,
framework = newPiralDefaults.framework,
target = newPiralDefaults.target,
version = newPiralDefaults.version,
forceOverwrite = newPiralDefaults.forceOverwrite,
language = newPiralDefaults.language,
install = newPiralDefaults.install,
template = newPiralDefaults.template,
logLevel = newPiralDefaults.logLevel,
bundlerName = newPiralDefaults.bundlerName,
variables = newPiralDefaults.variables,
name = newPiralDefaults.name,
npmClient: defaultNpmClient = newPiralDefaults.npmClient,
} = options;
ensure('baseDir', baseDir, 'string');
ensure('framework', framework, 'string');
ensure('version', version, 'string');
ensure('target', target, 'string');
ensure('app', app, 'string');
ensure('template', template, 'string');
ensure('variables', variables, 'object');
const fullBase = resolve(process.cwd(), baseDir);
const root = resolve(fullBase, target);
if (!frameworkKeys.includes(framework)) {
fail('generalError_0002', `The "framework" value must be one of: ${frameworkKeys.join(', ')}`);
}
setLogLevel(logLevel);
progress('Preparing source and target ...');
const success = await createDirectory(root);
if (success) {
const npmClient = await determineNpmClient(root, defaultNpmClient);
const packageRef = combinePackageRef(framework, version, 'registry');
const projectName = name || basename(root);
progress(`Creating a new Piral instance in %s ...`, root);
await createFileIfNotExists(
root,
'package.json',
JSON.stringify(
{
name: projectName,
version: '1.0.0',
description: '',
keywords: ['piral'],
dependencies: {},
scripts: {},
},
undefined,
2,
),
);
await initNpmProject(npmClient, projectName, root);
if (registry !== newPiralDefaults.registry) {
progress(`Setting up npm registry (%s) ...`, registry);
await createFileIfNotExists(
root,
'.npmrc',
`registry=${registry}\n`,
forceOverwrite,
);
}
await createFileIfNotExists(root, piralJson, JSON.stringify({}, undefined, 2));
progress(`Installing npm package ${packageRef} ...`);
await installNpmPackage(npmClient, packageRef, root, '--save-exact');
progress(`Taking care of templating ...`);
const data = getPiralScaffoldData(language, root, app, framework, variables);
await patchPiralPackage(root, app, data, version, bundlerName);
await scaffoldPiralSourceFiles(template, registry, data, forceOverwrite);
if (install) {
progress(`Installing dependencies ...`);
await installNpmDependencies(npmClient, root);
}
logDone(`Piral instance scaffolded successfully!`);
} else {
fail('cannotCreateDirectory_0044');
}
}