@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.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { REALM_MASTER_NAME, DomainEventName, buildDomainChannelName, DomainType, isRealmResourceWritable, IdentityProviderProtocol, IdentityProviderPreset, getIdentityProviderProtocolForPreset } from '@authup/core-kit';
2
- import { hasInjectionContext, inject as inject$2, provide as provide$1, ref, computed, getCurrentScope, onScopeDispose, toRaw, isRef, isReactive, toRef, unref, h, onMounted, onUnmounted, watch, shallowRef, watchEffect, defineComponent, reactive, nextTick, getCurrentInstance, resolveDynamicComponent, mergeProps } from 'vue';
2
+ import { hasInjectionContext, inject as inject$2, provide as provide$1, ref, computed, getCurrentScope, onScopeDispose, toRaw, isRef, isReactive, toRef, unref, h, onMounted, onUnmounted, watch, shallowRef, watchEffect, defineComponent, reactive, nextTick, resolveComponent, openBlock, createElementBlock, createElementVNode, Fragment, renderList, createBlock, withCtx, normalizeClass, withModifiers, toDisplayString, getCurrentInstance, resolveDynamicComponent, mergeProps } from 'vue';
3
3
  import { Client, isClientTokenExpiredError, CookieName, ClientResponseErrorTokenHook } from '@authup/core-http-kit';
4
4
  import { defineStore, storeToRefs as storeToRefs$1 } from 'pinia';
5
5
  import { BuiltInPolicyType, PolicyError, maybeInvertPolicyOutcome, PermissionBindingPolicyValidator, PolicyEngine as PolicyEngine$1, PermissionMemoryProvider, PermissionChecker, TokenError, buildEventFullName, EventNameSuffix, hasOwnProperty, createNanoID, isOAuth2OpenIDProviderMetadata, isObject as isObject$2 } from '@authup/kit';
@@ -90,6 +90,91 @@ class PolicyEngine extends PolicyEngine$1 {
90
90
  }
91
91
  }
92
92
 
93
+ /*
94
+ * Copyright (c) 2024.
95
+ * Author Peter Placzek (tada5hi)
96
+ * For the full copyright and license information,
97
+ * view the LICENSE file that was distributed with this source code.
98
+ */ var StoreDispatcherEventName = /*#__PURE__*/ function(StoreDispatcherEventName) {
99
+ StoreDispatcherEventName["LOGGING_IN"] = "loggingIn";
100
+ StoreDispatcherEventName["LOGGED_IN"] = "loggedIn";
101
+ StoreDispatcherEventName["LOGGING_OUT"] = "loggingOut";
102
+ StoreDispatcherEventName["LOGGED_OUT"] = "loggedOut";
103
+ StoreDispatcherEventName["RESOLVING"] = "resolving";
104
+ StoreDispatcherEventName["RESOLVED"] = "resolved";
105
+ StoreDispatcherEventName["ACCESS_TOKEN_UPDATED"] = "accessTokenUpdated";
106
+ StoreDispatcherEventName["ACCESS_TOKEN_EXPIRE_DATE_UPDATED"] = "accessTokenExpireDateUpdated";
107
+ StoreDispatcherEventName["REFRESH_TOKEN_UPDATED"] = "refreshTokenUpdated";
108
+ StoreDispatcherEventName["USER_UPDATED"] = "userUpdated";
109
+ StoreDispatcherEventName["REALM_UPDATED"] = "realmUpdated";
110
+ StoreDispatcherEventName["REALM_MANAGEMENT_UPDATED"] = "realmManagementUpdated";
111
+ return StoreDispatcherEventName;
112
+ }({});
113
+
114
+ // src/event-emitter.ts
115
+ var EventEmitter = class {
116
+ on(type, handler) {
117
+ if (!this.all.has(type)) {
118
+ this.all.set(type, []);
119
+ }
120
+ const handlers = this.all.get(type);
121
+ handlers.push(handler);
122
+ return ()=>handlers.splice(handlers.indexOf(handler) >>> 0, 1);
123
+ }
124
+ off(type, handler) {
125
+ if (!type) {
126
+ return this.all.clear();
127
+ }
128
+ const handlers = this.all.get(type);
129
+ if (handlers) {
130
+ if (handler) {
131
+ handlers.splice(handlers.indexOf(handler) >>> 0, 1);
132
+ } else {
133
+ this.all.delete(type);
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * Invoke all handlers for the given type.
139
+ * If present, `'*'` handlers are invoked after type-matched handlers.
140
+ *
141
+ * Note: Manually firing `'*'` handlers is not supported.
142
+ *
143
+ * @param type The event type to invoke
144
+ * @param payload Any value to each handler
145
+ */ emit(type, ...payload) {
146
+ let handlers = this.all.get(type);
147
+ handlers?.slice().map((handler)=>{
148
+ handler(...payload);
149
+ });
150
+ handlers = this.all.get("*");
151
+ if (handlers) {
152
+ handlers.slice().map((handler)=>{
153
+ handler(type, payload);
154
+ });
155
+ }
156
+ }
157
+ constructor(all){
158
+ this.all = all || /* @__PURE__ */ new Map();
159
+ }
160
+ };
161
+
162
+ function createStoreDispatcher() {
163
+ return new EventEmitter();
164
+ }
165
+
166
+ const sym$1 = Symbol.for('AuthupStoreEventBus');
167
+ function injectStoreDispatcher(app) {
168
+ const instance = inject$1(sym$1, app);
169
+ if (!instance) {
170
+ throw new Error('The store dispatcher has not been injected in the app context.');
171
+ }
172
+ return instance;
173
+ }
174
+ function provideStoreDispatcher(eventBus, app) {
175
+ provide(sym$1, eventBus, app);
176
+ }
177
+
93
178
  function createPromiseShareWrapperFn(fn) {
94
179
  let promise;
95
180
  return (...args)=>{
@@ -107,41 +192,45 @@ function createPromiseShareWrapperFn(fn) {
107
192
  return promise;
108
193
  };
109
194
  }
110
- function createStore(context = {}) {
195
+ function createStore(context) {
111
196
  const client = new Client({
112
197
  baseURL: context.baseURL
113
198
  });
114
- const initialized = ref(false);
115
- const setInitialized = (value)=>{
116
- initialized.value = value;
199
+ const cookiesRead = ref(false);
200
+ const setCookiesRead = (value)=>{
201
+ cookiesRead.value = value;
117
202
  };
118
203
  // --------------------------------------------------------------------
119
- const accessToken = ref(undefined);
204
+ const accessToken = ref(null);
120
205
  const setAccessToken = (input)=>{
121
206
  accessToken.value = input;
207
+ context.dispatcher.emit(StoreDispatcherEventName.ACCESS_TOKEN_UPDATED, input);
122
208
  };
123
209
  // --------------------------------------------------------------------
124
- const accessTokenExpireDate = ref(undefined);
210
+ const accessTokenExpireDate = ref(null);
125
211
  const setAccessTokenExpireDate = (input)=>{
126
212
  if (typeof input === 'number' || typeof input === 'string') {
127
213
  accessTokenExpireDate.value = new Date(input); // verify microseconds or seconds
128
- return;
214
+ } else {
215
+ accessTokenExpireDate.value = input;
129
216
  }
130
- accessTokenExpireDate.value = input;
217
+ context.dispatcher.emit(StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED, accessTokenExpireDate.value);
131
218
  };
132
219
  // --------------------------------------------------------------------
133
- const refreshToken = ref(undefined);
220
+ const refreshToken = ref(null);
134
221
  const setRefreshToken = (input)=>{
135
222
  refreshToken.value = input;
223
+ context.dispatcher.emit(StoreDispatcherEventName.REFRESH_TOKEN_UPDATED, input);
136
224
  };
137
225
  // --------------------------------------------------------------------
138
- const user = ref(undefined);
139
- const userId = computed(()=>user.value ? user.value.id : undefined);
140
- const setUser = (entity)=>{
141
- user.value = entity;
226
+ const user = ref(null);
227
+ const userId = computed(()=>user.value ? user.value.id : null);
228
+ const setUser = (input)=>{
229
+ user.value = input;
230
+ context.dispatcher.emit(StoreDispatcherEventName.USER_UPDATED, input);
142
231
  };
143
232
  // --------------------------------------------------------------------
144
- const realm = ref(undefined);
233
+ const realm = ref(null);
145
234
  const realmId = computed(()=>realm.value ? realm.value.id : undefined);
146
235
  const realmName = computed(()=>realm.value ? realm.value.name : undefined);
147
236
  const realmIsRoot = computed(()=>{
@@ -150,14 +239,16 @@ function createStore(context = {}) {
150
239
  }
151
240
  return false;
152
241
  });
153
- const setRealm = (entity)=>{
154
- realm.value = entity;
242
+ const setRealm = (input)=>{
243
+ realm.value = input;
244
+ context.dispatcher.emit(StoreDispatcherEventName.REALM_UPDATED, input);
155
245
  };
156
- const realmManagement = ref(undefined);
246
+ const realmManagement = ref(null);
157
247
  const realmManagementId = computed(()=>realmManagement.value ? realmManagement.value.id : realmId.value);
158
248
  const realmManagementName = computed(()=>realmManagement.value ? realmManagement.value.name : realmName.value);
159
- const setRealmManagement = (entity)=>{
160
- realmManagement.value = entity;
249
+ const setRealmManagement = (input)=>{
250
+ realmManagement.value = input;
251
+ context.dispatcher.emit(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, input);
161
252
  };
162
253
  // --------------------------------------------------------------------
163
254
  const permissionRepository = new PermissionMemoryProvider();
@@ -210,11 +301,15 @@ function createStore(context = {}) {
210
301
  });
211
302
  };
212
303
  // --------------------------------------------------------------------
213
- const handleTokenGrantResponse = (response)=>{
304
+ const applyTokenGrantResponse = (response)=>{
214
305
  const expireDate = new Date(Date.now() + response.expires_in * 1000);
215
306
  setAccessTokenExpireDate(expireDate);
216
307
  setAccessToken(response.access_token);
217
- setRefreshToken(response.refresh_token);
308
+ if (response.refresh_token) {
309
+ setRefreshToken(response.refresh_token);
310
+ } else {
311
+ setRefreshToken(null);
312
+ }
218
313
  };
219
314
  // --------------------------------------------------------------------
220
315
  const refreshSession = createPromiseShareWrapperFn(async ()=>{
@@ -223,8 +318,8 @@ function createStore(context = {}) {
223
318
  }
224
319
  return client.token.createWithRefreshToken({
225
320
  refresh_token: refreshToken.value
226
- }).then((r)=>handleTokenGrantResponse(r)).catch((e)=>{
227
- logout();
321
+ }).then((r)=>applyTokenGrantResponse(r)).catch((e)=>{
322
+ reset();
228
323
  return Promise.reject(e);
229
324
  }).finally(()=>{
230
325
  tokenResolved.value = false;
@@ -233,6 +328,7 @@ function createStore(context = {}) {
233
328
  });
234
329
  // --------------------------------------------------------------------
235
330
  const resolveInternal = async ()=>{
331
+ context.dispatcher.emit(StoreDispatcherEventName.RESOLVING);
236
332
  try {
237
333
  if (!accessToken.value && refreshToken.value) {
238
334
  await refreshSession();
@@ -250,45 +346,72 @@ function createStore(context = {}) {
250
346
  }
251
347
  throw e;
252
348
  }
349
+ context.dispatcher.emit(StoreDispatcherEventName.RESOLVED);
253
350
  return Promise.resolve();
254
351
  };
255
352
  const resolve = createPromiseShareWrapperFn(resolveInternal);
256
353
  const loggedIn = computed(()=>!!accessToken.value);
257
354
  const login = async (ctx)=>{
355
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGING_IN);
356
+ const response = await client.token.createWithPasswordGrant({
357
+ username: ctx.name,
358
+ password: ctx.password,
359
+ ...realmId.value ? {
360
+ realm_id: ctx.realmId
361
+ } : {}
362
+ });
363
+ applyTokenGrantResponse(response);
258
364
  try {
259
- const response = await client.token.createWithPasswordGrant({
260
- username: ctx.name,
261
- password: ctx.password,
262
- ...realmId.value ? {
263
- realm_id: ctx.realmId
264
- } : {}
265
- });
266
- handleTokenGrantResponse(response);
267
365
  await resolve();
268
366
  } catch (e) {
269
- logout();
367
+ await logout();
270
368
  throw e;
271
369
  }
370
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGED_IN);
272
371
  };
273
- const logout = ()=>{
274
- setAccessToken(undefined);
275
- setAccessTokenExpireDate(undefined);
276
- setRefreshToken(undefined);
277
- setUser(undefined);
278
- setRealm(undefined);
279
- setRealmManagement(undefined);
372
+ const reset = ()=>{
373
+ setAccessToken(null);
374
+ setAccessTokenExpireDate(null);
375
+ setRefreshToken(null);
376
+ setUser(null);
377
+ setRealm(null);
378
+ setRealmManagement(null);
379
+ permissionRepository.setMany([]);
280
380
  tokenResolved.value = false;
281
381
  userResolved.value = false;
282
382
  };
383
+ const logout = async ()=>{
384
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGING_OUT);
385
+ try {
386
+ if (accessToken.value) {
387
+ await client.token.revoke({
388
+ token: accessToken.value
389
+ });
390
+ }
391
+ } catch (e) {
392
+ // ...
393
+ }
394
+ try {
395
+ if (refreshToken.value) {
396
+ await client.token.revoke({
397
+ token: refreshToken.value
398
+ });
399
+ }
400
+ } catch (e) {
401
+ // ...
402
+ }
403
+ reset();
404
+ context.dispatcher.emit(StoreDispatcherEventName.LOGGED_OUT);
405
+ };
283
406
  return {
284
- initialized,
285
- setInitialized,
407
+ cookiesRead,
408
+ setCookiesRead,
286
409
  permissionChecker,
287
410
  login,
288
411
  logout,
289
412
  loggedIn,
290
413
  resolve,
291
- handleTokenGrantResponse,
414
+ applyTokenGrantResponse,
292
415
  accessToken,
293
416
  setAccessToken,
294
417
  accessTokenExpireDate,
@@ -375,7 +498,7 @@ function shouldUpdate(dependencies, newCookies, oldCookies) {
375
498
  return false;
376
499
  }
377
500
 
378
- const StoreSymbol = Symbol.for('AuthupStore');
501
+ const sym = Symbol.for('AuthupStore');
379
502
  function useStore(pinia, app) {
380
503
  const instance = injectStoreFactory(app);
381
504
  if (!instance) {
@@ -384,25 +507,28 @@ function useStore(pinia, app) {
384
507
  return instance(pinia);
385
508
  }
386
509
  function injectStoreFactory(app) {
387
- const instance = inject$1(StoreSymbol, app);
510
+ const instance = inject$1(sym, app);
388
511
  if (!instance) {
389
512
  throw new Error('The store factory has not been injected in the app context.');
390
513
  }
391
514
  return instance;
392
515
  }
393
516
  function hasStoreFactory(app) {
394
- return !!inject$1(StoreSymbol, app);
517
+ return !!inject$1(sym, app);
395
518
  }
396
519
  function provideStoreFactory(store, app) {
397
- provide(StoreSymbol, store, app);
520
+ provide(sym, store, app);
398
521
  }
399
522
 
400
523
  function installStore(app, options = {}) {
401
524
  if (hasStoreFactory(app)) {
402
525
  return;
403
526
  }
527
+ const storeDispatcher = createStoreDispatcher();
528
+ provideStoreDispatcher(storeDispatcher, app);
404
529
  const storeFactory = defineStore(STORE_ID, ()=>createStore({
405
- baseURL: options.baseURL
530
+ baseURL: options.baseURL,
531
+ dispatcher: storeDispatcher
406
532
  }));
407
533
  const store = storeFactory(options.pinia);
408
534
  let cookieGet;
@@ -430,11 +556,11 @@ function installStore(app, options = {}) {
430
556
  const cookies = useCookies();
431
557
  cookieUnset = cookies.remove;
432
558
  }
433
- const initStore = ()=>{
434
- if (store.initialized) {
559
+ const readCookies = ()=>{
560
+ if (store.cookiesRead) {
435
561
  return;
436
562
  }
437
- store.setInitialized(true);
563
+ store.setCookiesRead(true);
438
564
  const keys = Object.values(CookieName);
439
565
  let value;
440
566
  for(let i = 0; i < keys.length; i++){
@@ -476,51 +602,60 @@ function installStore(app, options = {}) {
476
602
  }
477
603
  }
478
604
  };
479
- store.$onAction((action)=>{
480
- if (action.store.$id !== STORE_ID) {
481
- return;
605
+ const maxAgeFn = ()=>{
606
+ if (!store.accessTokenExpireDate) {
607
+ return undefined;
482
608
  }
483
- if (action.name === 'logout') {
484
- cookieUnset(CookieName.ACCESS_TOKEN, {});
609
+ return Math.floor(Math.max(1000, new Date(`${store.accessTokenExpireDate}`).getTime() - Date.now()) / 1000);
610
+ };
611
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED, (input)=>{
612
+ if (input) {
613
+ cookieSet(CookieName.ACCESS_TOKEN_EXPIRE_DATE, input, {
614
+ maxAge: maxAgeFn()
615
+ });
616
+ } else {
485
617
  cookieUnset(CookieName.ACCESS_TOKEN_EXPIRE_DATE, {});
486
- cookieUnset(CookieName.REFRESH_TOKEN, {});
487
- cookieUnset(CookieName.USER, {});
488
- cookieUnset(CookieName.REALM, {});
489
- cookieUnset(CookieName.REALM_MANAGEMENT, {});
490
618
  }
491
619
  });
492
- initStore();
493
- store.$subscribe((mutation, state)=>{
494
- if (mutation.storeId !== STORE_ID) {
495
- return;
496
- }
497
- let maxAge;
498
- if (state.accessTokenExpireDate) {
499
- maxAge = Math.floor(Math.max(1000, new Date(`${state.accessTokenExpireDate}`).getTime() - Date.now()) / 1000);
500
- }
501
- if (state.accessToken) {
502
- cookieSet(CookieName.ACCESS_TOKEN, state.accessToken, {
503
- maxAge
504
- });
505
- }
506
- if (state.accessTokenExpireDate) {
507
- cookieSet(CookieName.ACCESS_TOKEN_EXPIRE_DATE, state.accessTokenExpireDate, {
620
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_UPDATED, (input)=>{
621
+ if (input) {
622
+ const maxAge = maxAgeFn();
623
+ cookieSet(CookieName.ACCESS_TOKEN, input, {
508
624
  maxAge
509
625
  });
626
+ } else {
627
+ cookieUnset(CookieName.ACCESS_TOKEN, {});
510
628
  }
511
- if (state.refreshToken) {
512
- cookieSet(CookieName.REFRESH_TOKEN, state.refreshToken, {});
629
+ });
630
+ storeDispatcher.on(StoreDispatcherEventName.REFRESH_TOKEN_UPDATED, (input)=>{
631
+ if (input) {
632
+ cookieSet(CookieName.REFRESH_TOKEN, input, {});
633
+ } else {
634
+ cookieUnset(CookieName.REFRESH_TOKEN, {});
513
635
  }
514
- if (state.user) {
515
- cookieSet(CookieName.USER, state.user, {});
636
+ });
637
+ storeDispatcher.on(StoreDispatcherEventName.USER_UPDATED, (input)=>{
638
+ if (input) {
639
+ cookieSet(CookieName.USER, input, {});
640
+ } else {
641
+ cookieUnset(CookieName.USER, {});
516
642
  }
517
- if (state.realm) {
518
- cookieSet(CookieName.REALM, state.realm, {});
643
+ });
644
+ storeDispatcher.on(StoreDispatcherEventName.REALM_UPDATED, (input)=>{
645
+ if (input) {
646
+ cookieSet(CookieName.REALM, input, {});
647
+ } else {
648
+ cookieUnset(CookieName.REALM, {});
519
649
  }
520
- if (state.realmManagement) {
521
- cookieSet(CookieName.REALM_MANAGEMENT, state.realmManagement, {});
650
+ });
651
+ storeDispatcher.on(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, (input)=>{
652
+ if (input) {
653
+ cookieSet(CookieName.REALM_MANAGEMENT, input, {});
654
+ } else {
655
+ cookieUnset(CookieName.REALM_MANAGEMENT, {});
522
656
  }
523
657
  });
658
+ readCookies();
524
659
  provideStoreFactory(storeFactory, app);
525
660
  }
526
661
 
@@ -558,30 +693,36 @@ function installHTTPClient(app, options = {}) {
558
693
  });
559
694
  },
560
695
  tokenCreated: (response)=>{
561
- store.handleTokenGrantResponse(response);
696
+ store.applyTokenGrantResponse(response);
562
697
  },
563
698
  tokenFailed: ()=>{
564
- store.logout();
699
+ Promise.resolve().then(()=>store.logout());
565
700
  },
566
701
  timer: !options.isServer
567
702
  });
568
- store.$subscribe((mutation, state)=>{
569
- if (mutation.storeId !== STORE_ID) return;
570
- if (state.accessToken) {
703
+ const storeDispatcher = injectStoreDispatcher(app);
704
+ const handleAccessTokenEvent = ()=>{
705
+ if (store.accessToken) {
571
706
  client.setAuthorizationHeader({
572
707
  type: 'Bearer',
573
- token: state.accessToken
708
+ token: store.accessToken
574
709
  });
575
710
  tokenHook.mount();
576
711
  } else {
577
712
  client.unsetAuthorizationHeader();
578
713
  tokenHook.unmount();
579
714
  }
580
- if (state.refreshToken && state.accessTokenExpireDate) {
581
- const expiresIn = Math.floor((state.accessTokenExpireDate.getTime() - Date.now()) / 1000);
582
- tokenHook.setTimer(expiresIn, ()=>refreshToken.value);
715
+ };
716
+ const handleAccessTokenExpireDateEvent = ()=>{
717
+ if (store.accessTokenExpireDate) {
718
+ const expiresIn = Math.floor((store.accessTokenExpireDate.getTime() - Date.now()) / 1000);
719
+ tokenHook.setTimer(expiresIn, ()=>refreshToken.value || undefined);
583
720
  }
584
- });
721
+ };
722
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_UPDATED, ()=>handleAccessTokenEvent());
723
+ storeDispatcher.on(StoreDispatcherEventName.ACCESS_TOKEN_EXPIRE_DATE_UPDATED, ()=>handleAccessTokenExpireDateEvent());
724
+ handleAccessTokenEvent();
725
+ handleAccessTokenExpireDateEvent();
585
726
  provideHTTPClient(client, app);
586
727
  }
587
728
 
@@ -1036,7 +1177,7 @@ function createList(context) {
1036
1177
  }
1037
1178
  }
1038
1179
  const handleCreated = buildListCreatedHandler(data, (cbEntity)=>{
1039
- total.value--;
1180
+ total.value++;
1040
1181
  if (context.onCreated) {
1041
1182
  context.onCreated(cbEntity, meta.value);
1042
1183
  }
@@ -1069,7 +1210,7 @@ function createList(context) {
1069
1210
  noMore: renderOptions.noMore,
1070
1211
  body: renderOptions.body,
1071
1212
  loading: renderOptions.loading,
1072
- total,
1213
+ total: total.value,
1073
1214
  load,
1074
1215
  busy: busy.value,
1075
1216
  data: data.value,
@@ -1078,16 +1219,19 @@ function createList(context) {
1078
1219
  if (context.setup.emit) {
1079
1220
  context.setup.emit('created', value);
1080
1221
  }
1222
+ handleCreated(value);
1081
1223
  },
1082
1224
  onDeleted: (value)=>{
1083
1225
  if (context.setup.emit) {
1084
1226
  context.setup.emit('deleted', value);
1085
1227
  }
1228
+ handleDeleted(value);
1086
1229
  },
1087
1230
  onUpdated: (value)=>{
1088
1231
  if (context.setup.emit) {
1089
1232
  context.setup.emit('updated', value);
1090
1233
  }
1234
+ handleUpdated(value);
1091
1235
  },
1092
1236
  slotItems: context.setup.slots || {}
1093
1237
  });
@@ -4067,7 +4211,11 @@ const AIdentityProviderPreset = defineComponent({
4067
4211
  }
4068
4212
  });
4069
4213
 
4070
- const AIdentityProviderPicker = defineComponent({
4214
+ var _sfc_main = defineComponent({
4215
+ components: {
4216
+ AIdentityProviderPreset,
4217
+ AIdentityProviderProtocol
4218
+ },
4071
4219
  props: {
4072
4220
  protocol: {
4073
4221
  type: String
@@ -4080,113 +4228,139 @@ const AIdentityProviderPicker = defineComponent({
4080
4228
  'pick'
4081
4229
  ],
4082
4230
  setup (props, setup) {
4083
- const protocols = [];
4084
- const presets = [];
4085
- Object.values(IdentityProviderProtocol).map((id)=>{
4086
- protocols.push({
4087
- id
4088
- });
4089
- return id;
4090
- });
4091
- Object.values(IdentityProviderPreset).map((id)=>{
4092
- presets.push({
4093
- id
4094
- });
4095
- return id;
4096
- });
4097
- const pick = (ctx)=>{
4098
- setup.emit('pick', ctx);
4231
+ const protocols = Object.values(IdentityProviderProtocol);
4232
+ const presets = Object.values(IdentityProviderPreset);
4233
+ const pickProtocol = (protocol)=>{
4234
+ setup.emit('pick', 'protocol', protocol);
4099
4235
  };
4100
- return ()=>{
4101
- const protocolNode = buildList({
4102
- data: protocols,
4103
- header: {
4104
- content: h('h6', 'Protocols')
4105
- },
4106
- body: {
4107
- class: 'd-flex flex-row',
4108
- item: {
4109
- class: [
4110
- 'me-1 list-item'
4111
- ],
4112
- icon: false,
4113
- content: (item)=>h(AIdentityProviderProtocol, {
4114
- id: item.id
4115
- }, {
4116
- default: (element)=>[
4117
- h('i', {
4118
- class: [
4119
- element.icon,
4120
- 'pe-1'
4121
- ]
4122
- }),
4123
- element.name,
4124
- h('button', {
4125
- class: 'btn btn-xs btn-dark ms-1',
4126
- onClick ($event) {
4127
- $event.preventDefault();
4128
- pick({
4129
- protocol: item.id
4130
- });
4131
- }
4132
- }, [
4133
- h('i', {
4134
- class: 'fa fa-plus'
4135
- })
4136
- ])
4137
- ]
4138
- })
4139
- }
4140
- }
4141
- });
4142
- const protocolNodeConfigurationNode = buildList({
4143
- data: presets,
4144
- header: {
4145
- content: h('h6', 'Presets')
4146
- },
4147
- body: {
4148
- class: 'd-flex flex-row',
4149
- item: {
4150
- class: 'me-1 list-item',
4151
- icon: false,
4152
- content: (preset)=>h(AIdentityProviderPreset, {
4153
- id: preset.id
4154
- }, {
4155
- default: (item)=>h('div', [
4156
- h('i', {
4157
- class: [
4158
- item.icon,
4159
- 'pe-1'
4160
- ]
4161
- }),
4162
- item.name,
4163
- h('button', {
4164
- class: 'btn btn-xs btn-dark ms-1',
4165
- onClick ($event) {
4166
- $event.preventDefault();
4167
- pick({
4168
- preset: preset.id,
4169
- protocol: getIdentityProviderProtocolForPreset(preset.id)
4170
- });
4171
- }
4172
- }, [
4173
- h('i', {
4174
- class: 'fa fa-plus'
4175
- })
4176
- ])
4177
- ])
4178
- })
4179
- }
4180
- }
4181
- });
4182
- return [
4183
- protocolNode,
4184
- protocolNodeConfigurationNode
4185
- ];
4236
+ const pickPreset = (preset)=>{
4237
+ setup.emit('pick', 'preset', preset);
4238
+ };
4239
+ return {
4240
+ protocols,
4241
+ presets,
4242
+ pickProtocol,
4243
+ pickPreset
4186
4244
  };
4187
4245
  }
4188
4246
  });
4189
4247
 
4248
+ var _export_sfc = (sfc, props) => {
4249
+ const target = sfc.__vccOpts || sfc;
4250
+ for (const [key, val] of props) {
4251
+ target[key] = val;
4252
+ }
4253
+ return target;
4254
+ };
4255
+
4256
+ const _hoisted_1 = {
4257
+ class: "d-flex flex-column gap-2"
4258
+ };
4259
+ const _hoisted_2 = {
4260
+ class: "d-flex flex-row gap-2 flex-wrap"
4261
+ };
4262
+ const _hoisted_3 = [
4263
+ "onClick"
4264
+ ];
4265
+ const _hoisted_4 = {
4266
+ class: "d-flex flex-row gap-2 flex-wrap"
4267
+ };
4268
+ const _hoisted_5 = [
4269
+ "onClick"
4270
+ ];
4271
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
4272
+ const _component_AIdentityProviderProtocol = resolveComponent("AIdentityProviderProtocol");
4273
+ const _component_AIdentityProviderPreset = resolveComponent("AIdentityProviderPreset");
4274
+ return openBlock(), createElementBlock("div", _hoisted_1, [
4275
+ createElementVNode("div", null, [
4276
+ _cache[0] || (_cache[0] = createElementVNode("h6", null, "Protocols", -1)),
4277
+ createElementVNode("div", _hoisted_2, [
4278
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.protocols, (item, key)=>{
4279
+ return openBlock(), createBlock(_component_AIdentityProviderProtocol, {
4280
+ key,
4281
+ id: item
4282
+ }, {
4283
+ default: withCtx((props)=>[
4284
+ createElementVNode("div", {
4285
+ class: normalizeClass([
4286
+ {
4287
+ "active": item === _ctx.protocol && !_ctx.preset
4288
+ },
4289
+ "d-flex flex-column gap-1 text-center identity-provider-picker-item"
4290
+ ]),
4291
+ onClick: withModifiers(($event)=>_ctx.pickProtocol(item), [
4292
+ "prevent"
4293
+ ])
4294
+ }, [
4295
+ createElementVNode("div", null, [
4296
+ createElementVNode("i", {
4297
+ class: normalizeClass([
4298
+ "fa-2x",
4299
+ props.icon
4300
+ ])
4301
+ }, null, 2)
4302
+ ]),
4303
+ createElementVNode("div", null, toDisplayString(props.name), 1)
4304
+ ], 10, _hoisted_3)
4305
+ ]),
4306
+ _: 2
4307
+ }, 1032, [
4308
+ "id"
4309
+ ]);
4310
+ }), 128))
4311
+ ])
4312
+ ]),
4313
+ createElementVNode("div", null, [
4314
+ _cache[1] || (_cache[1] = createElementVNode("h6", null, "Presets", -1)),
4315
+ createElementVNode("div", _hoisted_4, [
4316
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.presets, (item, key)=>{
4317
+ return openBlock(), createBlock(_component_AIdentityProviderPreset, {
4318
+ key,
4319
+ id: item
4320
+ }, {
4321
+ default: withCtx((props)=>[
4322
+ createElementVNode("div", {
4323
+ class: normalizeClass([
4324
+ {
4325
+ "active": item === _ctx.preset
4326
+ },
4327
+ "d-flex flex-column gap-1 text-center identity-provider-picker-item"
4328
+ ]),
4329
+ onClick: withModifiers(($event)=>_ctx.pickPreset(item), [
4330
+ "prevent"
4331
+ ])
4332
+ }, [
4333
+ createElementVNode("div", null, [
4334
+ createElementVNode("i", {
4335
+ class: normalizeClass([
4336
+ "fa-2x",
4337
+ props.icon
4338
+ ])
4339
+ }, null, 2)
4340
+ ]),
4341
+ createElementVNode("div", null, toDisplayString(props.name), 1)
4342
+ ], 10, _hoisted_5)
4343
+ ]),
4344
+ _: 2
4345
+ }, 1032, [
4346
+ "id"
4347
+ ]);
4348
+ }), 128))
4349
+ ])
4350
+ ])
4351
+ ]);
4352
+ }
4353
+ var AIdentityProviderPicker = /* @__PURE__ */ _export_sfc(_sfc_main, [
4354
+ [
4355
+ "render",
4356
+ _sfc_render
4357
+ ],
4358
+ [
4359
+ "__scopeId",
4360
+ "data-v-0df1e731"
4361
+ ]
4362
+ ]);
4363
+
4190
4364
  const AIdentityProviderOAuth2ClientFields = defineComponent({
4191
4365
  props: {
4192
4366
  entity: {
@@ -4724,17 +4898,16 @@ const AIdentityProviderForm = defineComponent({
4724
4898
  set();
4725
4899
  onChange(updatedAt, ()=>set());
4726
4900
  const renderPicker = ()=>h(AIdentityProviderPicker, {
4727
- onPick (value) {
4728
- if (value.protocol) {
4729
- protocol.value = value.protocol;
4730
- } else {
4731
- protocol.value = null;
4732
- }
4733
- if (value.preset) {
4734
- preset.value = value.preset;
4735
- } else {
4736
- preset.value = null;
4901
+ protocol: protocol.value,
4902
+ preset: preset.value,
4903
+ onPick (type, value) {
4904
+ if (type === 'preset') {
4905
+ preset.value = value;
4906
+ protocol.value = `${getIdentityProviderProtocolForPreset(value)}`;
4907
+ return;
4737
4908
  }
4909
+ protocol.value = value;
4910
+ preset.value = null;
4738
4911
  }
4739
4912
  });
4740
4913
  const render = (node)=>{
@@ -7114,5 +7287,5 @@ var index = {
7114
7287
  install
7115
7288
  };
7116
7289
 
7117
- export { AClient, AClientForm, AClientRedirectUris, AClientRedirectUrisItem, AClientScope, AClientScopeAssignment, AClientScopeAssignments, AClientScopes, AClients, AEntityDelete, AIdentityProvider, AIdentityProviderForm, AIdentityProviderIcon, AIdentityProviderLdapForm, AIdentityProviderOAuth2Form, AIdentityProviderPreset, AIdentityProviderProtocol, AIdentityProviderRoleAssignment, AIdentityProviderRoleAssignments, AIdentityProviders, APagination, APermission, APermissionCheck, APermissionForm, APermissionRobotAssignments, APermissionRoleAssignments, APermissionUserAssignments, APermissions, ARealm, ARealmForm, ARealms, ARobot, ARobotForm, ARobotPermissionAssignment, ARobotPermissionAssignments, ARobotRoleAssignment, ARobotRoleAssignments, ARobots, ARole, ARoleForm, ARolePermissionAssignment, ARolePermissionAssignments, ARoleRobotAssignments, ARoleUserAssignments, ARoles, AScope, AScopeClientAssignments, AScopeForm, AScopes, ASearch, ATitle, AUser, AUserForm, AUserPasswordForm, AUserPermissionAssignment, AUserPermissionAssignments, AUserRoleAssignment, AUserRoleAssignments, AUsers, EntityManagerError, HTTPClientSymbol, LanguageSwitcherDropdown, STORE_ID, SocketClientSymbol, StoreSymbol, TranslatorTranslationClientKey, TranslatorTranslationDefaultKey, TranslatorTranslationGroup, TranslatorTranslationVuecsKey, VuelidateCustomRule, VuelidateCustomRuleKey, buildEntityManagerSlotProps, buildFormSubmitWithTranslations, buildListCreatedHandler, buildListDeletedHandler, buildListUpdatedHandler, createEntityManager, createFormSubmitTranslations, createList, createPermissionCheckerReactiveFn, createStore, index as default, defineEntityManagerEvents, defineEntityManagerProps, defineListEvents, defineListProps, extendObjectProperties, extractVuelidateResultsFromChild, getVuelidateSeverity, hasHTTPClient, hasNormalizedSlot, hasStoreFactory, initFormAttributesFromSource, inject$1 as inject, injectHTTPClient, injectSocketManager, injectStoreFactory, injectTranslatorLocale, install, installHTTPClient, installSocketManager, installStore, installTranslator, isQuerySortedDescByDate, isSocketManagerUsable, mergeListOptions, normalizeSlot, onChange, provide, provideHTTPClient, provideSocketManager, provideStoreFactory, renderEntityAssignAction, storeToRefs, useIsEditing, usePermissionCheck, useRealmResourceWritableCheck, useStore, useTranslation, useTranslationsForBaseValidation, useTranslationsForGroup, useTranslationsForNestedValidation, useUpdatedAt, wrapFnWithBusyState };
7290
+ export { AClient, AClientForm, AClientRedirectUris, AClientRedirectUrisItem, AClientScope, AClientScopeAssignment, AClientScopeAssignments, AClientScopes, AClients, AEntityDelete, AIdentityProvider, AIdentityProviderForm, AIdentityProviderIcon, AIdentityProviderLdapForm, AIdentityProviderOAuth2Form, AIdentityProviderPreset, AIdentityProviderProtocol, AIdentityProviderRoleAssignment, AIdentityProviderRoleAssignments, AIdentityProviders, APagination, APermission, APermissionCheck, APermissionForm, APermissionRobotAssignments, APermissionRoleAssignments, APermissionUserAssignments, APermissions, ARealm, ARealmForm, ARealms, ARobot, ARobotForm, ARobotPermissionAssignment, ARobotPermissionAssignments, ARobotRoleAssignment, ARobotRoleAssignments, ARobots, ARole, ARoleForm, ARolePermissionAssignment, ARolePermissionAssignments, ARoleRobotAssignments, ARoleUserAssignments, ARoles, AScope, AScopeClientAssignments, AScopeForm, AScopes, ASearch, ATitle, AUser, AUserForm, AUserPasswordForm, AUserPermissionAssignment, AUserPermissionAssignments, AUserRoleAssignment, AUserRoleAssignments, AUsers, EntityManagerError, HTTPClientSymbol, LanguageSwitcherDropdown, STORE_ID, SocketClientSymbol, StoreDispatcherEventName, TranslatorTranslationClientKey, TranslatorTranslationDefaultKey, TranslatorTranslationGroup, TranslatorTranslationVuecsKey, VuelidateCustomRule, VuelidateCustomRuleKey, buildEntityManagerSlotProps, buildFormSubmitWithTranslations, buildListCreatedHandler, buildListDeletedHandler, buildListUpdatedHandler, createEntityManager, createFormSubmitTranslations, createList, createPermissionCheckerReactiveFn, createStore, createStoreDispatcher, index as default, defineEntityManagerEvents, defineEntityManagerProps, defineListEvents, defineListProps, extendObjectProperties, extractVuelidateResultsFromChild, getVuelidateSeverity, hasHTTPClient, hasNormalizedSlot, hasStoreFactory, initFormAttributesFromSource, inject$1 as inject, injectHTTPClient, injectSocketManager, injectStoreDispatcher, injectStoreFactory, injectTranslatorLocale, install, installHTTPClient, installSocketManager, installStore, installTranslator, isQuerySortedDescByDate, isSocketManagerUsable, mergeListOptions, normalizeSlot, onChange, provide, provideHTTPClient, provideSocketManager, provideStoreDispatcher, provideStoreFactory, renderEntityAssignAction, storeToRefs, useIsEditing, usePermissionCheck, useRealmResourceWritableCheck, useStore, useTranslation, useTranslationsForBaseValidation, useTranslationsForGroup, useTranslationsForNestedValidation, useUpdatedAt, wrapFnWithBusyState };
7118
7291
  //# sourceMappingURL=index.mjs.map