113 lines
2.8 KiB
TypeScript
113 lines
2.8 KiB
TypeScript
import {
|
|
addDependenciesToPackageJson,
|
|
convertNxGenerator,
|
|
installPackagesTask,
|
|
ProjectConfiguration,
|
|
readJson,
|
|
readProjectConfiguration,
|
|
Tree,
|
|
updateProjectConfiguration,
|
|
} from '@nx/devkit';
|
|
import { join } from 'path';
|
|
import { addSwcConfig } from '../../utils/swc/add-swc-config';
|
|
import { addSwcDependencies } from '../../utils/swc/add-swc-dependencies';
|
|
import { swcHelpersVersion } from '../../utils/versions';
|
|
import { ConvertToSwcGeneratorSchema } from './schema';
|
|
|
|
export async function convertToSwcGenerator(
|
|
tree: Tree,
|
|
schema: ConvertToSwcGeneratorSchema
|
|
) {
|
|
const options = normalizeOptions(schema);
|
|
const projectConfiguration = readProjectConfiguration(tree, options.project);
|
|
|
|
updateProjectBuildTargets(
|
|
tree,
|
|
projectConfiguration,
|
|
options.project,
|
|
options.targets
|
|
);
|
|
return checkSwcDependencies(tree, projectConfiguration);
|
|
}
|
|
|
|
function normalizeOptions(
|
|
schema: ConvertToSwcGeneratorSchema
|
|
): ConvertToSwcGeneratorSchema {
|
|
const options = { ...schema };
|
|
|
|
if (!options.targets) {
|
|
options.targets = ['build'];
|
|
}
|
|
|
|
return options;
|
|
}
|
|
|
|
function updateProjectBuildTargets(
|
|
tree: Tree,
|
|
projectConfiguration: ProjectConfiguration,
|
|
projectName: string,
|
|
projectTargets: string[]
|
|
) {
|
|
for (const target of projectTargets) {
|
|
const targetConfiguration = projectConfiguration.targets[target];
|
|
if (
|
|
!targetConfiguration ||
|
|
(targetConfiguration.executor !== '@nx/js:tsc' &&
|
|
targetConfiguration.executor !== '@nrwl/js:tsc')
|
|
)
|
|
continue;
|
|
targetConfiguration.executor = '@nx/js:swc';
|
|
}
|
|
|
|
updateProjectConfiguration(tree, projectName, projectConfiguration);
|
|
}
|
|
|
|
function checkSwcDependencies(
|
|
tree: Tree,
|
|
projectConfiguration: ProjectConfiguration
|
|
) {
|
|
const isSwcrcPresent = tree.exists(join(projectConfiguration.root, '.swcrc'));
|
|
|
|
const packageJson = readJson(tree, 'package.json');
|
|
const projectPackageJsonPath = join(
|
|
projectConfiguration.root,
|
|
'package.json'
|
|
);
|
|
const projectPackageJson = readJson(tree, projectPackageJsonPath);
|
|
|
|
const hasSwcDependency =
|
|
packageJson.dependencies && packageJson.dependencies['@swc/core'];
|
|
|
|
const hasSwcHelpers =
|
|
projectPackageJson.dependencies &&
|
|
projectPackageJson.dependencies['@swc/helpers'];
|
|
|
|
if (isSwcrcPresent && hasSwcDependency && hasSwcHelpers) return;
|
|
|
|
if (!isSwcrcPresent) {
|
|
addSwcConfig(tree, projectConfiguration.root);
|
|
}
|
|
|
|
if (!hasSwcDependency) {
|
|
addSwcDependencies(tree);
|
|
}
|
|
|
|
if (!hasSwcHelpers) {
|
|
addDependenciesToPackageJson(
|
|
tree,
|
|
{ '@swc/helpers': swcHelpersVersion },
|
|
{},
|
|
projectPackageJsonPath
|
|
);
|
|
}
|
|
|
|
return () => {
|
|
if (!hasSwcDependency) {
|
|
installPackagesTask(tree);
|
|
}
|
|
};
|
|
}
|
|
|
|
export default convertToSwcGenerator;
|
|
export const convertToSwcSchematic = convertNxGenerator(convertToSwcGenerator);
|