返回

解密 validate-npm-package-name 源码,揭秘背后的规则

前端

validate-npm-package-name 是一个用于验证 NPM 包名的 JavaScript 库。它接收一个字符串作为参数,并返回一个具有两个属性的对象。第一个属性是布尔值,表示该字符串是否是一个有效的 NPM 包名。第二个属性是一个字符串数组,包含了该包名中不符合 NPM 规则的部分。

NPM 包名验证规则主要有以下几点:

  • 名称长度应大于零。
  • 名称中的所有字符都必须是小写的,不允许使用大写字母。
  • 名称中只能包含字母、数字、连字符和下划线。
  • 连字符和下划线不能出现在名称的开头或结尾。
  • 名称中不能包含连续的连字符或下划线。
  • 名称不能以数字开头。
  • 名称不能包含空格或其他特殊字符。

validate-npm-package-name 库使用正则表达式来验证 NPM 包名是否符合这些规则。正则表达式是一种用于匹配字符串的强大工具,它可以用来查找、替换和验证字符串。validate-npm-package-name 库使用正则表达式来匹配 NPM 包名中不符合规则的部分。如果正则表达式匹配到了字符串中的某个部分,则该部分被认为是不符合 NPM 规则的。

validate-npm-package-name 库是一个非常有用的工具,它可以帮助您在发布 NPM 包之前验证包名是否符合规则。这可以避免您的包被 NPM 拒绝,并确保您的包能够正常使用。

让我们深入 validate-npm-package-name 源码,一探究竟。

function validatePackageName(name) {
  if (typeof name !== 'string') {
    throw new TypeError('Expected a string');
  }

  if (name.length === 0) {
    return {
      valid: false,
      errors: ['Name must not be empty']
    };
  }

  if (name.length > 214) {
    return {
      valid: false,
      errors: ['Name must not be longer than 214 characters']
    };
  }

  if (!/^[a-z0-9\-_]+$/.test(name)) {
    return {
      valid: false,
      errors: ['Name must only contain lowercase letters, numbers, hyphens, and underscores']
    };
  }

  if (name[0] === '-' || name[0] === '_') {
    return {
      valid: false,
      errors: ['Name must not start with a hyphen or underscore']
    };
  }

  if (name[name.length - 1] === '-' || name[name.length - 1] === '_') {
    return {
      valid: false,
      errors: ['Name must not end with a hyphen or underscore']
    };
  }

  if (/--/.test(name) || /__/.test(name)) {
    return {
      valid: false,
      errors: ['Name must not contain consecutive hyphens or underscores']
    };
  }

  if (/^-?\d+$/.test(name)) {
    return {
      valid: false,
      errors: ['Name must not start with a number']
    };
  }

  if (/\s/.test(name)) {
    return {
      valid: false,
      errors: ['Name must not contain spaces']
    };
  }

  return {
    valid: true,
    errors: []
  };
}

validate-npm-package-name 库首先检查名称的长度是否大于零,然后检查名称的长度是否小于等于 214 个字符。接下来,它使用正则表达式来检查名称是否只包含小写字母、数字、连字符和下划线。然后,它检查名称是否以连字符或下划线开头或结尾,并检查名称是否包含连续的连字符或下划线。最后,它检查名称是否以数字开头,并检查名称是否包含空格。

如果名称符合所有这些规则,则 validate-npm-package-name 库返回一个布尔值 true 和一个空数组。否则,它返回一个布尔值 false 和一个包含不符合规则的名称部分的数组。

validate-npm-package-name 库是一个非常有用的工具,它可以帮助您验证 NPM 包名是否符合规则。这可以避免您的包被 NPM 拒绝,并确保您的包能够正常使用。