canonical
Version:
Canonical code style linter and formatter for JavaScript, SCSS, CSS and JSON.
118 lines (92 loc) • 9 kB
JavaScript
;
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _resolve = require('../core/resolve');
var _resolve2 = _interopRequireDefault(_resolve);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
module.exports = function (context) {
function checkSourceValue(source) {
if (source == null) return;
if ((0, _resolve2.default)(source.value, context) === undefined) {
context.report(source, 'Unable to resolve path to module \'' + source.value + '\'.');
}
}
// for import-y declarations
function checkSource(node) {
checkSourceValue(node.source);
}
// for CommonJS `require` calls
// adapted from @mctep: http://git.io/v4rAu
function checkCommon(call) {
if (call.callee.type !== 'Identifier') return;
if (call.callee.name !== 'require') return;
if (call.arguments.length !== 1) return;
var modulePath = call.arguments[0];
if (modulePath.type !== 'Literal') return;
if (typeof modulePath.value !== 'string') return;
checkSourceValue(modulePath);
}
function checkAMD(call) {
if (call.callee.type !== 'Identifier') return;
if (call.callee.name !== 'require' && call.callee.name !== 'define') return;
if (call.arguments.length !== 2) return;
var modules = call.arguments[0];
if (modules.type !== 'ArrayExpression') return;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)(modules.elements), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var element = _step.value;
if (element.type !== 'Literal') continue;
if (typeof element.value !== 'string') continue;
if (element.value === 'require' || element.value === 'exports') continue; // magic modules: http://git.io/vByan
checkSourceValue(element);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
var visitors = {
'ImportDeclaration': checkSource,
'ExportNamedDeclaration': checkSource,
'ExportAllDeclaration': checkSource
};
if (context.options[0] != null) {
(function () {
var _context$options$ = context.options[0];
var commonjs = _context$options$.commonjs;
var amd = _context$options$.amd;
if (commonjs || amd) {
visitors['CallExpression'] = function (call) {
if (commonjs) checkCommon(call);
if (amd) checkAMD(call);
};
}
})();
}
return visitors;
}; /**
* @fileOverview Ensures that an imported path exists, given resolution rules.
* @author Ben Mosher
*/
module.exports.schema = [{
'type': 'object',
'properties': {
'commonjs': { 'type': 'boolean' },
'amd': { 'type': 'boolean' }
},
'additionalProperties': false
}];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bGVzL25vLXVucmVzb2x2ZWQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBTUEsT0FBTyxPQUFQLEdBQWlCLFVBQVUsT0FBVixFQUFtQjs7QUFFbEMsV0FBUyxnQkFBVCxDQUEwQixNQUExQixFQUFrQztBQUNoQyxRQUFJLFVBQVUsSUFBVixFQUFnQixPQUFwQjs7QUFFQSxRQUFJLHVCQUFRLE9BQU8sS0FBUCxFQUFjLE9BQXRCLE1BQW1DLFNBQW5DLEVBQThDO0FBQ2hELGNBQVEsTUFBUixDQUFlLE1BQWYsRUFDRSx3Q0FBd0MsT0FBTyxLQUFQLEdBQWUsS0FBdkQsQ0FERixDQURnRDtLQUFsRDtHQUhGOzs7QUFGa0MsV0FZekIsV0FBVCxDQUFxQixJQUFyQixFQUEyQjtBQUN6QixxQkFBaUIsS0FBSyxNQUFMLENBQWpCLENBRHlCO0dBQTNCOzs7O0FBWmtDLFdBa0J6QixXQUFULENBQXFCLElBQXJCLEVBQTJCO0FBQ3pCLFFBQUksS0FBSyxNQUFMLENBQVksSUFBWixLQUFxQixZQUFyQixFQUFtQyxPQUF2QztBQUNBLFFBQUksS0FBSyxNQUFMLENBQVksSUFBWixLQUFxQixTQUFyQixFQUFnQyxPQUFwQztBQUNBLFFBQUksS0FBSyxTQUFMLENBQWUsTUFBZixLQUEwQixDQUExQixFQUE2QixPQUFqQzs7QUFFQSxRQUFNLGFBQWEsS0FBSyxTQUFMLENBQWUsQ0FBZixDQUFiLENBTG1CO0FBTXpCLFFBQUksV0FBVyxJQUFYLEtBQW9CLFNBQXBCLEVBQStCLE9BQW5DO0FBQ0EsUUFBSSxPQUFPLFdBQVcsS0FBWCxLQUFxQixRQUE1QixFQUFzQyxPQUExQzs7QUFFQSxxQkFBaUIsVUFBakIsRUFUeUI7R0FBM0I7O0FBWUEsV0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdCO0FBQ3RCLFFBQUksS0FBSyxNQUFMLENBQVksSUFBWixLQUFxQixZQUFyQixFQUFtQyxPQUF2QztBQUNBLFFBQUksS0FBSyxNQUFMLENBQVksSUFBWixLQUFxQixTQUFyQixJQUNBLEtBQUssTUFBTCxDQUFZLElBQVosS0FBcUIsUUFBckIsRUFBK0IsT0FEbkM7QUFFQSxRQUFJLEtBQUssU0FBTCxDQUFlLE1BQWYsS0FBMEIsQ0FBMUIsRUFBNkIsT0FBakM7O0FBRUEsUUFBTSxVQUFVLEtBQUssU0FBTCxDQUFlLENBQWYsQ0FBVixDQU5nQjtBQU90QixRQUFJLFFBQVEsSUFBUixLQUFpQixpQkFBakIsRUFBb0MsT0FBeEM7O3lDQVBzQjs7Ozs7QUFTdEIsc0RBQW9CLFFBQVEsUUFBUixRQUFwQixvR0FBc0M7WUFBN0Isc0JBQTZCOztBQUNwQyxZQUFJLFFBQVEsSUFBUixLQUFpQixTQUFqQixFQUE0QixTQUFoQztBQUNBLFlBQUksT0FBTyxRQUFRLEtBQVIsS0FBa0IsUUFBekIsRUFBbUMsU0FBdkM7O0FBRUEsWUFBSSxRQUFRLEtBQVIsS0FBa0IsU0FBbEIsSUFDQSxRQUFRLEtBQVIsS0FBa0IsU0FBbEIsRUFBNkIsU0FEakM7O0FBSm9DLHdCQU9wQyxDQUFpQixPQUFqQixFQVBvQztPQUF0Qzs7Ozs7Ozs7Ozs7Ozs7S0FUc0I7R0FBeEI7O0FBb0JBLE1BQU0sV0FBVztBQUNmLHlCQUFxQixXQUFyQjtBQUNBLDhCQUEwQixXQUExQjtBQUNBLDRCQUF3QixXQUF4QjtHQUhJLENBbEQ0Qjs7QUF3RGxDLE1BQUksUUFBUSxPQUFSLENBQWdCLENBQWhCLEtBQXNCLElBQXRCLEVBQTRCOzs4QkFDSixRQUFRLE9BQVIsQ0FBZ0IsQ0FBaEI7VUFBbEI7VUFBVTs7O0FBRWxCLFVBQUksWUFBWSxHQUFaLEVBQWlCO0FBQ25CLGlCQUFTLGdCQUFULElBQTZCLFVBQVUsSUFBVixFQUFnQjtBQUMzQyxjQUFJLFFBQUosRUFBYyxZQUFZLElBQVosRUFBZDtBQUNBLGNBQUksR0FBSixFQUFTLFNBQVMsSUFBVCxFQUFUO1NBRjJCLENBRFY7T0FBckI7U0FIOEI7R0FBaEM7O0FBV0EsU0FBTyxRQUFQLENBbkVrQztDQUFuQjs7Ozs7O0FBc0VqQixPQUFPLE9BQVAsQ0FBZSxNQUFmLEdBQXdCLENBQ3RCO0FBQ0UsVUFBUSxRQUFSO0FBQ0EsZ0JBQWM7QUFDWixnQkFBWSxFQUFFLFFBQVEsU0FBUixFQUFkO0FBQ0EsV0FBTyxFQUFFLFFBQVEsU0FBUixFQUFUO0dBRkY7QUFJQSwwQkFBd0IsS0FBeEI7Q0FQb0IsQ0FBeEIiLCJmaWxlIjoicnVsZXMvbm8tdW5yZXNvbHZlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVPdmVydmlldyBFbnN1cmVzIHRoYXQgYW4gaW1wb3J0ZWQgcGF0aCBleGlzdHMsIGdpdmVuIHJlc29sdXRpb24gcnVsZXMuXG4gKiBAYXV0aG9yIEJlbiBNb3NoZXJcbiAqL1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnLi4vY29yZS9yZXNvbHZlJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cbiAgZnVuY3Rpb24gY2hlY2tTb3VyY2VWYWx1ZShzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVyblxuXG4gICAgaWYgKHJlc29sdmUoc291cmNlLnZhbHVlLCBjb250ZXh0KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydChzb3VyY2UsXG4gICAgICAgICdVbmFibGUgdG8gcmVzb2x2ZSBwYXRoIHRvIG1vZHVsZSBcXCcnICsgc291cmNlLnZhbHVlICsgJ1xcJy4nKVxuICAgIH1cbiAgfVxuXG4gIC8vIGZvciBpbXBvcnQteSBkZWNsYXJhdGlvbnNcbiAgZnVuY3Rpb24gY2hlY2tTb3VyY2Uobm9kZSkge1xuICAgIGNoZWNrU291cmNlVmFsdWUobm9kZS5zb3VyY2UpXG4gIH1cblxuICAvLyBmb3IgQ29tbW9uSlMgYHJlcXVpcmVgIGNhbGxzXG4gIC8vIGFkYXB0ZWQgZnJvbSBAbWN0ZXA6IGh0dHA6Ly9naXQuaW8vdjRyQXVcbiAgZnVuY3Rpb24gY2hlY2tDb21tb24oY2FsbCkge1xuICAgIGlmIChjYWxsLmNhbGxlZS50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgIGlmIChjYWxsLmNhbGxlZS5uYW1lICE9PSAncmVxdWlyZScpIHJldHVyblxuICAgIGlmIChjYWxsLmFyZ3VtZW50cy5sZW5ndGggIT09IDEpIHJldHVyblxuXG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IGNhbGwuYXJndW1lbnRzWzBdXG4gICAgaWYgKG1vZHVsZVBhdGgudHlwZSAhPT0gJ0xpdGVyYWwnKSByZXR1cm5cbiAgICBpZiAodHlwZW9mIG1vZHVsZVBhdGgudmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm5cblxuICAgIGNoZWNrU291cmNlVmFsdWUobW9kdWxlUGF0aClcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrQU1EKGNhbGwpIHtcbiAgICBpZiAoY2FsbC5jYWxsZWUudHlwZSAhPT0gJ0lkZW50aWZpZXInKSByZXR1cm5cbiAgICBpZiAoY2FsbC5jYWxsZWUubmFtZSAhPT0gJ3JlcXVpcmUnICYmXG4gICAgICAgIGNhbGwuY2FsbGVlLm5hbWUgIT09ICdkZWZpbmUnKSByZXR1cm5cbiAgICBpZiAoY2FsbC5hcmd1bWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm5cblxuICAgIGNvbnN0IG1vZHVsZXMgPSBjYWxsLmFyZ3VtZW50c1swXVxuICAgIGlmIChtb2R1bGVzLnR5cGUgIT09ICdBcnJheUV4cHJlc3Npb24nKSByZXR1cm5cblxuICAgIGZvciAobGV0IGVsZW1lbnQgb2YgbW9kdWxlcy5lbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ0xpdGVyYWwnKSBjb250aW51ZVxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWVcblxuICAgICAgaWYgKGVsZW1lbnQudmFsdWUgPT09ICdyZXF1aXJlJyB8fFxuICAgICAgICAgIGVsZW1lbnQudmFsdWUgPT09ICdleHBvcnRzJykgY29udGludWUgLy8gbWFnaWMgbW9kdWxlczogaHR0cDovL2dpdC5pby92QnlhblxuXG4gICAgICBjaGVja1NvdXJjZVZhbHVlKGVsZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdmlzaXRvcnMgPSB7XG4gICAgJ0ltcG9ydERlY2xhcmF0aW9uJzogY2hlY2tTb3VyY2UsXG4gICAgJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nOiBjaGVja1NvdXJjZSxcbiAgICAnRXhwb3J0QWxsRGVjbGFyYXRpb24nOiBjaGVja1NvdXJjZSxcbiAgfVxuXG4gIGlmIChjb250ZXh0Lm9wdGlvbnNbMF0gIT0gbnVsbCkge1xuICAgIGNvbnN0IHsgY29tbW9uanMsIGFtZCB9ID0gY29udGV4dC5vcHRpb25zWzBdXG5cbiAgICBpZiAoY29tbW9uanMgfHwgYW1kKSB7XG4gICAgICB2aXNpdG9yc1snQ2FsbEV4cHJlc3Npb24nXSA9IGZ1bmN0aW9uIChjYWxsKSB7XG4gICAgICAgIGlmIChjb21tb25qcykgY2hlY2tDb21tb24oY2FsbClcbiAgICAgICAgaWYgKGFtZCkgY2hlY2tBTUQoY2FsbClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmlzaXRvcnNcbn1cblxubW9kdWxlLmV4cG9ydHMuc2NoZW1hID0gW1xuICB7XG4gICAgJ3R5cGUnOiAnb2JqZWN0JyxcbiAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICdjb21tb25qcyc6IHsgJ3R5cGUnOiAnYm9vbGVhbicgfSxcbiAgICAgICdhbWQnOiB7ICd0eXBlJzogJ2Jvb2xlYW4nIH0sXG4gICAgfSxcbiAgICAnYWRkaXRpb25hbFByb3BlcnRpZXMnOiBmYWxzZSxcbiAgfSxcbl1cbiJdfQ==