Мне нужно, чтобы переменная __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
к литералу, прежде чем нажимать на операторы, или как-то еще можно использовать переменные?