| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | 'use strict';exports.__esModule = true;/** * Returns an object of node visitors that will call * 'visitor' with every discovered module path. * * todo: correct function prototype for visitor * @param  {Function(String)} visitor [description] * @param  {[type]} options [description] * @return {object} */exports.default = function visitModules(visitor, options) {  // if esmodule is not explicitly disabled, it is assumed to be enabled  options = Object.assign({ esmodule: true }, options);  let ignoreRegExps = [];  if (options.ignore != null) {    ignoreRegExps = options.ignore.map(p => new RegExp(p));  }  function checkSourceValue(source, importer) {    if (source == null) return; //?    // handle ignore    if (ignoreRegExps.some(re => re.test(source.value))) return;    // fire visitor    visitor(source, importer);  }  // for import-y declarations  function checkSource(node) {    checkSourceValue(node.source, node);  }  // for esmodule dynamic `import()` calls  function checkImportCall(node) {    let modulePath;    // refs https://github.com/estree/estree/blob/HEAD/es2020.md#importexpression    if (node.type === 'ImportExpression') {      modulePath = node.source;    } else if (node.type === 'CallExpression') {      if (node.callee.type !== 'Import') return;      if (node.arguments.length !== 1) return;      modulePath = node.arguments[0];    }    if (modulePath.type !== 'Literal') return;    if (typeof modulePath.value !== 'string') return;    checkSourceValue(modulePath, node);  }  // for CommonJS `require` calls  // adapted from @mctep: https://git.io/v4rAu  function checkCommon(call) {    if (call.callee.type !== 'Identifier') return;    if (call.callee.name !== 'require') return;    if (call.arguments.length !== 1) return;    const modulePath = call.arguments[0];    if (modulePath.type !== 'Literal') return;    if (typeof modulePath.value !== 'string') return;    checkSourceValue(modulePath, call);  }  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;    const modules = call.arguments[0];    if (modules.type !== 'ArrayExpression') return;    for (const element of modules.elements) {      if (element.type !== 'Literal') continue;      if (typeof element.value !== 'string') continue;      if (element.value === 'require' ||          element.value === 'exports') continue; // magic modules: https://git.io/vByan      checkSourceValue(element, element);    }  }  const visitors = {};  if (options.esmodule) {    Object.assign(visitors, {      'ImportDeclaration': checkSource,      'ExportNamedDeclaration': checkSource,      'ExportAllDeclaration': checkSource,      'CallExpression': checkImportCall,      'ImportExpression': checkImportCall,    });  }  if (options.commonjs || options.amd) {    const currentCallExpression = visitors['CallExpression'];    visitors['CallExpression'] = function (call) {      if (currentCallExpression) currentCallExpression(call);      if (options.commonjs) checkCommon(call);      if (options.amd) checkAMD(call);    };  }  return visitors;};/** * make an options schema for the module visitor, optionally * adding extra fields. */function makeOptionsSchema(additionalProperties) {  const base =  {    'type': 'object',    'properties': {      'commonjs': { 'type': 'boolean' },      'amd': { 'type': 'boolean' },      'esmodule': { 'type': 'boolean' },      'ignore': {        'type': 'array',        'minItems': 1,        'items': { 'type': 'string' },        'uniqueItems': true,      },    },    'additionalProperties': false,  };  if (additionalProperties) {    for (const key in additionalProperties) {      base.properties[key] = additionalProperties[key];    }  }  return base;}exports.makeOptionsSchema = makeOptionsSchema;/** * json schema object for options parameter. can be used to build * rule options schema object. * @type {Object} */exports.optionsSchema = makeOptionsSchema();
 |