83 lines
2.3 KiB
TypeScript

import type { Tree } from '@nx/devkit';
import {
formatFiles,
getProjects,
joinPathFragments,
stripIndents,
} from '@nx/devkit';
import type { Schema } from './schema';
import {
convertScamToStandalone,
getComponentDataFromAST,
getModuleMetadataFromAST,
getTargetProject,
replaceModuleUsagesWithComponent,
verifyIsInlineScam,
verifyModuleIsScam,
} from './lib';
import { getInstalledAngularVersionInfo } from '../utils/version-utils';
import { lt } from 'semver';
export async function scamToStandalone(
tree: Tree,
{ component, project: projectName, skipFormat }: Schema
) {
const installedAngularVersionInfo = getInstalledAngularVersionInfo(tree);
if (lt(installedAngularVersionInfo.version, '14.1.0')) {
throw new Error(stripIndents`This generator is only supported with Angular >= 14.1.0. You are currently using ${installedAngularVersionInfo.version}.
You can resolve this error by migrating to Angular 14.1.0.`);
}
const projects = getProjects(tree);
let project = getTargetProject(projectName, projects);
const normalizedComponentPath = joinPathFragments(project.root, component);
if (!tree.exists(normalizedComponentPath)) {
throw new Error(
`The path provided to the component (${normalizedComponentPath}) does not exist. Please ensure the correct path has been provided.`
);
}
const { componentFileContents, componentAST, componentName } =
getComponentDataFromAST(tree, normalizedComponentPath);
const isInlineScam = verifyIsInlineScam(componentAST);
if (!isInlineScam) {
throw new Error(
'This generator currently only supports inline SCAMs. We could not find an accompanying NgModule within the component file, please ensure the SCAM provided is an inline scam.'
);
}
const {
moduleNodes,
exportsArray,
importsArray,
declarationsArray,
providersArray,
moduleName,
} = getModuleMetadataFromAST(componentAST, componentFileContents);
verifyModuleIsScam(exportsArray, componentName, declarationsArray);
convertScamToStandalone(
componentAST,
componentFileContents,
importsArray,
providersArray,
moduleNodes,
tree,
normalizedComponentPath,
componentName
);
replaceModuleUsagesWithComponent(tree, moduleName, componentName);
if (!skipFormat) {
await formatFiles(tree);
}
}
export default scamToStandalone;