@yumerijs/core 1.2.1 → 1.3.0

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.
package/dist/context.d.ts CHANGED
@@ -4,7 +4,6 @@
4
4
  * WindyPear-Team All right reserved
5
5
  **/
6
6
  import { Core } from './core';
7
- import { Command } from './command';
8
7
  import { Route } from './route';
9
8
  import { HookHandler } from './hook';
10
9
  /**
@@ -28,11 +27,6 @@ export declare class Context {
28
27
  * @param pluginname 插件名称
29
28
  */
30
29
  constructor(core: Core, pluginname: string);
31
- /**
32
- * @deprecated Use route() instead.
33
- * 尝试注册命令,如果命令已存在则警告
34
- */
35
- command(name: string): Command;
36
30
  /**
37
31
  * 注册路由
38
32
  * @param path 路由路径
package/dist/context.js CHANGED
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Context = void 0;
4
- const command_1 = require("./command");
5
4
  const route_1 = require("./route");
6
5
  /**
7
6
  * 插件上下文对象
@@ -27,17 +26,6 @@ class Context {
27
26
  this.core = core;
28
27
  this.pluginname = pluginname;
29
28
  }
30
- /**
31
- * @deprecated Use route() instead.
32
- * 尝试注册命令,如果命令已存在则警告
33
- */
34
- command(name) {
35
- if (this.core.commands[name]) {
36
- this.core.logger.warn(`Plugin "${this.pluginname}" attempt to register command "${name}", but it has already been registered.`);
37
- return new command_1.Command(this.core, name);
38
- }
39
- return this.core.command(name);
40
- }
41
29
  /**
42
30
  * 注册路由
43
31
  * @param path 路由路径
package/dist/core.d.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  import { Config } from './config';
2
2
  import { Logger } from './logger';
3
- import { Command } from './command';
4
3
  import { Session } from './session';
5
- import { Platform } from './platform';
6
4
  import { Middleware } from './middleware';
7
5
  import { Route } from './route';
8
6
  import { Context } from './context';
9
7
  import { HookHandler, Hook } from './hook';
8
+ import { Server as CoreServer } from './server';
10
9
  interface Plugin {
11
10
  apply: (ctx: Context, config: Config) => Promise<void>;
12
11
  disable: (ctx: Context) => Promise<void>;
@@ -20,6 +19,13 @@ interface PluginLoader {
20
19
  installPluginDependencies(pluginName: string): Promise<void>;
21
20
  logger: Logger;
22
21
  }
22
+ interface CoreOptions {
23
+ port: number;
24
+ host: string;
25
+ staticDir: string;
26
+ enableCors: boolean;
27
+ enableWs: boolean;
28
+ }
23
29
  /**
24
30
  * 定义插件状态枚举
25
31
  */
@@ -36,14 +42,12 @@ export declare class Core {
36
42
  };
37
43
  };
38
44
  config: any;
39
- platforms: Platform[];
40
45
  eventListeners: {
41
46
  [event: string]: ((...args: any[]) => Promise<void>)[];
42
47
  };
43
48
  components: {
44
49
  [name: string]: any;
45
50
  };
46
- commands: Record<string, Command>;
47
51
  routes: Record<string, Route>;
48
52
  pluginLoader: PluginLoader;
49
53
  logger: Logger;
@@ -53,6 +57,8 @@ export declare class Core {
53
57
  globalMiddlewares: Record<string, Middleware>;
54
58
  pluginStatus: Record<string, PluginStatus>;
55
59
  hooks: Record<string, Hook>;
60
+ coreConfig: CoreOptions;
61
+ server: CoreServer;
56
62
  private pluginWatchers;
57
63
  private pluginModules;
58
64
  private configPath;
@@ -60,7 +66,7 @@ export declare class Core {
60
66
  * 插件名 -> Context 映射
61
67
  */
62
68
  private pluginContexts;
63
- constructor(pluginLoader: PluginLoader);
69
+ constructor(pluginLoader?: PluginLoader, coreConfig?: CoreOptions);
64
70
  /**
65
71
  * 获取或创建插件对应 Context
66
72
  */
@@ -74,6 +80,11 @@ export declare class Core {
74
80
  * @param configPath 配置文件的路径
75
81
  */
76
82
  loadConfig(configPath: string): Promise<void>;
83
+ /**
84
+ * 启动应用
85
+ * @returns Promise<void>
86
+ */
87
+ runCore(): Promise<void>;
77
88
  /**
78
89
  * 监听配置文件变化,实现热重载
79
90
  * @param configPath 配置文件的路径
@@ -160,10 +171,6 @@ export declare class Core {
160
171
  * @returns Core 实例
161
172
  */
162
173
  use(name: string, middleware: Middleware): Core;
163
- /**
164
- * @deprecated 已更改为路由
165
- */
166
- command(name: string): Command;
167
174
  /**
168
175
  * 注册路由
169
176
  * @param path 路由路径
@@ -188,11 +195,6 @@ export declare class Core {
188
195
  * @return Promise<any[]>
189
196
  */
190
197
  hookExecute(name: string, ...args: any[]): Promise<any[]>;
191
- /**
192
- * 执行命令
193
- * @deprecated
194
- */
195
- executeCommand(name: string, session: any, ...args: any[]): Promise<Session | null>;
196
198
  /**
197
199
  * 执行路由
198
200
  * @param pathname 需要匹配的URL
@@ -201,18 +203,6 @@ export declare class Core {
201
203
  * @returns 是否匹配成功
202
204
  */
203
205
  executeRoute(pathname: string, session: Session, queryParams: URLSearchParams): Promise<boolean>;
204
- /**
205
- * 注册平台
206
- * @param platform 平台实例
207
- * @returns 平台启动结果
208
- */
209
- registerPlatform(platform: Platform): any;
210
- /**
211
- * 获取命令
212
- * @param name 命令名称
213
- * @returns Command 实例或 null
214
- */
215
- getCommand(name: string): Command | null;
216
206
  /**
217
207
  * 获取路由
218
208
  * @param path 匹配路径
package/dist/core.js CHANGED
@@ -44,18 +44,16 @@ const fs = __importStar(require("fs"));
44
44
  const path = __importStar(require("path"));
45
45
  const config_1 = require("./config");
46
46
  const logger_1 = require("./logger");
47
- const command_1 = require("./command");
48
47
  const chokidar = __importStar(require("chokidar"));
49
48
  const route_1 = require("./route");
50
49
  const context_1 = require("./context");
51
50
  const hook_1 = require("./hook");
51
+ const server_1 = require("./server");
52
52
  class Core {
53
53
  plugins = {};
54
54
  config = null;
55
- platforms = [];
56
55
  eventListeners = {};
57
56
  components = {};
58
- commands = {};
59
57
  routes = {};
60
58
  pluginLoader;
61
59
  logger = new logger_1.Logger('core');
@@ -63,6 +61,8 @@ class Core {
63
61
  globalMiddlewares = {};
64
62
  pluginStatus = {};
65
63
  hooks = {};
64
+ coreConfig;
65
+ server;
66
66
  pluginWatchers = {};
67
67
  pluginModules = {};
68
68
  configPath = '';
@@ -70,7 +70,8 @@ class Core {
70
70
  * 插件名 -> Context 映射
71
71
  */
72
72
  pluginContexts = {};
73
- constructor(pluginLoader) {
73
+ constructor(pluginLoader, coreConfig) {
74
+ this.coreConfig = coreConfig;
74
75
  this.pluginLoader = pluginLoader;
75
76
  }
76
77
  /**
@@ -105,12 +106,28 @@ class Core {
105
106
  if (process.env.NODE_ENV === 'development') {
106
107
  this.watchConfig(configPath);
107
108
  }
109
+ this.coreConfig = this.config.core || {};
108
110
  }
109
111
  catch (e) {
110
112
  this.logger.error('Failed to load config:', e);
111
113
  throw e;
112
114
  }
113
115
  }
116
+ /**
117
+ * 启动应用
118
+ * @returns Promise<void>
119
+ */
120
+ async runCore() {
121
+ this.server = new server_1.Server(this, {
122
+ port: this.coreConfig.port || 14510,
123
+ host: this.coreConfig.host || '0.0.0.0',
124
+ enableCors: this.coreConfig.enableCors || false,
125
+ enableWs: this.coreConfig.enableWs || false,
126
+ staticDir: this.coreConfig.staticDir || 'public',
127
+ });
128
+ await this.server.start();
129
+ this.logger.info(`Yumeri server started at ${this.coreConfig.host}:${this.coreConfig.port}`);
130
+ }
114
131
  /**
115
132
  * 监听配置文件变化,实现热重载
116
133
  * @param configPath 配置文件的路径
@@ -497,14 +514,6 @@ class Core {
497
514
  this.globalMiddlewares[name] = middleware;
498
515
  return this;
499
516
  }
500
- /**
501
- * @deprecated 已更改为路由
502
- */
503
- command(name) {
504
- const command = new command_1.Command(this, name);
505
- this.commands[name] = command;
506
- return command;
507
- }
508
517
  /**
509
518
  * 注册路由
510
519
  * @param path 路由路径
@@ -547,26 +556,6 @@ class Core {
547
556
  }
548
557
  return [];
549
558
  }
550
- /**
551
- * 执行命令
552
- * @deprecated
553
- */
554
- async executeCommand(name, session, ...args) {
555
- const command = this.commands[name];
556
- if (command) {
557
- const middlewares = [...Object.values(this.globalMiddlewares), ...(command.middlewares || [])];
558
- let index = 0;
559
- const runner = async () => {
560
- if (index < middlewares.length)
561
- await middlewares[index++](session, runner);
562
- else
563
- await command.executeHandler(session, ...args);
564
- };
565
- await runner();
566
- return session;
567
- }
568
- return null;
569
- }
570
559
  /**
571
560
  * 执行路由
572
561
  * @param pathname 需要匹配的URL
@@ -593,23 +582,6 @@ class Core {
593
582
  }
594
583
  return false;
595
584
  }
596
- /**
597
- * 注册平台
598
- * @param platform 平台实例
599
- * @returns 平台启动结果
600
- */
601
- registerPlatform(platform) {
602
- this.platforms.push(platform);
603
- return platform.startPlatform(this);
604
- }
605
- /**
606
- * 获取命令
607
- * @param name 命令名称
608
- * @returns Command 实例或 null
609
- */
610
- getCommand(name) {
611
- return this.commands[name] || null;
612
- }
613
585
  /**
614
586
  * 获取路由
615
587
  * @param path 匹配路径
package/dist/index.d.ts CHANGED
@@ -5,10 +5,8 @@
5
5
  **/
6
6
  export * from './core';
7
7
  export * from './session';
8
- export * from './command';
9
8
  export * from './route';
10
9
  export * from './config';
11
10
  export * from './logger';
12
- export * from './platform';
13
11
  export * from './context';
14
12
  export * from './hook';
package/dist/index.js CHANGED
@@ -21,10 +21,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  __exportStar(require("./core"), exports);
23
23
  __exportStar(require("./session"), exports);
24
- __exportStar(require("./command"), exports);
25
24
  __exportStar(require("./route"), exports);
26
25
  __exportStar(require("./config"), exports);
27
26
  __exportStar(require("./logger"), exports);
28
- __exportStar(require("./platform"), exports);
29
27
  __exportStar(require("./context"), exports);
30
28
  __exportStar(require("./hook"), exports);
@@ -0,0 +1,26 @@
1
+ import { Core } from './core';
2
+ export interface ServerConfig {
3
+ port: number;
4
+ host: string;
5
+ enableCors: boolean;
6
+ staticDir: string;
7
+ enableWs: boolean;
8
+ }
9
+ export declare class Server {
10
+ private core;
11
+ private port;
12
+ private host;
13
+ private enableCors;
14
+ private staticDir;
15
+ private enableWs;
16
+ private httpServer;
17
+ private wsServer;
18
+ constructor(core: Core, config?: Partial<ServerConfig>);
19
+ private createSession;
20
+ private parseCookies;
21
+ private getClientIP;
22
+ private parseRequestBody;
23
+ private serveStaticFile;
24
+ start(): Promise<void>;
25
+ stop(): void;
26
+ }
package/dist/server.js ADDED
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Server = void 0;
40
+ const logger_1 = require("./logger");
41
+ const session_1 = require("./session");
42
+ const http_1 = __importDefault(require("http"));
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const url_1 = require("url");
46
+ const ws_1 = __importDefault(require("ws"));
47
+ const formidable = __importStar(require("formidable"));
48
+ const mime = __importStar(require("mime-types"));
49
+ const logger = new logger_1.Logger('server');
50
+ class Server {
51
+ core;
52
+ port;
53
+ host;
54
+ enableCors;
55
+ staticDir;
56
+ enableWs;
57
+ httpServer = null;
58
+ wsServer = null;
59
+ constructor(core, config = {}) {
60
+ this.core = core;
61
+ this.port = config.port ?? 14510;
62
+ this.host = config.host ?? '0.0.0.0';
63
+ this.enableCors = config.enableCors ?? true;
64
+ this.staticDir = config.staticDir ?? 'static';
65
+ this.enableWs = config.enableWs ?? true;
66
+ }
67
+ createSession(ip, cookies, res, req, extra = {}) {
68
+ const session = new session_1.Session(ip, cookies, this, req, res);
69
+ Object.assign(session.properties, extra);
70
+ session.protocol = extra.protocol ?? 'http';
71
+ return session;
72
+ }
73
+ parseCookies(req) {
74
+ const cookieHeader = req.headers.cookie;
75
+ if (!cookieHeader)
76
+ return {};
77
+ const cookies = {};
78
+ cookieHeader.split(';').forEach(c => {
79
+ const [k, ...v] = c.split('=');
80
+ cookies[k.trim()] = v.join('=').trim();
81
+ });
82
+ return cookies;
83
+ }
84
+ getClientIP(req) {
85
+ const xff = req.headers['x-forwarded-for'];
86
+ return xff ? xff.split(',')[0].trim() : req.socket.remoteAddress || '127.0.0.1';
87
+ }
88
+ async parseRequestBody(req) {
89
+ return new Promise((resolve, reject) => {
90
+ const contentType = (req.headers['content-type'] || '').toLowerCase();
91
+ if (contentType.includes('application/json') || contentType.includes('application/x-www-form-urlencoded')) {
92
+ let body = '';
93
+ req.on('data', chunk => body += chunk.toString());
94
+ req.on('end', () => {
95
+ try {
96
+ if (contentType.includes('application/json'))
97
+ resolve(JSON.parse(body));
98
+ else {
99
+ const params = new URLSearchParams(body);
100
+ const parsed = {};
101
+ params.forEach((v, k) => parsed[k] = v);
102
+ resolve(parsed);
103
+ }
104
+ }
105
+ catch (e) {
106
+ reject(e);
107
+ }
108
+ });
109
+ }
110
+ else if (contentType.includes('multipart/form-data')) {
111
+ const form = formidable.formidable({});
112
+ form.parse(req, (err, fields) => {
113
+ if (err)
114
+ return reject(err);
115
+ const parsed = {};
116
+ Object.keys(fields).forEach(k => {
117
+ const val = fields[k];
118
+ parsed[k] = Array.isArray(val) && val.length === 1 ? val[0] : val;
119
+ });
120
+ resolve(parsed);
121
+ });
122
+ }
123
+ else
124
+ resolve({});
125
+ req.on('error', reject);
126
+ });
127
+ }
128
+ serveStaticFile(pathname, res) {
129
+ const fullPath = path.join(process.cwd(), this.staticDir, pathname);
130
+ fs.readFile(fullPath, (err, data) => {
131
+ if (err) {
132
+ res.writeHead(404, { 'Content-Type': 'text/html' });
133
+ res.end(`<html><body><h1>404 Not Found</h1></body></html>`);
134
+ }
135
+ else {
136
+ res.writeHead(200, { 'Content-Type': mime.lookup(fullPath) || 'text/plain' });
137
+ res.end(data);
138
+ }
139
+ });
140
+ }
141
+ async start() {
142
+ this.httpServer = http_1.default.createServer(async (req, res) => {
143
+ if (req.method === 'OPTIONS' && this.enableCors) {
144
+ res.writeHead(204, {
145
+ 'Access-Control-Allow-Origin': '*',
146
+ 'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS',
147
+ 'Access-Control-Allow-Headers': 'Content-Type',
148
+ });
149
+ res.end();
150
+ return;
151
+ }
152
+ const url = new url_1.URL(req.url || '/', `http://${req.headers.host}`);
153
+ const pathname = url.pathname;
154
+ const queryParams = url.searchParams;
155
+ const ip = this.getClientIP(req);
156
+ const cookies = this.parseCookies(req);
157
+ const session = this.createSession(ip, cookies, res, req, { protocol: 'http', header: req.headers });
158
+ if (req.method?.toLowerCase() === 'post') {
159
+ try {
160
+ const body = await this.parseRequestBody(req);
161
+ Object.entries(body).forEach(([k, v]) => {
162
+ if (typeof v === 'string')
163
+ queryParams.set(k, v);
164
+ else if (Array.isArray(v))
165
+ v.forEach(val => queryParams.append(k, val));
166
+ });
167
+ }
168
+ catch (err) {
169
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
170
+ res.end('Invalid request body');
171
+ logger.error('Request body parse error:', err);
172
+ return;
173
+ }
174
+ }
175
+ const route = this.core.getRoute(pathname);
176
+ if (route && route.allowedMethods.includes(req.method ?? 'GET')) {
177
+ const matched = await this.core.executeRoute(pathname, session, queryParams);
178
+ if (!matched) {
179
+ this.serveStaticFile(pathname, res);
180
+ }
181
+ else {
182
+ let head = session.head;
183
+ head['Set-Cookie'] = Object.entries(session.newCookie).map(([k, v]) => `${k}=${v}`);
184
+ if (this.enableCors) {
185
+ head['Access-Control-Allow-Origin'] = '*';
186
+ }
187
+ res.writeHead(session.status ?? 200, head);
188
+ res.end(session.body);
189
+ }
190
+ }
191
+ else {
192
+ this.serveStaticFile(pathname, res);
193
+ }
194
+ });
195
+ if (this.enableWs) {
196
+ this.wsServer = new ws_1.default.Server({ server: this.httpServer });
197
+ this.wsServer.on('connection', (ws, req) => {
198
+ const url = new url_1.URL(req.url || '/', `http://${req.headers.host}`);
199
+ const pathname = url.pathname;
200
+ const queryParams = url.searchParams;
201
+ const ip = this.getClientIP(req);
202
+ const cookies = this.parseCookies(req);
203
+ const session = this.createSession(ip, cookies, undefined, req, { ws, protocol: 'ws' });
204
+ ws.on('message', async (msg) => {
205
+ try {
206
+ const data = JSON.parse(msg.toString());
207
+ Object.entries(data).forEach(([k, v]) => queryParams.set(k, v));
208
+ }
209
+ catch {
210
+ queryParams.set('message', msg.toString());
211
+ }
212
+ await this.core.executeRoute(pathname, session, queryParams);
213
+ });
214
+ this.core.executeRoute(pathname, session, queryParams).catch(err => {
215
+ logger.error(`WS initial route error for ${pathname}:`, err);
216
+ ws.close(1011, 'Internal error');
217
+ });
218
+ });
219
+ }
220
+ this.httpServer.listen(this.port, this.host, () => {
221
+ logger.info(`Server listening on ${this.host}:${this.port}`);
222
+ });
223
+ }
224
+ stop() {
225
+ if (this.wsServer)
226
+ this.wsServer.close();
227
+ if (this.httpServer)
228
+ this.httpServer.close(() => logger.info('Server stopped'));
229
+ }
230
+ }
231
+ exports.Server = Server;
package/dist/session.d.ts CHANGED
@@ -3,7 +3,8 @@
3
3
  * @author: FireGuo
4
4
  * WindyPear-Team All right reserved
5
5
  **/
6
- import { Platform } from './platform';
6
+ import { Server } from './server';
7
+ import { IncomingMessage, ServerResponse } from 'http';
7
8
  export declare class Session {
8
9
  ip: string;
9
10
  cookie: Record<string, string>;
@@ -14,9 +15,12 @@ export declare class Session {
14
15
  head: Record<string, any>;
15
16
  status: number;
16
17
  body: any;
17
- platform: Platform;
18
18
  properties?: Record<string, any>;
19
- constructor(ip: string, cookie: Record<string, string>, platform: Platform, query?: Record<string, string>);
19
+ res: any;
20
+ req: any;
21
+ server: Server;
22
+ protocol: string;
23
+ constructor(ip: string, cookie: Record<string, string>, server: Server, req?: IncomingMessage, res?: ServerResponse, query?: Record<string, string>);
20
24
  private generateId;
21
25
  private md5;
22
26
  setData(key: string, value: any): void;
package/dist/session.js CHANGED
@@ -20,18 +20,23 @@ class Session {
20
20
  head = {};
21
21
  status = 200;
22
22
  body;
23
- platform;
24
23
  properties = {};
24
+ res = null;
25
+ req = null;
26
+ server;
27
+ protocol = 'http';
25
28
  /*
26
29
  * @ip: string,用户IP
27
30
  * @cookie: string,会话cookie
28
31
  * @query: string,请求字符串
29
32
  */
30
- constructor(ip, cookie, platform, query) {
33
+ constructor(ip, cookie, server, req, res, query) {
31
34
  this.ip = ip;
32
35
  this.cookie = cookie;
33
36
  this.query = query;
34
- this.platform = platform;
37
+ this.server = server;
38
+ this.req = req;
39
+ this.res = res;
35
40
  this.head['Content-Type'] = 'text/plain';
36
41
  if (cookie.sessionid) {
37
42
  this.sessionid = cookie.sessionid;
@@ -102,10 +107,10 @@ class Session {
102
107
  }
103
108
  }
104
109
  send(data) {
105
- return this.platform.sendMessage(this, data);
110
+ return this.res.send(data);
106
111
  }
107
112
  endsession(message) {
108
- return this.platform.terminationSession(this, message);
113
+ return this.res.end(message);
109
114
  }
110
115
  }
111
116
  exports.Session = Session;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yumerijs/core",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Core module for yumeri",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",