canonical
Version:
Canonical code style linter and formatter for JavaScript, SCSS, CSS and JSON.
143 lines (111 loc) • 12.7 kB
JavaScript
'use strict';
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _map = require('babel-runtime/core-js/map');
var _map2 = _interopRequireDefault(_map);
var _getExports = require('../core/getExports');
var _getExports2 = _interopRequireDefault(_getExports);
var _importDeclaration = require('../importDeclaration');
var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
module.exports = function (context) {
var namespaces = new _map2.default();
function getImportsAndReport(namespace) {
var declaration = (0, _importDeclaration2.default)(context);
var imports = _getExports2.default.get(declaration.source.value, context);
if (imports == null) return null;
if (imports.errors.length) {
imports.reportErrors(context, declaration);
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 = (0, _getIterator3.default)(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,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LENBekNrQztDQUFuQiIsImZpbGUiOiJydWxlcy9uYW1lc3BhY2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXhwb3J0cyBmcm9tICcuLi9jb3JlL2dldEV4cG9ydHMnXG5pbXBvcnQgaW1wb3J0RGVjbGFyYXRpb24gZnJvbSAnLi4vaW1wb3J0RGVjbGFyYXRpb24nXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcblxuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcCgpXG5cbiAgZnVuY3Rpb24gZ2V0SW1wb3J0c0FuZFJlcG9ydChuYW1lc3BhY2UpIHtcbiAgICB2YXIgZGVjbGFyYXRpb24gPSBpbXBvcnREZWNsYXJhdGlvbihjb250ZXh0KVxuXG4gICAgdmFyIGltcG9ydHMgPSBFeHBvcnRzLmdldChkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgaWYgKGltcG9ydHMgPT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGlmIChpbXBvcnRzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgIGltcG9ydHMucmVwb3J0RXJyb3JzKGNvbnRleHQsIGRlY2xhcmF0aW9uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFpbXBvcnRzLmhhc05hbWVkKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydChuYW1lc3BhY2UsXG4gICAgICAgIGBObyBleHBvcnRlZCBuYW1lcyBmb3VuZCBpbiBtb2R1bGUgJyR7ZGVjbGFyYXRpb24uc291cmNlLnZhbHVlfScuYClcbiAgICB9XG5cbiAgICByZXR1cm4gaW1wb3J0c1xuICB9XG5cbiAgZnVuY3Rpb24gbWVzc2FnZShpZGVudGlmaWVyLCBuYW1lc3BhY2UpIHtcbiAgICByZXR1cm4gJ1xcJycgKyBpZGVudGlmaWVyLm5hbWUgK1xuICAgICAgICAgICAnXFwnIG5vdCBmb3VuZCBpbiBpbXBvcnRlZCBuYW1lc3BhY2UgJyArXG4gICAgICAgICAgIG5hbWVzcGFjZS5uYW1lICsgJy4nXG4gIH1cblxuICBmdW5jdGlvbiBkZWNsYXJlZFNjb3BlKG5hbWUpIHtcbiAgICBsZXQgcmVmZXJlbmNlcyA9IGNvbnRleHQuZ2V0U2NvcGUoKS5yZWZlcmVuY2VzXG4gICAgICAsIGlcbiAgICBmb3IgKGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlZmVyZW5jZXNbaV0uaWRlbnRpZmllci5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcmVmZXJlbmNlc1tpXSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiByZWZlcmVuY2VzW2ldLnJlc29sdmVkLnNjb3BlLnR5cGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcic6IGZ1bmN0aW9uIChuYW1lc3BhY2UpIHtcbiAgICAgIGNvbnN0IGltcG9ydHMgPSBnZXRJbXBvcnRzQW5kUmVwb3J0KG5hbWVzcGFjZSlcbiAgICAgIGlmIChpbXBvcnRzID09IG51bGwpIHJldHVyblxuICAgICAgbmFtZXNwYWNlcy5zZXQobmFtZXNwYWNlLmxvY2FsLm5hbWUsIGltcG9ydHMubmFtZWQpXG4gICAgfSxcblxuICAgIC8vIHNhbWUgYXMgYWJvdmUsIGJ1dCBkb2VzIG5vdCBhZGQgbmFtZXMgdG8gbG9jYWwgbWFwXG4gICAgJ0V4cG9ydE5hbWVzcGFjZVNwZWNpZmllcic6IGZ1bmN0aW9uIChuYW1lc3BhY2UpIHtcbiAgICAgIGdldEltcG9ydHNBbmRSZXBvcnQobmFtZXNwYWNlKVxuICAgIH0sXG5cbiAgICAvLyB0b2RvOiBjaGVjayBmb3IgcG9zc2libGUgcmVkZWZpbml0aW9uXG5cbiAgICAnTWVtYmVyRXhwcmVzc2lvbic6IGZ1bmN0aW9uIChkZXJlZmVyZW5jZSkge1xuICAgICAgaWYgKGRlcmVmZXJlbmNlLm9iamVjdC50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgaWYgKCFuYW1lc3BhY2VzLmhhcyhkZXJlZmVyZW5jZS5vYmplY3QubmFtZSkpIHJldHVyblxuXG4gICAgICBpZiAoZGVyZWZlcmVuY2UucGFyZW50LnR5cGUgPT09ICdBc3NpZ25tZW50RXhwcmVzc2lvbicgJiZcbiAgICAgICAgICBkZXJlZmVyZW5jZS5wYXJlbnQubGVmdCA9PT0gZGVyZWZlcmVuY2UpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChkZXJlZmVyZW5jZS5wYXJlbnQsXG4gICAgICAgICAgICAgIGBBc3NpZ25tZW50IHRvIG1lbWJlciBvZiBuYW1lc3BhY2UgJyR7ZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWV9Jy5gKVxuICAgICAgfVxuXG4gICAgICBpZiAoZGVyZWZlcmVuY2UuY29tcHV0ZWQpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoZGVyZWZlcmVuY2UucHJvcGVydHksXG4gICAgICAgICAgJ1VuYWJsZSB0byB2YWxpZGF0ZSBjb21wdXRlZCByZWZlcmVuY2UgdG8gaW1wb3J0ZWQgbmFtZXNwYWNlIFxcJycgK1xuICAgICAgICAgIGRlcmVmZXJlbmNlLm9iamVjdC5uYW1lICsgJ1xcJy4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuZ2V0KGRlcmVmZXJlbmNlLm9iamVjdC5uYW1lKVxuICAgICAgaWYgKCFuYW1lc3BhY2UuaGFzKGRlcmVmZXJlbmNlLnByb3BlcnR5Lm5hbWUpKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KCBkZXJlZmVyZW5jZS5wcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICwgbWVzc2FnZShkZXJlZmVyZW5jZS5wcm9wZXJ0eSwgZGVyZWZlcmVuY2Uub2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1ZhcmlhYmxlRGVjbGFyYXRvcic6IGZ1bmN0aW9uICh7IGlkLCBpbml0IH0pIHtcbiAgICAgIGlmIChpbml0ID09IG51bGwpIHJldHVyblxuICAgICAgaWYgKGlkLnR5cGUgIT09ICdPYmplY3RQYXR0ZXJuJykgcmV0dXJuXG4gICAgICBpZiAoaW5pdC50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgaWYgKCFuYW1lc3BhY2VzLmhhcyhpbml0Lm5hbWUpKSByZXR1cm5cblxuICAgICAgLy8gY2hlY2sgZm9yIHJlZGVmaW5pdGlvbiBpbiBpbnRlcm1lZGlhdGUgc2NvcGVzXG4gICAgICBpZiAoZGVjbGFyZWRTY29wZShpbml0Lm5hbWUpICE9PSAnbW9kdWxlJykgcmV0dXJuXG5cbiAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuZ2V0KGluaXQubmFtZSlcblxuICAgICAgZm9yIChsZXQgcHJvcGVydHkgb2YgaWQucHJvcGVydGllcykge1xuICAgICAgICBpZiAocHJvcGVydHkua2V5LnR5cGUgIT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGU6IHByb3BlcnR5LFxuICAgICAgICAgICAgbWVzc2FnZTogJ09ubHkgZGVzdHJ1Y3R1cmUgdG9wLWxldmVsIG5hbWVzLicsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmICghbmFtZXNwYWNlLmhhcyhwcm9wZXJ0eS5rZXkubmFtZSkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UocHJvcGVydHkua2V5LCBpbml0KSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuIl19