@frontegg/nextjs 6.7.8-alpha.3738952319 → 6.7.9-alpha.3741489660
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -0
- package/FronteggBaseProvider-5529ded6.js +119 -0
- package/FronteggBaseProvider-5529ded6.js.map +1 -0
- package/FronteggClientProviderNext13-65bb4cd0.js +19 -0
- package/FronteggClientProviderNext13-65bb4cd0.js.map +1 -0
- package/FronteggConfig-7ae86562.js +123 -0
- package/FronteggConfig-7ae86562.js.map +1 -0
- package/FronteggProvider.d.ts +3 -12
- package/FronteggProviderNoSSR.d.ts +2 -4
- package/README.md +56 -4
- package/api-70f0e81e.js +58 -0
- package/api-70f0e81e.js.map +1 -0
- package/client/FronteggAppRouter.d.ts +10 -0
- package/client/FronteggClientProviderNext13.d.ts +3 -0
- package/client/index.d.ts +2 -0
- package/client/index.js +63 -0
- package/client/index.js.map +1 -0
- package/{FronteggConfig.d.ts → common/FronteggConfig.d.ts} +1 -1
- package/{api.d.ts → common/api.d.ts} +0 -0
- package/{AppContext.d.ts → common/client/AppContext.d.ts} +0 -0
- package/common/client/ExpireInListener.d.ts +1 -0
- package/common/client/FronteggBaseProvider.d.ts +3 -0
- package/common/client/createOrGetFronteggApp.d.ts +11 -0
- package/common/client/hooks/index.d.ts +1 -0
- package/common/client/hooks/useRequestAuthorizeSSR.d.ts +9 -0
- package/common/client/index.d.ts +4 -0
- package/{consts.d.ts → common/consts.d.ts} +0 -0
- package/common/getMeAndTenants.d.ts +2 -0
- package/{helpers.d.ts → common/helpers.d.ts} +7 -9
- package/common/index.d.ts +6 -0
- package/common/index.js +12 -0
- package/common/index.js.map +1 -0
- package/common/types.d.ts +74 -0
- package/common/utils/createGetSession.d.ts +7 -0
- package/common/utils/getCookieFromRequest.d.ts +2 -0
- package/common/utils/index.d.ts +3 -0
- package/common/utils/parseCookie.d.ts +1 -0
- package/consts-873fdf4e.js +9 -0
- package/consts-873fdf4e.js.map +1 -0
- package/createGetSession-81b1748e.js +50 -0
- package/createGetSession-81b1748e.js.map +1 -0
- package/edge/getSessionOnEdge.d.ts +2 -0
- package/edge/index.d.ts +1 -0
- package/edge/index.js +29 -0
- package/edge/index.js.map +1 -0
- package/getCookieFromRequest-624c37b5.js +28 -0
- package/getCookieFromRequest-624c37b5.js.map +1 -0
- package/helpers-dbf29bd5.js +189 -0
- package/helpers-dbf29bd5.js.map +1 -0
- package/index.d.ts +1 -2
- package/index.js +599 -0
- package/index.js.map +1 -0
- package/package.json +15 -9
- package/refreshToken.d.ts +3 -0
- package/server/FronteggProviderNext13.d.ts +3 -0
- package/server/getSessionNext13.d.ts +4 -0
- package/server/index.d.ts +2 -0
- package/server/index.js +87 -0
- package/server/index.js.map +1 -0
- package/session.d.ts +4 -8
- package/withFronteggApp.d.ts +10 -8
- package/index.cjs.js +0 -2747
- package/index.esm.js +0 -2691
- package/types.d.ts +0 -53
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
## [6.7.9](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.8...v6.7.9) (2022-12-20)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## [6.7.8](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.7...v6.7.8) (2022-12-20)
|
|
8
|
+
|
|
9
|
+
- Fixed mfa input on mobile
|
|
10
|
+
- Enabled scim without roles
|
|
11
|
+
- Fixed menu component for dark theme
|
|
12
|
+
- Added api navigation icon
|
|
13
|
+
- Added tests for mfa
|
|
14
|
+
- Added apple social login types
|
|
15
|
+
- Added support for Hiding Invoices
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## [6.7.7](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.6...v6.7.7) (2022-12-13)
|
|
19
|
+
|
|
20
|
+
- Fixed MFA flow issues
|
|
21
|
+
- Added support for subscriptions billing collection
|
|
22
|
+
- Fixed the issue of the OTC screen submit button is disabled on mobile devices
|
|
23
|
+
- Added SCIM section in admin portal under FF
|
|
24
|
+
|
|
25
|
+
## [6.7.6](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.5...v6.7.6) (2022-12-12)
|
|
26
|
+
# v6.7.6
|
|
27
|
+
• Fixed ignoring urlPrefix issue
|
|
28
|
+
• Added the ability to Invite a user by bulk API in the admin portal
|
|
29
|
+
• Fixed OTC digits are not visible on mobile devices
|
|
30
|
+
• Added MFA devices management section in the admin portal under FF
|
|
31
|
+
• Fixed the ability to copy invite link for dynamic base URL as well
|
|
32
|
+
• Added new abilities to MFA flows under FF
|
|
33
|
+
• Added support for providing an external CDN to load fonts in Frontegg components
|
|
34
|
+
• Update hide fields API according to new security tabs naming
|
|
35
|
+
• Changed max length for secret fields to 100 characters
|
|
36
|
+
• Added support for customizing invite user dialog fields
|
|
37
|
+
• Fixed creating custom webhook on the Admin Portal is sent with the event ID and not with the event Key
|
|
38
|
+
|
|
39
|
+
### NextJS Wrapper 6.7.6:
|
|
40
|
+
- Improved SSR support for `withFronteggApp` function
|
|
41
|
+
|
|
42
|
+
## [6.7.5](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.4...v6.7.5) (2022-11-28)
|
|
43
|
+
|
|
44
|
+
# v6.7.5
|
|
45
|
+
- Update hide fields API according to new security tabs naming
|
|
46
|
+
- Changed max length for secret fields to 100 characters
|
|
47
|
+
- Added support for customizing invite user dialog fields
|
|
48
|
+
- Added support for admin portal pre-defined theme options (dark, vivid, modern, and classic themes)
|
|
49
|
+
- Added support for customizing admin portal navigation hover color
|
|
50
|
+
- Fixed typo of Andorra country in countries dropdown
|
|
51
|
+
- Fixed select popup alignment issue
|
|
52
|
+
- Changed no local authentication feature to also hide the sign-up form when there is no local authentication option (use only social logins and SSO for signing up)
|
|
53
|
+
- Added mock for feature flags API for admin portal preview mode
|
|
54
|
+
- Fixed resend invitation and activate your account API calls
|
|
55
|
+
- Fixed creating custom webhook on the Admin Portal is sent with the event ID and not with the event Key
|
|
56
|
+
- Added support for customizing fields and tabs in the admin portal
|
|
57
|
+
|
|
58
|
+
### NextJS Wrapper 6.7.5:
|
|
59
|
+
- Updated next readme to include hosted login box integration
|
|
60
|
+
|
|
61
|
+
## [6.7.4](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.3...v6.7.4) (2022-11-15)
|
|
62
|
+
|
|
63
|
+
- Fixed redirect to the app after signing up without forced email verification
|
|
64
|
+
- Fixed admin portal dark theme
|
|
65
|
+
- Added the ability to customize fields and tabs in the admin portal
|
|
66
|
+
- Fixed cleaning up error messages on sign up page when re-visiting the page
|
|
67
|
+
- Fixed resizing the login box when the logo is null
|
|
68
|
+
- Fix the ReCaptcha timeout issue
|
|
69
|
+
|
|
70
|
+
## [6.7.3](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.2...v6.7.3) (2022-11-11)
|
|
71
|
+
|
|
72
|
+
- FR-9186 - support ssr with session and refresh token
|
|
73
|
+
- FR-9614 - Add support for innerThemeProvider for admin portal pages and tabs
|
|
74
|
+
|
|
75
|
+
- FR-9186 - fix pipeline
|
|
76
|
+
### AdminPortal 6.36.0:
|
|
77
|
+
-
|
|
78
|
+
|
|
79
|
+
### AdminPortal 6.35.0:
|
|
80
|
+
-
|
|
81
|
+
### AdminPortal 6.34.0:
|
|
82
|
+
-
|
|
83
|
+
|
|
84
|
+
### NextJS Wrapper 6.7.3:
|
|
85
|
+
- FR-9544 - remove console logs
|
|
86
|
+
- FR-9544 - Add support for keep session a live
|
|
87
|
+
- FR-9187 - split cookie if exceeds length of 4096
|
|
88
|
+
|
|
89
|
+
## [6.7.2](https://github.com/frontegg/frontegg-nextjs/compare/v6.7.1...v6.7.2) (2022-10-26)
|
|
90
|
+
|
|
91
|
+
### AdminPortal 6.34.0:
|
|
92
|
+
-
|
|
93
|
+
|
|
94
|
+
### NextJS Wrapper 6.7.2:
|
|
95
|
+
- FR-9186 - Fix Changelog
|
|
96
|
+
- FR-9186 - Generate changelog for pre-release / releases based on AdminPortal and LoginBox changes
|
|
97
|
+
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __assign, __rest } from 'tslib';
|
|
3
|
+
import { useAuthUserOrNull, useAuthActions, FronteggStoreProvider } from '@frontegg/react-hooks';
|
|
4
|
+
import { fronteggAuthApiRoutes, ContextHolder } from '@frontegg/rest-api';
|
|
5
|
+
import React, { createContext, useEffect, useRef, useCallback, useMemo } from 'react';
|
|
6
|
+
import { AppHolder, initialize } from '@frontegg/js';
|
|
7
|
+
import { createFronteggStore } from '@frontegg/redux-store';
|
|
8
|
+
|
|
9
|
+
var AppContext = createContext(null);
|
|
10
|
+
|
|
11
|
+
var createOrGetFronteggApp = function (_a) {
|
|
12
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
13
|
+
var options = _a.options, onRedirectTo = _a.onRedirectTo, appName = _a.appName, user = _a.user, tenants = _a.tenants, storeHolder = _a.storeHolder;
|
|
14
|
+
var _l = (_b = options.session) !== null && _b !== void 0 ? _b : {}, accessToken = _l.accessToken, refreshToken = _l.refreshToken;
|
|
15
|
+
var contextOptions = __assign(__assign({ requestCredentials: 'include' }, options.contextOptions), { baseUrl: function (path) {
|
|
16
|
+
if (fronteggAuthApiRoutes.indexOf(path) !== -1 ||
|
|
17
|
+
path.endsWith('/postlogin') ||
|
|
18
|
+
path.endsWith('/prelogin') ||
|
|
19
|
+
path === '/oauth/token') {
|
|
20
|
+
return options.envAppUrl + "/api";
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return options.envBaseUrl;
|
|
24
|
+
}
|
|
25
|
+
}, clientId: options.envClientId });
|
|
26
|
+
var tenantsState = tenants
|
|
27
|
+
? __assign({ tenantTree: null, subTenants: [], tenants: tenants, loading: false }, (_c = options.authOptions) === null || _c === void 0 ? void 0 : _c.tenantsState) : undefined;
|
|
28
|
+
var userData = user
|
|
29
|
+
? __assign(__assign(__assign({}, user), { accessToken: accessToken !== null && accessToken !== void 0 ? accessToken : '', refreshToken: refreshToken !== null && refreshToken !== void 0 ? refreshToken : undefined }), (_d = options.authOptions) === null || _d === void 0 ? void 0 : _d.user) : null;
|
|
30
|
+
var authOptions = __assign(__assign({}, options.authOptions), { onRedirectTo: onRedirectTo, isLoading: false, isAuthenticated: !!options.session, hostedLoginBox: (_e = options.hostedLoginBox) !== null && _e !== void 0 ? _e : false, disableSilentRefresh: (_g = (_f = options.authOptions) === null || _f === void 0 ? void 0 : _f.disableSilentRefresh) !== null && _g !== void 0 ? _g : false, user: userData, tenantsState: tenantsState });
|
|
31
|
+
var sharedStore = createFronteggStore({ context: contextOptions }, storeHolder.current, options.previewMode, authOptions, {
|
|
32
|
+
auth: authOptions !== null && authOptions !== void 0 ? authOptions : {},
|
|
33
|
+
audits: (_h = options.auditsOptions) !== null && _h !== void 0 ? _h : {},
|
|
34
|
+
}, false, options.urlStrategy);
|
|
35
|
+
var createdApp;
|
|
36
|
+
try {
|
|
37
|
+
createdApp = AppHolder.getInstance(appName !== null && appName !== void 0 ? appName : 'default');
|
|
38
|
+
createdApp.store = sharedStore;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
createdApp = initialize(__assign(__assign({}, options), { store: sharedStore, hostedLoginBox: (_j = options.hostedLoginBox) !== null && _j !== void 0 ? _j : false, customLoginBox: (_k = options.customLoginBox) !== null && _k !== void 0 ? _k : false, basename: options.basename, authOptions: authOptions,
|
|
42
|
+
contextOptions: contextOptions,
|
|
43
|
+
onRedirectTo: onRedirectTo }), appName !== null && appName !== void 0 ? appName : 'default');
|
|
44
|
+
}
|
|
45
|
+
return createdApp;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
var ExpireInListener = function () {
|
|
49
|
+
var user = useAuthUserOrNull();
|
|
50
|
+
var actions = useAuthActions();
|
|
51
|
+
useEffect(function () {
|
|
52
|
+
if (user && (user === null || user === void 0 ? void 0 : user.expiresIn) == null) {
|
|
53
|
+
actions.setUser(__assign(__assign({}, user), { expiresIn: Math.floor((user['exp'] * 1000 - Date.now()) / 1000) }));
|
|
54
|
+
}
|
|
55
|
+
}, [actions, user]);
|
|
56
|
+
// eslint-disable-next-line react/jsx-no-useless-fragment
|
|
57
|
+
return React.createElement(React.Fragment, null);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
var useRequestAuthorizeSSR = function (_a) {
|
|
61
|
+
var app = _a.app, accessToken = _a.accessToken, user = _a.user, tenants = _a.tenants, refreshToken = _a.refreshToken;
|
|
62
|
+
useEffect(function () {
|
|
63
|
+
app === null || app === void 0 ? void 0 : app.store.dispatch({
|
|
64
|
+
type: 'auth/requestAuthorizeSSR',
|
|
65
|
+
payload: {
|
|
66
|
+
accessToken: accessToken,
|
|
67
|
+
user: user ? __assign(__assign({}, user), { refreshToken: refreshToken }) : null,
|
|
68
|
+
tenants: tenants,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}, [app]);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
var Connector = function (_a) {
|
|
75
|
+
var _b, _c;
|
|
76
|
+
var router = _a.router, _d = _a.appName, appName = _d === void 0 ? 'default' : _d, user = _a.user, tenants = _a.tenants, props = __rest(_a, ["router", "appName", "user", "tenants"]);
|
|
77
|
+
var isSSR = typeof window === 'undefined';
|
|
78
|
+
var _e = (_b = props.session) !== null && _b !== void 0 ? _b : {}, accessToken = _e.accessToken, refreshToken = _e.refreshToken;
|
|
79
|
+
var baseName = (_c = props.basename) !== null && _c !== void 0 ? _c : '';
|
|
80
|
+
var storeHolder = useRef({});
|
|
81
|
+
var onRedirectTo = useCallback(function (_path, opts) {
|
|
82
|
+
var path = _path;
|
|
83
|
+
if (path.startsWith(baseName)) {
|
|
84
|
+
path = path.substring(baseName.length);
|
|
85
|
+
}
|
|
86
|
+
if (opts === null || opts === void 0 ? void 0 : opts.preserveQueryParams) {
|
|
87
|
+
path = "" + path + window.location.search;
|
|
88
|
+
}
|
|
89
|
+
if ((opts === null || opts === void 0 ? void 0 : opts.refresh) && !isSSR) {
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
window.Cypress ? router.push(path) : (window.location.href = path);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
(opts === null || opts === void 0 ? void 0 : opts.replace) ? router.replace(path) : router.push(path);
|
|
95
|
+
}
|
|
96
|
+
}, []);
|
|
97
|
+
var app = useMemo(function () {
|
|
98
|
+
return createOrGetFronteggApp({
|
|
99
|
+
options: __assign(__assign({}, props), { basename: baseName }),
|
|
100
|
+
user: user,
|
|
101
|
+
tenants: tenants,
|
|
102
|
+
onRedirectTo: onRedirectTo,
|
|
103
|
+
appName: appName,
|
|
104
|
+
storeHolder: storeHolder,
|
|
105
|
+
});
|
|
106
|
+
}, [props]);
|
|
107
|
+
ContextHolder.setOnRedirectTo(onRedirectTo);
|
|
108
|
+
useRequestAuthorizeSSR({ app: app, accessToken: accessToken, user: user, tenants: tenants, refreshToken: refreshToken });
|
|
109
|
+
return (React.createElement(AppContext.Provider, { value: app },
|
|
110
|
+
React.createElement(FronteggStoreProvider, __assign({}, __assign(__assign({}, props), { app: app })), props.children)));
|
|
111
|
+
};
|
|
112
|
+
var FronteggBaseProvider = function (props) {
|
|
113
|
+
return (React.createElement(Connector, __assign({}, props, { framework: 'nextjs' }),
|
|
114
|
+
React.createElement(ExpireInListener, null),
|
|
115
|
+
props.children));
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export { AppContext as A, ExpireInListener as E, FronteggBaseProvider as F };
|
|
119
|
+
//# sourceMappingURL=FronteggBaseProvider-5529ded6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FronteggBaseProvider-5529ded6.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __rest, __assign } from 'tslib';
|
|
3
|
+
import { F as FronteggBaseProvider } from './FronteggBaseProvider-5529ded6.js';
|
|
4
|
+
import '@frontegg/js';
|
|
5
|
+
import '@frontegg/redux-store';
|
|
6
|
+
import '@frontegg/rest-api';
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import '@frontegg/react-hooks';
|
|
9
|
+
import { useRouter } from 'next/navigation';
|
|
10
|
+
|
|
11
|
+
var FronteggClientProviderNext13 = function (_a) {
|
|
12
|
+
var children = _a.children, basename = _a.basename, props = __rest(_a, ["children", "basename"]);
|
|
13
|
+
var router = useRouter();
|
|
14
|
+
var basePath = process.env.__NEXT_ROUTER_BASEPATH || '';
|
|
15
|
+
return (React.createElement(FronteggBaseProvider, __assign({ router: router, basename: basename !== null && basename !== void 0 ? basename : basePath }, props), children));
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { FronteggClientProviderNext13 as F };
|
|
19
|
+
//# sourceMappingURL=FronteggClientProviderNext13-65bb4cd0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FronteggClientProviderNext13-65bb4cd0.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { __awaiter, __generator } from 'tslib';
|
|
2
|
+
import { importJWK } from 'jose';
|
|
3
|
+
|
|
4
|
+
function normalizeStringPasswordToMap(password) {
|
|
5
|
+
return typeof password === 'string' ? { 1: password } : password;
|
|
6
|
+
}
|
|
7
|
+
var FronteggConfig = /** @class */ (function () {
|
|
8
|
+
function FronteggConfig() {
|
|
9
|
+
var _a, _b, _c;
|
|
10
|
+
this.authRoutes = {};
|
|
11
|
+
this.fronteggAppOptions = {};
|
|
12
|
+
this._clientId = (_a = process.env['FRONTEGG_CLIENT_ID']) !== null && _a !== void 0 ? _a : '';
|
|
13
|
+
this._cookieName = (_b = process.env['FRONTEGG_COOKIE_NAME']) !== null && _b !== void 0 ? _b : "fe_next_session";
|
|
14
|
+
this._password = (_c = process.env['FRONTEGG_ENCRYPTION_PASSWORD']) !== null && _c !== void 0 ? _c : '';
|
|
15
|
+
this._passwordsAsMap = normalizeStringPasswordToMap(this._password);
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(FronteggConfig.prototype, "cookieName", {
|
|
18
|
+
get: function () {
|
|
19
|
+
return this._cookieName + "-" + this._clientId.replace(/-/g, '');
|
|
20
|
+
},
|
|
21
|
+
enumerable: false,
|
|
22
|
+
configurable: true
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(FronteggConfig.prototype, "password", {
|
|
25
|
+
get: function () {
|
|
26
|
+
return this._password;
|
|
27
|
+
},
|
|
28
|
+
enumerable: false,
|
|
29
|
+
configurable: true
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(FronteggConfig.prototype, "clientId", {
|
|
32
|
+
get: function () {
|
|
33
|
+
return this._clientId;
|
|
34
|
+
},
|
|
35
|
+
enumerable: false,
|
|
36
|
+
configurable: true
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(FronteggConfig.prototype, "baseUrlHost", {
|
|
39
|
+
get: function () {
|
|
40
|
+
var _a;
|
|
41
|
+
return new URL((_a = process.env['FRONTEGG_BASE_URL']) !== null && _a !== void 0 ? _a : '').hostname;
|
|
42
|
+
},
|
|
43
|
+
enumerable: false,
|
|
44
|
+
configurable: true
|
|
45
|
+
});
|
|
46
|
+
FronteggConfig.prototype.getEnvAppUrl = function () {
|
|
47
|
+
var url = undefined;
|
|
48
|
+
if (process.env['FRONTEGG_APP_URL']) {
|
|
49
|
+
url = process.env['FRONTEGG_APP_URL'];
|
|
50
|
+
}
|
|
51
|
+
else if (process.env['VERCEL'] && process.env['VERCEL_URL']) {
|
|
52
|
+
url = process.env['VERCEL_URL'];
|
|
53
|
+
}
|
|
54
|
+
if (url && !url.startsWith('http')) {
|
|
55
|
+
var protocol = url.startsWith('localhost') ? 'http://' : 'https://';
|
|
56
|
+
url = "" + protocol + url;
|
|
57
|
+
}
|
|
58
|
+
return url;
|
|
59
|
+
};
|
|
60
|
+
Object.defineProperty(FronteggConfig.prototype, "appUrl", {
|
|
61
|
+
get: function () {
|
|
62
|
+
var _a;
|
|
63
|
+
return (_a = this.getEnvAppUrl()) !== null && _a !== void 0 ? _a : 'http://localhost:3000';
|
|
64
|
+
},
|
|
65
|
+
enumerable: false,
|
|
66
|
+
configurable: true
|
|
67
|
+
});
|
|
68
|
+
Object.defineProperty(FronteggConfig.prototype, "appEnvConfig", {
|
|
69
|
+
get: function () {
|
|
70
|
+
return {
|
|
71
|
+
envAppUrl: this.getEnvAppUrl(),
|
|
72
|
+
envBaseUrl: process.env['FRONTEGG_BASE_URL'],
|
|
73
|
+
envClientId: process.env['FRONTEGG_CLIENT_ID'],
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
enumerable: false,
|
|
77
|
+
configurable: true
|
|
78
|
+
});
|
|
79
|
+
Object.defineProperty(FronteggConfig.prototype, "cookieDomain", {
|
|
80
|
+
get: function () {
|
|
81
|
+
var _a;
|
|
82
|
+
return new URL((_a = this.getEnvAppUrl()) !== null && _a !== void 0 ? _a : '').hostname.replace(/:(\d)+$/, '');
|
|
83
|
+
},
|
|
84
|
+
enumerable: false,
|
|
85
|
+
configurable: true
|
|
86
|
+
});
|
|
87
|
+
FronteggConfig.prototype.getJwtPublicKey = function () {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
89
|
+
var response, data, publicKey, _a;
|
|
90
|
+
return __generator(this, function (_b) {
|
|
91
|
+
switch (_b.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
if (!!this._jwtPublicKey) return [3 /*break*/, 4];
|
|
94
|
+
return [4 /*yield*/, fetch(process.env['FRONTEGG_BASE_URL'] + "/.well-known/jwks.json")];
|
|
95
|
+
case 1:
|
|
96
|
+
response = _b.sent();
|
|
97
|
+
return [4 /*yield*/, response.json()];
|
|
98
|
+
case 2:
|
|
99
|
+
data = _b.sent();
|
|
100
|
+
publicKey = data.keys.find(function (key) { return key.kty === 'RSA'; });
|
|
101
|
+
_a = this;
|
|
102
|
+
return [4 /*yield*/, importJWK(publicKey)];
|
|
103
|
+
case 3:
|
|
104
|
+
_a._jwtPublicKey = _b.sent();
|
|
105
|
+
_b.label = 4;
|
|
106
|
+
case 4: return [2 /*return*/, this._jwtPublicKey];
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
Object.defineProperty(FronteggConfig.prototype, "passwordsAsMap", {
|
|
112
|
+
get: function () {
|
|
113
|
+
return this._passwordsAsMap;
|
|
114
|
+
},
|
|
115
|
+
enumerable: false,
|
|
116
|
+
configurable: true
|
|
117
|
+
});
|
|
118
|
+
return FronteggConfig;
|
|
119
|
+
}());
|
|
120
|
+
var FronteggConfig$1 = new FronteggConfig();
|
|
121
|
+
|
|
122
|
+
export { FronteggConfig$1 as F };
|
|
123
|
+
//# sourceMappingURL=FronteggConfig-7ae86562.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FronteggConfig-7ae86562.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/FronteggProvider.d.ts
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
import { FC
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export declare type FronteggProviderProps = Omit<FronteggAppOptions, 'contextOptions'> & MeAndTenants & {
|
|
5
|
-
children?: ReactNode;
|
|
6
|
-
session?: FronteggNextJSSession;
|
|
7
|
-
envAppUrl: string;
|
|
8
|
-
envBaseUrl: string;
|
|
9
|
-
envClientId: string;
|
|
10
|
-
contextOptions?: Omit<FronteggAppOptions['contextOptions'], 'baseUrl'>;
|
|
11
|
-
};
|
|
12
|
-
export declare const FronteggProvider: FC<FronteggProviderProps>;
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { FronteggProviderProps } from './common';
|
|
3
|
+
export declare const FronteggProvider: FC<Omit<FronteggProviderProps, 'router'>>;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { FC, ReactNode } from 'react';
|
|
2
1
|
import { FronteggAppOptions } from '@frontegg/types';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
};
|
|
2
|
+
import { FC, PropsWithChildren } from 'react';
|
|
3
|
+
export declare type FronteggProviderNoSSRProps = PropsWithChildren<FronteggAppOptions>;
|
|
6
4
|
export declare const FronteggProviderNoSSR: FC<FronteggProviderNoSSRProps>;
|
package/README.md
CHANGED
|
@@ -228,6 +228,57 @@ export const getServerSideProps: GetServerSideProps = withSSRSession(
|
|
|
228
228
|
);
|
|
229
229
|
```
|
|
230
230
|
|
|
231
|
+
## Next.js 13
|
|
232
|
+
### wrapping your application
|
|
233
|
+
```ts
|
|
234
|
+
// app/layout.tsx
|
|
235
|
+
import { FronteggAppProvider } from '@frontegg/nextjs/server';
|
|
236
|
+
|
|
237
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
238
|
+
return (
|
|
239
|
+
<FronteggAppProvider hostedLoginBox>
|
|
240
|
+
<html>
|
|
241
|
+
<head></head>
|
|
242
|
+
<body>{children}</body>
|
|
243
|
+
</html>
|
|
244
|
+
</FronteggAppProvider>
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### routing
|
|
250
|
+
```ts
|
|
251
|
+
// app/[...frontegg-router]/page.tsx
|
|
252
|
+
export { FronteggAppRouter as default } from '@frontegg/nextjs/client';
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### server component
|
|
256
|
+
```ts
|
|
257
|
+
// app/ServerComponent.tsx
|
|
258
|
+
import { getUserSession } from '@frontegg/nextjs/server';
|
|
259
|
+
|
|
260
|
+
export const ServerComponent = async () => {
|
|
261
|
+
const userSession = await getUserSession();
|
|
262
|
+
return (
|
|
263
|
+
<div>
|
|
264
|
+
user session server side: {JSON.stringify(userSession)}
|
|
265
|
+
</div>
|
|
266
|
+
);
|
|
267
|
+
};
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### client component
|
|
271
|
+
```ts
|
|
272
|
+
// app/ClientComponent.tsx
|
|
273
|
+
'use client';
|
|
274
|
+
import { useAuthUserOrNull } from '@frontegg/nextjs';
|
|
275
|
+
|
|
276
|
+
export const ClientComponent = () => {
|
|
277
|
+
const user = useAuthUserOrNull();
|
|
278
|
+
return <div>user session client side: {JSON.stringify(user)}</div>;
|
|
279
|
+
};
|
|
280
|
+
```
|
|
281
|
+
|
|
231
282
|
## Next.js middlewares usage
|
|
232
283
|
|
|
233
284
|
To prevent access unauthenticated user to all routes, use [Next.js middlewares](https://nextjs.org/docs/advanced-features/middleware).
|
|
@@ -238,16 +289,17 @@ To prevent access unauthenticated user to all routes, use [Next.js middlewares](
|
|
|
238
289
|
// /middleware.ts
|
|
239
290
|
import { NextResponse } from "next/server";
|
|
240
291
|
import type { NextRequest } from "next/server";
|
|
241
|
-
import { getSession } from '@frontegg/nextjs';
|
|
292
|
+
import { getSession } from '@frontegg/nextjs/edge';
|
|
242
293
|
|
|
243
294
|
export const middleware = async (request: NextRequest) => {
|
|
244
295
|
const session = await getSession(request);
|
|
296
|
+
const isAuthRoute = [...your auth routes]
|
|
245
297
|
|
|
246
298
|
console.log("middleware session", session);
|
|
247
|
-
|
|
248
|
-
if(!session){
|
|
299
|
+
|
|
300
|
+
if(!session && isAuthRoute){
|
|
249
301
|
// redirect unauthenticated user to /account/login page
|
|
250
|
-
return NextResponse.redirect(new URL('/account/login',
|
|
302
|
+
return NextResponse.redirect(new URL('/account/login', request))
|
|
251
303
|
}
|
|
252
304
|
|
|
253
305
|
return NextResponse.next();
|
package/api-70f0e81e.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { __awaiter, __generator } from 'tslib';
|
|
2
|
+
import { fronteggUsersUrl, fronteggTenantsUrl } from '@frontegg/rest-api';
|
|
3
|
+
|
|
4
|
+
var BASE_URL = process.env['FRONTEGG_BASE_URL'] + "/frontegg";
|
|
5
|
+
var Get = function (_a) {
|
|
6
|
+
var url = _a.url, _b = _a.credentials, credentials = _b === void 0 ? 'include' : _b, headers = _a.headers;
|
|
7
|
+
return fetch(url, { method: 'GET', credentials: credentials, headers: headers });
|
|
8
|
+
};
|
|
9
|
+
var extractHeaders = function (headers) { return ({
|
|
10
|
+
'accept-encoding': headers['accept-encoding'],
|
|
11
|
+
'accept-language': headers['accept-language'],
|
|
12
|
+
cookie: headers['cookie'],
|
|
13
|
+
accept: headers['accept'],
|
|
14
|
+
'user-agent': headers['user-agent'],
|
|
15
|
+
// connection: headers['connection'],
|
|
16
|
+
'cache-control': headers['cache-control'],
|
|
17
|
+
Authorization: headers['Authorization'],
|
|
18
|
+
}); };
|
|
19
|
+
var parseResponse = function (res) { return __awaiter(void 0, void 0, void 0, function () {
|
|
20
|
+
var resText;
|
|
21
|
+
return __generator(this, function (_a) {
|
|
22
|
+
switch (_a.label) {
|
|
23
|
+
case 0:
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
return [2 /*return*/, undefined];
|
|
26
|
+
}
|
|
27
|
+
return [4 /*yield*/, res.text()];
|
|
28
|
+
case 1:
|
|
29
|
+
resText = _a.sent();
|
|
30
|
+
return [2 /*return*/, JSON.parse(resText)];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}); };
|
|
34
|
+
var getUsers = function (headers) { return __awaiter(void 0, void 0, void 0, function () {
|
|
35
|
+
var res;
|
|
36
|
+
return __generator(this, function (_a) {
|
|
37
|
+
switch (_a.label) {
|
|
38
|
+
case 0: return [4 /*yield*/, Get({ url: "" + BASE_URL + fronteggUsersUrl, headers: extractHeaders(headers) })];
|
|
39
|
+
case 1:
|
|
40
|
+
res = _a.sent();
|
|
41
|
+
return [2 /*return*/, parseResponse(res)];
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}); };
|
|
45
|
+
var getTenants = function (headers) { return __awaiter(void 0, void 0, void 0, function () {
|
|
46
|
+
var res;
|
|
47
|
+
return __generator(this, function (_a) {
|
|
48
|
+
switch (_a.label) {
|
|
49
|
+
case 0: return [4 /*yield*/, Get({ url: "" + BASE_URL + fronteggTenantsUrl, headers: extractHeaders(headers) })];
|
|
50
|
+
case 1:
|
|
51
|
+
res = _a.sent();
|
|
52
|
+
return [2 /*return*/, parseResponse(res)];
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}); };
|
|
56
|
+
|
|
57
|
+
export { getTenants as a, getUsers as g };
|
|
58
|
+
//# sourceMappingURL=api-70f0e81e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-70f0e81e.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ParsedUrlQuery } from 'querystring';
|
|
3
|
+
declare type FronteggRouterProps = {
|
|
4
|
+
params: ParsedUrlQuery & {
|
|
5
|
+
'frontegg-router'?: string[];
|
|
6
|
+
};
|
|
7
|
+
searchParams: ParsedUrlQuery;
|
|
8
|
+
};
|
|
9
|
+
export declare function FronteggAppRouter({ params: { 'frontegg-router': pathArr }, searchParams }: FronteggRouterProps): string;
|
|
10
|
+
export {};
|
package/client/index.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __assign, __spreadArrays } from 'tslib';
|
|
3
|
+
import { F as FronteggConfig } from '../FronteggConfig-7ae86562.js';
|
|
4
|
+
import '../api-70f0e81e.js';
|
|
5
|
+
import 'cookie';
|
|
6
|
+
import 'iron-session';
|
|
7
|
+
import 'jose';
|
|
8
|
+
import { useLoginWithRedirect, useLoginActions } from '@frontegg/react-hooks';
|
|
9
|
+
import '@frontegg/rest-api';
|
|
10
|
+
import { useContext, useEffect } from 'react';
|
|
11
|
+
import { A as AppContext } from '../FronteggBaseProvider-5529ded6.js';
|
|
12
|
+
import '@frontegg/js';
|
|
13
|
+
import { authInitialState } from '@frontegg/redux-store';
|
|
14
|
+
import { useRouter, notFound } from 'next/navigation';
|
|
15
|
+
export { F as FronteggClientProviderNext13 } from '../FronteggClientProviderNext13-65bb4cd0.js';
|
|
16
|
+
|
|
17
|
+
function FronteggAppRouter(_a) {
|
|
18
|
+
var _b = _a.params["frontegg-router"], pathArr = _b === void 0 ? [] : _b, searchParams = _a.searchParams;
|
|
19
|
+
var routesObj = __assign(__assign({}, authInitialState.routes), FronteggConfig.authRoutes);
|
|
20
|
+
var routesArr = Object.keys(routesObj).reduce(function (p, key) { return __spreadArrays(p, [routesObj[key]]); }, []);
|
|
21
|
+
var app = useContext(AppContext);
|
|
22
|
+
var replace = useRouter().replace;
|
|
23
|
+
var loginWithRedirect = useLoginWithRedirect();
|
|
24
|
+
var logout = useLoginActions().logout;
|
|
25
|
+
var pathname = "/" + pathArr.join('/');
|
|
26
|
+
if (!pathname || pathname.startsWith('/_next/data')) {
|
|
27
|
+
var query = searchParams[Object.keys(searchParams)[0]];
|
|
28
|
+
pathname = "/" + (Array.isArray(query) ? query.join('/') : query);
|
|
29
|
+
}
|
|
30
|
+
if (routesArr.indexOf(pathname) === -1) {
|
|
31
|
+
notFound();
|
|
32
|
+
}
|
|
33
|
+
if (FronteggConfig.fronteggAppOptions.hostedLoginBox &&
|
|
34
|
+
routesObj.loginUrl !== pathname &&
|
|
35
|
+
routesObj.logoutUrl !== pathname &&
|
|
36
|
+
routesObj.hostedLoginRedirectUrl !== pathname) {
|
|
37
|
+
notFound();
|
|
38
|
+
}
|
|
39
|
+
useEffect(function () {
|
|
40
|
+
if (!app) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (app.options.hostedLoginBox) {
|
|
44
|
+
if (pathname === routesObj.loginUrl) {
|
|
45
|
+
if (searchParams.redirectUrl) {
|
|
46
|
+
localStorage.setItem('FRONTEGG_AFTER_AUTH_REDIRECT_URL', "" + window.location.origin + searchParams.redirectUrl);
|
|
47
|
+
}
|
|
48
|
+
loginWithRedirect();
|
|
49
|
+
}
|
|
50
|
+
else if (pathname === routesObj.logoutUrl) {
|
|
51
|
+
var _baseUrl = app.options.contextOptions.baseUrl;
|
|
52
|
+
var baseUrl_1 = typeof _baseUrl === 'string' ? _baseUrl : _baseUrl('');
|
|
53
|
+
logout(function () {
|
|
54
|
+
window.location.href = baseUrl_1 + "/oauth/logout?post_logout_redirect_uri=" + encodeURIComponent(window.location.origin);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}, [app, searchParams, loginWithRedirect, logout, replace]);
|
|
59
|
+
return '';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { FronteggAppRouter };
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { AppEnvConfig } from './types';
|
|
1
2
|
import { KeyLike } from 'jose';
|
|
2
3
|
import { AuthPageRoutes } from '@frontegg/redux-store';
|
|
3
4
|
import { FronteggAppOptions } from '@frontegg/types';
|
|
4
|
-
import { AppEnvConfig } from './types';
|
|
5
5
|
export declare type PasswordsMap = {
|
|
6
6
|
[id: string]: string;
|
|
7
7
|
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ExpireInListener: () => JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FronteggApp } from '@frontegg/js';
|
|
2
|
+
import { AuthState } from '@frontegg/redux-store';
|
|
3
|
+
import { FronteggProviderOptions, MeAndTenantsResponse } from '../types';
|
|
4
|
+
declare type CreateOrGetFronteggAppParams = {
|
|
5
|
+
options: FronteggProviderOptions;
|
|
6
|
+
onRedirectTo: AuthState['onRedirectTo'];
|
|
7
|
+
appName?: string;
|
|
8
|
+
storeHolder: any;
|
|
9
|
+
} & MeAndTenantsResponse;
|
|
10
|
+
export declare const createOrGetFronteggApp: ({ options, onRedirectTo, appName, user, tenants, storeHolder, }: CreateOrGetFronteggAppParams) => FronteggApp;
|
|
11
|
+
export {};
|