Node.js 使用npm程序包验证程序包名称
有没有办法使用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("
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说包名称不应包含以下任何字符:~)(“!*”。哪一个是正确的?有效名称是否可以包含“!”?