node-karin 0.10.0 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/config/defSet/group.yaml +40 -2
  2. package/lib/adapter/onebot/11/index.js +1 -1
  3. package/lib/cli/init.js +1 -1
  4. package/lib/cli/karin.js +1 -1
  5. package/lib/core/index.d.ts +9 -9
  6. package/lib/core/index.js +9 -9
  7. package/lib/core/init/dir.js +7 -0
  8. package/lib/core/init/init.js +46 -0
  9. package/lib/core/{karin.d.ts → karin/karin.d.ts} +1 -1
  10. package/lib/core/karin/karin.js +194 -0
  11. package/lib/core/{listener.d.ts → listener/listener.d.ts} +1 -1
  12. package/lib/core/listener/listener.js +213 -0
  13. package/lib/core/{plugin.app.d.ts → plugin/app.d.ts} +1 -1
  14. package/lib/core/plugin/app.js +19 -0
  15. package/lib/core/{plugin.d.ts → plugin/base.d.ts} +1 -1
  16. package/lib/core/plugin/base.js +140 -0
  17. package/lib/core/{plugin.loader.d.ts → plugin/loader.d.ts} +3 -3
  18. package/lib/core/plugin/loader.js +579 -0
  19. package/lib/core/process/process.js +100 -0
  20. package/lib/core/server/server.js +283 -0
  21. package/lib/db/index.d.ts +2 -2
  22. package/lib/db/index.js +2 -2
  23. package/lib/db/level/level.js +36 -0
  24. package/lib/db/redis/redis.js +135 -0
  25. package/lib/db/redis/redis_level.js +287 -0
  26. package/lib/event/{event.handler.d.ts → handler/base.d.ts} +2 -2
  27. package/lib/event/handler/base.js +173 -0
  28. package/lib/event/{message.handler.d.ts → handler/message.d.ts} +3 -3
  29. package/lib/event/handler/message.js +270 -0
  30. package/lib/event/{notice.handler.d.ts → handler/notice.d.ts} +3 -3
  31. package/lib/event/handler/notice.js +212 -0
  32. package/lib/event/{request.handler.d.ts → handler/request.d.ts} +3 -3
  33. package/lib/event/handler/request.js +118 -0
  34. package/lib/event/{review.handler.d.ts → handler/review.d.ts} +3 -3
  35. package/lib/event/handler/review.js +391 -0
  36. package/lib/event/index.d.ts +5 -5
  37. package/lib/event/index.js +5 -5
  38. package/lib/render/base.d.ts +1 -1
  39. package/lib/render/client.d.ts +1 -1
  40. package/lib/render/client.js +2 -12
  41. package/lib/render/client_even.d.ts +1 -1
  42. package/lib/render/client_even.js +2 -12
  43. package/lib/render/http.d.ts +1 -1
  44. package/lib/render/http.js +1 -1
  45. package/lib/render/server.js +1 -1
  46. package/lib/types/adapter/{adapter.d.ts → base.d.ts} +2 -2
  47. package/lib/types/config/config.js +1 -0
  48. package/lib/types/element/element.js +1 -0
  49. package/lib/types/event/message.d.ts +1 -1
  50. package/lib/types/event/reply.d.ts +1 -1
  51. package/lib/types/index.d.ts +6 -6
  52. package/lib/types/index.js +6 -6
  53. package/lib/types/logger/logger.js +1 -0
  54. package/lib/types/{plugin.d.ts → plugin/plugin.d.ts} +3 -3
  55. package/lib/types/plugin/plugin.js +1 -0
  56. package/lib/types/render/render.js +1 -0
  57. package/lib/utils/{common.d.ts → common/common.d.ts} +1 -1
  58. package/lib/utils/common/common.js +591 -0
  59. package/lib/utils/{config.d.ts → config/config.d.ts} +37 -19
  60. package/lib/utils/config/config.js +328 -0
  61. package/lib/utils/config/updateVersion.js +145 -0
  62. package/lib/utils/config/yamlEditor.js +292 -0
  63. package/lib/utils/{handler.d.ts → core/handler.d.ts} +1 -1
  64. package/lib/utils/core/handler.js +115 -0
  65. package/lib/utils/core/init.js +213 -0
  66. package/lib/utils/core/logger.js +105 -0
  67. package/lib/utils/{segment.d.ts → core/segment.d.ts} +1 -1
  68. package/lib/utils/core/segment.js +441 -0
  69. package/lib/utils/index.d.ts +11 -11
  70. package/lib/utils/index.js +11 -11
  71. package/lib/utils/{button.d.ts → tools/button.d.ts} +1 -1
  72. package/lib/utils/tools/button.js +38 -0
  73. package/lib/utils/tools/exec.js +37 -0
  74. package/lib/utils/tools/ffmpeg.js +25 -0
  75. package/lib/utils/tools/update.js +139 -0
  76. package/package.json +1 -1
  77. package/lib/core/dir.js +0 -7
  78. package/lib/core/init.js +0 -42
  79. package/lib/core/karin.js +0 -194
  80. package/lib/core/listener.js +0 -217
  81. package/lib/core/plugin.app.js +0 -19
  82. package/lib/core/plugin.js +0 -145
  83. package/lib/core/plugin.loader.js +0 -561
  84. package/lib/core/process.js +0 -98
  85. package/lib/core/server.js +0 -269
  86. package/lib/db/level.js +0 -37
  87. package/lib/db/redis.js +0 -134
  88. package/lib/db/redis_level.js +0 -293
  89. package/lib/event/event.handler.js +0 -167
  90. package/lib/event/message.handler.js +0 -254
  91. package/lib/event/notice.handler.js +0 -204
  92. package/lib/event/request.handler.js +0 -110
  93. package/lib/event/review.handler.js +0 -387
  94. package/lib/types/config.js +0 -1
  95. package/lib/types/element.js +0 -1
  96. package/lib/types/logger.js +0 -1
  97. package/lib/types/plugin.js +0 -1
  98. package/lib/types/render.js +0 -1
  99. package/lib/utils/button.js +0 -34
  100. package/lib/utils/common.js +0 -572
  101. package/lib/utils/config.js +0 -318
  102. package/lib/utils/exec.js +0 -36
  103. package/lib/utils/ffmpeg.js +0 -25
  104. package/lib/utils/handler.js +0 -109
  105. package/lib/utils/init.js +0 -208
  106. package/lib/utils/logger.js +0 -104
  107. package/lib/utils/segment.js +0 -470
  108. package/lib/utils/update.js +0 -135
  109. package/lib/utils/updateVersion.js +0 -145
  110. package/lib/utils/yamlEditor.js +0 -279
  111. /package/lib/core/{dir.d.ts → init/dir.d.ts} +0 -0
  112. /package/lib/core/{init.d.ts → init/init.d.ts} +0 -0
  113. /package/lib/core/{process.d.ts → process/process.d.ts} +0 -0
  114. /package/lib/core/{server.d.ts → server/server.d.ts} +0 -0
  115. /package/lib/db/{level.d.ts → level/level.d.ts} +0 -0
  116. /package/lib/db/{redis.d.ts → redis/redis.d.ts} +0 -0
  117. /package/lib/db/{redis_level.d.ts → redis/redis_level.d.ts} +0 -0
  118. /package/lib/types/adapter/{adapter.js → base.js} +0 -0
  119. /package/lib/types/{config.d.ts → config/config.d.ts} +0 -0
  120. /package/lib/types/{element.d.ts → element/element.d.ts} +0 -0
  121. /package/lib/types/{logger.d.ts → logger/logger.d.ts} +0 -0
  122. /package/lib/types/{render.d.ts → render/render.d.ts} +0 -0
  123. /package/lib/utils/{updateVersion.d.ts → config/updateVersion.d.ts} +0 -0
  124. /package/lib/utils/{yamlEditor.d.ts → config/yamlEditor.d.ts} +0 -0
  125. /package/lib/utils/{init.d.ts → core/init.d.ts} +0 -0
  126. /package/lib/utils/{logger.d.ts → core/logger.d.ts} +0 -0
  127. /package/lib/utils/{exec.d.ts → tools/exec.d.ts} +0 -0
  128. /package/lib/utils/{ffmpeg.d.ts → tools/ffmpeg.d.ts} +0 -0
  129. /package/lib/utils/{update.d.ts → tools/update.d.ts} +0 -0
@@ -1,318 +0,0 @@
1
- import fs from 'fs'
2
- import Yaml from 'yaml'
3
- import path from 'path'
4
- import chokidar from 'chokidar'
5
- import { karinDir } from '../core/dir.js'
6
- import { common } from './common.js'
7
- /**
8
- * 配置文件
9
- */
10
- export const config = new (class Cfg {
11
- /**
12
- * 运行目录绝对路径
13
- */
14
- dir
15
- /**
16
- * 运行目录配置文件夹路径
17
- */
18
- cfgDir
19
- /**
20
- * node-karin npm包路径
21
- */
22
- pkgDir
23
- /**
24
- * node-karin 包配置文件夹路径
25
- */
26
- pkgCfgDir
27
- change
28
- watcher
29
- review
30
- logger
31
- constructor () {
32
- this.dir = process.cwd()
33
- this.pkgDir = karinDir
34
- this.cfgDir = this.dir + '/config'
35
- this.pkgCfgDir = this.pkgDir + '/config/defSet'
36
- /** 缓存 */
37
- this.change = new Map()
38
- /** 监听文件 */
39
- this.watcher = new Map()
40
- /** 拦截器状态 */
41
- this.review = false
42
- this.initCfg()
43
- }
44
-
45
- /** 初始化配置 */
46
- async initCfg () {
47
- const list = [
48
- this.dir + '/temp/input',
49
- this.dir + '/plugins/karin-plugin-example',
50
- this.cfgDir + '/config',
51
- this.cfgDir + '/plugin',
52
- ]
53
- list.forEach(path => this.mkdir(path))
54
- if (this.pkgCfgDir !== (this.cfgDir + '/defSet').replace(/\\/g, '/')) {
55
- const files = fs.readdirSync(this.pkgCfgDir).filter(file => file.endsWith('.yaml'))
56
- files.forEach(file => {
57
- const path = `${this.cfgDir}/config/${file}`
58
- const pathDef = `${this.pkgCfgDir}/${file}`
59
- if (!fs.existsSync(path)) { fs.copyFileSync(pathDef, path) }
60
- })
61
- }
62
- /** 为每个插件包创建统一存储的文件夹 */
63
- const plugins = await this.getPlugins()
64
- const DataList = [
65
- 'data',
66
- 'temp',
67
- 'resources',
68
- 'temp/html',
69
- this.cfgDir + '/plugin',
70
- ]
71
- DataList.forEach(path => this.dirPath(path, plugins))
72
- this.logger = (await import('./logger.js')).default
73
- }
74
-
75
- async getPlugins () {
76
- const list = []
77
- const files = fs.readdirSync('./plugins', { withFileTypes: true })
78
- // 过滤掉非karin-plugin-开头的文件夹
79
- list.push(...files.filter(file => file.isDirectory() && (file.name.startsWith('karin-plugin-'))).map(dir => dir.name))
80
- // 获取npm插件
81
- list.push(...(await common.getNpmPlugins(false)))
82
- return list
83
- }
84
-
85
- /**
86
- * 递归创建目录
87
- * @param dirname - 要创建的文件夹路径
88
- */
89
- mkdir (dirname) {
90
- if (fs.existsSync(dirname)) { return true }
91
- /** 递归自调用 */
92
- if (this.mkdir(path.dirname(dirname))) { fs.mkdirSync(dirname) }
93
- return true
94
- }
95
-
96
- /**
97
- * 为每一个插件建立对应的文件夹
98
- */
99
- async dirPath (_path, plugins) {
100
- this.mkdir(_path)
101
- for (const plugin of plugins) {
102
- const path = `${_path}/${plugin}`
103
- this.mkdir(path)
104
- }
105
- }
106
-
107
- /**
108
- * 超时时间
109
- */
110
- timeout (type = 'ws') {
111
- let timeout = 60
112
- if (type === 'ws') {
113
- timeout = this.Server.websocket.timeout
114
- } else {
115
- timeout = this.Server.grpc.timeout
116
- }
117
- return timeout || 60
118
- }
119
-
120
- /**
121
- * Redis 配置
122
- * 采用实时读取优化性能
123
- */
124
- get redis () {
125
- const config = this.getYaml('config', 'redis', false)
126
- const defSet = this.getYaml('defSet', 'redis', false)
127
- const data = { ...defSet, ...config }
128
- return data
129
- }
130
-
131
- /**
132
- * 主人列表
133
- */
134
- get master () {
135
- return this.Config.master || []
136
- }
137
-
138
- /**
139
- * 管理员列表
140
- */
141
- get admin () {
142
- return this.Config.admin || []
143
- }
144
-
145
- /** App管理 */
146
- get App () {
147
- const key = 'change.App'
148
- const res = this.change.get(key)
149
- /** 取缓存 */
150
- if (res) { return res }
151
- /** 取配置 */
152
- const config = this.getYaml('config', 'App', true)
153
- const defSet = this.getYaml('defSet', 'App', true)
154
- const data = { ...defSet, ...config }
155
- /** 缓存 */
156
- this.change.set(key, data)
157
- return data
158
- }
159
-
160
- /**
161
- * 基本配置
162
- */
163
- get Config () {
164
- const key = 'change.config'
165
- const res = this.change.get(key)
166
- /** 取缓存 */
167
- if (res) { return res }
168
- /** 取配置 */
169
- const config = this.getYaml('config', 'config', true)
170
- const defSet = this.getYaml('defSet', 'config', false)
171
- const data = { ...defSet, ...config }
172
- const Config = {
173
- ...data,
174
- WhiteList: {
175
- users: data.WhiteList.users.map((i) => String(i)),
176
- groups: data.WhiteList.groups.map((i) => String(i)),
177
- GroupMsgLog: data.WhiteList.GroupMsgLog.map((i) => String(i)),
178
- },
179
- BlackList: {
180
- users: data.BlackList.users.map((i) => String(i)),
181
- groups: data.BlackList.groups.map((i) => String(i)),
182
- GroupMsgLog: data.BlackList.GroupMsgLog.map((i) => String(i)),
183
- },
184
- master: data.master.map((i) => String(i)),
185
- admin: data.admin.map((i) => String(i)),
186
- private: {
187
- white_list: data.private.white_list.map((i) => String(i)),
188
- tips: data.private.tips,
189
- },
190
- }
191
- /** 缓存 */
192
- this.change.set(key, Config)
193
- return Config
194
- }
195
-
196
- /**
197
- * Server 配置文档
198
- */
199
- get Server () {
200
- const key = 'change.server'
201
- /** 取缓存 */
202
- const res = this.change.get(key)
203
- if (res) { return res }
204
- /** 取配置 */
205
- const config = this.getYaml('config', 'server', true)
206
- const defSet = this.getYaml('defSet', 'server', false)
207
- const data = { ...defSet, ...config }
208
- /** 缓存 */
209
- this.change.set(key, data)
210
- return data
211
- }
212
-
213
- /**
214
- * packageon
215
- * 实时获取packageon文件
216
- */
217
- get package () {
218
- const data = fs.readFileSync(this.pkgDir + '/package.json', 'utf8')
219
- const pack = JSON.parse(data)
220
- return pack
221
- }
222
-
223
- /**
224
- * 获取群配置
225
- */
226
- group (group_id = '') {
227
- const key = 'change.group'
228
- /** 取缓存 */
229
- let res = this.change.get(key)
230
- if (res) {
231
- res = { ...res.defCfg.default, ...res.Config.default, ...(res.Config[group_id] || {}) }
232
- return res
233
- }
234
- /** 取配置 */
235
- const Config = this.getYaml('config', 'group', true)
236
- const defCfg = this.getYaml('defSet', 'group', false)
237
- const data = { Config, defCfg }
238
- /** 缓存 */
239
- res = this.change.set(key, data)
240
- res = { ...defCfg.default, ...Config.default, ...(Config[group_id] || {}) }
241
- return res
242
- }
243
-
244
- /**
245
- * 获取配置yaml
246
- */
247
- getYaml (type, name, isWatch = false) {
248
- /** 文件路径 */
249
- const file = type === 'defSet' ? `${this.pkgCfgDir}/${name}.yaml` : `${this.cfgDir}/config/${name}.yaml`
250
- /** 读取文件 */
251
- const data = Yaml.parse(fs.readFileSync(file, 'utf8'))
252
- /** 监听文件 */
253
- if (isWatch) { this.watch(type, name, file) }
254
- return data
255
- }
256
-
257
- /**
258
- * 监听配置文件
259
- * @param {'defSet'|'config'} type 类型
260
- * @param {string} name 文件名称 不带后缀
261
- * @param {string} file 文件路径
262
- */
263
- async watch (type, name, file) {
264
- const key = `change.${name}`
265
- /** 已经监听过了 */
266
- const res = this.watcher.get(key)
267
- if (res) { return true }
268
- /** 监听文件 */
269
- const watcher = chokidar.watch(file)
270
- /** 监听文件变化 */
271
- watcher.on('change', () => {
272
- this.change.delete(key)
273
- this.logger.mark(`[修改配置文件][${type}][${name}]`)
274
- /** 文件修改后调用对应的方法 */
275
- switch (`change_${name}`) {
276
- case 'change_App':
277
- this.change_App()
278
- break
279
- case 'change_config':
280
- this.change_config()
281
- break
282
- case 'change_group':
283
- this.change_group()
284
- break
285
- }
286
- })
287
- /** 缓存 防止重复监听 */
288
- this.watcher.set(key, watcher)
289
- }
290
-
291
- async change_App () {
292
- await this.#review()
293
- }
294
-
295
- async change_config () {
296
- /** 修改日志等级 */
297
- this.logger.level = this.Config.log4jsCfg.level
298
- await this.#review()
299
- if (this.Server.HotUpdate) {
300
- const { Bot } = await import('../index.js')
301
- Bot.emit('restart_http', {})
302
- Bot.emit('restart_grpc', {})
303
- }
304
- }
305
-
306
- async change_group () {
307
- await this.#review()
308
- }
309
-
310
- async #review () {
311
- if (this.review) { return }
312
- this.review = true
313
- const { review } = await import('../event/index.js')
314
- review.main()
315
- this.review = false
316
- }
317
- })()
318
- export const Cfg = config
package/lib/utils/exec.js DELETED
@@ -1,36 +0,0 @@
1
- import logger from './logger.js'
2
- import { exec as execCmd } from 'child_process'
3
- /**
4
- * 执行 shell 命令
5
- * @param cmd 命令
6
- * @param log 是否打印日志
7
- * @param options 选项
8
- */
9
- export const exec = (cmd, log = true, options = { cwd: process.cwd(), encoding: 'utf-8' }) => {
10
- return new Promise(resolve => {
11
- const logMessage = (level, message) => {
12
- if (log) { logger[level](message) }
13
- }
14
- const logType = (status) => {
15
- switch (status) {
16
- case '开始执行':
17
- return logger.yellow('[exec][开始执行]')
18
- case 'ok':
19
- return logger.green('[exec][执行成功]')
20
- case 'failed':
21
- return logger.red('[exec][执行失败]')
22
- }
23
- }
24
- const formatMessage = (status, details) => [logType(status), `cmd: ${cmd}`, `cwd: ${options.cwd || process.cwd()}`, details, '--------'].join('\n')
25
- logMessage('info', formatMessage('开始执行', ''))
26
- execCmd(cmd, options, (error, stdout, stderr) => {
27
- if (error) {
28
- logMessage('error', formatMessage('failed', `Error: ${error.message || error.stack || error.toString()}`))
29
- return resolve({ status: 'failed', error, stdout, stderr })
30
- }
31
- logMessage('mark', formatMessage('ok', `stdout: ${stdout}\nstderr: ${stderr}`))
32
- resolve({ status: 'ok', error, stdout, stderr })
33
- })
34
- })
35
- }
36
- export default exec
@@ -1,25 +0,0 @@
1
- import exec from './exec.js'
2
- import logger from './logger.js'
3
- import { config } from './config.js'
4
- /**
5
- * 执行 ffmpeg 命令
6
- */
7
- export async function ffmpeg () {
8
- let ffmpeg = 'ffmpeg'
9
- const { status } = await exec('ffmpeg -version', false)
10
- if (status !== 'ok') {
11
- logger.debug('ffmpeg 未安装,开始尝试读取配置文件是否存在ffmpeg路径')
12
- const ffmpegPath = config.Config.ffmpeg_path
13
- if (!ffmpegPath) {
14
- logger.warn('ffmpeg 未安装,请安装 ffmpeg 或手动配置 ffmpeg 路径后重启')
15
- return false
16
- }
17
- ffmpeg = `"${ffmpegPath}"`
18
- }
19
- // 返回函数
20
- return async (cmd, log = true, options = { cwd: process.cwd(), encoding: 'utf-8' }) => {
21
- cmd = cmd.replace(/^ffmpeg/, '').trim()
22
- cmd = `${ffmpeg} ${cmd}`
23
- return await exec(cmd, log, options)
24
- }
25
- }
@@ -1,109 +0,0 @@
1
- import lodash from 'lodash'
2
- import logger from './logger.js'
3
- import { pluginLoader as loader } from '../core/index.js'
4
- /**
5
- * 事件处理器类
6
- */
7
- export const handler = new (class EventHandler {
8
- /**
9
- * 添加事件处理器
10
- * @param index 插件索引
11
- * @param Class 插件类
12
- */
13
- async add (index, Class) {
14
- lodash.forEach(Class.handler, val => {
15
- if (!val.key) { logger.error(`[Handler][Add]: [${Class.name}] 缺少 key`) }
16
- if (!val.fnc) { logger.error(`[Handler][Add]: [${Class.name}] 缺少 fnc`) }
17
- logger.debug(`[Handler][Reg]: [${Class.name}][${val.key}]`)
18
- if (!Array.isArray(loader.handlerIds[val.key])) { loader.handlerIds[val.key] = [] }
19
- loader.handlerIds[val.key].push({ index, fnc: val.fnc, priority: val.priority || Class.priority })
20
- loader.handlerIds[val.key] = lodash.orderBy(loader.handlerIds[val.key], ['priority'], ['asc'])
21
- })
22
- }
23
-
24
- /**
25
- * 删除事件处理器
26
- * 如果不传参数则删除所有处理器
27
- * @param index 插件索引
28
- * @param key 事件键
29
- */
30
- del (index = '', key = '') {
31
- /** 无参 */
32
- if (!key && !index) {
33
- loader.handlerIds = {}
34
- return true
35
- }
36
- /** 删除指定索引插件 */
37
- if (!key) {
38
- for (const v of Object.keys(loader.handlerIds)) {
39
- loader.handlerIds[v] = loader.handlerIds[v].filter(v => v.index !== index)
40
- // 如果处理器为空则删除键
41
- if (!loader.handlerIds[v].length) {
42
- delete loader.handlerIds[v]
43
- } else {
44
- loader.handlerIds[v] = lodash.orderBy(loader.handlerIds[v], ['priority'], ['asc'])
45
- }
46
- }
47
- return true
48
- }
49
- /** 删除指定key */
50
- if (!index) {
51
- loader.handlerIds[key] && delete loader.handlerIds[key]
52
- return true
53
- }
54
- /** 删除指定key的index */
55
- if (!loader.handlerIds[key]) { return false }
56
- loader.handlerIds[key] = loader.handlerIds[key].filter(v => v.index !== index)
57
- if (!loader.handlerIds[key].length) {
58
- delete loader.handlerIds[key]
59
- return true
60
- }
61
- loader.handlerIds[key] = lodash.orderBy(loader.handlerIds[key], ['priority'], ['asc'])
62
- return true
63
- }
64
-
65
- /**
66
- * 调用事件处理器
67
- * @param key 事件键
68
- * @param args 自定义参数 一般用来传递e之类的
69
- */
70
- async call (key, args) {
71
- let res
72
- for (const v of loader.handlerIds[key] || []) {
73
- const info = loader.PluginList[v.index]
74
- try {
75
- let done = true
76
- /**
77
- * 拒绝处理器 调用后则不再继续执行下一个处理器
78
- * @param msg 错误信息
79
- */
80
- const reject = (msg = '') => {
81
- if (msg) { logger.mark(`[Handler][Reject]: [${info.file.dir}][${info.file.name}][${key}] ${msg}`) }
82
- done = false
83
- }
84
- if (info.file.type === 'function' && typeof v.fnc === 'function') {
85
- res = await v.fnc(args, reject)
86
- } else {
87
- const cla = new info.file.Fnc()
88
- if (args.e) { cla.e = args.e }
89
- res = await cla[v.fnc](args, reject)
90
- }
91
- if (done) {
92
- logger.mark(`[Handler][Done]: [${info.file.dir}][${info.file.name}][${key}]`)
93
- return res
94
- }
95
- } catch (e) {
96
- // 产生错误继续下一个处理器
97
- logger.error(`[Handler][Error]: [${info.file.dir}][${info.file.name}][${key}] ${e}`)
98
- }
99
- }
100
- return res
101
- }
102
-
103
- /**
104
- * 检查是否存在指定键的事件处理器
105
- */
106
- has (key) {
107
- return !!loader.handlerIds[key]
108
- }
109
- })()
package/lib/utils/init.js DELETED
@@ -1,208 +0,0 @@
1
- import fs from 'fs'
2
- import path from 'path'
3
- import { exec } from 'child_process'
4
- import { karinDir } from '../core/dir.js'
5
- export class KarinInit {
6
- /**
7
- * 基础目录
8
- */
9
- baseDir
10
- constructor () {
11
- this.baseDir = [
12
- './config/config',
13
- './config/view',
14
- './config/plugin',
15
- './temp/input',
16
- './temp/html',
17
- './plugins/karin-plugin-example',
18
- ]
19
- }
20
-
21
- init () {
22
- this.baseDir.forEach(dir => this.mkdir(dir))
23
- /** 非src源代码环境才创建 */
24
- if (!fs.existsSync('./src')) {
25
- this.copyFile()
26
- this.modifyPackage()
27
- }
28
- }
29
-
30
- /**
31
- * 递归创建目录
32
- * @param dirname - 路径
33
- */
34
- mkdir (dirname) {
35
- if (fs.existsSync(dirname)) { return true }
36
- if (this.mkdir(path.dirname(dirname))) { fs.mkdirSync(dirname) }
37
- return true
38
- }
39
-
40
- /**
41
- * 解析json
42
- */
43
- readJson (file) {
44
- return JSON.parse(fs.readFileSync(file, 'utf-8'))
45
- }
46
-
47
- /**
48
- * 获取插件列表
49
- */
50
- getPlugins () {
51
- const pluginsDir = './plugins'
52
- const plugins = fs.readdirSync(pluginsDir)
53
- return plugins.filter(dir => dir.startsWith('karin-plugin-'))
54
- }
55
-
56
- /**
57
- * 从npm包内复制默认配置出来
58
- */
59
- copyFile () {
60
- /** 配置 */
61
- const list = ['config/view']
62
- list.forEach(dir => {
63
- const pkgDir = path.join(karinDir, dir)
64
- const projDir = path.join(process.cwd(), dir)
65
- /** 清空projDir目录下的文件 保留目录 */
66
- if (fs.existsSync(projDir)) { fs.rmSync(projDir, { recursive: true }) }
67
- this.mkdir(projDir)
68
- /** 读取pkgDir目录下的所有文件 复制到projDir下 */
69
- const files = fs.readdirSync(pkgDir).filter(file => file.endsWith('.yaml'))
70
- files.forEach(file => {
71
- const destPath = path.join(projDir, file)
72
- const srcPath = path.join(pkgDir, file)
73
- fs.copyFileSync(srcPath, destPath)
74
- })
75
- })
76
- /** 创建pnpm工作区配置 */
77
- fs.writeFileSync('./pnpm-workspace.yaml', `packages:\n - 'plugins/**'\n`)
78
- /** 为每个插件包创建统一存储的文件夹 */
79
- const plugins = this.getPlugins()
80
- const DataList = [
81
- 'data',
82
- 'temp',
83
- 'resources',
84
- 'temp/html',
85
- 'config/plugin',
86
- ]
87
- DataList.forEach(_path => {
88
- _path = path.join(process.cwd(), _path)
89
- plugins.forEach(plugin => this.mkdir(path.join(_path, plugin)))
90
- })
91
- }
92
-
93
- /**
94
- * 修改package.json以支持运行
95
- */
96
- modifyPackage () {
97
- const pkg = this.readJson(path.join(karinDir, 'package.json'))
98
- const projPkg = this.readJson('./package.json')
99
- const main = 'node_modules/node-karin/lib/index.js'
100
- delete pkg.bin
101
- pkg.main = `./${main}`
102
- pkg.types = `./${main.replace('.js', '.d.ts')}`
103
- pkg.dependencies = { ...projPkg.dependencies, ...pkg.dependencies }
104
- pkg.devDependencies = { ...projPkg.devDependencies, ...pkg.devDependencies }
105
- projPkg.type = 'module'
106
- projPkg.private = true
107
- projPkg.main = `./${main}`
108
- projPkg.dependencies = { ...projPkg.dependencies, ...pkg.dependencies }
109
- projPkg.dependencies['node-karin'] = 'latest'
110
- projPkg.dependencies['kritor-proto'] = 'latest'
111
- if (!projPkg.scripts) { projPkg.scripts = {} }
112
- if (!projPkg.devDependencies) { projPkg.devDependencies = {} }
113
- projPkg.scripts.debug = `node --watch ${main}`
114
- projPkg.scripts.dev = `tsx --watch ${main}`
115
- fs.writeFileSync('./package.json', JSON.stringify(projPkg, null, 2))
116
- }
117
-
118
- /**
119
- * 更换镜像源为淘宝源
120
- */
121
- async changeRegistry (host) {
122
- const cmd = `npm config set registry ${host}`
123
- // 检查当前镜像源是否为淘宝源
124
- const registry = await this.shell('npm config get registry')
125
- if (registry === host) {
126
- console.log(`当前npm源已经是 ${host} ~`)
127
- return
128
- }
129
- if (!await this.shell(cmd)) {
130
- console.log('更换npm源失败,请手动更换npm源!')
131
- console.log(`可尝试手动执行 【 npm config set registry ${host} 】 更换镜像源~`)
132
- } else {
133
- console.log('更换npm源成功~')
134
- }
135
- }
136
-
137
- /**
138
- * 安装pnpm或者yarn
139
- * @param type - 包管理器名称
140
- */
141
- async install (type) {
142
- /** 检查是否已经安装对应的包管理器 */
143
- if (!(await this.shell(`${type} -v`))) {
144
- console.log(`检测到未安装${type},开始安装...`)
145
- if (!await this.shell(`npm install -g ${type}`)) {
146
- console.log(`${type}安装失败,请手动安装${type}!`)
147
- console.log(`可尝试手动执行 【 npm install -g ${type} 】 安装${type}~`)
148
- return
149
- } else {
150
- console.log(`${type}安装完成~`)
151
- }
152
- } else {
153
- console.log('检测到已安装pnpm,开始安装依赖...')
154
- }
155
- /** 安装依赖 */
156
- if (!(await this.shell(`${type} -P --force`))) {
157
- console.log('安装依赖失败,请手动安装依赖!')
158
- console.log(`可尝试手动执行 【 ${type} install -P 】 安装依赖~`)
159
- console.log('如中国大陆用户安装失败,请尝试执行换源 【 npm config set registry https://registry.npmmirror.com 】后再安装依赖~')
160
- } else {
161
- console.log('依赖安装完成~')
162
- }
163
- /** 检查安装pm2 */
164
- if (!(await this.shell('pm2 -v'))) {
165
- console.log('检测到未安装pm2,开始安装pm2...')
166
- if (!(await this.shell(`${type} install -g pm2`))) {
167
- console.log('安装pm2失败,请手动安装pm2!')
168
- console.log('可尝试手动执行 【 npm install -g pm2 】 安装pm2~')
169
- } else {
170
- console.log('pm2安装完成~')
171
- }
172
- } else {
173
- console.log('检测到已安装pm2~')
174
- }
175
- console.log('依赖环境初始化完成~')
176
- }
177
-
178
- /**
179
- * 执行命令
180
- * @param cmd - 命令
181
- */
182
- shell (cmd) {
183
- return new Promise(resolve => {
184
- exec(cmd, { env: process.env, cwd: process.cwd() }, (err, stdout, stderr) => {
185
- if (stdout) { return resolve(stdout.trim()) }
186
- if (err) {
187
- console.error(err)
188
- return resolve(false)
189
- }
190
- if (stderr) {
191
- console.error(stderr)
192
- return resolve(false)
193
- }
194
- })
195
- })
196
- }
197
-
198
- /**
199
- * 获取当前的包管理器 根据锁文件判断
200
- */
201
- getRegistry () {
202
- if (fs.existsSync('./pnpm-lock.yaml')) { return 'pnpm' }
203
- if (fs.existsSync('./yarn.lock')) { return 'yarn' }
204
- if (fs.existsSync('./package-lock.json')) { return 'npm' }
205
- // cnpm 没有锁文件
206
- return 'cnpm'
207
- }
208
- }