使用npm包验证包名称

20

有没有一种方法可以使用npm包来验证软件包名称?

const npm = require('npm');

const isValid = npm.validatePackageName('foobar'); // true
const isValid = npm.validatePackageName('-4! *'); // false

我看到有一个用户级别的软件包可以做到这一点,但npm软件包本身肯定也能做到吧?那个软件包导出了公共实用程序吗?


答案中的 package 是由 npm 官方提供的包,因此他们可能没有将其包含在他们的 npm 包中。将来可能会添加,但现在不支持。目前,他们只通过代码支持命令,例如 npm.commands.install([<package_list_array>, cb]); - Abhishek Singh
3个回答

18

合法名称

var validate = require("validate-npm-package-name")

validate("some-package")
validate("example.com")
validate("under_score")
validate("123numeric")
validate("excited!")
validate("@npm/thingy")
validate("@jane/foo.js")

上述所有名称都是有效的,因此您将收到此对象:

{
  validForNewPackages: true,
  validForOldPackages: true
}

无效名称

validate(" leading-space:and:weirdchars")

那从未是一个有效的包名,所以你会得到这个:

{
  validForNewPackages: false,
  validForOldPackages: false,
  errors: [
    'name cannot contain leading or trailing spaces',
    'name can only contain URL-friendly characters'
  ]
}

来源: https://github.com/npm/validate-npm-package-name


你说“excited!”是一个有效的名称。但@nikhil sugandh说“包名不应包含以下任何字符:〜)('!*”。哪个是正确的?一个有效的名称是否可以包含“!”? - silverbullettt

3
命名规则:
以下是有效的npm包名称应符合的规则列表:
  • 包名称长度应大于零。
  • 包名称中的所有字符都必须为小写,即不允许使用大写或混合大小写名称。
  • 包名称可以包含连字符。
  • 包名称不能包含任何非URL安全字符(因为名称最终成为URL的一部分)。
  • 包名称不应以 . _开头。
  • 包名称不应包含任何前导或尾随空格。
  • 包名称不应包含以下任何字符:~)('!*
  • 包名称不能与node.js/io.js核心模块或保留/黑名单名称相同。例如,以下名称无效:
    • http
    • stream
    • node_modules
    • favicon.ico
  • 包名称长度不能超过214。
您的包名称包含*;这就是问题所在。

0

基于 @Nikita Ivanov 的 答案,覆盖更多无效情况。代码:

var validate = require("validate-npm-package-name");

function printPackageNameValidationFor(packageName) {
  console.log(packageName);
  console.log(validate(packageName));
  console.log();
}

// valid
printPackageNameValidationFor("dashes-hyphens-minus-sign-valid");
printPackageNameValidationFor("example.com-periods-valid");
printPackageNameValidationFor("under_scores-valid");
printPackageNameValidationFor("example-123-numbers-valid");
printPackageNameValidationFor("123-starting-with-numbers-valid");
printPackageNameValidationFor("@scope/at-sign-for-scope-names-valid");

// invalid
printPackageNameValidationFor("slashes@using-at-sign-for-non-scopename-uses-invalid");
printPackageNameValidationFor("slashes/on-nonscoped-names-invalid");
printPackageNameValidationFor("pipes|invalid");
printPackageNameValidationFor("exclamations!for!new!packages!invalid");
printPackageNameValidationFor("space invalid");
printPackageNameValidationFor("html%20entities-invalid");
printPackageNameValidationFor("square[brackets]-invalid");
printPackageNameValidationFor("commas,invalid");
printPackageNameValidationFor("colon:invalid");
printPackageNameValidationFor("semicolon;invalid");
printPackageNameValidationFor("single-quote\'invalid");
printPackageNameValidationFor("double-quote\"invalid");
printPackageNameValidationFor("tilde~invalid");
printPackageNameValidationFor("simple-(brackets)-invalid");
printPackageNameValidationFor("curly-{braces}-invalid");
printPackageNameValidationFor("asterisks*-invalid");
printPackageNameValidationFor("carets^-invalid");
printPackageNameValidationFor("pound-sign#-invalid");
printPackageNameValidationFor("plus-sign+-invalid");
printPackageNameValidationFor("question-mark?-invalid");

输出,有效名称:

dashes-hyphens-minus-sign-valid
{ validForNewPackages: true, validForOldPackages: true }

example.com-periods-valid
{ validForNewPackages: true, validForOldPackages: true }

under_scores-valid
{ validForNewPackages: true, validForOldPackages: true }

example-123-numbers-valid
{ validForNewPackages: true, validForOldPackages: true }

123-starting-with-numbers-valid
{ validForNewPackages: true, validForOldPackages: true }

@scope/at-sign-for-scope-names-valid
{ validForNewPackages: true, validForOldPackages: true }

输出,无效名称:

slashes@using-at-sign-for-non-scopename-uses-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

slashes/on-nonscoped-names-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

pipes|invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

exclamations!for!new!packages!invalid
{ validForNewPackages: false,
  validForOldPackages: true,
  warnings:
   [ 'name can no longer contain special characters ("~\'!()*")' ] }

space invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

html%20entities-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

square[brackets]-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

commas,invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

colon:invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

semicolon;invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

single-quote'invalid
{ validForNewPackages: false,
  validForOldPackages: true,
  warnings:
   [ 'name can no longer contain special characters ("~\'!()*")' ] }

double-quote"invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

tilde~invalid
{ validForNewPackages: false,
  validForOldPackages: true,
  warnings:
   [ 'name can no longer contain special characters ("~\'!()*")' ] }

simple-(brackets)-invalid
{ validForNewPackages: false,
  validForOldPackages: true,
  warnings:
   [ 'name can no longer contain special characters ("~\'!()*")' ] }

curly-{braces}-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

asterisks*-invalid
{ validForNewPackages: false,
  validForOldPackages: true,
  warnings:
   [ 'name can no longer contain special characters ("~\'!()*")' ] }

carets^-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

pound-sign#-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

plus-sign+-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

question-mark?-invalid
{ validForNewPackages: false,
  validForOldPackages: false,
  errors: [ 'name can only contain URL-friendly characters' ] }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接