Перехват оператора в синтаксическом анализаторе Webpack со строковыми переменными? - PullRequest
0 голосов
/ 19 января 2019

Мне нужно, чтобы переменная __flag__ была настроена в любом месте моего проекта, например:

const variable = 'assets';
const __flag__ = {
  input: './'+variable+'/**/*.css'
};

Затем в моем собственном плагине для веб-пакетов я использую обработчик оператора normalModule -> parser -> (https://webpack.js.org/api/parser/#statement), чтобы перехватить эту переменную и построить из нее путь glob / output, например:

compiler.hooks.normalModuleFactory.tap({name: 'MyPlugin'}, factory => {
  factory.hooks.parser.for('javascript/auto').tap({name: 'MyPlugin'}, (parser, options) => {
    parser.hooks.statement.tap({name: 'MyPlugin'}, (expr) => {
      if (!expr.declarations || !expr.declarations.length) return;
      const thisExpr = expr.declarations[0];

      if ('__flag__'.indexOf(thisExpr.id.name) !== -1) {
        console.log(expr.init.properties);
      }
    });
  });
});

Моя проблема заключается в том, что при включении variable в мой __flag__.input оператор считается BinaryExpression, и я не могу найти где-либо значение моей переменной, только строковую часть __flag__.input может быть расположен. Вот лог моего вывода как BinaryExpression:

[ Node {
    type: 'Property',
    start: 167,
    end: 201,
    loc: SourceLocation { start: [Object], end: [Object] },
    range: [ 167, 201 ],
    method: false,
    shorthand: false,
    computed: false,
    key:
     Node {
       type: 'Identifier',
       start: 167,
       end: 171,
       loc: [Object],
       range: [Array],
       name: 'path' },
    value:
     Node {
       type: 'BinaryExpression', 
       start: 173,
       end: 201,
       loc: [Object],
       range: [Array],
       left: [Object], <- Input's variable value not found here
       operator: '+',
       right: [Object] <- Input's string lives here
    },
    kind: 'init' }
]

Без переменной в моей конфигурации __flag__'.input оператор считается Literal и, конечно, гораздо проще получить мое значение из .., но путь исправлен и не может быть настроен по желанию:

[ Node {
    type: 'Property',
    start: 56,
    end: 81,
    loc: SourceLocation { start: [Object], end: [Object] },
    range: [ 56, 81 ],
    method: false,
    shorthand: false,
    computed: false,
    key:
     Node {
       type: 'Identifier',
       start: 56,
       end: 60,
       loc: [Object],
       range: [Array],
       name: 'path' },
    value:
     Node {
       type: 'Literal',
       start: 62,
       end: 81,
       loc: [Object],
       range: [Array],
       value: './assets/**/*.css',
       raw: '\'./assets/**/*.css\'' },
    kind: 'init' }
]

Кто-нибудь знает, как отследить путь моего __flag__.input к литералу, прежде чем нажимать на операторы, или как-то еще можно использовать переменные?

...