@frontegg/js 7.0.0-alpha.6 → 7.0.0-alpha.8

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.
@@ -1,6 +1,6 @@
1
- import { FronteggStore, EntitledToOptions, Entitlement, StepUpOptions, IsSteppedUpOptions } from '@frontegg/redux-store';
2
- import { FronteggAppOptions, FronteggCheckoutDialogOptions, LocalizationsOverrides, LoadEntitlementsCallback, ShowAdminPortalOptions, SwitchTenantOptions } from '@frontegg/types';
3
- import { IFeatureFlagsAttributes } from '@frontegg/rest-api';
1
+ import { EntitledToOptions, Entitlement, FronteggStore, IsSteppedUpOptions, StepUpOptions } from '@frontegg/redux-store';
2
+ import { FronteggAppOptions, FronteggCheckoutDialogOptions, LoadEntitlementsCallback, LocalizationsOverrides, ShowAdminPortalOptions, SwitchTenantOptions } from '@frontegg/types';
3
+ import { FetchClient, FronteggApiClient, IFeatureFlagsAttributes } from '@frontegg/rest-api';
4
4
  import { CustomAttributes } from '@frontegg/entitlements-javascript-commons';
5
5
  declare type FronteggAppContainers = {
6
6
  adminPortalEl: HTMLElement;
@@ -28,6 +28,8 @@ export declare class FronteggApp {
28
28
  loginBoxRenderer?: any;
29
29
  store: FronteggStore;
30
30
  loadingListeners: (() => void)[];
31
+ fetchClient: FetchClient;
32
+ apiClient: FronteggApiClient;
31
33
  updateLocalizations?: (localizations: LocalizationsOverrides) => void;
32
34
  constructor(_options: FronteggAppOptions, name: string, iframeRendering?: boolean, allowMultipleRenderers?: boolean);
33
35
  /**
@@ -60,7 +62,7 @@ export declare class FronteggApp {
60
62
  updateMetadata(metadata: FronteggAppOptions['metadata']): void;
61
63
  addOnLoadedListener(listener: () => void): void;
62
64
  ready(listener: () => void): void;
63
- loginWithRedirect(): void;
65
+ loginWithRedirect(additionalParams?: Record<string, any>): void;
64
66
  logout(): void;
65
67
  loadScript(component: string): Promise<unknown>;
66
68
  loadLoginBox(): Promise<void>;
@@ -3,20 +3,18 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
3
  import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
4
4
  import _createClass from "@babel/runtime/helpers/esm/createClass";
5
5
  import _regeneratorRuntime from "@babel/runtime/regenerator";
6
- import { getPermissionEntitlements as _getPermissionEntitlements, getFeatureEntitlements as _getFeatureEntitlements, redirectByStepUpUrl, isSteppedUp as _isSteppedUp, createStore } from '@frontegg/redux-store';
6
+ import * as FronteggReduxStore from '@frontegg/redux-store';
7
+ import { createStore, getFeatureEntitlements as _getFeatureEntitlements, getPermissionEntitlements as _getPermissionEntitlements, isSteppedUp as _isSteppedUp, redirectByStepUpUrl } from '@frontegg/redux-store';
8
+ import * as FronteggTypes from '@frontegg/types';
7
9
  import { Metadata } from '@frontegg/types';
8
10
  import { formatName, restoreSearchParams } from '../utils';
9
11
  import { AppHolder } from '../AppHolder';
10
- import { fetch as FronteggFetch, ContextHolder } from '@frontegg/rest-api';
11
- import { RequestSource } from '@frontegg/rest-api';
12
12
  import * as FronteggRestApi from '@frontegg/rest-api';
13
- import * as FronteggTypes from '@frontegg/types';
14
- import * as FronteggReduxStore from '@frontegg/redux-store';
13
+ import { ContextHolder, createApiClient, FetchClient, RequestSource } from '@frontegg/rest-api';
15
14
  import versions from '../version';
16
15
  import { mockFlagsList } from '../utils/mockFlagsList';
17
- import { loadGTM } from './utils';
16
+ import { getOverriddenMetadata, loadGTM } from './utils';
18
17
  import * as ValtioVanilla from 'valtio/vanilla';
19
- import deepMerge from 'deepmerge';
20
18
  export var FronteggApp = /*#__PURE__*/function () {
21
19
  function FronteggApp(_options, name) {
22
20
  var _this = this,
@@ -42,61 +40,43 @@ export var FronteggApp = /*#__PURE__*/function () {
42
40
  this.loginBoxRenderer = void 0;
43
41
  this.store = void 0;
44
42
  this.loadingListeners = [];
43
+ this.fetchClient = void 0;
44
+ this.apiClient = void 0;
45
45
  this.updateLocalizations = void 0;
46
46
  this.loadAdminBoxMetadata = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
47
- var Get, _data$rows, _data$rows$, _data$rows$$configura, _data$rows$$configura2, _data$rows$0$configur, _data$rows2, _data$rows2$, data, overrideUrl, metadata, overrideData;
47
+ var _data$rows$0$configur, _data$rows, _data$rows$, data, metadata;
48
48
  return _regeneratorRuntime.wrap(function _callee$(_context) {
49
49
  while (1) switch (_context.prev = _context.next) {
50
50
  case 0:
51
- Get = FronteggFetch.Get;
52
51
  if (_this.options.metadata) {
53
- _context.next = 25;
52
+ _context.next = 14;
54
53
  break;
55
54
  }
56
- _context.prev = 2;
57
- _context.next = 5;
58
- return Get('/metadata', {
55
+ _context.prev = 1;
56
+ _context.next = 4;
57
+ return _this.fetchClient.get('/metadata', {
59
58
  entityName: 'adminBox'
60
59
  });
61
- case 5:
60
+ case 4:
62
61
  data = _context.sent;
63
- overrideUrl = data == null ? void 0 : (_data$rows = data.rows) == null ? void 0 : (_data$rows$ = _data$rows[0]) == null ? void 0 : (_data$rows$$configura = _data$rows$.configuration) == null ? void 0 : (_data$rows$$configura2 = _data$rows$$configura.metadataOverrides) == null ? void 0 : _data$rows$$configura2.url;
64
- metadata = (_data$rows$0$configur = data == null ? void 0 : (_data$rows2 = data.rows) == null ? void 0 : (_data$rows2$ = _data$rows2[0]) == null ? void 0 : _data$rows2$.configuration) != null ? _data$rows$0$configur : {};
65
- if (!overrideUrl) {
66
- _context.next = 19;
67
- break;
68
- }
69
- _context.prev = 9;
70
- _context.next = 12;
71
- return Get(overrideUrl, {}, {
72
- credentials: 'same-origin'
73
- });
74
- case 12:
75
- overrideData = _context.sent;
76
- if (overrideData) {
77
- metadata = deepMerge(metadata, overrideData);
78
- }
79
- _context.next = 19;
62
+ metadata = (_data$rows$0$configur = data == null ? void 0 : (_data$rows = data.rows) == null ? void 0 : (_data$rows$ = _data$rows[0]) == null ? void 0 : _data$rows$.configuration) != null ? _data$rows$0$configur : {};
63
+ _context.next = 8;
64
+ return getOverriddenMetadata(metadata, _this.fetchClient);
65
+ case 8:
66
+ _this.options.metadata = _context.sent;
67
+ _context.next = 14;
80
68
  break;
81
- case 16:
82
- _context.prev = 16;
83
- _context.t0 = _context["catch"](9);
84
- console.error('Failed to get metadata overrides', _context.t0);
85
- case 19:
86
- _this.options.metadata = metadata;
87
- _context.next = 25;
88
- break;
89
- case 22:
90
- _context.prev = 22;
91
- _context.t1 = _context["catch"](2);
92
- console.error('failed to get admin portal metadata', _context.t1);
93
- case 25:
69
+ case 11:
70
+ _context.prev = 11;
71
+ _context.t0 = _context["catch"](1);
72
+ console.error('failed to get admin portal metadata', _context.t0);
73
+ case 14:
94
74
  Metadata.set(_this.options.metadata, _this.name);
95
- case 26:
75
+ case 15:
96
76
  case "end":
97
77
  return _context.stop();
98
78
  }
99
- }, _callee, null, [[2, 22], [9, 16]]);
79
+ }, _callee, null, [[1, 11]]);
100
80
  }));
101
81
  this.requestAuthorize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
102
82
  var _this$options$authOpt, _this$options$authOpt2;
@@ -144,7 +124,7 @@ export var FronteggApp = /*#__PURE__*/function () {
144
124
  case 4:
145
125
  _context3.prev = 4;
146
126
  _context3.next = 7;
147
- return FronteggRestApi.loadFeatureFlags();
127
+ return _this.apiClient.featureFlags.loadFeatureFlags();
148
128
  case 7:
149
129
  flags = _context3.sent;
150
130
  if (_this.options.overrideFeatureFlags) {
@@ -200,6 +180,8 @@ export var FronteggApp = /*#__PURE__*/function () {
200
180
  requestCredentials: 'include'
201
181
  }, _options.contextOptions)
202
182
  });
183
+ this.fetchClient = new FetchClient(this.name);
184
+ this.apiClient = createApiClient(this.name);
203
185
  if (this.options.cdnUrl) {
204
186
  this.cdnUrl = this.options.cdnUrl;
205
187
  }
@@ -232,13 +214,18 @@ export var FronteggApp = /*#__PURE__*/function () {
232
214
  });
233
215
  }
234
216
  AppHolder.setInstance(appName, this);
217
+ var contextHolder = ContextHolder["for"](appName);
218
+ contextHolder.setAppName(appName);
235
219
  this.setEntitlementsOptions(_options.entitlementsOptions);
236
220
  this.setSessionContext({
237
221
  enableSessionPerTenant: (_options$authOptions = _options.authOptions) == null ? void 0 : _options$authOptions.enableSessionPerTenant
238
222
  });
239
223
 
240
- // for feature flags (for entitlements)
241
- ContextHolder.setAppName(appName);
224
+ // pay attention: basename is used from the router base name, then if it's empty it will be the frontegg options basename
225
+ var basename = _options.basename;
226
+ if (basename) {
227
+ contextHolder.setBasename(basename);
228
+ }
242
229
  }
243
230
 
244
231
  /**
@@ -248,12 +235,12 @@ export var FronteggApp = /*#__PURE__*/function () {
248
235
  _createClass(FronteggApp, [{
249
236
  key: "setEntitlementsOptions",
250
237
  value: function setEntitlementsOptions(entitlementsOptions) {
251
- ContextHolder.setEntitlementsOptions(Object.assign({}, entitlementsOptions));
238
+ ContextHolder["for"](this.name).setEntitlementsOptions(Object.assign({}, entitlementsOptions));
252
239
  }
253
240
  }, {
254
241
  key: "setSessionContext",
255
242
  value: function setSessionContext(sessionContext) {
256
- ContextHolder.setSessionContext(Object.assign({}, sessionContext));
243
+ ContextHolder["for"](this.name).setSessionContext(Object.assign({}, sessionContext));
257
244
  }
258
245
  }, {
259
246
  key: "initContainers",
@@ -331,6 +318,7 @@ export var FronteggApp = /*#__PURE__*/function () {
331
318
  }, {
332
319
  key: "loginWithRedirect",
333
320
  value: function loginWithRedirect() {
321
+ var additionalParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
334
322
  this.store.dispatch({
335
323
  type: 'auth/setState',
336
324
  payload: {
@@ -338,7 +326,8 @@ export var FronteggApp = /*#__PURE__*/function () {
338
326
  }
339
327
  });
340
328
  this.store.dispatch({
341
- type: 'auth/requestHostedLoginAuthorize'
329
+ type: 'auth/requestHostedLoginAuthorize',
330
+ payload: additionalParams
342
331
  });
343
332
  }
344
333
  }, {
@@ -443,7 +432,7 @@ export var FronteggApp = /*#__PURE__*/function () {
443
432
  isMultiApp: false
444
433
  }, isMultiApp = _ref4.isMultiApp;
445
434
  _this$queryFeatureFla = this.queryFeatureFlags(['multi-apps-admin-portal']), _this$queryFeatureFla2 = _slicedToArray(_this$queryFeatureFla, 1), multiAppsFlag = _this$queryFeatureFla2[0];
446
- FronteggRestApi.ContextHolder.setRequestSource(RequestSource.AdminPortal);
435
+ ContextHolder["for"](this.name).setRequestSource(RequestSource.AdminPortal);
447
436
  _context6.next = 5;
448
437
  return this.loadScript('FronteggAdminPortal');
449
438
  case 5:
@@ -491,7 +480,7 @@ export var FronteggApp = /*#__PURE__*/function () {
491
480
  (_this$adminPortalRend = this.adminPortalRenderer) == null ? void 0 : _this$adminPortalRend.unmount();
492
481
  // unmount is removing url search params, therefore we need to restore them after unmount
493
482
  restoreSearchParams(searchParams);
494
- FronteggRestApi.ContextHolder.setRequestSource(null);
483
+ ContextHolder["for"](this.name).setRequestSource(null);
495
484
  } catch (e) {
496
485
  console.error('Failed to unmount admin portal', e);
497
486
  }
@@ -1 +1,2 @@
1
1
  export * from './FronteggApp';
2
+ export { getOverriddenMetadata } from './utils';
@@ -1 +1,2 @@
1
- export * from './FronteggApp';
1
+ export * from './FronteggApp';
2
+ export { getOverriddenMetadata } from './utils';
@@ -1,5 +1,13 @@
1
+ import { FronteggMetadata } from '@frontegg/types';
2
+ import { FetchClient } from '@frontegg/rest-api';
1
3
  /**
2
4
  * load gtm scripts by using metadata gtm keys
3
5
  * @param fronteggAppName
4
6
  */
5
7
  export declare const loadGTM: (fronteggAppName: string) => void;
8
+ /**
9
+ * @param metadata {FronteggMetadata}
10
+ * this function will get metadata overrides from the metadataOverrides.url and will return a new object with override of old metadata
11
+ * @param fetchClient
12
+ */
13
+ export declare const getOverriddenMetadata: (metadata: FronteggMetadata, fetchClient: FetchClient) => Promise<FronteggMetadata>;
@@ -1,4 +1,7 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
1
3
  import { Metadata } from '@frontegg/types';
4
+ import deepMerge from 'deepmerge';
2
5
 
3
6
  /**
4
7
  * To prevent XSS attack, this function check for gtm key validity
@@ -30,4 +33,56 @@ export var loadGTM = function loadGTM(fronteggAppName) {
30
33
  script.innerHTML = "\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','".concat(id, "');\n ");
31
34
  document.body.appendChild(script);
32
35
  });
33
- };
36
+ };
37
+
38
+ /**
39
+ * @param metadata {FronteggMetadata}
40
+ * this function will get metadata overrides from the metadataOverrides.url and will return a new object with override of old metadata
41
+ * @param fetchClient
42
+ */
43
+ export var getOverriddenMetadata = /*#__PURE__*/function () {
44
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(metadata, fetchClient) {
45
+ var _metadata$metadataOve;
46
+ var overrideUrl, overrideData, overriddenMetadata;
47
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
48
+ while (1) switch (_context.prev = _context.next) {
49
+ case 0:
50
+ overrideUrl = (_metadata$metadataOve = metadata.metadataOverrides) == null ? void 0 : _metadata$metadataOve.url;
51
+ if (overrideUrl) {
52
+ _context.next = 3;
53
+ break;
54
+ }
55
+ return _context.abrupt("return", metadata);
56
+ case 3:
57
+ _context.prev = 3;
58
+ _context.next = 6;
59
+ return fetchClient.get(overrideUrl, {}, {
60
+ credentials: 'same-origin'
61
+ });
62
+ case 6:
63
+ overrideData = _context.sent;
64
+ if (!overrideData) {
65
+ _context.next = 10;
66
+ break;
67
+ }
68
+ overriddenMetadata = deepMerge(metadata, overrideData);
69
+ return _context.abrupt("return", overriddenMetadata);
70
+ case 10:
71
+ _context.next = 15;
72
+ break;
73
+ case 12:
74
+ _context.prev = 12;
75
+ _context.t0 = _context["catch"](3);
76
+ console.error('Failed to get metadata overrides', _context.t0);
77
+ case 15:
78
+ return _context.abrupt("return", metadata);
79
+ case 16:
80
+ case "end":
81
+ return _context.stop();
82
+ }
83
+ }, _callee, null, [[3, 12]]);
84
+ }));
85
+ return function getOverriddenMetadata(_x, _x2) {
86
+ return _ref3.apply(this, arguments);
87
+ };
88
+ }();
@@ -11,9 +11,10 @@ export var HostedLogin = /*#__PURE__*/function () {
11
11
  value: function setAuthentication(isAuthenticated, accessToken, user) {
12
12
  var appName = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default';
13
13
  var app = AppHolder.getInstance(appName);
14
+ var contextHolder = ContextHolder["for"](appName);
14
15
  if (isAuthenticated && accessToken) {
15
- ContextHolder.setAccessToken(accessToken);
16
- ContextHolder.setUser(Object.assign({}, user, {
16
+ contextHolder.setAccessToken(accessToken);
17
+ contextHolder.setUser(Object.assign({}, user, {
17
18
  accessToken: accessToken
18
19
  }));
19
20
  app.store.actions.setAuthState({
@@ -23,8 +24,8 @@ export var HostedLogin = /*#__PURE__*/function () {
23
24
  });
24
25
  app.store.actions.loadTenants();
25
26
  } else {
26
- ContextHolder.setAccessToken(null);
27
- ContextHolder.setUser(null);
27
+ contextHolder.setAccessToken(null);
28
+ contextHolder.setUser(null);
28
29
  app.store.actions.setAuthState({
29
30
  isLoading: false,
30
31
  isAuthenticated: false,
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v7.0.0-alpha.6
1
+ /** @license Frontegg v7.0.0-alpha.8
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
@@ -20,7 +20,6 @@ var _version = _interopRequireDefault(require("../version"));
20
20
  var _mockFlagsList = require("../utils/mockFlagsList");
21
21
  var _utils2 = require("./utils");
22
22
  var ValtioVanilla = _interopRequireWildcard(require("valtio/vanilla"));
23
- var _deepmerge = _interopRequireDefault(require("deepmerge"));
24
23
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
24
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
25
  var FronteggApp = /*#__PURE__*/function () {
@@ -48,61 +47,43 @@ var FronteggApp = /*#__PURE__*/function () {
48
47
  this.loginBoxRenderer = void 0;
49
48
  this.store = void 0;
50
49
  this.loadingListeners = [];
50
+ this.fetchClient = void 0;
51
+ this.apiClient = void 0;
51
52
  this.updateLocalizations = void 0;
52
53
  this.loadAdminBoxMetadata = /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
53
- var Get, _data$rows, _data$rows$, _data$rows$$configura, _data$rows$$configura2, _data$rows$0$configur, _data$rows2, _data$rows2$, data, overrideUrl, metadata, overrideData;
54
+ var _data$rows$0$configur, _data$rows, _data$rows$, data, metadata;
54
55
  return _regenerator["default"].wrap(function _callee$(_context) {
55
56
  while (1) switch (_context.prev = _context.next) {
56
57
  case 0:
57
- Get = FronteggRestApi.fetch.Get;
58
58
  if (_this.options.metadata) {
59
- _context.next = 25;
59
+ _context.next = 14;
60
60
  break;
61
61
  }
62
- _context.prev = 2;
63
- _context.next = 5;
64
- return Get('/metadata', {
62
+ _context.prev = 1;
63
+ _context.next = 4;
64
+ return _this.fetchClient.get('/metadata', {
65
65
  entityName: 'adminBox'
66
66
  });
67
- case 5:
67
+ case 4:
68
68
  data = _context.sent;
69
- overrideUrl = data == null ? void 0 : (_data$rows = data.rows) == null ? void 0 : (_data$rows$ = _data$rows[0]) == null ? void 0 : (_data$rows$$configura = _data$rows$.configuration) == null ? void 0 : (_data$rows$$configura2 = _data$rows$$configura.metadataOverrides) == null ? void 0 : _data$rows$$configura2.url;
70
- metadata = (_data$rows$0$configur = data == null ? void 0 : (_data$rows2 = data.rows) == null ? void 0 : (_data$rows2$ = _data$rows2[0]) == null ? void 0 : _data$rows2$.configuration) != null ? _data$rows$0$configur : {};
71
- if (!overrideUrl) {
72
- _context.next = 19;
73
- break;
74
- }
75
- _context.prev = 9;
76
- _context.next = 12;
77
- return Get(overrideUrl, {}, {
78
- credentials: 'same-origin'
79
- });
80
- case 12:
81
- overrideData = _context.sent;
82
- if (overrideData) {
83
- metadata = (0, _deepmerge["default"])(metadata, overrideData);
84
- }
85
- _context.next = 19;
86
- break;
87
- case 16:
88
- _context.prev = 16;
89
- _context.t0 = _context["catch"](9);
90
- console.error('Failed to get metadata overrides', _context.t0);
91
- case 19:
92
- _this.options.metadata = metadata;
93
- _context.next = 25;
69
+ metadata = (_data$rows$0$configur = data == null ? void 0 : (_data$rows = data.rows) == null ? void 0 : (_data$rows$ = _data$rows[0]) == null ? void 0 : _data$rows$.configuration) != null ? _data$rows$0$configur : {};
70
+ _context.next = 8;
71
+ return (0, _utils2.getOverriddenMetadata)(metadata, _this.fetchClient);
72
+ case 8:
73
+ _this.options.metadata = _context.sent;
74
+ _context.next = 14;
94
75
  break;
95
- case 22:
96
- _context.prev = 22;
97
- _context.t1 = _context["catch"](2);
98
- console.error('failed to get admin portal metadata', _context.t1);
99
- case 25:
76
+ case 11:
77
+ _context.prev = 11;
78
+ _context.t0 = _context["catch"](1);
79
+ console.error('failed to get admin portal metadata', _context.t0);
80
+ case 14:
100
81
  FronteggTypes.Metadata.set(_this.options.metadata, _this.name);
101
- case 26:
82
+ case 15:
102
83
  case "end":
103
84
  return _context.stop();
104
85
  }
105
- }, _callee, null, [[2, 22], [9, 16]]);
86
+ }, _callee, null, [[1, 11]]);
106
87
  }));
107
88
  this.requestAuthorize = /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
108
89
  var _this$options$authOpt, _this$options$authOpt2;
@@ -150,7 +131,7 @@ var FronteggApp = /*#__PURE__*/function () {
150
131
  case 4:
151
132
  _context3.prev = 4;
152
133
  _context3.next = 7;
153
- return FronteggRestApi.loadFeatureFlags();
134
+ return _this.apiClient.featureFlags.loadFeatureFlags();
154
135
  case 7:
155
136
  flags = _context3.sent;
156
137
  if (_this.options.overrideFeatureFlags) {
@@ -206,6 +187,8 @@ var FronteggApp = /*#__PURE__*/function () {
206
187
  requestCredentials: 'include'
207
188
  }, _options.contextOptions)
208
189
  });
190
+ this.fetchClient = new FronteggRestApi.FetchClient(this.name);
191
+ this.apiClient = (0, FronteggRestApi.createApiClient)(this.name);
209
192
  if (this.options.cdnUrl) {
210
193
  this.cdnUrl = this.options.cdnUrl;
211
194
  }
@@ -238,13 +221,18 @@ var FronteggApp = /*#__PURE__*/function () {
238
221
  });
239
222
  }
240
223
  _AppHolder.AppHolder.setInstance(appName, this);
224
+ var contextHolder = FronteggRestApi.ContextHolder["for"](appName);
225
+ contextHolder.setAppName(appName);
241
226
  this.setEntitlementsOptions(_options.entitlementsOptions);
242
227
  this.setSessionContext({
243
228
  enableSessionPerTenant: (_options$authOptions = _options.authOptions) == null ? void 0 : _options$authOptions.enableSessionPerTenant
244
229
  });
245
230
 
246
- // for feature flags (for entitlements)
247
- FronteggRestApi.ContextHolder.setAppName(appName);
231
+ // pay attention: basename is used from the router base name, then if it's empty it will be the frontegg options basename
232
+ var basename = _options.basename;
233
+ if (basename) {
234
+ contextHolder.setBasename(basename);
235
+ }
248
236
  }
249
237
 
250
238
  /**
@@ -254,12 +242,12 @@ var FronteggApp = /*#__PURE__*/function () {
254
242
  (0, _createClass2["default"])(FronteggApp, [{
255
243
  key: "setEntitlementsOptions",
256
244
  value: function setEntitlementsOptions(entitlementsOptions) {
257
- FronteggRestApi.ContextHolder.setEntitlementsOptions(Object.assign({}, entitlementsOptions));
245
+ FronteggRestApi.ContextHolder["for"](this.name).setEntitlementsOptions(Object.assign({}, entitlementsOptions));
258
246
  }
259
247
  }, {
260
248
  key: "setSessionContext",
261
249
  value: function setSessionContext(sessionContext) {
262
- FronteggRestApi.ContextHolder.setSessionContext(Object.assign({}, sessionContext));
250
+ FronteggRestApi.ContextHolder["for"](this.name).setSessionContext(Object.assign({}, sessionContext));
263
251
  }
264
252
  }, {
265
253
  key: "initContainers",
@@ -337,6 +325,7 @@ var FronteggApp = /*#__PURE__*/function () {
337
325
  }, {
338
326
  key: "loginWithRedirect",
339
327
  value: function loginWithRedirect() {
328
+ var additionalParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
340
329
  this.store.dispatch({
341
330
  type: 'auth/setState',
342
331
  payload: {
@@ -344,7 +333,8 @@ var FronteggApp = /*#__PURE__*/function () {
344
333
  }
345
334
  });
346
335
  this.store.dispatch({
347
- type: 'auth/requestHostedLoginAuthorize'
336
+ type: 'auth/requestHostedLoginAuthorize',
337
+ payload: additionalParams
348
338
  });
349
339
  }
350
340
  }, {
@@ -449,7 +439,7 @@ var FronteggApp = /*#__PURE__*/function () {
449
439
  isMultiApp: false
450
440
  }, isMultiApp = _ref4.isMultiApp;
451
441
  _this$queryFeatureFla = this.queryFeatureFlags(['multi-apps-admin-portal']), _this$queryFeatureFla2 = (0, _slicedToArray2["default"])(_this$queryFeatureFla, 1), multiAppsFlag = _this$queryFeatureFla2[0];
452
- FronteggRestApi.ContextHolder.setRequestSource(FronteggRestApi.RequestSource.AdminPortal);
442
+ FronteggRestApi.ContextHolder["for"](this.name).setRequestSource(FronteggRestApi.RequestSource.AdminPortal);
453
443
  _context6.next = 5;
454
444
  return this.loadScript('FronteggAdminPortal');
455
445
  case 5:
@@ -497,7 +487,7 @@ var FronteggApp = /*#__PURE__*/function () {
497
487
  (_this$adminPortalRend = this.adminPortalRenderer) == null ? void 0 : _this$adminPortalRend.unmount();
498
488
  // unmount is removing url search params, therefore we need to restore them after unmount
499
489
  (0, _utils.restoreSearchParams)(searchParams);
500
- FronteggRestApi.ContextHolder.setRequestSource(null);
490
+ FronteggRestApi.ContextHolder["for"](this.name).setRequestSource(null);
501
491
  } catch (e) {
502
492
  console.error('Failed to unmount admin portal', e);
503
493
  }
@@ -3,9 +3,19 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ var _exportNames = {
7
+ getOverriddenMetadata: true
8
+ };
9
+ Object.defineProperty(exports, "getOverriddenMetadata", {
10
+ enumerable: true,
11
+ get: function get() {
12
+ return _utils.getOverriddenMetadata;
13
+ }
14
+ });
6
15
  var _FronteggApp = require("./FronteggApp");
7
16
  Object.keys(_FronteggApp).forEach(function (key) {
8
17
  if (key === "default" || key === "__esModule") return;
18
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
9
19
  if (key in exports && exports[key] === _FronteggApp[key]) return;
10
20
  Object.defineProperty(exports, key, {
11
21
  enumerable: true,
@@ -13,4 +23,5 @@ Object.keys(_FronteggApp).forEach(function (key) {
13
23
  return _FronteggApp[key];
14
24
  }
15
25
  });
16
- });
26
+ });
27
+ var _utils = require("./utils");
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.loadGTM = void 0;
7
+ exports.loadGTM = exports.getOverriddenMetadata = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
10
  var _types = require("@frontegg/types");
11
+ var _deepmerge = _interopRequireDefault(require("deepmerge"));
8
12
  /**
9
13
  * To prevent XSS attack, this function check for gtm key validity
10
14
  * XSS attack may happen if values are injected by postman because we don't have validity check in the BE
@@ -36,4 +40,57 @@ var loadGTM = function loadGTM(fronteggAppName) {
36
40
  document.body.appendChild(script);
37
41
  });
38
42
  };
39
- exports.loadGTM = loadGTM;
43
+
44
+ /**
45
+ * @param metadata {FronteggMetadata}
46
+ * this function will get metadata overrides from the metadataOverrides.url and will return a new object with override of old metadata
47
+ * @param fetchClient
48
+ */
49
+ exports.loadGTM = loadGTM;
50
+ var getOverriddenMetadata = /*#__PURE__*/function () {
51
+ var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(metadata, fetchClient) {
52
+ var _metadata$metadataOve;
53
+ var overrideUrl, overrideData, overriddenMetadata;
54
+ return _regenerator["default"].wrap(function _callee$(_context) {
55
+ while (1) switch (_context.prev = _context.next) {
56
+ case 0:
57
+ overrideUrl = (_metadata$metadataOve = metadata.metadataOverrides) == null ? void 0 : _metadata$metadataOve.url;
58
+ if (overrideUrl) {
59
+ _context.next = 3;
60
+ break;
61
+ }
62
+ return _context.abrupt("return", metadata);
63
+ case 3:
64
+ _context.prev = 3;
65
+ _context.next = 6;
66
+ return fetchClient.get(overrideUrl, {}, {
67
+ credentials: 'same-origin'
68
+ });
69
+ case 6:
70
+ overrideData = _context.sent;
71
+ if (!overrideData) {
72
+ _context.next = 10;
73
+ break;
74
+ }
75
+ overriddenMetadata = (0, _deepmerge["default"])(metadata, overrideData);
76
+ return _context.abrupt("return", overriddenMetadata);
77
+ case 10:
78
+ _context.next = 15;
79
+ break;
80
+ case 12:
81
+ _context.prev = 12;
82
+ _context.t0 = _context["catch"](3);
83
+ console.error('Failed to get metadata overrides', _context.t0);
84
+ case 15:
85
+ return _context.abrupt("return", metadata);
86
+ case 16:
87
+ case "end":
88
+ return _context.stop();
89
+ }
90
+ }, _callee, null, [[3, 12]]);
91
+ }));
92
+ return function getOverriddenMetadata(_x, _x2) {
93
+ return _ref3.apply(this, arguments);
94
+ };
95
+ }();
96
+ exports.getOverriddenMetadata = getOverriddenMetadata;
@@ -18,9 +18,10 @@ var HostedLogin = /*#__PURE__*/function () {
18
18
  value: function setAuthentication(isAuthenticated, accessToken, user) {
19
19
  var appName = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default';
20
20
  var app = _AppHolder.AppHolder.getInstance(appName);
21
+ var contextHolder = _restApi.ContextHolder["for"](appName);
21
22
  if (isAuthenticated && accessToken) {
22
- _restApi.ContextHolder.setAccessToken(accessToken);
23
- _restApi.ContextHolder.setUser(Object.assign({}, user, {
23
+ contextHolder.setAccessToken(accessToken);
24
+ contextHolder.setUser(Object.assign({}, user, {
24
25
  accessToken: accessToken
25
26
  }));
26
27
  app.store.actions.setAuthState({
@@ -30,8 +31,8 @@ var HostedLogin = /*#__PURE__*/function () {
30
31
  });
31
32
  app.store.actions.loadTenants();
32
33
  } else {
33
- _restApi.ContextHolder.setAccessToken(null);
34
- _restApi.ContextHolder.setUser(null);
34
+ contextHolder.setAccessToken(null);
35
+ contextHolder.setUser(null);
35
36
  app.store.actions.setAuthState({
36
37
  isLoading: false,
37
38
  isAuthenticated: false,