ember-codemod-remove-global-styles
Version:
Codemod to localize global styles
40 lines (39 loc) • 2.02 kB
JavaScript
import { AST } from '@codemod-utils/ast-javascript';
export function replaceTemplateOnlyComponent(file, data) {
if (data.isTemplateTag) {
return file;
}
const traverse = AST.traverse(data.isTypeScript);
const ast = traverse(file, {
visitCallExpression(path) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (path.value.callee.name !== 'templateOnlyComponent') {
return false;
}
const superClass = AST.builders.identifier('Component');
if (data.isTypeScript) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
superClass.typeAnnotation = path.value.typeParameters;
}
return AST.builders.classExpression(null, AST.builders.classBody([
AST.builders.classProperty(AST.builders.identifier('styles'), AST.builders.identifier('styles')),
]), superClass);
},
visitImportDeclaration(path) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (path.value.source.value !== '@ember/component/template-only') {
return false;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
const defaultImport = path.value.specifiers.find((specifier) => specifier.type === 'ImportDefaultSpecifier');
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (defaultImport?.local?.name !== 'templateOnlyComponent') {
return false;
}
return AST.builders.importDeclaration([
AST.builders.importDefaultSpecifier(AST.builders.identifier('Component')),
], AST.builders.literal('@glimmer/component'));
},
});
return AST.print(ast);
}