@mu-cabin/opms-permission 0.8.35 → 0.9.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.
package/dist/index.cjs CHANGED
@@ -31,17 +31,48 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  DataHandler: () => DataHandler,
34
+ EnumOrgQueryMode: () => EnumOrgQueryMode,
35
+ EnumOrgQueryScope: () => EnumOrgQueryScope,
36
+ EventEmitter: () => EventEmitter,
34
37
  OpmsPermission: () => Permission,
38
+ getOrgTree: () => getOrgTree,
39
+ getUserInfo: () => getUserInfo,
40
+ getUserOrgTree: () => getUserOrgTree,
35
41
  jumpToSSOLogin: () => jumpToSSOLogin,
36
- jumpToSSOLogout: () => jumpToSSOLogout
42
+ jumpToSSOLogout: () => jumpToSSOLogout,
43
+ login: () => login,
44
+ logout: () => logout,
45
+ queryOrgCompanies: () => queryOrgCompanies,
46
+ queryResource: () => queryResource
37
47
  });
38
48
  module.exports = __toCommonJS(index_exports);
39
49
 
40
50
  // src/utils/storage.ts
41
51
  var Storage = class {
52
+ constructor() {
53
+ this.currentVersion = "1.0.0";
54
+ }
42
55
  setSystemId(systemId) {
43
56
  this.systemId = systemId;
44
57
  }
58
+ /**
59
+ * Set the current version for new data
60
+ * If version changes, all existing data for this systemId will be cleared
61
+ */
62
+ setVersion(version) {
63
+ if (this.currentVersion !== version) {
64
+ this.clear();
65
+ this.currentVersion = version;
66
+ } else {
67
+ this.currentVersion = version;
68
+ }
69
+ }
70
+ /**
71
+ * Get the current version
72
+ */
73
+ getVersion() {
74
+ return this.currentVersion;
75
+ }
45
76
  prefixKey(key) {
46
77
  return this.systemId !== void 0 ? `systemId-${this.systemId}-${key}` : key;
47
78
  }
@@ -51,24 +82,35 @@ var Storage = class {
51
82
  setItem(key, value, expireMinutes) {
52
83
  const data = {
53
84
  value,
54
- expire: expireMinutes ? Date.now() + expireMinutes * 60 * 1e3 : null
85
+ expire: expireMinutes ? Date.now() + expireMinutes * 60 * 1e3 : null,
86
+ version: this.currentVersion,
87
+ timestamp: Date.now()
55
88
  };
56
89
  localStorage.setItem(this.prefixKey(key), JSON.stringify(data));
57
90
  }
58
91
  /**
59
92
  * Get an item from localStorage, returns undefined if expired or not found
93
+ * Automatically expires data if version is different
60
94
  */
61
95
  getItem(key) {
62
96
  const raw = localStorage.getItem(this.prefixKey(key));
63
97
  if (!raw) return void 0;
64
98
  try {
65
99
  const data = JSON.parse(raw);
100
+ if (!data.version) {
101
+ data.version = "0.0.0";
102
+ }
66
103
  if (data.expire && Date.now() > data.expire) {
67
104
  localStorage.removeItem(this.prefixKey(key));
68
105
  return void 0;
69
106
  }
107
+ if (data.version !== this.currentVersion) {
108
+ localStorage.removeItem(this.prefixKey(key));
109
+ return void 0;
110
+ }
70
111
  return data.value;
71
- } catch {
112
+ } catch (error) {
113
+ console.error("Error parsing stored data:", error);
72
114
  return void 0;
73
115
  }
74
116
  }
@@ -78,6 +120,44 @@ var Storage = class {
78
120
  removeItem(key) {
79
121
  localStorage.removeItem(this.prefixKey(key));
80
122
  }
123
+ /**
124
+ * Clear all data for the current systemId
125
+ */
126
+ clear() {
127
+ if (this.systemId !== void 0) {
128
+ const prefix = `systemId-${this.systemId}-`;
129
+ Object.keys(localStorage).filter((key) => key.startsWith(prefix)).forEach((key) => localStorage.removeItem(key));
130
+ }
131
+ }
132
+ /**
133
+ * Get all keys for the current systemId
134
+ */
135
+ getKeys() {
136
+ if (this.systemId === void 0) {
137
+ return Object.keys(localStorage);
138
+ }
139
+ const prefix = `systemId-${this.systemId}-`;
140
+ return Object.keys(localStorage).filter((key) => key.startsWith(prefix)).map((key) => key.substring(prefix.length));
141
+ }
142
+ /**
143
+ * Check if a key exists
144
+ */
145
+ hasKey(key) {
146
+ return localStorage.getItem(this.prefixKey(key)) !== null;
147
+ }
148
+ /**
149
+ * Get storage info for debugging
150
+ */
151
+ getStorageInfo() {
152
+ const totalKeys = Object.keys(localStorage).length;
153
+ const systemKeys = this.getKeys().length;
154
+ return {
155
+ systemId: this.systemId,
156
+ currentVersion: this.currentVersion,
157
+ totalKeys,
158
+ systemKeys
159
+ };
160
+ }
81
161
  };
82
162
  var storage = new Storage();
83
163
 
@@ -233,8 +313,6 @@ var import_axios = __toESM(require("axios"));
233
313
  var USER_INFO_KEY = "opms_user_info";
234
314
  var RESOURCE_KEY = "opms_resources";
235
315
  var TOKEN_KEY = "omps_authorization";
236
- var ORG_COMPANY_KEY = "opms_org_company";
237
- var USER_ORG_KEY = "opms_user_org";
238
316
 
239
317
  // src/api.ts
240
318
  var axiosClient = import_axios.default.create();
@@ -261,6 +339,17 @@ axiosClient.interceptors.response.use(
261
339
  return Promise.reject(error);
262
340
  }
263
341
  );
342
+ var EnumOrgQueryMode = /* @__PURE__ */ ((EnumOrgQueryMode2) => {
343
+ EnumOrgQueryMode2["BY_ROLES"] = "BY_ROLES";
344
+ EnumOrgQueryMode2["BY_DEPT"] = "BY_DEPT";
345
+ return EnumOrgQueryMode2;
346
+ })(EnumOrgQueryMode || {});
347
+ var EnumOrgQueryScope = /* @__PURE__ */ ((EnumOrgQueryScope2) => {
348
+ EnumOrgQueryScope2["ONLY_BRANCH"] = "ONLY_BRANCH";
349
+ EnumOrgQueryScope2["STEWARD_UNIT"] = "STEWARD_UNIT";
350
+ EnumOrgQueryScope2["WITH_DEPARTMENT"] = "WITH_DEPARTMENT";
351
+ return EnumOrgQueryScope2;
352
+ })(EnumOrgQueryScope || {});
264
353
  async function login(baseUrl, authorizationCode) {
265
354
  return await axiosClient.get(
266
355
  `${baseUrl}/opmsDefaultAuth/oauthLogin`,
@@ -286,9 +375,16 @@ async function queryResource(baseUrl, params) {
286
375
  params
287
376
  );
288
377
  }
289
- async function getUserOrgTree(baseUrl) {
378
+ async function getOrgTree(baseUrl, params) {
290
379
  return await axiosClient.post(
291
- `${baseUrl}/user/orgTree`
380
+ `${baseUrl}/opmsDefaultUser/orgTree`,
381
+ params
382
+ );
383
+ }
384
+ async function getUserOrgTree(baseUrl, params) {
385
+ return await axiosClient.post(
386
+ `${baseUrl}/opmsDefaultUser/userOrgTree`,
387
+ params
292
388
  );
293
389
  }
294
390
  async function queryOrgCompanies(baseUrl, params) {
@@ -298,6 +394,104 @@ async function queryOrgCompanies(baseUrl, params) {
298
394
  );
299
395
  }
300
396
 
397
+ // src/utils/eventEmitter.ts
398
+ var EventEmitter = class {
399
+ constructor(allowedEvents) {
400
+ this.eventListeners = /* @__PURE__ */ new Map();
401
+ this.allowedEvents = new Set(allowedEvents || []);
402
+ }
403
+ /**
404
+ * Add event listener
405
+ */
406
+ listen(event, listener) {
407
+ if (this.allowedEvents.size > 0 && !this.allowedEvents.has(event)) {
408
+ const allowedEventsList = Array.from(this.allowedEvents).join(", ");
409
+ throw new Error(
410
+ `Event "${String(event)}" is not registered. Allowed events: ${allowedEventsList}`
411
+ );
412
+ }
413
+ if (!this.eventListeners.has(event)) {
414
+ this.eventListeners.set(event, /* @__PURE__ */ new Set());
415
+ }
416
+ const listeners = this.eventListeners.get(event);
417
+ listeners.add(listener);
418
+ return () => {
419
+ listeners.delete(listener);
420
+ if (listeners.size === 0) {
421
+ this.eventListeners.delete(event);
422
+ }
423
+ };
424
+ }
425
+ /**
426
+ * Remove event listener
427
+ */
428
+ unlisten(event, listener) {
429
+ const listeners = this.eventListeners.get(event);
430
+ if (listeners) {
431
+ listeners.delete(listener);
432
+ if (listeners.size === 0) {
433
+ this.eventListeners.delete(event);
434
+ }
435
+ }
436
+ }
437
+ /**
438
+ * Remove all listeners for a specific event or all events
439
+ */
440
+ unlistenAll(event) {
441
+ if (event) {
442
+ this.eventListeners.delete(event);
443
+ } else {
444
+ this.eventListeners.clear();
445
+ }
446
+ }
447
+ /**
448
+ * Emit event to all listeners
449
+ */
450
+ emit(event, data) {
451
+ const listeners = this.eventListeners.get(event);
452
+ if (listeners) {
453
+ listeners.forEach((listener) => {
454
+ try {
455
+ listener(data);
456
+ } catch (error) {
457
+ console.error(`Error in event listener for ${String(event)}:`, error);
458
+ }
459
+ });
460
+ }
461
+ }
462
+ /**
463
+ * Get the number of listeners for a specific event
464
+ */
465
+ getListenerCount(event) {
466
+ const listeners = this.eventListeners.get(event);
467
+ return listeners ? listeners.size : 0;
468
+ }
469
+ /**
470
+ * Check if there are any listeners for a specific event
471
+ */
472
+ hasListeners(event) {
473
+ return this.getListenerCount(event) > 0;
474
+ }
475
+ /**
476
+ * Get all registered event types
477
+ */
478
+ getEventTypes() {
479
+ return Array.from(this.eventListeners.keys());
480
+ }
481
+ /**
482
+ * Get all allowed event types
483
+ */
484
+ getAllowedEvents() {
485
+ return Array.from(this.allowedEvents);
486
+ }
487
+ /**
488
+ * Check if an event is allowed
489
+ */
490
+ isEventAllowed(event) {
491
+ return this.allowedEvents.size === 0 || this.allowedEvents.has(event);
492
+ }
493
+ };
494
+
301
495
  // src/permission.ts
302
496
  var DataHandler = {
303
497
  iterateOrgTree(orgTree) {
@@ -363,16 +557,63 @@ var DataHandler = {
363
557
  var Permission = class {
364
558
  constructor(options) {
365
559
  this._userInfo = null;
366
- this._orgTree = null;
367
- this._orgCompany = null;
368
560
  this.resources = [];
369
561
  this.resourceMap = {};
370
562
  this.widgetMap = {};
371
563
  this.menuList = [];
372
564
  this.menuMap = {};
565
+ // Event emitter instance - only allow tokenChange event
566
+ this.eventEmitter = new EventEmitter(["tokenChange"]);
373
567
  this.baseUrl = options.baseUrl;
374
568
  this.systemId = options.systemId;
375
569
  storage.setSystemId(this.systemId);
570
+ storage.setVersion("1.0.0");
571
+ }
572
+ /**
573
+ * Add event listener
574
+ */
575
+ listen(event, listener) {
576
+ try {
577
+ return this.eventEmitter.listen(event, listener);
578
+ } catch (error) {
579
+ if (error instanceof Error && error.message.includes("not registered")) {
580
+ const allowedEvents = this.eventEmitter.getAllowedEvents();
581
+ throw new Error(
582
+ `Permission event "${String(event)}" is not supported. Available events: ${allowedEvents.join(", ")}`
583
+ );
584
+ }
585
+ throw error;
586
+ }
587
+ }
588
+ /**
589
+ * Remove event listener
590
+ */
591
+ unlisten(event, listener) {
592
+ this.eventEmitter.unlisten(event, listener);
593
+ }
594
+ /**
595
+ * Remove all listeners for a specific event or all events
596
+ */
597
+ unlistenAll(event) {
598
+ this.eventEmitter.unlistenAll(event);
599
+ }
600
+ /**
601
+ * Emit event to all listeners
602
+ */
603
+ emit(event, data) {
604
+ this.eventEmitter.emit(event, data);
605
+ }
606
+ /**
607
+ * Get available events that can be listened to
608
+ */
609
+ getAvailableEvents() {
610
+ return this.eventEmitter.getAllowedEvents();
611
+ }
612
+ /**
613
+ * Check if an event is supported
614
+ */
615
+ isEventSupported(event) {
616
+ return this.eventEmitter.isEventAllowed(event);
376
617
  }
377
618
  /**
378
619
  * Login using code from URL, save userInfo
@@ -400,6 +641,7 @@ var Permission = class {
400
641
  const { token } = obj;
401
642
  url.searchParams.delete("code");
402
643
  storage.setItem(TOKEN_KEY, token);
644
+ this.emit("tokenChange", token);
403
645
  return token;
404
646
  }
405
647
  /**
@@ -410,25 +652,13 @@ var Permission = class {
410
652
  clearData && this.clear();
411
653
  }
412
654
  clear() {
413
- this._userInfo = null;
414
- this._orgTree = null;
415
- this._orgCompany = null;
416
- this.resources = [];
417
- this.resourceMap = {};
418
- this.widgetMap = {};
419
- this.menuList = [];
420
- this.menuMap = {};
421
- storage.removeItem(RESOURCE_KEY);
422
- storage.removeItem(TOKEN_KEY);
423
- storage.removeItem(USER_INFO_KEY);
424
- storage.removeItem(ORG_COMPANY_KEY);
425
- storage.removeItem(USER_ORG_KEY);
655
+ storage.clear();
656
+ this.emit("tokenChange", "");
426
657
  }
427
658
  async getUserInfo() {
428
659
  const data = await getUserInfo(this.baseUrl);
429
660
  const { obj, success, msg, code } = data;
430
- this._userInfo = obj;
431
- return this.userInfo;
661
+ return obj;
432
662
  }
433
663
  /**
434
664
  * Get resources and process to menuList, menuMap, widgetMap (matches app store logic)
@@ -449,17 +679,12 @@ var Permission = class {
449
679
  storage.setItem(
450
680
  RESOURCE_KEY,
451
681
  resources,
452
- 60 * 24
453
- // 24 hours
682
+ 60 * 12
683
+ // 12 hours
454
684
  );
455
685
  }
456
686
  const { resourceMap, widgetMap } = createResourceMap(resources);
457
687
  const { menuList, menuMap } = createMenuList(resources);
458
- this.resources = resources;
459
- this.resourceMap = resourceMap;
460
- this.widgetMap = widgetMap;
461
- this.menuList = menuList;
462
- this.menuMap = menuMap;
463
688
  return {
464
689
  resources,
465
690
  resourceMap,
@@ -469,13 +694,28 @@ var Permission = class {
469
694
  };
470
695
  }
471
696
  /**
472
- * Query and process organization tree
697
+ * Generate cache key for user orgs query
473
698
  */
474
- async queryUserOrgs() {
699
+ generateUserOrgsCacheKey(params) {
700
+ const sortedParams = Object.keys(params).sort().reduce((acc, key) => {
701
+ acc[key] = params[key];
702
+ return acc;
703
+ }, {});
704
+ return `user_orgs_${JSON.stringify(sortedParams)}`;
705
+ }
706
+ /**
707
+ * Query and process organization tree with caching
708
+ */
709
+ async queryUserOrgs(params, config = { force: false, cacheTimeout: 2 }) {
475
710
  try {
476
- let orgTreeData = storage.getItem(USER_ORG_KEY) || null;
711
+ const { force, cacheTimeout = 2 } = config;
712
+ let orgTreeData = null;
713
+ if (!force) {
714
+ const cacheKey = this.generateUserOrgsCacheKey(params);
715
+ orgTreeData = storage.getItem(cacheKey) || null;
716
+ }
477
717
  if (!orgTreeData) {
478
- const res = await getUserOrgTree(this.baseUrl);
718
+ const res = await getUserOrgTree(this.baseUrl, params);
479
719
  const { obj } = res;
480
720
  orgTreeData = iterateNestedArray(obj, (item) => {
481
721
  return {
@@ -490,33 +730,33 @@ var Permission = class {
490
730
  orgId: item.orgId
491
731
  };
492
732
  });
493
- storage.setItem(USER_ORG_KEY, orgTreeData);
733
+ const cacheKey = this.generateUserOrgsCacheKey(params);
734
+ storage.setItem(cacheKey, orgTreeData, cacheTimeout);
494
735
  }
495
736
  const data = handlePermissionTree(orgTreeData, "orgId");
496
- const { noAuthMap } = data;
497
- let { tree } = data;
498
- if (tree.length === 1 && tree[0].orgType === "HEAD" && tree[0].disabled) {
499
- tree = tree[0].children || [];
500
- }
501
- this._orgTree = orgTreeData;
502
- return { orgTree: orgTreeData, orgNoAuthMap: noAuthMap, authOrgTree: tree };
737
+ const { tree } = data;
738
+ return {
739
+ orgTree: tree
740
+ // orgNoAuthMap: noAuthMap,
741
+ // authOrgTree: tree,
742
+ };
503
743
  } catch (error) {
504
744
  console.log(error);
505
745
  return null;
506
746
  }
507
747
  }
508
- async queryCompanies() {
509
- let orgCompanyList = storage.getItem(ORG_COMPANY_KEY);
510
- if (!orgCompanyList) {
511
- const { obj } = await queryOrgCompanies(this.baseUrl, {
512
- queryAllBranches: true
513
- });
514
- orgCompanyList = obj;
515
- storage.setItem(ORG_COMPANY_KEY, orgCompanyList);
516
- }
517
- this._orgCompany = orgCompanyList;
518
- return orgCompanyList;
519
- }
748
+ // async queryCompanies(): Promise<OrgRecord[]> {
749
+ // let orgCompanyList: OrgRecord[] | undefined =
750
+ // storage.getItem(ORG_COMPANY_KEY);
751
+ // if (!orgCompanyList) {
752
+ // const { obj } = await queryOrgCompanies(this.baseUrl, {
753
+ // queryAllBranches: true,
754
+ // });
755
+ // orgCompanyList = obj;
756
+ // storage.setItem(ORG_COMPANY_KEY, orgCompanyList);
757
+ // }
758
+ // return orgCompanyList;
759
+ // }
520
760
  isLogin() {
521
761
  return !!storage.getItem(TOKEN_KEY);
522
762
  }
@@ -525,72 +765,77 @@ var Permission = class {
525
765
  }
526
766
  setToken(token) {
527
767
  storage.setItem(TOKEN_KEY, token);
768
+ this.emit("tokenChange", token);
528
769
  }
529
770
  // --- Getters ---
530
- get userInfo() {
531
- if (!this._userInfo) {
532
- this._userInfo = storage.getItem(USER_INFO_KEY);
533
- }
534
- if (!this._userInfo) return null;
535
- const { account, name, ehrId, crewCode, crewId } = this._userInfo;
536
- return { account, name, ehrId, crewCode, crewId };
537
- }
538
- get hasRootAuth() {
539
- const orgs = this._userInfo?.organizations || [];
540
- const first = orgs[0];
541
- if (!first) return false;
542
- return first.searchPath === "#1";
543
- }
544
- get userOrganizations() {
545
- return this._userInfo?.userOrganizations || [];
546
- }
547
- get allCompanyOptions() {
548
- const orgCompany = this._orgCompany;
549
- if (!orgCompany) return [];
550
- const list = orgCompany.map((v) => ({
551
- label: v.orgName,
552
- value: v.orgCode
553
- }));
554
- list.unshift({ label: "\u5168\u516C\u53F8", value: "EA" });
555
- return list;
556
- }
557
- get companyOptions() {
558
- const orgTree = this._orgTree;
559
- if (!orgTree) return [];
560
- const list = orgTree.map(({ children, ...others }) => ({
561
- ...others,
562
- disabled: false
563
- }));
564
- if (this.hasRootAuth) {
565
- list.unshift({ ...orgTree, label: "\u5168\u516C\u53F8", children: [] });
566
- }
567
- return list;
568
- }
569
- get firstCompanyOrgCode() {
570
- return this.companyOptions?.[0]?.value ?? "";
771
+ // get userInfo(): UserInfo | null {
772
+ // if (!this._userInfo) {
773
+ // this._userInfo = storage.getItem(USER_INFO_KEY);
774
+ // }
775
+ // if (!this._userInfo) return null;
776
+ // const { account, name, ehrId, crewCode, crewId } = this._userInfo;
777
+ // return { account, name, ehrId, crewCode, crewId };
778
+ // }
779
+ // get hasRootAuth() {
780
+ // const orgs = this._userInfo?.organizations || [];
781
+ // const first = orgs[0];
782
+ // if (!first) return false;
783
+ // return first.searchPath === '#1';
784
+ // }
785
+ // get userOrganizations(): UserOrganization[] {
786
+ // return this._userInfo?.userOrganizations || [];
787
+ // }
788
+ /**
789
+ * Get storage information for debugging and monitoring
790
+ */
791
+ getStorageInfo() {
792
+ const keys = storage.getKeys();
793
+ const userOrgsCacheKeys = keys.filter((key) => key.startsWith("user_orgs_"));
794
+ return {
795
+ ...storage.getStorageInfo(),
796
+ permissionKeys: {
797
+ resourceKey: RESOURCE_KEY,
798
+ tokenKey: TOKEN_KEY,
799
+ userInfoKey: USER_INFO_KEY
800
+ },
801
+ hasData: {
802
+ resources: storage.hasKey(RESOURCE_KEY),
803
+ token: storage.hasKey(TOKEN_KEY),
804
+ userInfo: storage.hasKey(USER_INFO_KEY)
805
+ },
806
+ cacheInfo: {
807
+ userOrgsCacheCount: userOrgsCacheKeys.length,
808
+ userOrgsCacheKeys
809
+ }
810
+ };
571
811
  }
572
- get unitOptions() {
573
- const orgTree = this._orgTree;
574
- if (!orgTree) return [];
575
- return orgTree;
812
+ /**
813
+ * Get current storage version
814
+ */
815
+ getStorageVersion() {
816
+ return storage.getVersion();
576
817
  }
577
- get allUnitOptions() {
578
- const orgTree = this._orgTree;
579
- if (!orgTree) return [];
580
- return DataHandler.getAllUnitOptions(orgTree);
818
+ /**
819
+ * Clear all storage data for this system
820
+ */
821
+ clearStorage() {
822
+ storage.clear();
581
823
  }
582
- get firstUnitOrgCode() {
583
- if (this.hasRootAuth) {
584
- return this.companyOptions[1]?.value ?? "";
824
+ /**
825
+ * Clear user orgs cache for specific parameters or all
826
+ */
827
+ clearUserOrgsCache(params) {
828
+ if (params) {
829
+ const cacheKey = this.generateUserOrgsCacheKey(params);
830
+ storage.removeItem(cacheKey);
831
+ } else {
832
+ const keys = storage.getKeys();
833
+ keys.forEach((key) => {
834
+ if (key.startsWith("user_orgs_")) {
835
+ storage.removeItem(key);
836
+ }
837
+ });
585
838
  }
586
- const orgTree = this._orgTree;
587
- if (!orgTree) return "";
588
- return findFirstEnableCode(orgTree) ?? "";
589
- }
590
- get topLevelUnitOrgCodes() {
591
- const orgTree = this._orgTree;
592
- if (!orgTree) return [];
593
- return DataHandler.topLevelUnitOrgCodes(orgTree);
594
839
  }
595
840
  };
596
841
 
@@ -631,7 +876,17 @@ function jumpToSSOLogout({
631
876
  // Annotate the CommonJS export names for ESM import in node:
632
877
  0 && (module.exports = {
633
878
  DataHandler,
879
+ EnumOrgQueryMode,
880
+ EnumOrgQueryScope,
881
+ EventEmitter,
634
882
  OpmsPermission,
883
+ getOrgTree,
884
+ getUserInfo,
885
+ getUserOrgTree,
635
886
  jumpToSSOLogin,
636
- jumpToSSOLogout
887
+ jumpToSSOLogout,
888
+ login,
889
+ logout,
890
+ queryOrgCompanies,
891
+ queryResource
637
892
  });