有没有一种方法可以使用npm包来验证软件包名称?
const npm = require('npm');
const isValid = npm.validatePackageName('foobar'); // true
const isValid = npm.validatePackageName('-4! *'); // false
我看到有一个用户级别的软件包可以做到这一点,但npm软件包本身肯定也能做到吧?那个软件包导出了公共实用程序吗?
有没有一种方法可以使用npm包来验证软件包名称?
const npm = require('npm');
const isValid = npm.validatePackageName('foobar'); // true
const isValid = npm.validatePackageName('-4! *'); // false
我看到有一个用户级别的软件包可以做到这一点,但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")
上述所有名称都是有效的,因此您将收到此对象:
{
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'
]
}
.
或_
开头。~)('!*
http
stream
node_modules
favicon.ico
*
;这就是问题所在。基于 @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' ] }