38 lines
No EOL
1.1 KiB
JavaScript
Executable file
38 lines
No EOL
1.1 KiB
JavaScript
Executable file
'use strict';
|
|
|
|
const types = require('babel-types');
|
|
|
|
// from babel-types. remove when we upgrade to babel 7.
|
|
// https://github.com/babel/babel/blob/0189b387026c35472dccf45d14d58312d249f799/packages/babel-types/src/index.js#L347
|
|
module.exports = function matchesPattern(member, match, allowPartial) {
|
|
// not a member expression
|
|
if (!types.isMemberExpression(member)) return false;
|
|
|
|
const parts = Array.isArray(match) ? match : match.split('.');
|
|
const nodes = [];
|
|
|
|
let node;
|
|
for (node = member; types.isMemberExpression(node); node = node.object) {
|
|
nodes.push(node.property);
|
|
}
|
|
nodes.push(node);
|
|
|
|
if (nodes.length < parts.length) return false;
|
|
if (!allowPartial && nodes.length > parts.length) return false;
|
|
|
|
for (let i = 0, j = nodes.length - 1; i < parts.length; i++, j--) {
|
|
const node = nodes[j];
|
|
let value;
|
|
if (types.isIdentifier(node)) {
|
|
value = node.name;
|
|
} else if (types.isStringLiteral(node)) {
|
|
value = node.value;
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
if (parts[i] !== value) return false;
|
|
}
|
|
|
|
return true;
|
|
}; |