Как в `babel-plugin-macros` вернуть объект` посетитель '? - PullRequest
0 голосов
/ 25 марта 2019

Я новичок в babel, я создаю библиотеку, я хочу, чтобы люди импортировали мою библиотеку с помощью моего макроса, чтобы они получали оптимизированную версию, основанную на среде, и я знаю, что могу добиться этого, используя условные module.exports, но я хочу использовать экспорт es6 для достижения tree-shaking.

Поэтому я хочу сделать следующие вещи:

import { sum, add } from 'myLibrary/macro'; // I'm going to change this line
import otherLibrary from 'otherLibrary/macro';

sum([1,2,3])

Код выше приведен ниже.

import { sum, add } from "myLibrary/production"; // `macro` keyword replaced
import otherLibrary from 'otherLibrary/macro';

sum([1, 2, 3]);

Теперь я написал обычную версию Babel:

export default function(babel) {
  return {
    visitor: {
      // All my `ImportDeclaration` gets processed.
      ImportDeclaration(path) {
        if (path.node.source.value.includes("myLibrary")) {
          const someCondition = true; // I actually want to use `process.env.NODE_ENV === "production"`

          if (someCondition) {
            path.node.source.value = "myLibrary/production";
          } else {
            path.node.source.value = "myLibrary/development";
          }
        }
      }
    }
  };
}

Я могу легко выполнить свое условие, просто возвращая объект visitor, и все мои ImportDeclaration обрабатываются, но в babel macrosКажется, что я не могу легко достичь этого:

module.exports = createMacro(myMacro);

function myMacro({ references, state, babel }) {
  const someCondition = true; // I actually want to use `process.env.NODE_ENV === "production"`

  state.file.path.node.body.forEach(node => { // I need to `forEach` by my self.
    if (node.type === "ImportDeclaration") {
      if (node.source.value.includes("myLibrary")) {
        if (someCondition) {
          node.source.value = "myLibrary/production";
        } else {
          node.source.value = "myLibrary/development";
        }
      }
    }
  });

  return { keepImports: true };
}

Есть ли какой-нибудь простой способ добиться того же в babel macros?

...