Node.js 使用npm程序包验证程序包名称

Node.js 使用npm程序包验证程序包名称,node.js,npm,Node.js,Npm,有没有办法使用npm包来验证包名 const npm = require('npm'); const isValid = npm.validatePackageName('foobar'); // true const isValid = npm.validatePackageName('-4! *'); // false 我看到一个userland包可以做到这一点,但npm包本身肯定可以做到这一点吗?是否有从该软件包导出的公用设施?有效名称 var validate = require("

有没有办法使用npm包来验证包名

const npm = require('npm');

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

我看到一个userland包可以做到这一点,但npm包本身肯定可以做到这一点吗?是否有从该软件包导出的公用设施?

有效名称

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")
validate(" leading-space:and:weirdchars")
以上所有名称都有效,因此您将返回此对象:

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

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")
validate(" leading-space:and:weirdchars")
这从来都不是一个有效的包名,因此您会看到:

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

命名规则:

以下是有效npm包名称应遵守的规则列表:

  • 包名称长度应大于零
  • 包名称中的所有字符必须为小写,即不使用大写 或允许混合大小写名称
  • 包名称可以由连字符组成
  • 包名称不得包含任何非url安全字符(因为名称结束 是URL的一部分)
  • 程序包名称不应以
    \uu
    开头
  • 包名称不应包含任何前导或尾随空格
  • 包名称不应包含以下任何字符:
    ~)(“!*
  • 包名称不能与node.js/io.js核心模块或 保留/黑名单名称。例如,以下名称无效:
    • http
    • node\u模块
    • favicon.ico
  • 包名称长度不能超过214
您的包名由
*
组成,这就是问题所在。

基于@Nikita Ivanov的,涵盖了更多无效案例。代码:

var validate=require(“验证npm包名”);
函数printPackageName验证(packageName){
console.log(packageName);
日志(验证(packageName));
console.log();
}
//有效的
printPackageNameValidationFor(“虚线连字符减号有效”);
printPackageNameValidationFor(“example.com有效期”);
printPackageNameValidationFor(“低于有效分数”);
printPackageNameValidationFor(“示例-123-numbers-validation”);
printPackageNameValidationFor(“123以有效数字开头”);
printPackageNameValidationFor(“作用域名称的@scope/at符号有效”);
//无效的
printPackageNameValidationFor(“slashes@using-非scopename的at符号使用无效“);
printPackageNameValidationFor(“斜杠/非范围名称无效”);
printPackageNameValidationFor(“管道无效”);
printPackageNameValidationFor(“感叹!for!new!packages!invalid”);
printPackageNameValidationFor(“空格无效”);
printPackageNameValidationFor(“html%20实体无效”);
printPackageNameValidationFor(“方括号]-无效”);
printPackageNameValidationFor(“逗号,无效”);
printPackageNameValidationFor(“冒号:无效”);
printPackageNameValidationFor(“分号;无效”);
printPackageNameValidationFor(“单报价无效”);
printPackageNameValidationFor(“双引号”无效);
printPackageNameValidationFor(“波浪号~无效”);
printPackageNameValidationFor(“简单-(括号)-无效”);
printPackageNameValidationFor(“curly-{Brages}-无效”);
printPackageNameValidationFor(“星号*-无效”);
printPackageNameValidationFor(“插入符号^-无效”);
printPackageNameValidationFor(“磅符号#-无效”);
printPackageNameValidationFor(“加号+-无效”);
printPackageNameValidationFor(“问号?无效”);
输出,有效名称:

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' ] }
输出,无效名称:

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' ] }

答案中的软件包是npm自己的官方软件包,因此他们可能没有将其包含在npm软件包中。将来他们可能会,但现在不会。目前,他们只通过类似npm.commands.install([,cb])的代码支持命令;您说“兴奋!”是一个有效的名称。但是@nikhil sugandh说包名称不应包含以下任何字符:~)(“!*”。哪一个是正确的?有效名称是否可以包含“!”?