156 lines
15 KiB
JavaScript
156 lines
15 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var _declaredScope = require('eslint-module-utils/declaredScope');
|
||
|
|
||
|
var _declaredScope2 = _interopRequireDefault(_declaredScope);
|
||
|
|
||
|
var _ExportMap = require('../ExportMap');
|
||
|
|
||
|
var _ExportMap2 = _interopRequireDefault(_ExportMap);
|
||
|
|
||
|
var _docsUrl = require('../docsUrl');
|
||
|
|
||
|
var _docsUrl2 = _interopRequireDefault(_docsUrl);
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
function message(deprecation) {
|
||
|
return 'Deprecated' + (deprecation.description ? ': ' + deprecation.description : '.');
|
||
|
}
|
||
|
|
||
|
function getDeprecation(metadata) {
|
||
|
if (!metadata || !metadata.doc) return;
|
||
|
|
||
|
let deprecation;
|
||
|
if (metadata.doc.tags.some(t => t.title === 'deprecated' && (deprecation = t))) {
|
||
|
return deprecation;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
meta: {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
url: (0, _docsUrl2.default)('no-deprecated')
|
||
|
}
|
||
|
},
|
||
|
|
||
|
create: function (context) {
|
||
|
const deprecated = new Map(),
|
||
|
namespaces = new Map();
|
||
|
|
||
|
function checkSpecifiers(node) {
|
||
|
if (node.type !== 'ImportDeclaration') return;
|
||
|
if (node.source == null) return; // local export, ignore
|
||
|
|
||
|
const imports = _ExportMap2.default.get(node.source.value, context);
|
||
|
if (imports == null) return;
|
||
|
|
||
|
let moduleDeprecation;
|
||
|
if (imports.doc && imports.doc.tags.some(t => t.title === 'deprecated' && (moduleDeprecation = t))) {
|
||
|
context.report({ node, message: message(moduleDeprecation) });
|
||
|
}
|
||
|
|
||
|
if (imports.errors.length) {
|
||
|
imports.reportErrors(context, node);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
node.specifiers.forEach(function (im) {
|
||
|
let imported, local;
|
||
|
switch (im.type) {
|
||
|
|
||
|
case 'ImportNamespaceSpecifier':
|
||
|
{
|
||
|
if (!imports.size) return;
|
||
|
namespaces.set(im.local.name, imports);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
case 'ImportDefaultSpecifier':
|
||
|
imported = 'default';
|
||
|
local = im.local.name;
|
||
|
break;
|
||
|
|
||
|
case 'ImportSpecifier':
|
||
|
imported = im.imported.name;
|
||
|
local = im.local.name;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return; // can't handle this one
|
||
|
}
|
||
|
|
||
|
// unknown thing can't be deprecated
|
||
|
const exported = imports.get(imported);
|
||
|
if (exported == null) return;
|
||
|
|
||
|
// capture import of deep namespace
|
||
|
if (exported.namespace) namespaces.set(local, exported.namespace);
|
||
|
|
||
|
const deprecation = getDeprecation(imports.get(imported));
|
||
|
if (!deprecation) return;
|
||
|
|
||
|
context.report({ node: im, message: message(deprecation) });
|
||
|
|
||
|
deprecated.set(local, deprecation);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
'Program': (_ref) => {
|
||
|
let body = _ref.body;
|
||
|
return body.forEach(checkSpecifiers);
|
||
|
},
|
||
|
|
||
|
'Identifier': function (node) {
|
||
|
if (node.parent.type === 'MemberExpression' && node.parent.property === node) {
|
||
|
return; // handled by MemberExpression
|
||
|
}
|
||
|
|
||
|
// ignore specifier identifiers
|
||
|
if (node.parent.type.slice(0, 6) === 'Import') return;
|
||
|
|
||
|
if (!deprecated.has(node.name)) return;
|
||
|
|
||
|
if ((0, _declaredScope2.default)(context, node.name) !== 'module') return;
|
||
|
context.report({
|
||
|
node,
|
||
|
message: message(deprecated.get(node.name))
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'MemberExpression': function (dereference) {
|
||
|
if (dereference.object.type !== 'Identifier') return;
|
||
|
if (!namespaces.has(dereference.object.name)) return;
|
||
|
|
||
|
if ((0, _declaredScope2.default)(context, dereference.object.name) !== 'module') return;
|
||
|
|
||
|
// go deep
|
||
|
var namespace = namespaces.get(dereference.object.name);
|
||
|
var namepath = [dereference.object.name];
|
||
|
// while property is namespace and parent is member expression, keep validating
|
||
|
while (namespace instanceof _ExportMap2.default && dereference.type === 'MemberExpression') {
|
||
|
|
||
|
// ignore computed parts for now
|
||
|
if (dereference.computed) return;
|
||
|
|
||
|
const metadata = namespace.get(dereference.property.name);
|
||
|
|
||
|
if (!metadata) break;
|
||
|
const deprecation = getDeprecation(metadata);
|
||
|
|
||
|
if (deprecation) {
|
||
|
context.report({ node: dereference.property, message: message(deprecation) });
|
||
|
}
|
||
|
|
||
|
// stash and pop
|
||
|
namepath.push(dereference.property.name);
|
||
|
namespace = metadata.namespace;
|
||
|
dereference = dereference.parent;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
};
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1kZXByZWNhdGVkLmpzIl0sIm5hbWVzIjpbIm1lc3NhZ2UiLCJkZXByZWNhdGlvbiIsImRlc2NyaXB0aW9uIiwiZ2V0RGVwcmVjYXRpb24iLCJtZXRhZGF0YSIsImRvYyIsInRhZ3MiLCJzb21lIiwidCIsInRpdGxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImNyZWF0ZSIsImNvbnRleHQiLCJkZXByZWNhdGVkIiwiTWFwIiwibmFtZXNwYWNlcyIsImNoZWNrU3BlY2lmaWVycyIsIm5vZGUiLCJzb3VyY2UiLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInZhbHVlIiwibW9kdWxlRGVwcmVjYXRpb24iLCJyZXBvcnQiLCJlcnJvcnMiLCJsZW5ndGgiLCJyZXBvcnRFcnJvcnMiLCJzcGVjaWZpZXJzIiwiZm9yRWFjaCIsImltIiwiaW1wb3J0ZWQiLCJsb2NhbCIsInNpemUiLCJzZXQiLCJuYW1lIiwiZXhwb3J0ZWQiLCJuYW1lc3BhY2UiLCJib2R5IiwicGFyZW50IiwicHJvcGVydHkiLCJzbGljZSIsImhhcyIsImRlcmVmZXJlbmNlIiwib2JqZWN0IiwibmFtZXBhdGgiLCJjb21wdXRlZCIsInB1c2giXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQSxTQUFTQSxPQUFULENBQWlCQyxXQUFqQixFQUE4QjtBQUM1QixTQUFPLGdCQUFnQkEsWUFBWUMsV0FBWixHQUEwQixPQUFPRCxZQUFZQyxXQUE3QyxHQUEyRCxHQUEzRSxDQUFQO0FBQ0Q7O0FBRUQsU0FBU0MsY0FBVCxDQUF3QkMsUUFBeEIsRUFBa0M7QUFDaEMsTUFBSSxDQUFDQSxRQUFELElBQWEsQ0FBQ0EsU0FBU0MsR0FBM0IsRUFBZ0M7O0FBRWhDLE1BQUlKLFdBQUo7QUFDQSxNQUFJRyxTQUFTQyxHQUFULENBQWFDLElBQWIsQ0FBa0JDLElBQWxCLENBQXVCQyxLQUFLQSxFQUFFQyxL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
|