function transformLegacyImportToNewImport(file, { jscodeshift }) { const root = jscodeshift(file.source); /* 오래된 import 문들을 찾음 */ const oldImports = findOldImports(root, { jscodeshift }); /* 오래된 import 문이 없는 파일인 경우, 아무 작업을 하지 않음 */ if (oldImports.length === 0) { return; } for (const oldImport of oldImports) { /* 오래된 import 문에서 Adaptive를 가져오는 부분을 삭제 */ /* (Adaptive만을 가져오는 import 문인 경우, import 문 전체를 삭제) */ removeImportMember(root, oldImport, 'Adaptive', { jscodeshift }); } /* @tossteam/colors에서 adaptive를 import하는 부분을 추가 */ /* (@tossteam/colors를 import하고 있지 않은 경우, import 문을 추가) */ addImportMember(root, '@tossteam/colors', 'adaptive', { jscodeshift }); /* Adaptive 변수를 모두 adaptive로 치환 */ const oldAdaptives = findIdentifiers(root, 'Adaptive', { jscodeshift }); for (const oldAdaptive of oldAdaptives) { jscodeshift(oldAdaptive).replaceWith( jscodeshift.identifier('adaptive') ); } /* 수정된 소스코드를 반환 */ return root.toSource(); }
function removeImportMember(root, importNode, name, { jscodeshift }) { const oldSpecifiers = importNode.value.specifiers; /* name을 import하는 부분을 삭제 */ const newSpecifiers = oldSpecifiers.filter(specifier => { return ( specifier.type !== 'ImportSpecifier' || specifier.imported.name !== name ); } /* 더 이상 import할 것이 남지 않은 경우에는, import 문을 삭제 */ if (newSpecifiers.length === 0) { jscodeshift(importNode).remove(); return; } /* 그렇지 않은 경우, import 문에서 name을 가져오는 부분만 삭제 */ jscodeshift(importNode).replaceWith( jscodeshift.importDeclaration( newSpecifiers, importNode.value.source ) ); }

