Определение в плагине babel, является ли файл модулем или скриптом
Я пишу плагин Babel, который добавляет polyfill в верхней части модуля.
Я хотел бы использовать одну стратегию для модулей 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 {
...
}
}
}
?
Какой идиоматический способ сделать это в Вавилоне?