canonical
Version:
Canonical code style linter and formatter for JavaScript, SCSS and CSS.
142 lines (112 loc) • 13.5 kB
JavaScript
'use strict';
var _Map = require('babel-runtime/core-js/map')['default'];
var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _coreGetExports = require('../core/getExports');
var _coreGetExports2 = _interopRequireDefault(_coreGetExports);
var _importDeclaration = require('../importDeclaration');
var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
module.exports = function (context) {
var namespaces = new _Map();
function getImportsAndReport(namespace) {
var declaration = (0, _importDeclaration2['default'])(context);
var imports = _coreGetExports2['default'].get(declaration.source.value, context);
if (imports == null) return null;
if (imports.errors.length) {
context.report({
node: declaration.source,
message: 'Parse errors in imported module ' + ('\'' + declaration.source.value + '\'.')
});
return;
}
if (!imports.hasNamed) {
context.report(namespace, 'No exported names found in module \'' + declaration.source.value + '\'.');
}
return imports;
}
function message(identifier, namespace) {
return '\'' + identifier.name + '\' not found in imported namespace ' + namespace.name + '.';
}
function declaredScope(name) {
var references = context.getScope().references,
i = undefined;
for (i = 0; i < references.length; i++) {
if (references[i].identifier.name === name) {
break;
}
}
if (!references[i]) return undefined;
return references[i].resolved.scope.type;
}
return {
'ImportNamespaceSpecifier': function ImportNamespaceSpecifier(namespace) {
var imports = getImportsAndReport(namespace);
if (imports == null) return;
namespaces.set(namespace.local.name, imports.named);
},
// same as above, but does not add names to local map
'ExportNamespaceSpecifier': function ExportNamespaceSpecifier(namespace) {
getImportsAndReport(namespace);
},
// todo: check for possible redefinition
'MemberExpression': function MemberExpression(dereference) {
if (dereference.object.type !== 'Identifier') return;
if (!namespaces.has(dereference.object.name)) return;
if (dereference.parent.type === 'AssignmentExpression' && dereference.parent.left === dereference) {
context.report(dereference.parent, 'Assignment to member of namespace \'' + dereference.object.name + '\'.');
}
if (dereference.computed) {
context.report(dereference.property, 'Unable to validate computed reference to imported namespace \'' + dereference.object.name + '\'.');
return;
}
var namespace = namespaces.get(dereference.object.name);
if (!namespace.has(dereference.property.name)) {
context.report(dereference.property, message(dereference.property, dereference.object));
}
},
'VariableDeclarator': function VariableDeclarator(_ref) {
var id = _ref.id;
var init = _ref.init;
if (init == null) return;
if (id.type !== 'ObjectPattern') return;
if (init.type !== 'Identifier') return;
if (!namespaces.has(init.name)) return;
// check for redefinition in intermediate scopes
if (declaredScope(init.name) !== 'module') return;
var namespace = namespaces.get(init.name);
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _getIterator(id.properties), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var property = _step.value;
if (property.key.type !== 'Identifier') {
context.report({
node: property,
message: 'Only destructure top-level names.'
});
} else if (!namespace.has(property.key.name)) {
context.report({
node: property,
message: message(property.key, init)
});
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uYW1lc3BhY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OEJBQW9CLG9CQUFvQjs7OztpQ0FDVixzQkFBc0I7Ozs7QUFFcEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFVLE9BQU8sRUFBRTs7QUFFbEMsTUFBTSxVQUFVLEdBQUcsVUFBUyxDQUFBOztBQUU1QixXQUFTLG1CQUFtQixDQUFDLFNBQVMsRUFBRTtBQUN0QyxRQUFJLFdBQVcsR0FBRyxvQ0FBa0IsT0FBTyxDQUFDLENBQUE7O0FBRTVDLFFBQUksT0FBTyxHQUFHLDRCQUFRLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUM1RCxRQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUE7O0FBRWhDLFFBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7QUFDekIsYUFBTyxDQUFDLE1BQU0sQ0FBQztBQUNiLFlBQUksRUFBRSxXQUFXLENBQUMsTUFBTTtBQUN4QixlQUFPLEVBQUUsNkNBQ0ksV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQUk7T0FDMUMsQ0FBQyxDQUFBO0FBQ0YsYUFBTTtLQUNQOztBQUVELFFBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO0FBQ3JCLGFBQU8sQ0FBQyxNQUFNLENBQUMsU0FBUywyQ0FDZ0IsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQUssQ0FBQTtLQUN0RTs7QUFFRCxXQUFPLE9BQU8sQ0FBQTtHQUNmOztBQUVELFdBQVMsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUU7QUFDdEMsV0FBTyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksR0FDdEIscUNBQXFDLEdBQ3JDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFBO0dBQzVCOztBQUVELFdBQVMsYUFBYSxDQUFDLElBQUksRUFBRTtBQUMzQixRQUFJLFVBQVUs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QUksQ0FBQyxJQUFJLENBQUMsQ0FBQTs7Ozs7OztBQUUzQywwQ0FBcUIsRUFBRSxDQUFDLFVBQVUsNEdBQUU7Y0FBM0IsUUFBUTs7QUFDZixjQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtBQUN0QyxtQkFBTyxDQUFDLE1BQU0sQ0FBQztBQUNiLGtCQUFJLEVBQUUsUUFBUTtBQUNkLHFCQUFPLEVBQUUsbUNBQW1DO2FBQzdDLENBQUMsQ0FBQTtXQUNILE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUM1QyxtQkFBTyxDQUFDLE1BQU0sQ0FBQztBQUNiLGtCQUFJLEVBQUUsUUFBUTtBQUNkLHFCQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO2FBQ3JDLENBQUMsQ0FBQTtXQUNIO1NBQ0Y7Ozs7Ozs7Ozs7Ozs7OztLQUNGO0dBQ0YsQ0FBQTtDQUNGLENBQUEiLCJmaWxlIjoibmFtZXNwYWNlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV4cG9ydHMgZnJvbSAnLi4vY29yZS9nZXRFeHBvcnRzJ1xuaW1wb3J0IGltcG9ydERlY2xhcmF0aW9uIGZyb20gJy4uL2ltcG9ydERlY2xhcmF0aW9uJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cbiAgY29uc3QgbmFtZXNwYWNlcyA9IG5ldyBNYXAoKVxuXG4gIGZ1bmN0aW9uIGdldEltcG9ydHNBbmRSZXBvcnQobmFtZXNwYWNlKSB7XG4gICAgdmFyIGRlY2xhcmF0aW9uID0gaW1wb3J0RGVjbGFyYXRpb24oY29udGV4dClcblxuICAgIHZhciBpbXBvcnRzID0gRXhwb3J0cy5nZXQoZGVjbGFyYXRpb24uc291cmNlLnZhbHVlLCBjb250ZXh0KVxuICAgIGlmIChpbXBvcnRzID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBpZiAoaW1wb3J0cy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG5vZGU6IGRlY2xhcmF0aW9uLnNvdXJjZSxcbiAgICAgICAgbWVzc2FnZTogYFBhcnNlIGVycm9ycyBpbiBpbXBvcnRlZCBtb2R1bGUgYCArXG4gICAgICAgICAgICAgICAgIGAnJHtkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWV9Jy5gLFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghaW1wb3J0cy5oYXNOYW1lZCkge1xuICAgICAgY29udGV4dC5yZXBvcnQobmFtZXNwYWNlLFxuICAgICAgICBgTm8gZXhwb3J0ZWQgbmFtZXMgZm91bmQgaW4gbW9kdWxlICcke2RlY2xhcmF0aW9uLnNvdXJjZS52YWx1ZX0nLmApXG4gICAgfVxuXG4gICAgcmV0dXJuIGltcG9ydHNcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lc3NhZ2UoaWRlbnRpZmllciwgbmFtZXNwYWNlKSB7XG4gICAgcmV0dXJuICdcXCcnICsgaWRlbnRpZmllci5uYW1lICtcbiAgICAgICAgICAgJ1xcJyBub3QgZm91bmQgaW4gaW1wb3J0ZWQgbmFtZXNwYWNlICcgK1xuICAgICAgICAgICBuYW1lc3BhY2UubmFtZSArICcuJ1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjbGFyZWRTY29wZShuYW1lKSB7XG4gICAgbGV0IHJlZmVyZW5jZXMgPSBjb250ZXh0LmdldFNjb3BlKCkucmVmZXJlbmNlc1xuICAgICAgLCBpXG4gICAgZm9yIChpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWZlcmVuY2VzW2ldLmlkZW50aWZpZXIubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlZmVyZW5jZXNbaV0pIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gcmVmZXJlbmNlc1tpXS5yZXNvbHZlZC5zY29wZS50eXBlXG4gIH1cblxuICByZXR1cm4ge1xuICAgICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInOiBmdW5jdGlvbiAobmFtZXNwYWNlKSB7XG4gICAgICBjb25zdCBpbXBvcnRzID0gZ2V0SW1wb3J0c0FuZFJlcG9ydChuYW1lc3BhY2UpXG4gICAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSByZXR1cm5cbiAgICAgIG5hbWVzcGFjZXMuc2V0KG5hbWVzcGFjZS5sb2NhbC5uYW1lLCBpbXBvcnRzLm5hbWVkKVxuICAgIH0sXG5cbiAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgZG9lcyBub3QgYWRkIG5hbWVzIHRvIGxvY2FsIG1hcFxuICAgICdFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXInOiBmdW5jdGlvbiAobmFtZXNwYWNlKSB7XG4gICAgICBnZXRJbXBvcnRzQW5kUmVwb3J0KG5hbWVzcGFjZSlcbiAgICB9LFxuXG4gICAgLy8gdG9kbzogY2hlY2sgZm9yIHBvc3NpYmxlIHJlZGVmaW5pdGlvblxuXG4gICAgJ01lbWJlckV4cHJlc3Npb24nOiBmdW5jdGlvbiAoZGVyZWZlcmVuY2UpIHtcbiAgICAgIGlmIChkZXJlZmVyZW5jZS5vYmplY3QudHlwZSAhPT0gJ0lkZW50aWZpZXInKSByZXR1cm5cbiAgICAgIGlmICghbmFtZXNwYWNlcy5oYXMoZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpKSByZXR1cm5cblxuICAgICAgaWYgKGRlcmVmZXJlbmNlLnBhcmVudC50eXBlID09PSAnQXNzaWdubWVudEV4cHJlc3Npb24nICYmXG4gICAgICAgICAgZGVyZWZlcmVuY2UucGFyZW50LmxlZnQgPT09IGRlcmVmZXJlbmNlKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoZGVyZWZlcmVuY2UucGFyZW50LFxuICAgICAgICAgICAgICBgQXNzaWdubWVudCB0byBtZW1iZXIgb2YgbmFtZXNwYWNlICcke2RlcmVmZXJlbmNlLm9iamVjdC5uYW1lfScuYClcbiAgICAgIH1cblxuICAgICAgaWYgKGRlcmVmZXJlbmNlLmNvbXB1dGVkKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KGRlcmVmZXJlbmNlLnByb3BlcnR5LFxuICAgICAgICAgICdVbmFibGUgdG8gdmFsaWRhdGUgY29tcHV0ZWQgcmVmZXJlbmNlIHRvIGltcG9ydGVkIG5hbWVzcGFjZSBcXCcnICtcbiAgICAgICAgICBkZXJlZmVyZW5jZS5vYmplY3QubmFtZSArICdcXCcuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmdldChkZXJlZmVyZW5jZS5vYmplY3QubmFtZSlcbiAgICAgIGlmICghbmFtZXNwYWNlLmhhcyhkZXJlZmVyZW5jZS5wcm9wZXJ0eS5uYW1lKSkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCggZGVyZWZlcmVuY2UucHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAsIG1lc3NhZ2UoZGVyZWZlcmVuY2UucHJvcGVydHksIGRlcmVmZXJlbmNlLm9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICB9XG4gICAgfSxcblxuICAgICdWYXJpYWJsZURlY2xhcmF0b3InOiBmdW5jdGlvbiAoeyBpZCwgaW5pdCB9KSB7XG4gICAgICBpZiAoaW5pdCA9PSBudWxsKSByZXR1cm5cbiAgICAgIGlmIChpZC50eXBlICE9PSAnT2JqZWN0UGF0dGVybicpIHJldHVyblxuICAgICAgaWYgKGluaXQudHlwZSAhPT0gJ0lkZW50aWZpZXInKSByZXR1cm5cbiAgICAgIGlmICghbmFtZXNwYWNlcy5oYXMoaW5pdC5uYW1lKSkgcmV0dXJuXG5cbiAgICAgIC8vIGNoZWNrIGZvciByZWRlZmluaXRpb24gaW4gaW50ZXJtZWRpYXRlIHNjb3Blc1xuICAgICAgaWYgKGRlY2xhcmVkU2NvcGUoaW5pdC5uYW1lKSAhPT0gJ21vZHVsZScpIHJldHVyblxuXG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmdldChpbml0Lm5hbWUpXG5cbiAgICAgIGZvciAobGV0IHByb3BlcnR5IG9mIGlkLnByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5LmtleS50eXBlICE9PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdPbmx5IGRlc3RydWN0dXJlIHRvcC1sZXZlbCBuYW1lcy4nLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoIW5hbWVzcGFjZS5oYXMocHJvcGVydHkua2V5Lm5hbWUpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZTogcHJvcGVydHksXG4gICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKHByb3BlcnR5LmtleSwgaW5pdCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cbiJdfQ==