UNPKG

2.6 kBJavaScriptView Raw
1const kebabCase = require('kebab-case');
2const chalk = require('chalk');
3const spawn = require('cross-spawn');
4const { getNpmInfo, isAliNpm } = require('ice-npm-utils');
5
6/**
7 * 获取 npm 包名
8 * @param {string} name
9 * @param {string} npmPrefix
10 */
11function generateNpmNameByPrefix(name, npmPrefix) {
12 return npmPrefix + kebabCase(name).replace(/^-/, '');
13}
14
15/**
16 * 检测 NPM 包是否已发送,并返回包的发布时间
17 * @param {string} npm package name
18 * @param {String} version pacage version
19 * @param {String} registry npm registry
20 * @return {array}
21 * [code, resute]
22 */
23function getNpmTime(npm, version = 'latest') {
24 return getNpmInfo(npm)
25 .then((data) => {
26 if (!data.time) {
27 console.error(chalk.red('time 字段不存在'));
28 return Promise.reject(new Error(`${npm}@${version} time 字段不存在`));
29 }
30 // 传进来的可能是 latest 这种非 数字型的 版本号
31 const distTags = data['dist-tags'];
32 version = distTags[version] || version;
33 const { versions } = data;
34 if (!versions || versions[version] === undefined) {
35 return Promise.reject(new Error(`${npm}@${version} 未发布! 禁止提交!`));
36 }
37 return data.time;
38 })
39 .catch((err) => {
40 if (
41 (err.response && err.response.status === 404)
42 || err.message === 'Not found' // tnpm
43 || /not found/.test(err.message) // tnpm
44 || err.message === 'not_found' // npm
45 ) {
46 // 这种情况是该 npm 包名一次都没有发布过
47 return Promise.reject(new Error(`[ERR checkAndQueryNpmTime] ${npm}@${version} 包未发布! 禁止提交!`));
48 }
49
50 return Promise.reject(err);
51 });
52}
53
54/**
55 * get NPM registry
56 *
57 * @returns {string} npm registry url
58 */
59function getNpmRegistry(npmName) {
60 // return REGISTRY env variable
61 if (process.env.REGISTRY) return process.env.REGISTRY;
62
63 // return tnpm if is a interior npm
64 if (isAliNpm(npmName)) return 'https://registry.npm.alibaba-inc.com';
65
66 // get registry through npm config
67 let npmRegistry = spawn.sync('npm', ['config', 'get', 'registry'], { stdio: ['ignore', 'pipe', 'pipe'] });
68 npmRegistry = npmRegistry.stdout.toString().replace(/\/+(\n?)$/, '');
69
70 // return registry
71 if (isVaildRegistry(npmRegistry)) return npmRegistry;
72
73 // default
74 return 'https://registry.npmjs.com';
75}
76
77/**
78 * verify a registry URL
79 *
80 * @param {string} url
81 */
82function isVaildRegistry(url) {
83 return /^(https?):\/\/.+$/.test(url);
84}
85
86module.exports = {
87 generateNpmNameByPrefix,
88 getNpmTime,
89 getNpmRegistry,
90};