UNPKG

2.07 kBJavaScriptView Raw
1const { chalk } = require('sherry-utils')
2
3module.exports = class PluginAPI {
4 constructor(sherry) {
5 this.sherry = sherry
6 this.peerDependencies = []
7 }
8
9 registerPluginAPI(name, handler) {
10 /* eslint-disable no-proto */
11 this.__proto__[name] = handler
12 /* eslint-enable no-proto */
13 }
14
15 registerCommand(fn) {
16 fn && fn(this.sherry.cli)
17 }
18
19 registerPeerDependencies(name, dependencies) {
20 this.peerDependencies.push({
21 name,
22 dependencies
23 })
24 }
25
26 _checkEnv() {
27 let exceptionLog = ''
28
29 for (const { name: plginName, dependencies } of this.peerDependencies) {
30 const checkResponse = checkDependencies(dependencies)
31 for (const name of Object.keys(checkResponse)) {
32 const { code, required, actual } = checkResponse[name]
33 if (code === 'NOT_INSTALLED') {
34 exceptionLog += `[${plginName}] requires ${chalk.yellow(`${name} (${required})`)} to be installed.\n`
35 }
36 if (code === 'IMCOMPTIBLE') {
37 exceptionLog += `[${plginName}] requires ${chalk.yellow(`${name} (${required})`)}, but detect an imcompatible version ${chalk.yellow(actual)}\n`
38 }
39 }
40 }
41
42 return exceptionLog
43 }
44}
45
46function checkDependencies(dependencies) {
47 const { semver } = require('sherry-utils')
48 const result = {}
49 let actualVersion
50 let pkgJsonPath
51 for (const name of Object.keys(dependencies)) {
52 const requiredVersion = dependencies[name]
53 try {
54 pkgJsonPath = require.resolve(`${name}/package.json`)
55 } catch (e) {
56 result[name] = {
57 code: 'NOT_INSTALLED',
58 required: requiredVersion
59 }
60 }
61 if (pkgJsonPath) {
62 actualVersion = require(pkgJsonPath).version
63 if (semver.satisfies(actualVersion, requiredVersion)) {
64 result[name] = {
65 code: 'PASS_CHECK'
66 }
67 } else {
68 result[name] = {
69 code: 'IMCOMPTIBLE',
70 required: requiredVersion,
71 actual: actualVersion
72 }
73 }
74 }
75 }
76 return result
77}
78
79module.exports.checkDependencies = checkDependencies