@authup/client-web-kit 1.0.0-beta.21 → 1.0.0-beta.22

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 (57) hide show
  1. package/dist/components/client/AClient.d.ts +1 -1
  2. package/dist/components/client/AClientForm.d.ts +2 -2
  3. package/dist/components/client-scope/AClientScope.d.ts +1 -1
  4. package/dist/components/client-scope/AClientScopeAssignment.d.ts +1 -1
  5. package/dist/components/identity-provider/AIdentityProvider.d.ts +1 -1
  6. package/dist/components/identity-provider/AIdentityProviderForm.d.ts.map +1 -1
  7. package/dist/components/identity-provider/AIdentityProviderLdapForm.d.ts +1 -1
  8. package/dist/components/identity-provider/AIdentityProviderOAuth2Form.d.ts +1 -1
  9. package/dist/components/identity-provider/AIdentityProviderPicker.vue.d.ts +56 -0
  10. package/dist/components/identity-provider/AIdentityProviderPicker.vue.d.ts.map +1 -0
  11. package/dist/components/identity-provider-role/AIdentityProviderRoleAssignment.d.ts +1 -1
  12. package/dist/components/permission/APermission.d.ts +1 -1
  13. package/dist/components/permission/APermissionForm.d.ts +1 -1
  14. package/dist/components/realm/ARealm.d.ts +1 -1
  15. package/dist/components/realm/ARealmForm.d.ts +1 -1
  16. package/dist/components/robot/ARobot.d.ts +1 -1
  17. package/dist/components/robot/ARobotForm.d.ts +2 -2
  18. package/dist/components/robot-permission/ARobotPermissionAssignment.d.ts +1 -1
  19. package/dist/components/robot-role/ARobotRoleAssignment.d.ts +1 -1
  20. package/dist/components/role/ARole.d.ts +1 -1
  21. package/dist/components/role/ARoleForm.d.ts +1 -1
  22. package/dist/components/role-permission/ARolePermissionAssignment.d.ts +1 -1
  23. package/dist/components/scope/AScope.d.ts +1 -1
  24. package/dist/components/scope/AScopeForm.d.ts +1 -1
  25. package/dist/components/user/AUser.d.ts +1 -1
  26. package/dist/components/user/AUserForm.d.ts +1 -1
  27. package/dist/components/user-permission/AUserPermissionAssignment.d.ts +1 -1
  28. package/dist/components/user-role/AUserRoleAssignment.d.ts +1 -1
  29. package/dist/core/http-client/install.d.ts.map +1 -1
  30. package/dist/core/list/module.d.ts.map +1 -1
  31. package/dist/core/store/create.d.ts +14 -13
  32. package/dist/core/store/create.d.ts.map +1 -1
  33. package/dist/core/store/dispatcher/constants.d.ts +15 -0
  34. package/dist/core/store/dispatcher/constants.d.ts.map +1 -0
  35. package/dist/core/store/dispatcher/index.d.ts +5 -0
  36. package/dist/core/store/dispatcher/index.d.ts.map +1 -0
  37. package/dist/core/store/dispatcher/module.d.ts +3 -0
  38. package/dist/core/store/dispatcher/module.d.ts.map +1 -0
  39. package/dist/core/store/dispatcher/singleton.d.ts +5 -0
  40. package/dist/core/store/dispatcher/singleton.d.ts.map +1 -0
  41. package/dist/core/store/dispatcher/types.d.ts +23 -0
  42. package/dist/core/store/dispatcher/types.d.ts.map +1 -0
  43. package/dist/core/store/index.d.ts +1 -0
  44. package/dist/core/store/index.d.ts.map +1 -1
  45. package/dist/core/store/install.d.ts.map +1 -1
  46. package/dist/core/store/singleton.d.ts +0 -1
  47. package/dist/core/store/singleton.d.ts.map +1 -1
  48. package/dist/core/store/types.d.ts +2 -4
  49. package/dist/core/store/types.d.ts.map +1 -1
  50. package/dist/index.cjs +385 -209
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.css +15 -0
  53. package/dist/index.mjs +383 -210
  54. package/dist/index.mjs.map +1 -1
  55. package/package.json +21 -19
  56. package/dist/components/identity-provider/AIdentityProviderPicker.d.ts +0 -18
  57. package/dist/components/identity-provider/AIdentityProviderPicker.d.ts.map +0 -1
package/dist/index.cjs CHANGED
@@ -94,6 +94,91 @@ class PolicyEngine extends kit.PolicyEngine {
94
94
  }
95
95
  }
96
96
 
97
+ /*
98
+ * Copyright (c) 2024.
99
+ * Author Peter Placzek (tada5hi)
100
+ * For the full copyright and license information,
101
+ * view the LICENSE file that was distributed with this source code.
102
+ */ var StoreDispatcherEventName = /*#__PURE__*/ function(StoreDispatcherEventName) {
103
+ StoreDispatcherEventName["LOGGING_IN"] = "loggingIn";
104
+ StoreDispatcherEventName["LOGGED_IN"] = "loggedIn";
105
+ StoreDispatcherEventName["LOGGING_OUT"] = "loggingOut";
106
+ StoreDispatcherEventName["LOGGED_OUT"] = "loggedOut";
107
+ StoreDispatcherEventName["RESOLVING"] = "resolving";
108
+ StoreDispatcherEventName["RESOLVED"] = "resolved";
109
+ StoreDispatcherEventName["ACCESS_TOKEN_UPDATED"] = "accessTokenUpdated";
110
+ StoreDispatcherEventName["ACCESS_TOKEN_EXPIRE_DATE_UPDATED"] = "accessTokenExpireDateUpdated";
111
+ StoreDispatcherEventName["REFRESH_TOKEN_UPDATED"] = "refreshTokenUpdated";
112
+ StoreDispatcherEventName["USER_UPDATED"] = "userUpdated";
113
+ StoreDispatcherEventName["REALM_UPDATED"] = "realmUpdated";
114
+ StoreDispatcherEventName["REALM_MANAGEMENT_UPDATED"] = "realmManagementUpdated";
115
+ return StoreDispatcherEventName;
116
+ }({});
117
+
118
+ // src/event-emitter.ts
119
+ var EventEmitter = class {
120
+ on(type, handler) {
121
+ if (!this.all.has(type)) {
122
+ this.all.set(type, []);
123
+ }
124
+ const handlers = this.all.get(type);
125
+ handlers.push(handler);
126
+ return ()=>handlers.splice(handlers.indexOf(handler) >>> 0, 1);
127
+ }
128
+ off(type, handler) {
129
+ if (!type) {
130
+ return this.all.clear();
131
+ }
132
+ const handlers = this.all.get(type);
133
+ if (handlers) {
134
+ if (handler) {
135
+ handlers.splice(handlers.indexOf(handler) >>> 0, 1);
136
+ } else {
137
+ this.all.delete(type);
138
+ }
139
+ }
140
+ }
141
+ /**
142
+ * Invoke all handlers for the given type.
143
+ * If present, `'*'` handlers are invoked after type-matched handlers.
144
+ *
145
+ * Note: Manually firing `'*'` handlers is not supported.
146
+ *
147
+ * @param type The event type to invoke
148
+ * @param payload Any value to each handler
149
+ */ emit(type, ...payload) {
150
+ let handlers = this.all.get(type);
151
+ handlers?.slice().map((handler)=>{
152
+ handler(...payload);
153
+ });
154
+ handlers = this.all.get("*");
155
+ if (handlers) {
156
+ handlers.slice().map((handler)=>{
157
+ handler(type, payload);
158
+ });
159
+ }
160
+ }
161
+ constructor(all){
162
+ this.all = all || /* @__PURE__ */ new Map();
163
+ }
164
+ };
165
+
166
+ function createStoreDispatcher() {
167
+ return new EventEmitter();
168
+ }
169
+
170
+ const sym$1 = Symbol.for('AuthupStoreEventBus');
171
+ function injectStoreDispatcher(app) {
172
+ const instance = inject$1(sym$1, app);
173
+ if (!instance) {
174
+ throw new Error('The store dispatcher has not been injected in the app context.');
175
+ }
176
+ return instance;
177
+ }
178
+ function provideStoreDispatcher(eventBus, app) {
179
+ provide(sym$1, eventBus, app);
180
+ }
181
+
97
182
  function createPromiseShareWrapperFn(fn) {
98
183
  let promise;
99
184
  return (...args)=>{
@@ -111,41 +196,45 @@ function createPromiseShareWrapperFn(fn) {
111
196
  return promise;
112
197
  };
113
198
  }
114
- function createStore(context = {}) {
199
+ function createStore(context) {
115
200
  const client = new coreHttpKit.Client({
116
201
  baseURL: context.baseURL
117
202
  });
118
- const initialized = vue.ref(false);
119
- const setInitialized = (value)=>{
120
- initialized.value = value;
203
+ const cookiesRead = vue.ref(false);
204
+ const setCookiesRead = (value)=>{
205
+ cookiesRead.value = value;
121
206
  };
122
207
  // --------------------------------------------------------------------
123
- const accessToken = vue.ref(undefined);
208
+ const accessToken = vue.ref(null);
124
209
  const setAccessToken = (input)=>{
125
210
  accessToken.value = input;
211
+ context.dispatcher.emit(StoreDispatcherEventName.ACCESS_TOKEN_UPDATED, input);
126
212
  };
127
213
  // --------------------------------------------------------------------
128
- const accessTokenExpireDate = vue.ref(undefined);
214
+ const accessTokenExpireDate = vue.ref(null);
129
215
  const setAccessTokenExpireDate = (input)=>{
130
216
  if (typeof input === 'number' || typeof input === 'string') {
131
217
  accessTokenExpireDate.value = new Date(input); // verify microseconds or seconds
132
- return;
218
+ } else {
219
+ accessTokenExpireDate.value = input;
133
220
  }
134
- accessTokenExpireDate.value = input;
221
+ context.dispatcher.emit(StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED, accessTokenExpireDate.value);
135
222
  };
136
223
  // --------------------------------------------------------------------
137
- const refreshToken = vue.ref(undefined);
224
+ const refreshToken = vue.ref(null);
138
225
  const setRefreshToken = (input)=>{
139
226
  refreshToken.value = input;
227
+ context.dispatcher.emit(StoreDispatcherEventName.REFRESH_TOKEN_UPDATED, input);
140
228
  };
141
229
  // --------------------------------------------------------------------
142
- const user = vue.ref(undefined);
143
- const userId = vue.computed(()=>user.value ? user.value.id : undefined);
144
- const setUser = (entity)=>{
145
- user.value = entity;
230
+ const user = vue.ref(null);
231
+ const userId = vue.computed(()=>user.value ? user.value.id : null);
232
+ const setUser = (input)=>{
233
+ user.value = input;
234
+ context.dispatcher.emit(StoreDispatcherEventName.USER_UPDATED, input);
146
235
  };
147
236
  // --------------------------------------------------------------------
148
- const realm = vue.ref(undefined);
237
+ const realm = vue.ref(null);
149
238
  const realmId = vue.computed(()=>realm.value ? realm.value.id : undefined);
150
239
  const realmName = vue.computed(()=>realm.value ? realm.value.name : undefined);
151
240
  const realmIsRoot = vue.computed(()=>{
@@ -154,14 +243,16 @@ function createStore(context = {}) {
154
243
  }
155
244
  return false;
156
245
  });
157
- const setRealm = (entity)=>{
158
- realm.value = entity;
246
+ const setRealm = (input)=>{
247
+ realm.value = input;
248
+ context.dispatcher.emit(StoreDispatcherEventName.REALM_UPDATED, input);
159
249
  };
160
- const realmManagement = vue.ref(undefined);
250
+ const realmManagement = vue.ref(null);
161
251
  const realmManagementId = vue.computed(()=>realmManagement.value ? realmManagement.value.id : realmId.value);
162
252
  const realmManagementName = vue.computed(()=>realmManagement.value ? realmManagement.value.name : realmName.value);
163
- const setRealmManagement = (entity)=>{
164
- realmManagement.value = entity;
253
+ const setRealmManagement = (input)=>{
254
+ realmManagement.value = input;
255
+ context.dispatcher.emit(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, input);
165
256
  };
166
257
  // --------------------------------------------------------------------
167
258
  const permissionRepository = new kit.PermissionMemoryProvider();
@@ -214,11 +305,15 @@ function createStore(context = {}) {
214
305
  });
215
306
  };
216
307
  // --------------------------------------------------------------------
217
- const handleTokenGrantResponse = (response)=>{
308
+ const applyTokenGrantResponse = (response)=>{
218
309
  const expireDate = new Date(Date.now() + response.expires_in * 1000);
219
310
  setAccessTokenExpireDate(expireDate);
220
311
  setAccessToken(response.access_token);
221
- setRefreshToken(response.refresh_token);
312
+ if (response.refresh_token) {
313
+ setRefreshToken(response.refresh_token);
314
+ } else {
315
+ setRefreshToken(null);
316
+ }
222
317
  };
223
318
  // --------------------------------------------------------------------
224
319
  const refreshSession = createPromiseShareWrapperFn(async ()=>{
@@ -227,8 +322,8 @@ function createStore(context = {}) {
227
322
  }
228
323
  return client.token.createWithRefreshToken({
229
324
  refresh_token: refreshToken.value
230
- }).then((r)=>handleTokenGrantResponse(r)).catch((e)=>{
231
- logout();
325
+ }).then((r)=>applyTokenGrantResponse(r)).catch((e)=>{
326
+ reset();
232
327
  return Promise.reject(e);
233
328
  }).finally(()=>{
234
329
  tokenResolved.value = false;
@@ -237,6 +332,7 @@ function createStore(context = {}) {
237
332
  });
238
333
  // --------------------------------------------------------------------
239
334
  const resolveInternal = async ()=>{
335
+ context.dispatcher.emit(StoreDispatcherEventName.RESOLVING);
240
336
  try {
241
337
  if (!accessToken.value && refreshToken.value) {
242
338
  await refreshSession();
@@ -254,45 +350,72 @@ function createStore(context = {}) {
254
350
  }
255
351
  throw e;
256
352
  }
353
+ context.dispatcher.emit(StoreDispatcherEventName.RESOLVED);
257
354
  return Promise.resolve();
258
355
  };
259
356
  const resolve = createPromiseShareWrapperFn(resolveInternal);
260
357
  const loggedIn = vue.computed(()=>!!accessToken.value);
261
358
  const login = async (ctx)=>{
359
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGING_IN);
360
+ const response = await client.token.createWithPasswordGrant({
361
+ username: ctx.name,
362
+ password: ctx.password,
363
+ ...realmId.value ? {
364
+ realm_id: ctx.realmId
365
+ } : {}
366
+ });
367
+ applyTokenGrantResponse(response);
262
368
  try {
263
- const response = await client.token.createWithPasswordGrant({
264
- username: ctx.name,
265
- password: ctx.password,
266
- ...realmId.value ? {
267
- realm_id: ctx.realmId
268
- } : {}
269
- });
270
- handleTokenGrantResponse(response);
271
369
  await resolve();
272
370
  } catch (e) {
273
- logout();
371
+ await logout();
274
372
  throw e;
275
373
  }
374
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGED_IN);
276
375
  };
277
- const logout = ()=>{
278
- setAccessToken(undefined);
279
- setAccessTokenExpireDate(undefined);
280
- setRefreshToken(undefined);
281
- setUser(undefined);
282
- setRealm(undefined);
283
- setRealmManagement(undefined);
376
+ const reset = ()=>{
377
+ setAccessToken(null);
378
+ setAccessTokenExpireDate(null);
379
+ setRefreshToken(null);
380
+ setUser(null);
381
+ setRealm(null);
382
+ setRealmManagement(null);
383
+ permissionRepository.setMany([]);
284
384
  tokenResolved.value = false;
285
385
  userResolved.value = false;
286
386
  };
387
+ const logout = async ()=>{
388
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGING_OUT);
389
+ try {
390
+ if (accessToken.value) {
391
+ await client.token.revoke({
392
+ token: accessToken.value
393
+ });
394
+ }
395
+ } catch (e) {
396
+ // ...
397
+ }
398
+ try {
399
+ if (refreshToken.value) {
400
+ await client.token.revoke({
401
+ token: refreshToken.value
402
+ });
403
+ }
404
+ } catch (e) {
405
+ // ...
406
+ }
407
+ reset();
408
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGED_OUT);
409
+ };
287
410
  return {
288
- initialized,
289
- setInitialized,
411
+ cookiesRead,
412
+ setCookiesRead,
290
413
  permissionChecker,
291
414
  login,
292
415
  logout,
293
416
  loggedIn,
294
417
  resolve,
295
- handleTokenGrantResponse,
418
+ applyTokenGrantResponse,
296
419
  accessToken,
297
420
  setAccessToken,
298
421
  accessTokenExpireDate,
@@ -379,7 +502,7 @@ function shouldUpdate(dependencies, newCookies, oldCookies) {
379
502
  return false;
380
503
  }
381
504
 
382
- const StoreSymbol = Symbol.for('AuthupStore');
505
+ const sym = Symbol.for('AuthupStore');
383
506
  function useStore(pinia, app) {
384
507
  const instance = injectStoreFactory(app);
385
508
  if (!instance) {
@@ -388,25 +511,28 @@ function useStore(pinia, app) {
388
511
  return instance(pinia);
389
512
  }
390
513
  function injectStoreFactory(app) {
391
- const instance = inject$1(StoreSymbol, app);
514
+ const instance = inject$1(sym, app);
392
515
  if (!instance) {
393
516
  throw new Error('The store factory has not been injected in the app context.');
394
517
  }
395
518
  return instance;
396
519
  }
397
520
  function hasStoreFactory(app) {
398
- return !!inject$1(StoreSymbol, app);
521
+ return !!inject$1(sym, app);
399
522
  }
400
523
  function provideStoreFactory(store, app) {
401
- provide(StoreSymbol, store, app);
524
+ provide(sym, store, app);
402
525
  }
403
526
 
404
527
  function installStore(app, options = {}) {
405
528
  if (hasStoreFactory(app)) {
406
529
  return;
407
530
  }
531
+ const storeDispatcher = createStoreDispatcher();
532
+ provideStoreDispatcher(storeDispatcher, app);
408
533
  const storeFactory = pinia.defineStore(STORE_ID, ()=>createStore({
409
- baseURL: options.baseURL
534
+ baseURL: options.baseURL,
535
+ dispatcher: storeDispatcher
410
536
  }));
411
537
  const store = storeFactory(options.pinia);
412
538
  let cookieGet;
@@ -434,11 +560,11 @@ function installStore(app, options = {}) {
434
560
  const cookies = useCookies();
435
561
  cookieUnset = cookies.remove;
436
562
  }
437
- const initStore = ()=>{
438
- if (store.initialized) {
563
+ const readCookies = ()=>{
564
+ if (store.cookiesRead) {
439
565
  return;
440
566
  }
441
- store.setInitialized(true);
567
+ store.setCookiesRead(true);
442
568
  const keys = Object.values(coreHttpKit.CookieName);
443
569
  let value;
444
570
  for(let i = 0; i < keys.length; i++){
@@ -480,51 +606,60 @@ function installStore(app, options = {}) {
480
606
  }
481
607
  }
482
608
  };
483
- store.$onAction((action)=>{
484
- if (action.store.$id !== STORE_ID) {
485
- return;
609
+ const maxAgeFn = ()=>{
610
+ if (!store.accessTokenExpireDate) {
611
+ return undefined;
486
612
  }
487
- if (action.name === 'logout') {
488
- cookieUnset(coreHttpKit.CookieName.ACCESS_TOKEN, {});
613
+ return Math.floor(Math.max(1000, new Date(`${store.accessTokenExpireDate}`).getTime() - Date.now()) / 1000);
614
+ };
615
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED, (input)=>{
616
+ if (input) {
617
+ cookieSet(coreHttpKit.CookieName.ACCESS_TOKEN_EXPIRE_DATE, input, {
618
+ maxAge: maxAgeFn()
619
+ });
620
+ } else {
489
621
  cookieUnset(coreHttpKit.CookieName.ACCESS_TOKEN_EXPIRE_DATE, {});
490
- cookieUnset(coreHttpKit.CookieName.REFRESH_TOKEN, {});
491
- cookieUnset(coreHttpKit.CookieName.USER, {});
492
- cookieUnset(coreHttpKit.CookieName.REALM, {});
493
- cookieUnset(coreHttpKit.CookieName.REALM_MANAGEMENT, {});
494
622
  }
495
623
  });
496
- initStore();
497
- store.$subscribe((mutation, state)=>{
498
- if (mutation.storeId !== STORE_ID) {
499
- return;
500
- }
501
- let maxAge;
502
- if (state.accessTokenExpireDate) {
503
- maxAge = Math.floor(Math.max(1000, new Date(`${state.accessTokenExpireDate}`).getTime() - Date.now()) / 1000);
504
- }
505
- if (state.accessToken) {
506
- cookieSet(coreHttpKit.CookieName.ACCESS_TOKEN, state.accessToken, {
507
- maxAge
508
- });
509
- }
510
- if (state.accessTokenExpireDate) {
511
- cookieSet(coreHttpKit.CookieName.ACCESS_TOKEN_EXPIRE_DATE, state.accessTokenExpireDate, {
624
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_UPDATED, (input)=>{
625
+ if (input) {
626
+ const maxAge = maxAgeFn();
627
+ cookieSet(coreHttpKit.CookieName.ACCESS_TOKEN, input, {
512
628
  maxAge
513
629
  });
630
+ } else {
631
+ cookieUnset(coreHttpKit.CookieName.ACCESS_TOKEN, {});
514
632
  }
515
- if (state.refreshToken) {
516
- cookieSet(coreHttpKit.CookieName.REFRESH_TOKEN, state.refreshToken, {});
633
+ });
634
+ storeDispatcher.on(StoreDispatcherEventName.REFRESH_TOKEN_UPDATED, (input)=>{
635
+ if (input) {
636
+ cookieSet(coreHttpKit.CookieName.REFRESH_TOKEN, input, {});
637
+ } else {
638
+ cookieUnset(coreHttpKit.CookieName.REFRESH_TOKEN, {});
517
639
  }
518
- if (state.user) {
519
- cookieSet(coreHttpKit.CookieName.USER, state.user, {});
640
+ });
641
+ storeDispatcher.on(StoreDispatcherEventName.USER_UPDATED, (input)=>{
642
+ if (input) {
643
+ cookieSet(coreHttpKit.CookieName.USER, input, {});
644
+ } else {
645
+ cookieUnset(coreHttpKit.CookieName.USER, {});
520
646
  }
521
- if (state.realm) {
522
- cookieSet(coreHttpKit.CookieName.REALM, state.realm, {});
647
+ });
648
+ storeDispatcher.on(StoreDispatcherEventName.REALM_UPDATED, (input)=>{
649
+ if (input) {
650
+ cookieSet(coreHttpKit.CookieName.REALM, input, {});
651
+ } else {
652
+ cookieUnset(coreHttpKit.CookieName.REALM, {});
523
653
  }
524
- if (state.realmManagement) {
525
- cookieSet(coreHttpKit.CookieName.REALM_MANAGEMENT, state.realmManagement, {});
654
+ });
655
+ storeDispatcher.on(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, (input)=>{
656
+ if (input) {
657
+ cookieSet(coreHttpKit.CookieName.REALM_MANAGEMENT, input, {});
658
+ } else {
659
+ cookieUnset(coreHttpKit.CookieName.REALM_MANAGEMENT, {});
526
660
  }
527
661
  });
662
+ readCookies();
528
663
  provideStoreFactory(storeFactory, app);
529
664
  }
530
665
 
@@ -562,30 +697,36 @@ function installHTTPClient(app, options = {}) {
562
697
  });
563
698
  },
564
699
  tokenCreated: (response)=>{
565
- store.handleTokenGrantResponse(response);
700
+ store.applyTokenGrantResponse(response);
566
701
  },
567
702
  tokenFailed: ()=>{
568
- store.logout();
703
+ Promise.resolve().then(()=>store.logout());
569
704
  },
570
705
  timer: !options.isServer
571
706
  });
572
- store.$subscribe((mutation, state)=>{
573
- if (mutation.storeId !== STORE_ID) return;
574
- if (state.accessToken) {
707
+ const storeDispatcher = injectStoreDispatcher(app);
708
+ const handleAccessTokenEvent = ()=>{
709
+ if (store.accessToken) {
575
710
  client.setAuthorizationHeader({
576
711
  type: 'Bearer',
577
- token: state.accessToken
712
+ token: store.accessToken
578
713
  });
579
714
  tokenHook.mount();
580
715
  } else {
581
716
  client.unsetAuthorizationHeader();
582
717
  tokenHook.unmount();
583
718
  }
584
- if (state.refreshToken && state.accessTokenExpireDate) {
585
- const expiresIn = Math.floor((state.accessTokenExpireDate.getTime() - Date.now()) / 1000);
586
- tokenHook.setTimer(expiresIn, ()=>refreshToken.value);
719
+ };
720
+ const handleAccessTokenExpireDateEvent = ()=>{
721
+ if (store.accessTokenExpireDate) {
722
+ const expiresIn = Math.floor((store.accessTokenExpireDate.getTime() - Date.now()) / 1000);
723
+ tokenHook.setTimer(expiresIn, ()=>refreshToken.value || undefined);
587
724
  }
588
- });
725
+ };
726
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_UPDATED, ()=>handleAccessTokenEvent());
727
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED, ()=>handleAccessTokenExpireDateEvent());
728
+ handleAccessTokenEvent();
729
+ handleAccessTokenExpireDateEvent();
589
730
  provideHTTPClient(client, app);
590
731
  }
591
732
 
@@ -1040,7 +1181,7 @@ function createList(context) {
1040
1181
  }
1041
1182
  }
1042
1183
  const handleCreated = buildListCreatedHandler(data, (cbEntity)=>{
1043
- total.value--;
1184
+ total.value++;
1044
1185
  if (context.onCreated) {
1045
1186
  context.onCreated(cbEntity, meta.value);
1046
1187
  }
@@ -1073,7 +1214,7 @@ function createList(context) {
1073
1214
  noMore: renderOptions.noMore,
1074
1215
  body: renderOptions.body,
1075
1216
  loading: renderOptions.loading,
1076
- total,
1217
+ total: total.value,
1077
1218
  load,
1078
1219
  busy: busy.value,
1079
1220
  data: data.value,
@@ -1082,16 +1223,19 @@ function createList(context) {
1082
1223
  if (context.setup.emit) {
1083
1224
  context.setup.emit('created', value);
1084
1225
  }
1226
+ handleCreated(value);
1085
1227
  },
1086
1228
  onDeleted: (value)=>{
1087
1229
  if (context.setup.emit) {
1088
1230
  context.setup.emit('deleted', value);
1089
1231
  }
1232
+ handleDeleted(value);
1090
1233
  },
1091
1234
  onUpdated: (value)=>{
1092
1235
  if (context.setup.emit) {
1093
1236
  context.setup.emit('updated', value);
1094
1237
  }
1238
+ handleUpdated(value);
1095
1239
  },
1096
1240
  slotItems: context.setup.slots || {}
1097
1241
  });
@@ -4071,7 +4215,11 @@ const AIdentityProviderPreset = vue.defineComponent({
4071
4215
  }
4072
4216
  });
4073
4217
 
4074
- const AIdentityProviderPicker = vue.defineComponent({
4218
+ var _sfc_main = vue.defineComponent({
4219
+ components: {
4220
+ AIdentityProviderPreset,
4221
+ AIdentityProviderProtocol
4222
+ },
4075
4223
  props: {
4076
4224
  protocol: {
4077
4225
  type: String
@@ -4084,113 +4232,139 @@ const AIdentityProviderPicker = vue.defineComponent({
4084
4232
  'pick'
4085
4233
  ],
4086
4234
  setup (props, setup) {
4087
- const protocols = [];
4088
- const presets = [];
4089
- Object.values(coreKit.IdentityProviderProtocol).map((id)=>{
4090
- protocols.push({
4091
- id
4092
- });
4093
- return id;
4094
- });
4095
- Object.values(coreKit.IdentityProviderPreset).map((id)=>{
4096
- presets.push({
4097
- id
4098
- });
4099
- return id;
4100
- });
4101
- const pick = (ctx)=>{
4102
- setup.emit('pick', ctx);
4235
+ const protocols = Object.values(coreKit.IdentityProviderProtocol);
4236
+ const presets = Object.values(coreKit.IdentityProviderPreset);
4237
+ const pickProtocol = (protocol)=>{
4238
+ setup.emit('pick', 'protocol', protocol);
4103
4239
  };
4104
- return ()=>{
4105
- const protocolNode = listControls.buildList({
4106
- data: protocols,
4107
- header: {
4108
- content: vue.h('h6', 'Protocols')
4109
- },
4110
- body: {
4111
- class: 'd-flex flex-row',
4112
- item: {
4113
- class: [
4114
- 'me-1 list-item'
4115
- ],
4116
- icon: false,
4117
- content: (item)=>vue.h(AIdentityProviderProtocol, {
4118
- id: item.id
4119
- }, {
4120
- default: (element)=>[
4121
- vue.h('i', {
4122
- class: [
4123
- element.icon,
4124
- 'pe-1'
4125
- ]
4126
- }),
4127
- element.name,
4128
- vue.h('button', {
4129
- class: 'btn btn-xs btn-dark ms-1',
4130
- onClick ($event) {
4131
- $event.preventDefault();
4132
- pick({
4133
- protocol: item.id
4134
- });
4135
- }
4136
- }, [
4137
- vue.h('i', {
4138
- class: 'fa fa-plus'
4139
- })
4140
- ])
4141
- ]
4142
- })
4143
- }
4144
- }
4145
- });
4146
- const protocolNodeConfigurationNode = listControls.buildList({
4147
- data: presets,
4148
- header: {
4149
- content: vue.h('h6', 'Presets')
4150
- },
4151
- body: {
4152
- class: 'd-flex flex-row',
4153
- item: {
4154
- class: 'me-1 list-item',
4155
- icon: false,
4156
- content: (preset)=>vue.h(AIdentityProviderPreset, {
4157
- id: preset.id
4158
- }, {
4159
- default: (item)=>vue.h('div', [
4160
- vue.h('i', {
4161
- class: [
4162
- item.icon,
4163
- 'pe-1'
4164
- ]
4165
- }),
4166
- item.name,
4167
- vue.h('button', {
4168
- class: 'btn btn-xs btn-dark ms-1',
4169
- onClick ($event) {
4170
- $event.preventDefault();
4171
- pick({
4172
- preset: preset.id,
4173
- protocol: coreKit.getIdentityProviderProtocolForPreset(preset.id)
4174
- });
4175
- }
4176
- }, [
4177
- vue.h('i', {
4178
- class: 'fa fa-plus'
4179
- })
4180
- ])
4181
- ])
4182
- })
4183
- }
4184
- }
4185
- });
4186
- return [
4187
- protocolNode,
4188
- protocolNodeConfigurationNode
4189
- ];
4240
+ const pickPreset = (preset)=>{
4241
+ setup.emit('pick', 'preset', preset);
4242
+ };
4243
+ return {
4244
+ protocols,
4245
+ presets,
4246
+ pickProtocol,
4247
+ pickPreset
4190
4248
  };
4191
4249
  }
4192
4250
  });
4193
4251
 
4252
+ var _export_sfc = (sfc, props) => {
4253
+ const target = sfc.__vccOpts || sfc;
4254
+ for (const [key, val] of props) {
4255
+ target[key] = val;
4256
+ }
4257
+ return target;
4258
+ };
4259
+
4260
+ const _hoisted_1 = {
4261
+ class: "d-flex flex-column gap-2"
4262
+ };
4263
+ const _hoisted_2 = {
4264
+ class: "d-flex flex-row gap-2 flex-wrap"
4265
+ };
4266
+ const _hoisted_3 = [
4267
+ "onClick"
4268
+ ];
4269
+ const _hoisted_4 = {
4270
+ class: "d-flex flex-row gap-2 flex-wrap"
4271
+ };
4272
+ const _hoisted_5 = [
4273
+ "onClick"
4274
+ ];
4275
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
4276
+ const _component_AIdentityProviderProtocol = vue.resolveComponent("AIdentityProviderProtocol");
4277
+ const _component_AIdentityProviderPreset = vue.resolveComponent("AIdentityProviderPreset");
4278
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
4279
+ vue.createElementVNode("div", null, [
4280
+ _cache[0] || (_cache[0] = vue.createElementVNode("h6", null, "Protocols", -1)),
4281
+ vue.createElementVNode("div", _hoisted_2, [
4282
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.protocols, (item, key)=>{
4283
+ return vue.openBlock(), vue.createBlock(_component_AIdentityProviderProtocol, {
4284
+ key,
4285
+ id: item
4286
+ }, {
4287
+ default: vue.withCtx((props)=>[
4288
+ vue.createElementVNode("div", {
4289
+ class: vue.normalizeClass([
4290
+ {
4291
+ "active": item === _ctx.protocol && !_ctx.preset
4292
+ },
4293
+ "d-flex flex-column gap-1 text-center identity-provider-picker-item"
4294
+ ]),
4295
+ onClick: vue.withModifiers(($event)=>_ctx.pickProtocol(item), [
4296
+ "prevent"
4297
+ ])
4298
+ }, [
4299
+ vue.createElementVNode("div", null, [
4300
+ vue.createElementVNode("i", {
4301
+ class: vue.normalizeClass([
4302
+ "fa-2x",
4303
+ props.icon
4304
+ ])
4305
+ }, null, 2)
4306
+ ]),
4307
+ vue.createElementVNode("div", null, vue.toDisplayString(props.name), 1)
4308
+ ], 10, _hoisted_3)
4309
+ ]),
4310
+ _: 2
4311
+ }, 1032, [
4312
+ "id"
4313
+ ]);
4314
+ }), 128))
4315
+ ])
4316
+ ]),
4317
+ vue.createElementVNode("div", null, [
4318
+ _cache[1] || (_cache[1] = vue.createElementVNode("h6", null, "Presets", -1)),
4319
+ vue.createElementVNode("div", _hoisted_4, [
4320
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.presets, (item, key)=>{
4321
+ return vue.openBlock(), vue.createBlock(_component_AIdentityProviderPreset, {
4322
+ key,
4323
+ id: item
4324
+ }, {
4325
+ default: vue.withCtx((props)=>[
4326
+ vue.createElementVNode("div", {
4327
+ class: vue.normalizeClass([
4328
+ {
4329
+ "active": item === _ctx.preset
4330
+ },
4331
+ "d-flex flex-column gap-1 text-center identity-provider-picker-item"
4332
+ ]),
4333
+ onClick: vue.withModifiers(($event)=>_ctx.pickPreset(item), [
4334
+ "prevent"
4335
+ ])
4336
+ }, [
4337
+ vue.createElementVNode("div", null, [
4338
+ vue.createElementVNode("i", {
4339
+ class: vue.normalizeClass([
4340
+ "fa-2x",
4341
+ props.icon
4342
+ ])
4343
+ }, null, 2)
4344
+ ]),
4345
+ vue.createElementVNode("div", null, vue.toDisplayString(props.name), 1)
4346
+ ], 10, _hoisted_5)
4347
+ ]),
4348
+ _: 2
4349
+ }, 1032, [
4350
+ "id"
4351
+ ]);
4352
+ }), 128))
4353
+ ])
4354
+ ])
4355
+ ]);
4356
+ }
4357
+ var AIdentityProviderPicker = /* @__PURE__ */ _export_sfc(_sfc_main, [
4358
+ [
4359
+ "render",
4360
+ _sfc_render
4361
+ ],
4362
+ [
4363
+ "__scopeId",
4364
+ "data-v-0df1e731"
4365
+ ]
4366
+ ]);
4367
+
4194
4368
  const AIdentityProviderOAuth2ClientFields = vue.defineComponent({
4195
4369
  props: {
4196
4370
  entity: {
@@ -4728,17 +4902,16 @@ const AIdentityProviderForm = vue.defineComponent({
4728
4902
  set();
4729
4903
  onChange(updatedAt, ()=>set());
4730
4904
  const renderPicker = ()=>vue.h(AIdentityProviderPicker, {
4731
- onPick (value) {
4732
- if (value.protocol) {
4733
- protocol.value = value.protocol;
4734
- } else {
4735
- protocol.value = null;
4736
- }
4737
- if (value.preset) {
4738
- preset.value = value.preset;
4739
- } else {
4740
- preset.value = null;
4905
+ protocol: protocol.value,
4906
+ preset: preset.value,
4907
+ onPick (type, value) {
4908
+ if (type === 'preset') {
4909
+ preset.value = value;
4910
+ protocol.value = `${coreKit.getIdentityProviderProtocolForPreset(value)}`;
4911
+ return;
4741
4912
  }
4913
+ protocol.value = value;
4914
+ preset.value = null;
4742
4915
  }
4743
4916
  });
4744
4917
  const render = (node)=>{
@@ -7182,7 +7355,7 @@ exports.HTTPClientSymbol = HTTPClientSymbol;
7182
7355
  exports.LanguageSwitcherDropdown = LanguageSwitcherDropdown;
7183
7356
  exports.STORE_ID = STORE_ID;
7184
7357
  exports.SocketClientSymbol = SocketClientSymbol;
7185
- exports.StoreSymbol = StoreSymbol;
7358
+ exports.StoreDispatcherEventName = StoreDispatcherEventName;
7186
7359
  exports.TranslatorTranslationClientKey = TranslatorTranslationClientKey;
7187
7360
  exports.TranslatorTranslationDefaultKey = TranslatorTranslationDefaultKey;
7188
7361
  exports.TranslatorTranslationGroup = TranslatorTranslationGroup;
@@ -7199,6 +7372,7 @@ exports.createFormSubmitTranslations = createFormSubmitTranslations;
7199
7372
  exports.createList = createList;
7200
7373
  exports.createPermissionCheckerReactiveFn = createPermissionCheckerReactiveFn;
7201
7374
  exports.createStore = createStore;
7375
+ exports.createStoreDispatcher = createStoreDispatcher;
7202
7376
  exports.default = index;
7203
7377
  exports.defineEntityManagerEvents = defineEntityManagerEvents;
7204
7378
  exports.defineEntityManagerProps = defineEntityManagerProps;
@@ -7214,6 +7388,7 @@ exports.initFormAttributesFromSource = initFormAttributesFromSource;
7214
7388
  exports.inject = inject$1;
7215
7389
  exports.injectHTTPClient = injectHTTPClient;
7216
7390
  exports.injectSocketManager = injectSocketManager;
7391
+ exports.injectStoreDispatcher = injectStoreDispatcher;
7217
7392
  exports.injectStoreFactory = injectStoreFactory;
7218
7393
  exports.injectTranslatorLocale = injectTranslatorLocale;
7219
7394
  exports.install = install;
@@ -7229,6 +7404,7 @@ exports.onChange = onChange;
7229
7404
  exports.provide = provide;
7230
7405
  exports.provideHTTPClient = provideHTTPClient;
7231
7406
  exports.provideSocketManager = provideSocketManager;
7407
+ exports.provideStoreDispatcher = provideStoreDispatcher;
7232
7408
  exports.provideStoreFactory = provideStoreFactory;
7233
7409
  exports.renderEntityAssignAction = renderEntityAssignAction;
7234
7410
  exports.storeToRefs = storeToRefs;