Как создать новый ASTNode jscodeshift? - PullRequest
0 голосов
/ 04 августа 2020

Я работал над модулем преобразования для превращения kind import specifiers в отдельный import declarations, чтобы уменьшить размер пакета приложения.

import { API, FileInfo, ImportDeclaration, Specifier } from 'jscodeshift';

const isKindImportSpecifier = (specifier: Specifier) =>
  specifier.type === 'ImportSpecifier';

export default function (fileInfo: FileInfo, api: API) {
  api
    .jscodeshift(fileInfo.source)
    .find(ImportDeclaration)
    .filter((path) => path.node.source.value === '@material-ui/code')
    .map((path) => {
      const kindImportSpecifiers = path.node.specifiers.filter(
        isKindImportSpecifier,
      );
      const defaultAndNamespaceImportSpecifiers = path.node.specifiers.filter(
        (specifier) => !isKindImportSpecifier(specifier),
      );

      return [ // ImportDeclaration[] is not assignable to AstNode<ImportDeclaration> | AstNode<ImportDeclaration>[]
        api.jscodeshift.importDeclaration(
          defaultAndNamespaceImportSpecifiers,
          api.jscodeshift.stringLiteral(path.node.source.value as string),
        ),
        ...kindImportSpecifiers.map((specifier) =>
          api.jscodeshift.importDeclaration(
            [specifier],
            api.jscodeshift.stringLiteral(
              `${path.node.source.value}/${specifier.name}`,
            ),
          ),
        ),
      ];
    });
}

Вероятно, это тривиальный вопрос, но как это возможно конструктор новый AstNode?

...