@mu-cabin/opms-permission 0.9.1 → 0.9.3

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/index.cjs CHANGED
@@ -33,6 +33,7 @@ __export(index_exports, {
33
33
  DataHandler: () => DataHandler,
34
34
  EnumOrgQueryMode: () => EnumOrgQueryMode,
35
35
  EnumOrgQueryScope: () => EnumOrgQueryScope,
36
+ EventEmitter: () => EventEmitter,
36
37
  OpmsPermission: () => Permission,
37
38
  getOrgTree: () => getOrgTree,
38
39
  getUserInfo: () => getUserInfo,
@@ -161,10 +162,11 @@ var Storage = class {
161
162
  var storage = new Storage();
162
163
 
163
164
  // src/utils/dataHandler.ts
164
- function getCompletePath(item) {
165
+ var getCompletePath = (item) => {
165
166
  const menuUrl = item.openIndicator === "INNER_COMPONENT" ? item.componentPath : item.defaultUrl;
166
- return menuUrl ?? "";
167
- }
167
+ const path = item.prefix && item.openIndicator === "INNER_COMPONENT" ? `${item.prefix}${menuUrl}` : menuUrl ?? "";
168
+ return path;
169
+ };
168
170
  function getMenuName(item) {
169
171
  return item.resourceType !== "FOLDER" ? item.resourceName || "" : (item.showName ?? item.resourceName) || "";
170
172
  }
@@ -393,6 +395,104 @@ async function queryOrgCompanies(baseUrl, params) {
393
395
  );
394
396
  }
395
397
 
398
+ // src/utils/eventEmitter.ts
399
+ var EventEmitter = class {
400
+ constructor(allowedEvents) {
401
+ this.eventListeners = /* @__PURE__ */ new Map();
402
+ this.allowedEvents = new Set(allowedEvents || []);
403
+ }
404
+ /**
405
+ * Add event listener
406
+ */
407
+ listen(event, listener) {
408
+ if (this.allowedEvents.size > 0 && !this.allowedEvents.has(event)) {
409
+ const allowedEventsList = Array.from(this.allowedEvents).join(", ");
410
+ throw new Error(
411
+ `Event "${String(event)}" is not registered. Allowed events: ${allowedEventsList}`
412
+ );
413
+ }
414
+ if (!this.eventListeners.has(event)) {
415
+ this.eventListeners.set(event, /* @__PURE__ */ new Set());
416
+ }
417
+ const listeners = this.eventListeners.get(event);
418
+ listeners.add(listener);
419
+ return () => {
420
+ listeners.delete(listener);
421
+ if (listeners.size === 0) {
422
+ this.eventListeners.delete(event);
423
+ }
424
+ };
425
+ }
426
+ /**
427
+ * Remove event listener
428
+ */
429
+ unlisten(event, listener) {
430
+ const listeners = this.eventListeners.get(event);
431
+ if (listeners) {
432
+ listeners.delete(listener);
433
+ if (listeners.size === 0) {
434
+ this.eventListeners.delete(event);
435
+ }
436
+ }
437
+ }
438
+ /**
439
+ * Remove all listeners for a specific event or all events
440
+ */
441
+ unlistenAll(event) {
442
+ if (event) {
443
+ this.eventListeners.delete(event);
444
+ } else {
445
+ this.eventListeners.clear();
446
+ }
447
+ }
448
+ /**
449
+ * Emit event to all listeners
450
+ */
451
+ emit(event, data) {
452
+ const listeners = this.eventListeners.get(event);
453
+ if (listeners) {
454
+ listeners.forEach((listener) => {
455
+ try {
456
+ listener(data);
457
+ } catch (error) {
458
+ console.error(`Error in event listener for ${String(event)}:`, error);
459
+ }
460
+ });
461
+ }
462
+ }
463
+ /**
464
+ * Get the number of listeners for a specific event
465
+ */
466
+ getListenerCount(event) {
467
+ const listeners = this.eventListeners.get(event);
468
+ return listeners ? listeners.size : 0;
469
+ }
470
+ /**
471
+ * Check if there are any listeners for a specific event
472
+ */
473
+ hasListeners(event) {
474
+ return this.getListenerCount(event) > 0;
475
+ }
476
+ /**
477
+ * Get all registered event types
478
+ */
479
+ getEventTypes() {
480
+ return Array.from(this.eventListeners.keys());
481
+ }
482
+ /**
483
+ * Get all allowed event types
484
+ */
485
+ getAllowedEvents() {
486
+ return Array.from(this.allowedEvents);
487
+ }
488
+ /**
489
+ * Check if an event is allowed
490
+ */
491
+ isEventAllowed(event) {
492
+ return this.allowedEvents.size === 0 || this.allowedEvents.has(event);
493
+ }
494
+ };
495
+
396
496
  // src/permission.ts
397
497
  var DataHandler = {
398
498
  iterateOrgTree(orgTree) {
@@ -463,11 +563,59 @@ var Permission = class {
463
563
  this.widgetMap = {};
464
564
  this.menuList = [];
465
565
  this.menuMap = {};
566
+ // Event emitter instance - only allow tokenChange event
567
+ this.eventEmitter = new EventEmitter(["tokenChange"]);
466
568
  this.baseUrl = options.baseUrl;
467
569
  this.systemId = options.systemId;
468
570
  storage.setSystemId(this.systemId);
469
571
  storage.setVersion("1.0.0");
470
572
  }
573
+ /**
574
+ * Add event listener
575
+ */
576
+ listen(event, listener) {
577
+ try {
578
+ return this.eventEmitter.listen(event, listener);
579
+ } catch (error) {
580
+ if (error instanceof Error && error.message.includes("not registered")) {
581
+ const allowedEvents = this.eventEmitter.getAllowedEvents();
582
+ throw new Error(
583
+ `Permission event "${String(event)}" is not supported. Available events: ${allowedEvents.join(", ")}`
584
+ );
585
+ }
586
+ throw error;
587
+ }
588
+ }
589
+ /**
590
+ * Remove event listener
591
+ */
592
+ unlisten(event, listener) {
593
+ this.eventEmitter.unlisten(event, listener);
594
+ }
595
+ /**
596
+ * Remove all listeners for a specific event or all events
597
+ */
598
+ unlistenAll(event) {
599
+ this.eventEmitter.unlistenAll(event);
600
+ }
601
+ /**
602
+ * Emit event to all listeners
603
+ */
604
+ emit(event, data) {
605
+ this.eventEmitter.emit(event, data);
606
+ }
607
+ /**
608
+ * Get available events that can be listened to
609
+ */
610
+ getAvailableEvents() {
611
+ return this.eventEmitter.getAllowedEvents();
612
+ }
613
+ /**
614
+ * Check if an event is supported
615
+ */
616
+ isEventSupported(event) {
617
+ return this.eventEmitter.isEventAllowed(event);
618
+ }
471
619
  /**
472
620
  * Login using code from URL, save userInfo
473
621
  */
@@ -494,6 +642,7 @@ var Permission = class {
494
642
  const { token } = obj;
495
643
  url.searchParams.delete("code");
496
644
  storage.setItem(TOKEN_KEY, token);
645
+ this.emit("tokenChange", token);
497
646
  return token;
498
647
  }
499
648
  /**
@@ -505,6 +654,7 @@ var Permission = class {
505
654
  }
506
655
  clear() {
507
656
  storage.clear();
657
+ this.emit("tokenChange", "");
508
658
  }
509
659
  async getUserInfo() {
510
660
  const data = await getUserInfo(this.baseUrl);
@@ -616,6 +766,7 @@ var Permission = class {
616
766
  }
617
767
  setToken(token) {
618
768
  storage.setItem(TOKEN_KEY, token);
769
+ this.emit("tokenChange", token);
619
770
  }
620
771
  // --- Getters ---
621
772
  // get userInfo(): UserInfo | null {
@@ -728,6 +879,7 @@ function jumpToSSOLogout({
728
879
  DataHandler,
729
880
  EnumOrgQueryMode,
730
881
  EnumOrgQueryScope,
882
+ EventEmitter,
731
883
  OpmsPermission,
732
884
  getOrgTree,
733
885
  getUserInfo,
package/dist/index.d.mts CHANGED
@@ -200,6 +200,56 @@ declare function handlePermissionTree<T extends {
200
200
  noAuthMap: Record<number | string, T>;
201
201
  };
202
202
 
203
+ type PermissionEventType = 'tokenChange';
204
+ type PermissionEventListener<T = any> = (data: T) => void;
205
+ interface PermissionEventMap {
206
+ tokenChange: string;
207
+ }
208
+ /**
209
+ * Generic Event Emitter class for handling events
210
+ */
211
+ declare class EventEmitter<TEventMap extends Record<string, any> = PermissionEventMap> {
212
+ private eventListeners;
213
+ private allowedEvents;
214
+ constructor(allowedEvents?: (keyof TEventMap)[]);
215
+ /**
216
+ * Add event listener
217
+ */
218
+ listen<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): () => void;
219
+ /**
220
+ * Remove event listener
221
+ */
222
+ unlisten<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): void;
223
+ /**
224
+ * Remove all listeners for a specific event or all events
225
+ */
226
+ unlistenAll(event?: keyof TEventMap): void;
227
+ /**
228
+ * Emit event to all listeners
229
+ */
230
+ emit<TEvent extends keyof TEventMap>(event: TEvent, data: TEventMap[TEvent]): void;
231
+ /**
232
+ * Get the number of listeners for a specific event
233
+ */
234
+ getListenerCount(event: keyof TEventMap): number;
235
+ /**
236
+ * Check if there are any listeners for a specific event
237
+ */
238
+ hasListeners(event: keyof TEventMap): boolean;
239
+ /**
240
+ * Get all registered event types
241
+ */
242
+ getEventTypes(): (keyof TEventMap)[];
243
+ /**
244
+ * Get all allowed event types
245
+ */
246
+ getAllowedEvents(): (keyof TEventMap)[];
247
+ /**
248
+ * Check if an event is allowed
249
+ */
250
+ isEventAllowed(event: keyof TEventMap): boolean;
251
+ }
252
+
203
253
  interface PermissionOptions {
204
254
  systemId: string;
205
255
  baseUrl: string;
@@ -246,7 +296,32 @@ declare class Permission {
246
296
  menuMap: {
247
297
  [path: string]: MenuItem;
248
298
  };
299
+ private eventEmitter;
249
300
  constructor(options: PermissionOptions);
301
+ /**
302
+ * Add event listener
303
+ */
304
+ listen<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): () => void;
305
+ /**
306
+ * Remove event listener
307
+ */
308
+ unlisten<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): void;
309
+ /**
310
+ * Remove all listeners for a specific event or all events
311
+ */
312
+ unlistenAll(event?: PermissionEventType): void;
313
+ /**
314
+ * Emit event to all listeners
315
+ */
316
+ private emit;
317
+ /**
318
+ * Get available events that can be listened to
319
+ */
320
+ getAvailableEvents(): PermissionEventType[];
321
+ /**
322
+ * Check if an event is supported
323
+ */
324
+ isEventSupported(event: string): event is PermissionEventType;
250
325
  /**
251
326
  * Login using code from URL, save userInfo
252
327
  */
@@ -346,4 +421,4 @@ declare function jumpToSSOLogout({ baseUrl, redirectToUrl, clientId, }: {
346
421
  clientId?: string;
347
422
  }): void;
348
423
 
349
- export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
424
+ export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, EventEmitter, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type PermissionEventListener, type PermissionEventMap, type PermissionEventType, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
package/dist/index.d.ts CHANGED
@@ -200,6 +200,56 @@ declare function handlePermissionTree<T extends {
200
200
  noAuthMap: Record<number | string, T>;
201
201
  };
202
202
 
203
+ type PermissionEventType = 'tokenChange';
204
+ type PermissionEventListener<T = any> = (data: T) => void;
205
+ interface PermissionEventMap {
206
+ tokenChange: string;
207
+ }
208
+ /**
209
+ * Generic Event Emitter class for handling events
210
+ */
211
+ declare class EventEmitter<TEventMap extends Record<string, any> = PermissionEventMap> {
212
+ private eventListeners;
213
+ private allowedEvents;
214
+ constructor(allowedEvents?: (keyof TEventMap)[]);
215
+ /**
216
+ * Add event listener
217
+ */
218
+ listen<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): () => void;
219
+ /**
220
+ * Remove event listener
221
+ */
222
+ unlisten<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): void;
223
+ /**
224
+ * Remove all listeners for a specific event or all events
225
+ */
226
+ unlistenAll(event?: keyof TEventMap): void;
227
+ /**
228
+ * Emit event to all listeners
229
+ */
230
+ emit<TEvent extends keyof TEventMap>(event: TEvent, data: TEventMap[TEvent]): void;
231
+ /**
232
+ * Get the number of listeners for a specific event
233
+ */
234
+ getListenerCount(event: keyof TEventMap): number;
235
+ /**
236
+ * Check if there are any listeners for a specific event
237
+ */
238
+ hasListeners(event: keyof TEventMap): boolean;
239
+ /**
240
+ * Get all registered event types
241
+ */
242
+ getEventTypes(): (keyof TEventMap)[];
243
+ /**
244
+ * Get all allowed event types
245
+ */
246
+ getAllowedEvents(): (keyof TEventMap)[];
247
+ /**
248
+ * Check if an event is allowed
249
+ */
250
+ isEventAllowed(event: keyof TEventMap): boolean;
251
+ }
252
+
203
253
  interface PermissionOptions {
204
254
  systemId: string;
205
255
  baseUrl: string;
@@ -246,7 +296,32 @@ declare class Permission {
246
296
  menuMap: {
247
297
  [path: string]: MenuItem;
248
298
  };
299
+ private eventEmitter;
249
300
  constructor(options: PermissionOptions);
301
+ /**
302
+ * Add event listener
303
+ */
304
+ listen<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): () => void;
305
+ /**
306
+ * Remove event listener
307
+ */
308
+ unlisten<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): void;
309
+ /**
310
+ * Remove all listeners for a specific event or all events
311
+ */
312
+ unlistenAll(event?: PermissionEventType): void;
313
+ /**
314
+ * Emit event to all listeners
315
+ */
316
+ private emit;
317
+ /**
318
+ * Get available events that can be listened to
319
+ */
320
+ getAvailableEvents(): PermissionEventType[];
321
+ /**
322
+ * Check if an event is supported
323
+ */
324
+ isEventSupported(event: string): event is PermissionEventType;
250
325
  /**
251
326
  * Login using code from URL, save userInfo
252
327
  */
@@ -346,4 +421,4 @@ declare function jumpToSSOLogout({ baseUrl, redirectToUrl, clientId, }: {
346
421
  clientId?: string;
347
422
  }): void;
348
423
 
349
- export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
424
+ export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, EventEmitter, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type PermissionEventListener, type PermissionEventMap, type PermissionEventType, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
package/dist/index.mjs CHANGED
@@ -113,10 +113,11 @@ var Storage = class {
113
113
  var storage = new Storage();
114
114
 
115
115
  // src/utils/dataHandler.ts
116
- function getCompletePath(item) {
116
+ var getCompletePath = (item) => {
117
117
  const menuUrl = item.openIndicator === "INNER_COMPONENT" ? item.componentPath : item.defaultUrl;
118
- return menuUrl ?? "";
119
- }
118
+ const path = item.prefix && item.openIndicator === "INNER_COMPONENT" ? `${item.prefix}${menuUrl}` : menuUrl ?? "";
119
+ return path;
120
+ };
120
121
  function getMenuName(item) {
121
122
  return item.resourceType !== "FOLDER" ? item.resourceName || "" : (item.showName ?? item.resourceName) || "";
122
123
  }
@@ -345,6 +346,104 @@ async function queryOrgCompanies(baseUrl, params) {
345
346
  );
346
347
  }
347
348
 
349
+ // src/utils/eventEmitter.ts
350
+ var EventEmitter = class {
351
+ constructor(allowedEvents) {
352
+ this.eventListeners = /* @__PURE__ */ new Map();
353
+ this.allowedEvents = new Set(allowedEvents || []);
354
+ }
355
+ /**
356
+ * Add event listener
357
+ */
358
+ listen(event, listener) {
359
+ if (this.allowedEvents.size > 0 && !this.allowedEvents.has(event)) {
360
+ const allowedEventsList = Array.from(this.allowedEvents).join(", ");
361
+ throw new Error(
362
+ `Event "${String(event)}" is not registered. Allowed events: ${allowedEventsList}`
363
+ );
364
+ }
365
+ if (!this.eventListeners.has(event)) {
366
+ this.eventListeners.set(event, /* @__PURE__ */ new Set());
367
+ }
368
+ const listeners = this.eventListeners.get(event);
369
+ listeners.add(listener);
370
+ return () => {
371
+ listeners.delete(listener);
372
+ if (listeners.size === 0) {
373
+ this.eventListeners.delete(event);
374
+ }
375
+ };
376
+ }
377
+ /**
378
+ * Remove event listener
379
+ */
380
+ unlisten(event, listener) {
381
+ const listeners = this.eventListeners.get(event);
382
+ if (listeners) {
383
+ listeners.delete(listener);
384
+ if (listeners.size === 0) {
385
+ this.eventListeners.delete(event);
386
+ }
387
+ }
388
+ }
389
+ /**
390
+ * Remove all listeners for a specific event or all events
391
+ */
392
+ unlistenAll(event) {
393
+ if (event) {
394
+ this.eventListeners.delete(event);
395
+ } else {
396
+ this.eventListeners.clear();
397
+ }
398
+ }
399
+ /**
400
+ * Emit event to all listeners
401
+ */
402
+ emit(event, data) {
403
+ const listeners = this.eventListeners.get(event);
404
+ if (listeners) {
405
+ listeners.forEach((listener) => {
406
+ try {
407
+ listener(data);
408
+ } catch (error) {
409
+ console.error(`Error in event listener for ${String(event)}:`, error);
410
+ }
411
+ });
412
+ }
413
+ }
414
+ /**
415
+ * Get the number of listeners for a specific event
416
+ */
417
+ getListenerCount(event) {
418
+ const listeners = this.eventListeners.get(event);
419
+ return listeners ? listeners.size : 0;
420
+ }
421
+ /**
422
+ * Check if there are any listeners for a specific event
423
+ */
424
+ hasListeners(event) {
425
+ return this.getListenerCount(event) > 0;
426
+ }
427
+ /**
428
+ * Get all registered event types
429
+ */
430
+ getEventTypes() {
431
+ return Array.from(this.eventListeners.keys());
432
+ }
433
+ /**
434
+ * Get all allowed event types
435
+ */
436
+ getAllowedEvents() {
437
+ return Array.from(this.allowedEvents);
438
+ }
439
+ /**
440
+ * Check if an event is allowed
441
+ */
442
+ isEventAllowed(event) {
443
+ return this.allowedEvents.size === 0 || this.allowedEvents.has(event);
444
+ }
445
+ };
446
+
348
447
  // src/permission.ts
349
448
  var DataHandler = {
350
449
  iterateOrgTree(orgTree) {
@@ -415,11 +514,59 @@ var Permission = class {
415
514
  this.widgetMap = {};
416
515
  this.menuList = [];
417
516
  this.menuMap = {};
517
+ // Event emitter instance - only allow tokenChange event
518
+ this.eventEmitter = new EventEmitter(["tokenChange"]);
418
519
  this.baseUrl = options.baseUrl;
419
520
  this.systemId = options.systemId;
420
521
  storage.setSystemId(this.systemId);
421
522
  storage.setVersion("1.0.0");
422
523
  }
524
+ /**
525
+ * Add event listener
526
+ */
527
+ listen(event, listener) {
528
+ try {
529
+ return this.eventEmitter.listen(event, listener);
530
+ } catch (error) {
531
+ if (error instanceof Error && error.message.includes("not registered")) {
532
+ const allowedEvents = this.eventEmitter.getAllowedEvents();
533
+ throw new Error(
534
+ `Permission event "${String(event)}" is not supported. Available events: ${allowedEvents.join(", ")}`
535
+ );
536
+ }
537
+ throw error;
538
+ }
539
+ }
540
+ /**
541
+ * Remove event listener
542
+ */
543
+ unlisten(event, listener) {
544
+ this.eventEmitter.unlisten(event, listener);
545
+ }
546
+ /**
547
+ * Remove all listeners for a specific event or all events
548
+ */
549
+ unlistenAll(event) {
550
+ this.eventEmitter.unlistenAll(event);
551
+ }
552
+ /**
553
+ * Emit event to all listeners
554
+ */
555
+ emit(event, data) {
556
+ this.eventEmitter.emit(event, data);
557
+ }
558
+ /**
559
+ * Get available events that can be listened to
560
+ */
561
+ getAvailableEvents() {
562
+ return this.eventEmitter.getAllowedEvents();
563
+ }
564
+ /**
565
+ * Check if an event is supported
566
+ */
567
+ isEventSupported(event) {
568
+ return this.eventEmitter.isEventAllowed(event);
569
+ }
423
570
  /**
424
571
  * Login using code from URL, save userInfo
425
572
  */
@@ -446,6 +593,7 @@ var Permission = class {
446
593
  const { token } = obj;
447
594
  url.searchParams.delete("code");
448
595
  storage.setItem(TOKEN_KEY, token);
596
+ this.emit("tokenChange", token);
449
597
  return token;
450
598
  }
451
599
  /**
@@ -457,6 +605,7 @@ var Permission = class {
457
605
  }
458
606
  clear() {
459
607
  storage.clear();
608
+ this.emit("tokenChange", "");
460
609
  }
461
610
  async getUserInfo() {
462
611
  const data = await getUserInfo(this.baseUrl);
@@ -568,6 +717,7 @@ var Permission = class {
568
717
  }
569
718
  setToken(token) {
570
719
  storage.setItem(TOKEN_KEY, token);
720
+ this.emit("tokenChange", token);
571
721
  }
572
722
  // --- Getters ---
573
723
  // get userInfo(): UserInfo | null {
@@ -679,6 +829,7 @@ export {
679
829
  DataHandler,
680
830
  EnumOrgQueryMode,
681
831
  EnumOrgQueryScope,
832
+ EventEmitter,
682
833
  Permission as OpmsPermission,
683
834
  getOrgTree,
684
835
  getUserInfo,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mu-cabin/opms-permission",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "description": "Frontend SDK for OPMS permission and auth management.",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",