123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- 'use strict';var _path = require('path');var _path2 = _interopRequireDefault(_path);
- var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
- var _importType = require('../core/importType');
- var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
- var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
- var enumValues = { 'enum': ['always', 'ignorePackages', 'never'] };
- var patternProperties = {
- type: 'object',
- patternProperties: { '.*': enumValues } };
- var properties = {
- type: 'object',
- properties: {
- 'pattern': patternProperties,
- 'ignorePackages': { type: 'boolean' } } };
- function buildProperties(context) {
- var result = {
- defaultConfig: 'never',
- pattern: {},
- ignorePackages: false };
- context.options.forEach(function (obj) {
-
- if (typeof obj === 'string') {
- result.defaultConfig = obj;
- return;
- }
-
- if (obj.pattern === undefined && obj.ignorePackages === undefined) {
- Object.assign(result.pattern, obj);
- return;
- }
-
- if (obj.pattern !== undefined) {
- Object.assign(result.pattern, obj.pattern);
- }
-
- if (obj.ignorePackages !== undefined) {
- result.ignorePackages = obj.ignorePackages;
- }
- });
- if (result.defaultConfig === 'ignorePackages') {
- result.defaultConfig = 'always';
- result.ignorePackages = true;
- }
- return result;
- }
- module.exports = {
- meta: {
- type: 'suggestion',
- docs: {
- url: (0, _docsUrl2['default'])('extensions') },
- schema: {
- anyOf: [
- {
- type: 'array',
- items: [enumValues],
- additionalItems: false },
- {
- type: 'array',
- items: [
- enumValues,
- properties],
- additionalItems: false },
- {
- type: 'array',
- items: [properties],
- additionalItems: false },
- {
- type: 'array',
- items: [patternProperties],
- additionalItems: false },
- {
- type: 'array',
- items: [
- enumValues,
- patternProperties],
- additionalItems: false }] } },
- create: function () {function create(context) {
- var props = buildProperties(context);
- function getModifier(extension) {
- return props.pattern[extension] || props.defaultConfig;
- }
- function isUseOfExtensionRequired(extension, isPackage) {
- return getModifier(extension) === 'always' && (!props.ignorePackages || !isPackage);
- }
- function isUseOfExtensionForbidden(extension) {
- return getModifier(extension) === 'never';
- }
- function isResolvableWithoutExtension(file) {
- var extension = _path2['default'].extname(file);
- var fileWithoutExtension = file.slice(0, -extension.length);
- var resolvedFileWithoutExtension = (0, _resolve2['default'])(fileWithoutExtension, context);
- return resolvedFileWithoutExtension === (0, _resolve2['default'])(file, context);
- }
- function isExternalRootModule(file) {
- var slashCount = file.split('/').length - 1;
- if (slashCount === 0) return true;
- if ((0, _importType.isScoped)(file) && slashCount <= 1) return true;
- return false;
- }
- function checkFileExtension(source, node) {
-
- if (!source || !source.value) return;
- var importPathWithQueryString = source.value;
-
- if ((0, _importType.isBuiltIn)(importPathWithQueryString, context.settings)) return;
- var importPath = importPathWithQueryString.replace(/\?(.*)$/, '');
-
-
- if (isExternalRootModule(importPath)) return;
- var resolvedPath = (0, _resolve2['default'])(importPath, context);
-
-
- var extension = _path2['default'].extname(resolvedPath || importPath).substring(1);
-
- var isPackage = (0, _importType.isExternalModule)(
- importPath,
- (0, _resolve2['default'])(importPath, context),
- context) ||
- (0, _importType.isScoped)(importPath);
- if (!extension || !importPath.endsWith('.' + String(extension))) {
-
- if (node.importKind === 'type') return;
- var extensionRequired = isUseOfExtensionRequired(extension, isPackage);
- var extensionForbidden = isUseOfExtensionForbidden(extension);
- if (extensionRequired && !extensionForbidden) {
- context.report({
- node: source,
- message: 'Missing file extension ' + (
- extension ? '"' + String(extension) + '" ' : '') + 'for "' + String(importPathWithQueryString) + '"' });
- }
- } else if (extension) {
- if (isUseOfExtensionForbidden(extension) && isResolvableWithoutExtension(importPath)) {
- context.report({
- node: source,
- message: 'Unexpected use of file extension "' + String(extension) + '" for "' + String(importPathWithQueryString) + '"' });
- }
- }
- }
- return (0, _moduleVisitor2['default'])(checkFileExtension, { commonjs: true });
- }return create;}() };
|