node-karin 1.15.5 → 1.16.1

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 (89) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/adapter-BqlH3u3X.mjs +218 -0
  3. package/dist/app-DdMQbBEY.mjs +4109 -0
  4. package/dist/cache-CPcPeo6N.mjs +163 -0
  5. package/dist/chunk-NzVPYdc1.mjs +21 -0
  6. package/dist/cli/index.cjs +10900 -1
  7. package/dist/cli/index.d.ts +1 -1
  8. package/dist/cli/index.mjs +10770 -10224
  9. package/dist/file-ZGuqNDd-.mjs +15987 -0
  10. package/dist/file-dGy9of8-.mjs +268 -0
  11. package/dist/fsSync-Cf5MWILk.mjs +65 -0
  12. package/dist/index.d.ts +12235 -12738
  13. package/dist/index.mjs +2054 -25247
  14. package/dist/internal-DupfycKE.mjs +597 -0
  15. package/dist/kv-DZp4UIxg.mjs +192 -0
  16. package/dist/module/art-template.d.ts +2 -13
  17. package/dist/module/art-template.mjs +3 -1
  18. package/dist/module/axios.d.ts +3 -2
  19. package/dist/module/axios.mjs +5 -2
  20. package/dist/module/chalk.d.ts +3 -2
  21. package/dist/module/chalk.mjs +5 -2
  22. package/dist/module/chokidar.d.ts +3 -2
  23. package/dist/module/chokidar.mjs +5 -2
  24. package/dist/module/express.d.ts +2 -1
  25. package/dist/module/express.mjs +3 -1
  26. package/dist/module/lodash.d.ts +2 -1
  27. package/dist/module/lodash.mjs +3 -1
  28. package/dist/module/log4js.d.ts +3 -2
  29. package/dist/module/log4js.mjs +5 -2
  30. package/dist/module/moment.d.ts +2 -1
  31. package/dist/module/moment.mjs +3 -1
  32. package/dist/module/node-schedule.d.ts +3 -2
  33. package/dist/module/node-schedule.mjs +5 -2
  34. package/dist/module/redis.d.ts +3 -2
  35. package/dist/module/redis.mjs +5 -2
  36. package/dist/module/sqlite3.d.ts +3 -2
  37. package/dist/module/sqlite3.mjs +5 -2
  38. package/dist/module/ws.d.ts +3 -2
  39. package/dist/module/ws.mjs +5 -2
  40. package/dist/module/yaml.d.ts +3 -2
  41. package/dist/module/yaml.mjs +5 -2
  42. package/dist/queue-CnKedaZA.mjs +70 -0
  43. package/dist/redis-aLJ7wbJH.mjs +1556 -0
  44. package/dist/render-DPqueDZr.mjs +170 -0
  45. package/dist/root.d.ts +46 -46
  46. package/dist/root.mjs +136 -93
  47. package/dist/router-zPSN9-tY.mjs +124 -0
  48. package/dist/server-DT64D-m-.mjs +38 -0
  49. package/dist/snapka-BTlnZOyI.mjs +450 -0
  50. package/dist/sqlite-Dcj9jlW9.mjs +307 -0
  51. package/dist/start/app.d.ts +1 -1
  52. package/dist/start/app.mjs +14 -7
  53. package/dist/start/index.d.ts +1 -1
  54. package/dist/start/index.mjs +325 -656
  55. package/dist/template-Djk6y0uC.mjs +133 -0
  56. package/dist/terminalManager-Lxa8Sm06.mjs +783 -0
  57. package/dist/uptime-C121X_rq.mjs +210 -0
  58. package/dist/web/{CompressaPRO-GX.woff2.br → CompressaPRO-GX.woff2} +0 -0
  59. package/dist/web/assets/css/style-CBB8wM_W.css +14880 -0
  60. package/dist/web/assets/js/entry-Blf4Trpx.js +258540 -0
  61. package/dist/web/{googleapis.woff2.br → googleapis.woff2} +0 -0
  62. package/dist/web/index.html +2 -15
  63. package/dist/web/karin.png +0 -0
  64. package/dist/web/sha256.min.js +9 -0
  65. package/dist/ws-BLDoC2gV.mjs +80 -0
  66. package/dist/ws-CcoWd3Ar.mjs +106 -0
  67. package/package.json +7 -7
  68. package/dist/global.d.d.ts +0 -68
  69. package/dist/types-hAhbXJDZ.d.ts +0 -109
  70. package/dist/web/assets/css/components-ep7vm38G.css +0 -1
  71. package/dist/web/assets/css/index-Dadvd9mn.css.br +0 -0
  72. package/dist/web/assets/css/vendor-editor-CFbL2ovg.css.br +0 -0
  73. package/dist/web/assets/css/vendor-others-ZgkIHsf0.css +0 -1
  74. package/dist/web/assets/js/components-CU2xw4lY.js.br +0 -0
  75. package/dist/web/assets/js/entry-Dvb7eYLE.js.br +0 -0
  76. package/dist/web/assets/js/hooks-CRfhs4ON.js.br +0 -0
  77. package/dist/web/assets/js/page-404.tsx-DYMd_RI_.js +0 -1
  78. package/dist/web/assets/js/page-dashboard-CG60V_Z-.js.br +0 -0
  79. package/dist/web/assets/js/page-loading.tsx-wY8a9me3.js.br +0 -0
  80. package/dist/web/assets/js/page-login.tsx-B54ZOEZB.js.br +0 -0
  81. package/dist/web/assets/js/utils-C9nWTSuo.js +0 -2
  82. package/dist/web/assets/js/vendor-editor-BmqYP7lh.js.br +0 -0
  83. package/dist/web/assets/js/vendor-heroui-ClBCy2zk.js.br +0 -0
  84. package/dist/web/assets/js/vendor-others-6GiMrjd4.js.br +0 -0
  85. package/dist/web/assets/js/vendor-react-Dc9jdQiK.js.br +0 -0
  86. package/dist/web/assets/js/vendor-ui-utils-D0xkboLL.js.br +0 -0
  87. package/dist/web/assets/js/vendor-visual-saF8KLH_.js.br +0 -0
  88. package/dist/web/karin.png.br +0 -0
  89. package/dist/web/sha256.min.js.br +0 -0
@@ -0,0 +1,307 @@
1
+ import { a as mkdirSync } from "./fsSync-Cf5MWILk.mjs";
2
+ import path from "node:path";
3
+ import sqlite3 from "sqlite3";
4
+
5
+ //#region src/core/db/redis/mock/sqlite/index.ts
6
+ /**
7
+ * @description 日志前缀
8
+ */
9
+ const logPrefix = (message) => `[redis-mock] ${message}`;
10
+ /**
11
+ * @description SQLite3封装类,用于Redis模拟的持久化存储 new之后需要调用init方法
12
+ */
13
+ var SQLiteWrapper = class {
14
+ db;
15
+ #isClosing = false;
16
+ #inTransaction = false;
17
+ dbPath;
18
+ /**
19
+ * 构造函数
20
+ * @param dbPath 数据库路径
21
+ */
22
+ constructor(dbPath) {
23
+ this.dbPath = dbPath;
24
+ }
25
+ /**
26
+ * 初始化数据库连接和表结构
27
+ */
28
+ async init() {
29
+ mkdirSync(path.dirname(this.dbPath));
30
+ await new Promise((resolve, reject) => {
31
+ this.db = new sqlite3.Database(this.dbPath, sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
32
+ if (err) {
33
+ logger.error(logPrefix("SQLite数据库连接失败:"));
34
+ logger.error(err);
35
+ reject(err);
36
+ return;
37
+ }
38
+ resolve();
39
+ });
40
+ });
41
+ await new Promise((resolve) => {
42
+ this.db.exec(`
43
+ PRAGMA foreign_keys = ON;
44
+ PRAGMA journal_mode = WAL;
45
+ PRAGMA synchronous = NORMAL;
46
+ `, (pragmaErr) => {
47
+ if (pragmaErr) {
48
+ logger.warn(logPrefix("设置SQLite PRAGMA失败:"));
49
+ logger.warn(pragmaErr);
50
+ }
51
+ resolve();
52
+ });
53
+ });
54
+ await new Promise((resolve, reject) => {
55
+ this.db.run(`
56
+ CREATE TABLE IF NOT EXISTS redis_data (
57
+ key TEXT PRIMARY KEY,
58
+ type TEXT NOT NULL,
59
+ expire INTEGER NOT NULL,
60
+ value TEXT NOT NULL
61
+ )
62
+ `, (err) => {
63
+ if (err) {
64
+ logger.error(logPrefix("创建SQLite表失败:"));
65
+ logger.error(err);
66
+ reject(err);
67
+ return;
68
+ }
69
+ resolve();
70
+ });
71
+ });
72
+ return this;
73
+ }
74
+ /**
75
+ * 获取所有键
76
+ * @returns 返回所有键的数组
77
+ */
78
+ async keys() {
79
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
80
+ return new Promise((resolve, reject) => {
81
+ this.db.all("SELECT key FROM redis_data", [], (err, rows) => {
82
+ if (err) {
83
+ logger.error(logPrefix("获取所有键失败:"));
84
+ logger.error(err);
85
+ reject(err);
86
+ return;
87
+ }
88
+ resolve(rows ? rows.map((row) => row.key) : []);
89
+ });
90
+ });
91
+ }
92
+ /**
93
+ * 获取指定键的数据
94
+ * @param key 键名
95
+ * @returns 返回键的数据或null
96
+ */
97
+ async get(key) {
98
+ if (!key) return null;
99
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
100
+ return await this.query("SELECT type, expire, value FROM redis_data WHERE key = ?", [key]).then((rows) => rows[0] || null).catch((err) => {
101
+ logger.error(logPrefix(`获取键${key}的值失败:`));
102
+ logger.error(err);
103
+ return null;
104
+ });
105
+ }
106
+ /**
107
+ * 设置键值对
108
+ * @param key 键名
109
+ * @param type 类型
110
+ * @param expire 过期时间
111
+ * @param value 值
112
+ * @returns 成功返回true
113
+ */
114
+ async set(key, value, type, expire = -1) {
115
+ if (!key) throw new Error("键名不能为空");
116
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
117
+ return await this.run("INSERT OR REPLACE INTO redis_data (key, type, expire, value) VALUES (?, ?, ?, ?)", [
118
+ key,
119
+ type,
120
+ expire,
121
+ value
122
+ ]).then((changes) => changes > 0).catch((err) => {
123
+ logger.error(logPrefix(`设置键${key}的值失败:`));
124
+ logger.error(err);
125
+ return false;
126
+ });
127
+ }
128
+ /**
129
+ * 删除键
130
+ * @param key 键名
131
+ * @returns 成功返回true
132
+ */
133
+ async del(key) {
134
+ if (!key) return false;
135
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
136
+ return await this.run("DELETE FROM redis_data WHERE key = ?", [key]).then((changes) => changes > 0).catch((err) => {
137
+ logger.error(logPrefix(`删除键${key}失败:`));
138
+ logger.error(err);
139
+ return false;
140
+ });
141
+ }
142
+ /**
143
+ * 设置键的过期时间
144
+ * @param key 键名
145
+ * @param expire 过期时间
146
+ * @returns 成功返回true
147
+ */
148
+ async expire(key, expire) {
149
+ if (!key) return false;
150
+ return await this.run("UPDATE redis_data SET expire = ? WHERE key = ?", [expire, key]).then((changes) => changes > 0).catch((err) => {
151
+ logger.error(logPrefix(`设置键${key}的过期时间失败:`));
152
+ logger.error(err);
153
+ return false;
154
+ });
155
+ }
156
+ /**
157
+ * 获取所有数据
158
+ * @returns 返回所有数据的数组
159
+ */
160
+ async getAllData() {
161
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
162
+ return new Promise((resolve, reject) => {
163
+ this.db.all("SELECT key, type, expire, value FROM redis_data", [], (err, rows) => {
164
+ if (err) {
165
+ logger.error(logPrefix("获取所有数据失败:"));
166
+ logger.error(err);
167
+ reject(err);
168
+ return;
169
+ }
170
+ resolve(rows || []);
171
+ });
172
+ });
173
+ }
174
+ /**
175
+ * 关闭数据库连接
176
+ */
177
+ async close() {
178
+ if (this.#isClosing) return;
179
+ this.#isClosing = true;
180
+ return new Promise((resolve, reject) => {
181
+ this.db.close((err) => {
182
+ if (err) {
183
+ logger.error(logPrefix("关闭SQLite数据库失败:"));
184
+ logger.error(err);
185
+ this.#isClosing = false;
186
+ reject(err);
187
+ return;
188
+ }
189
+ resolve();
190
+ });
191
+ });
192
+ }
193
+ /**
194
+ * 开始事务
195
+ */
196
+ async beginTransaction() {
197
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
198
+ if (this.#inTransaction) {
199
+ logger.warn(logPrefix("已在事务中,跳过开始新事务"));
200
+ return;
201
+ }
202
+ return new Promise((resolve, reject) => {
203
+ this.db.run("BEGIN TRANSACTION", (err) => {
204
+ if (err) {
205
+ logger.error(logPrefix("开始事务失败:"));
206
+ logger.error(err);
207
+ reject(err);
208
+ return;
209
+ }
210
+ this.#inTransaction = true;
211
+ resolve();
212
+ });
213
+ });
214
+ }
215
+ /**
216
+ * 提交事务
217
+ */
218
+ async commitTransaction() {
219
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
220
+ if (!this.#inTransaction) {
221
+ logger.warn(logPrefix("没有活动事务,跳过提交"));
222
+ return;
223
+ }
224
+ return new Promise((resolve, reject) => {
225
+ this.db.run("COMMIT", (err) => {
226
+ if (err) {
227
+ logger.error(logPrefix("提交事务失败:"));
228
+ logger.error(err);
229
+ reject(err);
230
+ return;
231
+ }
232
+ this.#inTransaction = false;
233
+ resolve();
234
+ });
235
+ });
236
+ }
237
+ /**
238
+ * 回滚事务
239
+ */
240
+ async rollbackTransaction() {
241
+ if (this.#isClosing) throw new Error("数据库正在关闭中");
242
+ if (!this.#inTransaction) {
243
+ logger.warn(logPrefix("没有活动事务,跳过回滚"));
244
+ return;
245
+ }
246
+ return new Promise((resolve, reject) => {
247
+ this.db.run("ROLLBACK", (err) => {
248
+ if (err) {
249
+ logger.error(logPrefix("回滚事务失败:"));
250
+ logger.error(err);
251
+ reject(err);
252
+ return;
253
+ }
254
+ this.#inTransaction = false;
255
+ resolve();
256
+ });
257
+ });
258
+ }
259
+ /**
260
+ * 执行SQL查询并返回结果
261
+ * @param sql SQL语句
262
+ * @param params 参数
263
+ * @returns 查询结果
264
+ */
265
+ async query(sql, params = []) {
266
+ if (!this.db) throw new Error("数据库未初始化");
267
+ return new Promise((resolve, reject) => {
268
+ this.db.all(sql, params, (err, rows) => {
269
+ if (err) {
270
+ logger.error(logPrefix(`查询失败: ${sql}`));
271
+ logger.error(err);
272
+ reject(err);
273
+ return;
274
+ }
275
+ resolve(rows);
276
+ });
277
+ });
278
+ }
279
+ /**
280
+ * 清理过期键
281
+ */
282
+ async cleanupExpiredKeys() {
283
+ const now = Date.now();
284
+ return (await this.query("SELECT key FROM redis_data WHERE expire != -1 AND expire < ? LIMIT 500", [now])).length;
285
+ }
286
+ /**
287
+ * 将db.run方法封装为Promise
288
+ * @param sql SQL语句
289
+ * @param params 参数数组
290
+ * @returns 返回受影响的行数
291
+ */
292
+ async run(sql, params) {
293
+ if (this.#isClosing) throw new Error("数据库正在关闭中...");
294
+ return new Promise((resolve, reject) => {
295
+ this.db.run(sql, params, function(err) {
296
+ if (err) {
297
+ reject(err);
298
+ return;
299
+ }
300
+ resolve(this.changes);
301
+ });
302
+ });
303
+ }
304
+ };
305
+
306
+ //#endregion
307
+ export { logPrefix as n, SQLiteWrapper as t };
@@ -1 +1 @@
1
- import EventEmitter from 'events';
1
+ export { };
@@ -1,9 +1,16 @@
1
- // src/start/app.ts
2
- var isStart = false;
1
+ //#region src/start/app.ts
2
+ /**
3
+ * 直接启动 此文件不暴露给外部
4
+ * 通过变量来防止打包器解析模块
5
+ */
6
+ let isStart = false;
3
7
  (async () => {
4
- if (isStart) return;
5
- isStart = true;
6
- const index = import.meta.url.includes(".ts") ? "../index.ts" : "../index.mjs";
7
- const { start } = await import(index);
8
- start();
8
+ if (isStart) return;
9
+ isStart = true;
10
+ const entry = import.meta.url.includes(".ts") ? "../index.ts" : "../index.mjs";
11
+ const { start } = await import(new URL(entry, import.meta.url).href);
12
+ start();
9
13
  })();
14
+
15
+ //#endregion
16
+ export { };
@@ -1 +1 @@
1
- import EventEmitter from 'events';
1
+ export { };