| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /**
- * @author Toru Nagashima
- * @copyright 2016 Toru Nagashima. All rights reserved.
- * See LICENSE file in root directory for full license.
- */
- "use strict"
- //------------------------------------------------------------------------------
- // Requirements
- //------------------------------------------------------------------------------
- const path = require("path")
- const getConvertPath = require("../util/get-convert-path")
- const getDocsUrl = require("../util/get-docs-url")
- const getNpmignore = require("../util/get-npmignore")
- const getPackageJson = require("../util/get-package-json")
- //------------------------------------------------------------------------------
- // Helpers
- //------------------------------------------------------------------------------
- /**
- * Checks whether or not a given path is a `bin` file.
- *
- * @param {string} filePath - A file path to check.
- * @param {string|object|undefined} binField - A value of the `bin` field of `package.json`.
- * @param {string} basedir - A directory path that `package.json` exists.
- * @returns {boolean} `true` if the file is a `bin` file.
- */
- function isBinFile(filePath, binField, basedir) {
- if (!binField) {
- return false
- }
- if (typeof binField === "string") {
- return filePath === path.resolve(basedir, binField)
- }
- return Object.keys(binField).some(key => filePath === path.resolve(basedir, binField[key]))
- }
- /**
- * The definition of this rule.
- *
- * @param {RuleContext} context - The rule context to check.
- * @returns {object} The definition of this rule.
- */
- function create(context) {
- return {
- Program(node) {
- // Check file path.
- let rawFilePath = context.getFilename()
- if (rawFilePath === "<input>") {
- return
- }
- rawFilePath = path.resolve(rawFilePath)
- // Find package.json
- const p = getPackageJson(rawFilePath)
- if (!p) {
- return
- }
- // Convert by convertPath option
- const basedir = path.dirname(p.filePath)
- const relativePath = getConvertPath(context)(
- path.relative(basedir, rawFilePath).replace(/\\/g, "/")
- )
- const filePath = path.join(basedir, relativePath)
- // Check this file is bin.
- if (!isBinFile(filePath, p.bin, basedir)) {
- return
- }
- // Check ignored or not
- const npmignore = getNpmignore(filePath)
- if (!npmignore.match(relativePath)) {
- return
- }
- // Report.
- context.report({
- node,
- message:
- "npm ignores '{{name}}'. " +
- "Check 'files' field of 'package.json' or '.npmignore'.",
- data: { name: relativePath },
- })
- },
- }
- }
- //------------------------------------------------------------------------------
- // Rule Definition
- //------------------------------------------------------------------------------
- module.exports = {
- create,
- meta: {
- docs: {
- description: "disallow 'bin' files which are ignored by npm",
- category: "Possible Errors",
- recommended: true,
- url: getDocsUrl("no-unpublished-bin.md"),
- },
- fixable: false,
- schema: [
- {
- type: "object",
- properties: { //
- convertPath: getConvertPath.schema,
- },
- },
- ],
- },
- }
|