Blame view

node_modules/eslint-plugin-node/lib/util/check-publish.js 2.96 KB
ce4c83ff   wxy   初始提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  /**
   * @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 },
                  })
              }
          }
      }
  }