ignore.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. 'use strict';
  2. exports.__esModule = true;
  3. const extname = require('path').extname;
  4. const log = require('debug')('eslint-plugin-import:utils:ignore');
  5. // one-shot memoized
  6. /** @type {Set<import('./types').Extension>} */ let cachedSet;
  7. /** @type {import('./types').ESLintSettings} */ let lastSettings;
  8. /** @type {import('./ignore').getFileExtensions} */
  9. function makeValidExtensionSet(settings) {
  10. // start with explicit JS-parsed extensions
  11. /** @type {Set<import('./types').Extension>} */
  12. const exts = new Set(settings['import/extensions'] || ['.js', '.mjs', '.cjs']);
  13. // all alternate parser extensions are also valid
  14. if ('import/parsers' in settings) {
  15. for (const parser in settings['import/parsers']) {
  16. const parserSettings = settings['import/parsers'][parser];
  17. if (!Array.isArray(parserSettings)) {
  18. throw new TypeError('"settings" for ' + parser + ' must be an array');
  19. }
  20. parserSettings.forEach((ext) => exts.add(ext));
  21. }
  22. }
  23. return exts;
  24. }
  25. exports.getFileExtensions = makeValidExtensionSet;
  26. /** @type {(context: import('eslint').Rule.RuleContext) => Set<import('./types').Extension>} */
  27. function validExtensions(context) {
  28. if (cachedSet && context.settings === lastSettings) {
  29. return cachedSet;
  30. }
  31. lastSettings = context.settings;
  32. cachedSet = makeValidExtensionSet(context.settings);
  33. return cachedSet;
  34. }
  35. /** @type {import('./ignore').hasValidExtension} */
  36. function hasValidExtension(path, context) {
  37. // eslint-disable-next-line no-extra-parens
  38. return validExtensions(context).has(/** @type {import('./types').Extension} */ (extname(path)));
  39. }
  40. exports.hasValidExtension = hasValidExtension;
  41. /** @type {import('./ignore').default} */
  42. exports.default = function ignore(path, context) {
  43. // check extension whitelist first (cheap)
  44. if (!hasValidExtension(path, context)) {
  45. return true;
  46. }
  47. if (!('import/ignore' in context.settings)) {
  48. return false;
  49. }
  50. const ignoreStrings = context.settings['import/ignore'];
  51. for (let i = 0; i < ignoreStrings.length; i++) {
  52. const regex = new RegExp(ignoreStrings[i]);
  53. if (regex.test(path)) {
  54. log(`ignoring ${path}, matched pattern /${ignoreStrings[i]}/`);
  55. return true;
  56. }
  57. }
  58. return false;
  59. };