108 lines
2.9 KiB
TypeScript

import type { Tree } from '@nrwl/devkit';
import {
convertNxGenerator,
formatFiles,
getImportPath,
getWorkspaceLayout,
joinPathFragments,
readProjectConfiguration,
updateProjectConfiguration,
writeJson,
} from '@nrwl/devkit';
import { rollupInitGenerator } from '../init/init';
import { RollupExecutorOptions } from '../../executors/rollup/schema';
import { RollupProjectSchema } from './schema';
export async function rollupProjectGenerator(
tree: Tree,
options: RollupProjectSchema
) {
const task = await rollupInitGenerator(tree, {
...options,
skipFormat: true,
});
checkForTargetConflicts(tree, options);
addBuildTarget(tree, options);
await formatFiles(tree);
return task;
}
function checkForTargetConflicts(tree: Tree, options: RollupProjectSchema) {
if (options.skipValidation) return;
const project = readProjectConfiguration(tree, options.project);
if (project.targets?.build) {
throw new Error(
`Project "${options.project}" already has a build target. Pass --skipValidation to ignore this error.`
);
}
}
function addBuildTarget(tree: Tree, options: RollupProjectSchema) {
const project = readProjectConfiguration(tree, options.project);
const packageJsonPath = joinPathFragments(project.root, 'package.json');
if (!tree.exists(packageJsonPath)) {
const { npmScope } = getWorkspaceLayout(tree);
const importPath =
options.importPath || getImportPath(npmScope, options.project);
writeJson(tree, packageJsonPath, {
name: importPath,
version: '0.0.1',
});
}
const tsConfig =
options.tsConfig ?? joinPathFragments(project.root, 'tsconfig.lib.json');
const buildOptions: RollupExecutorOptions = {
main: options.main ?? joinPathFragments(project.root, 'src/main.ts'),
outputPath: joinPathFragments('dist', project.root),
compiler: options.compiler ?? 'babel',
tsConfig,
project: `${project.root}/package.json`,
external: options.external,
};
if (options.rollupConfig) {
buildOptions.rollupConfig = options.rollupConfig;
}
if (tree.exists(joinPathFragments(project.root, 'README.md'))) {
buildOptions.assets = [
{
glob: `${project.root}/README.md`,
input: '.',
output: '.',
},
];
}
updateProjectConfiguration(tree, options.project, {
...project,
targets: {
...project.targets,
build: {
executor: '@nrwl/rollup:rollup',
outputs: ['{options.outputPath}'],
defaultConfiguration: 'production',
options: buildOptions,
configurations: {
production: {
optimization: true,
sourceMap: false,
namedChunks: false,
extractLicenses: true,
vendorChunk: false,
},
},
},
},
});
}
export default rollupProjectGenerator;
export const rollupProjectSchematic = convertNxGenerator(
rollupProjectGenerator
);