Ошибка плагина Babel неизвестного узла типа undefined с конструктором "String"

Я создаю библиотеку общих компонентов, которая будет использоваться как React, так и Vue.

Я использую Styletron, для которого требуется специальный адаптер, но в остальном он работает примерно так же.

Поэтому из моего исходного кода (связки функций) мне нужно сгенерировать папку с кодом, переданным как обычно, а затем другую папку, в которой функции слегка изменены.

Это мой код:

const MyComponent = styled('div', ({ isActive, hasBorder}) => ({
  color: 'red'
}))

// should not change
const OtherComponent = styled('div', {
  background: 'blue'
})

И это должно стать:

const MyComponent = styled('div', ({ isActive, hasBorder}) => ({
  color: 'red'
}), ['isActive', 'hasBorder'])

const OtherComponent = styled('div', {
  background: 'blue'
})

На самом деле у меня есть рабочий пример этого в ASTExplorer, но когда я пытаюсь сделать из него плагин, я сталкиваюсь с ошибкой Babel plugin error unknown node of type undefined with constructor "String"

Это мой первый плагин, и я ЗНАЮ, что делаю что-то неправильно, но сейчас мне просто нужно выяснить, что мне нужно сделать, чтобы эта работа работала вне ASTExplorer.

Это плагин, который я написал в ASTExplorer:

export default function(babel) {
  const { types: t } = babel;
  return {
    name: "ast-transform",
    visitor: {
      CallExpression: (path) => {
        if (
          path.node.callee.name === 'styled' && 
          path.node.arguments.length === 2 && 
          t.isArrowFunctionExpression(path.node.arguments[1])
        ) {
          if (t.isObjectPattern(path.node.arguments[1].params[0])) {
            const props = []
            path.node.arguments[1].params[0].properties.map(prop => props.push(prop.value.name))
            path.node.arguments.push(JSON.stringify(props)) // I suspect that the error is from here
          }
        } 

      }
    }
  };
}

1 ответ

Babel преобразует работу с узлами AST, поэтому расстановка реквизитов и помещение их в список аргументов таким образом не будет работать правильно. Вы действительно захотите создать структуру AST из вашего объекта.

В этом случае Babel предлагает помощника для этого, так что вы можете изменить

path.node.arguments.push(JSON.stringify(props))

в

path.node.arguments.push(t.valueToNode(props))
Другие вопросы по тегам