/** * @fileoverview Rule to check whether or not `require()` is valid. * @author Toru Nagashima * @copyright 2015 Toru Nagashima. All rights reserved. * See LICENSE file in root directory for full license. */ "use strict" //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const path = require("path") const getAllowModules = require("./get-allow-modules") const getConvertPath = require("./get-convert-path") const getNpmignore = require("./get-npmignore") const getPackageJson = require("./get-package-json") //------------------------------------------------------------------------------ // Public Interface //------------------------------------------------------------------------------ /** * Checks whether or not each requirement target is published via package.json. * * It reads package.json and checks the target exists in `dependencies`. * * @param {RuleContext} context - A context to report. * @param {string} filePath - The current file path. * @param {ImportTarget[]} targets - A list of target information to check. * @returns {void} */ module.exports = function checkForPublish(context, filePath, targets) { const packageInfo = getPackageJson(filePath) if (!packageInfo) { return } const allowed = new Set(getAllowModules(context)) const convertPath = getConvertPath(context) const basedir = path.dirname(packageInfo.filePath) const toRelative = function(fullPath) { // eslint-disable-line func-style const retv = path.relative(basedir, fullPath).replace(/\\/g, "/") return convertPath(retv) } const npmignore = getNpmignore(filePath) const devDependencies = new Set( Object.keys(packageInfo.devDependencies || {}) ) const dependencies = new Set( [].concat( Object.keys(packageInfo.dependencies || {}), Object.keys(packageInfo.peerDependencies || {}), Object.keys(packageInfo.optionalDependencies || {}) ) ) if (!npmignore.match(toRelative(filePath))) { // This file is published, so this cannot import private files. for (const target of targets) { const isPrivateFile = ( target.moduleName == null && npmignore.match(toRelative(target.filePath)) ) const isDevPackage = ( target.moduleName != null && devDependencies.has(target.moduleName) && !dependencies.has(target.moduleName) && !allowed.has(target.moduleName) ) if (isPrivateFile || isDevPackage) { context.report({ node: target.node, loc: target.node.loc, message: "\"{{name}}\" is not published.", data: {name: target.moduleName || target.name}, }) } } } }