Определение в плагине babel, является ли файл модулем или скриптом - PullRequest
0 голосов
/ 06 июня 2018

Я пишу плагин babel, который добавляет полифилл в верхней части модуля.

Я хотел бы использовать одну стратегию для модулей EcmaScript и в противном случае предположить, что это модуль CommonJS.

Итак, у меня есть что-то вроде

module.exports = function moduleKeysBabelPlugin({ types: t }) {
  return {
    name: 'my plugin',
    visitor: {
      Program(path) {
        // TODO: If there's a top-level export do something else.
        // require('my-polyfiller/commonjs').polyfill(module, require);
        const polyfill = t.expressionStatement(
          t.callExpression(
            t.memberExpression(
              t.callExpression(
                t.identifier('require'),
                [ t.stringLiteral('my-polyfiller/commonjs') ]),
              t.identifier('polyfill')),
            [ t.identifier('module'), t.identifier('require') ]));
        path.unshiftContainer('body', polyfill);
      },
    },
  };
};

, которое позволяет мне работать с CommonJS.

Как бы я выразил

// TODO: If there's a top-level export do something else.

часть?

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

Я мог бы попытаться погулять с детьми, но это не выглядит очень гостеприимно.

Это работа для отдельных enter и exit шагов?

Program: {
  enter() {
    sawTopLevelExports = false
  },
  exit(path) {
    if (sawTopLevelExports) {
      ...
    } else {
      ...
    }
  }
}

?

Какой идиоматический способ сделать это в Вавилоне?

...