当前位置: 首页 > Web前端 > HTML

validate-npm-package-name源码学习

时间:2023-03-29 11:07:17 HTML

用法validate-npm-package-name这个npm包的作用是校验项目名(npm包名)是否合法,很多cli工具都会用到。比如vue-cli:https://github.com/vuejs/vue-...create-react-app:https://github.com/facebook/c...vue-cli的用法如下followsconstresult=validateProjectName(name)//Thenameisinvalidif(!result.validForNewPackages){//输出错误信息console.error(chalk.red(`Invalidprojectname:"${name}"`))result.errors&&result.errors.forEach((err)=>{console.error(chalk.red.dim("Error:"+err))})result.warnings&&result.warnings.forEach((warn)=>{console.error(chalk.red.dim("Warning:"+warn))})//Endprocessexit(1);}Testcase测试用例只有一个文件,https://github.com/npm/valida...这里列出了各种用例,在没有文档的时候,可以通过这些用例来初步了解这个包的用法,也可以知道作者想要设计的功能。复制这两个用例并查看//Cannotstartwith。t.deepEqual(validate('.start-with-period'),{validForNewPackages:false,validForOldPackages:false,errors:['namecannotstartwithaperiod']})//不能以_开头t.deepEqual(validate('_start-with-underscore'),{validForNewPackages:false,validForOldPackages:false,errors:['namecannotstartwithanunderscore']})我们自己开发项目的时候,可以先写测试用例,然后再实现围绕这些用例,可以提高代码的稳定性。以后在增加功能的时候,这些测试用例可以帮助我们验证旧的功能,避免牵一发而动全身。源码可以从package.json中了解到,这个库的入口文件index.js//package.json//..."main":"index.js",//...来自index的内容.js发现项目只有这一个js文件https://github.com/npm/valida...'usestrict'//用来匹配scope包,例如@vue/reactivityvarscopedPackagePattern=newRegExp('^(?:@([^/]+?)[/])?([^/]+?)$')//节点内置模块名称列表varbuiltins=require('builtins')//blacklist(reservedwords)varblacklist=['node_modules','favicon.ico']//入口函数varvalidate=module.exports=function(name){//warning:用于表示包名被允许在过去和现在不允许varwarnings=[]//存储不合格包名的规则varerrors=[]//格式验证if(name===null){errors.push('namecannotbenull')//使用done函数构造返回值returndone(warnings,errors)}if(name===undefined){errors.push('namecannotbeundefined')returndone(warnings,errors)}if(typeofname!=='string'){错误。push('namemustbeastring')returndone(warnings,errors)}//name的长度不能为0if(!name.length){errors.push('name长度必须大于零')}//名称不能以.if(name.match(/^\./)){errors.push('namecannotstartwithaperiod')}//name不能以_开头if(name.match(/^_/)){errors.push('namecannotstartwithanunderscore')}//namecannotcontainleadingortrailingspacesif(name.trim()!==name){errors.push('namecannotcontainleadingortrailingspaces')}//没什么好笑的//名称不能是保留字)//为过去允许的东西生成警告//核心模块名称,如http、events、util等//名称与节点内置模块名称相同,然后生成警告builtins.forEach(function(builtin){if(name.toLowerCase()===builtin){warnings.push(builtin+'isacoremodulename')}})//really-long-package-names--------------------------------如此---长度-----很多---哇//这个真的很长packagenameitsshouldpublishdowe现在限制了packagenames-poch的长度。//名称不能超过214个字符if(name.length>214){warnings.push('namecannotlongercontainmorethan214characters')}//mIxeDCaSenAMEs//名称不能有大写字母if(name.toLowerCase()!==name){warnings.push('namecannotlongercontaincapitalletters')}//name不能包含特殊字符~'!()*if(/[~'!()*]/.test(name.split('/').slice(-1)[0])){warnings.push('namecannotlongercontainspecialcharacters("~\'!()*")')}if(encodeURIComponent(name)!==name){//可能是作用域包名,比如@user/package//进程作用域包,比如@vue/reactivityvarnameMatch=name.match(scopedPackagePattern)if(nameMatch){varuser=nameMatch[1]//vuevarpkg=nameMatch[2]//反应性if(encodeURIComponent(user)===user&&encodeURIComponent(pkg)===pkg){//作用域包没有异常,直接返回返回完成(警告,错误rs)}}//名称中有非url安全字符errors.push('namecanonlycontainURL-friendlycharacters')}returndone(warnings,errors)}//导出匹配范围的正则表达式packagevalidate.scopedPackagePattern=scopedPackagePattern//通过警告和错误构造返回值vardone=function(warnings,errors){varresult={validForNewPackages:errors.length===0&&warnings.length===0,validForOldPackages:错误。length===0,warnings:warnings,errors:errors}if(!result.warnings.length)deleteresult.warningsif(!result.errors.length)deleteresult.errorsreturnresult}上面是validate-npm-的package-name源码部分,功能比较简单。在没有了解库之前,直接阅读源码是非常混乱的。这时候可以先阅读测试用例,了解这个库的基本功能。了解基本功能后,可以从package.json入手,找到入口文件结合测试用例阅读。从源码中得知可以从builtins获取Node的内置模块。和项目开发规范一样,先制定需求(写测试用例),然后围绕测试用例进行开发,实现需求。希望文章的内容能给大家提供一点帮助,如有错误,欢迎指正。