@frontegg/nextjs 7.0.19 → 7.0.20-alpha.6170143015

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## [7.0.20](https://github.com/frontegg/frontegg-nextjs/compare/v7.0.19...v7.0.20) (2023-9-13)
4
+
5
+ - Releasing the new Security Center Page, which will replace the current Security Page. Currently exposed on Early Access with limited availability by a feature flag.
6
+
7
+
8
+ ### NextJS Wrapper 7.0.20:
9
+ - FR-13274 - Fixed removed cookies in pages directory for next-js version 13.4
10
+
3
11
  ## [7.0.19](https://github.com/frontegg/frontegg-nextjs/compare/v7.0.18...v7.0.19) (2023-9-5)
4
12
 
5
13
  - Releasing the new Security Center Page, which will replace the current Security Page. Currently exposed on Early Access with limited availability by a feature flag.
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v7.0.19
1
+ /** @license Frontegg v7.0.20-alpha.6170143015
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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@frontegg/nextjs",
3
3
  "libName": "FronteggNextJs",
4
- "version": "7.0.19",
4
+ "version": "7.0.20-alpha.6170143015",
5
5
  "author": "Frontegg LTD",
6
6
  "license": "MIT",
7
7
  "repository": {
package/sdkVersion.js CHANGED
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _default = {
8
- version: '7.0.19'
8
+ version: '7.0.20-alpha.6170143015'
9
9
  };
10
10
  exports.default = _default;
11
11
  //# sourceMappingURL=sdkVersion.js.map
package/sdkVersion.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdkVersion.js","names":["version","exports","default","_default"],"sources":["../../../packages/nextjs/src/sdkVersion.ts"],"sourcesContent":["export default { version: '7.0.19' };\n"],"mappings":";;;;;;eAAe;EAAEA,OAAO,EAAE;AAAS,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAC,QAAA"}
1
+ {"version":3,"file":"sdkVersion.js","names":["version","exports","default","_default"],"sources":["../../../packages/nextjs/src/sdkVersion.ts"],"sourcesContent":["export default { version: '7.0.20-alpha.6170143015' };\n"],"mappings":";;;;;;eAAe;EAAEA,OAAO,EAAE;AAA0B,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAC,QAAA"}
@@ -31,7 +31,7 @@ async function refreshAccessToken(ctx) {
31
31
  return null;
32
32
  }
33
33
  try {
34
- var _response$headers, _response$headers$raw, _CookieManager$modify, _ctx$res, _data$accessToken;
34
+ var _ref, _response$headers$raw, _response$headers, _response$headers$raw2, _response$headers2, _response$headers2$ge, _CookieManager$modify, _ctx$res, _data$accessToken;
35
35
  logger.info(`Check if should request made from first application load`);
36
36
  if ((0, _helpers.isRuntimeNextRequest)(url)) {
37
37
  logger.debug(`Detect runtime next.js request, resolving existing session from cookies if exists`);
@@ -67,8 +67,8 @@ async function refreshAccessToken(ctx) {
67
67
  }
68
68
  const data = await response.json();
69
69
 
70
- // @ts-ignore
71
- const cookieHeader = (_response$headers = response.headers) == null ? void 0 : (_response$headers$raw = _response$headers.raw) == null ? void 0 : _response$headers$raw.call(_response$headers)['set-cookie'];
70
+ // @ts-ignore the first argument "raw" will only work before nextjs 13.4 and the second argument "getSetCookie" will only work after
71
+ const cookieHeader = (_ref = (_response$headers$raw = (_response$headers = response.headers) == null ? void 0 : (_response$headers$raw2 = _response$headers.raw) == null ? void 0 : _response$headers$raw2.call(_response$headers)['set-cookie']) != null ? _response$headers$raw : (_response$headers2 = response.headers) == null ? void 0 : (_response$headers2$ge = _response$headers2.getSetCookie) == null ? void 0 : _response$headers2$ge.call(_response$headers2)) != null ? _ref : [];
72
72
  const newSetCookie = (_CookieManager$modify = _cookies.default.modifySetCookie(cookieHeader, isSecured)) != null ? _CookieManager$modify : [];
73
73
  const [session, decodedJwt, refreshToken] = await (0, _common.createSessionFromAccessToken)(data);
74
74
  if (!session) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_common","require","_config","_interopRequireDefault","_cookies","_helpers","_fronteggLogger","_encryption","_createSession","refreshAccessToken","ctx","logger","fronteggLogger","child","tag","info","pathname","nextJsRequest","req","nextJsResponse","res","url","debug","_response$headers","_response$headers$raw","_CookieManager$modify","_ctx$res","_data$accessToken","isRuntimeNextRequest","cookies","CookieManager","getSessionCookieFromRequest","session","createSession","encryption","isOauthCallback","isSamlCallback","response","config","isHostedLogin","refreshAccessTokenHostedLogin","refreshAccessTokenEmbedded","isSecured","isSSL","ok","removeCookies","cookieDomain","data","json","cookieHeader","headers","raw","call","newSetCookie","modifySetCookie","decodedJwt","refreshToken","createSessionFromAccessToken","cookieValue","create","value","expires","Date","exp","secure","push","setHeader","accessToken","access_token","user","e","error"],"sources":["../../../../../packages/nextjs/src/utils/refreshAccessToken/index.ts"],"sourcesContent":["import type { NextPageContext } from 'next/dist/shared/lib/utils';\nimport type { FronteggNextJSSession } from '../../types';\nimport { createSessionFromAccessToken } from '../../common';\nimport config from '../../config';\nimport CookieManager from '../cookies';\nimport {\n isOauthCallback,\n isRuntimeNextRequest,\n isSamlCallback,\n refreshAccessTokenEmbedded,\n refreshAccessTokenHostedLogin,\n} from './helpers';\nimport fronteggLogger from '../fronteggLogger';\nimport encryption from '../encryption';\nimport createSession from '../createSession';\n\n/**\n * Refreshes the access token for the current session.\n *\n * @param {NextPageContext} ctx - The Next.js Page Context object.\n * @returns {Promise<FronteggNextJSSession | null>} A Promise that resolves to the updated session object, or `null` if the refresh failed.\n */\nexport default async function refreshAccessToken(ctx: NextPageContext): Promise<FronteggNextJSSession | null> {\n const logger = fronteggLogger.child({ tag: 'refreshAccessToken' });\n logger.info(`Refreshing token by for PageContext ${ctx.pathname}`);\n const nextJsRequest = ctx.req;\n const nextJsResponse = ctx.res;\n const url = nextJsRequest?.url;\n if (!nextJsResponse || !nextJsRequest || !url) {\n logger.debug(`abandon refreshToken due to PageContext.req = null`);\n return null;\n }\n\n try {\n logger.info(`Check if should request made from first application load`);\n\n if (isRuntimeNextRequest(url)) {\n logger.debug(`Detect runtime next.js request, resolving existing session from cookies if exists`);\n\n const cookies = CookieManager.getSessionCookieFromRequest(nextJsRequest);\n const session = await createSession(cookies, encryption);\n\n if (session) {\n logger.debug(`session resolved from session cookie`);\n return session;\n } else {\n logger.info('Failed to resolve session from cookie, going to refresh token');\n }\n }\n\n if (isOauthCallback(url) || isSamlCallback(url)) {\n /* Prevent refresh token due to oauth login callback */\n logger.debug(`abandon refreshToken for url='/oauth/callback'`);\n return null;\n }\n\n let response: Response | null;\n if (config.isHostedLogin) {\n response = await refreshAccessTokenHostedLogin(nextJsRequest);\n } else {\n response = await refreshAccessTokenEmbedded(nextJsRequest);\n }\n\n const isSecured = config.isSSL;\n if (response === null || !response.ok) {\n CookieManager.removeCookies({\n cookieDomain: config.cookieDomain,\n isSecured,\n req: nextJsRequest,\n res: nextJsResponse,\n });\n return null;\n }\n\n const data = await response.json();\n\n // @ts-ignore\n const cookieHeader = response.headers?.raw?.()['set-cookie'];\n const newSetCookie = CookieManager.modifySetCookie(cookieHeader, isSecured) ?? [];\n\n const [session, decodedJwt, refreshToken] = await createSessionFromAccessToken(data);\n\n if (!session) {\n return null;\n }\n const cookieValue = CookieManager.create({\n value: session,\n expires: new Date(decodedJwt.exp * 1000),\n secure: isSecured,\n req: nextJsRequest,\n });\n newSetCookie.push(...cookieValue);\n ctx.res?.setHeader('set-cookie', newSetCookie);\n\n return {\n accessToken: data.accessToken ?? data.access_token,\n user: decodedJwt,\n refreshToken,\n };\n } catch (e) {\n logger.error('[refreshToken] Failed to create session e', e);\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_common","require","_config","_interopRequireDefault","_cookies","_helpers","_fronteggLogger","_encryption","_createSession","refreshAccessToken","ctx","logger","fronteggLogger","child","tag","info","pathname","nextJsRequest","req","nextJsResponse","res","url","debug","_ref","_response$headers$raw","_response$headers","_response$headers$raw2","_response$headers2","_response$headers2$ge","_CookieManager$modify","_ctx$res","_data$accessToken","isRuntimeNextRequest","cookies","CookieManager","getSessionCookieFromRequest","session","createSession","encryption","isOauthCallback","isSamlCallback","response","config","isHostedLogin","refreshAccessTokenHostedLogin","refreshAccessTokenEmbedded","isSecured","isSSL","ok","removeCookies","cookieDomain","data","json","cookieHeader","headers","raw","call","getSetCookie","newSetCookie","modifySetCookie","decodedJwt","refreshToken","createSessionFromAccessToken","cookieValue","create","value","expires","Date","exp","secure","push","setHeader","accessToken","access_token","user","e","error"],"sources":["../../../../../packages/nextjs/src/utils/refreshAccessToken/index.ts"],"sourcesContent":["import type { NextPageContext } from 'next/dist/shared/lib/utils';\nimport type { FronteggNextJSSession } from '../../types';\nimport { createSessionFromAccessToken } from '../../common';\nimport config from '../../config';\nimport CookieManager from '../cookies';\nimport {\n isOauthCallback,\n isRuntimeNextRequest,\n isSamlCallback,\n refreshAccessTokenEmbedded,\n refreshAccessTokenHostedLogin,\n} from './helpers';\nimport fronteggLogger from '../fronteggLogger';\nimport encryption from '../encryption';\nimport createSession from '../createSession';\n\n/**\n * Refreshes the access token for the current session.\n *\n * @param {NextPageContext} ctx - The Next.js Page Context object.\n * @returns {Promise<FronteggNextJSSession | null>} A Promise that resolves to the updated session object, or `null` if the refresh failed.\n */\nexport default async function refreshAccessToken(ctx: NextPageContext): Promise<FronteggNextJSSession | null> {\n const logger = fronteggLogger.child({ tag: 'refreshAccessToken' });\n logger.info(`Refreshing token by for PageContext ${ctx.pathname}`);\n const nextJsRequest = ctx.req;\n const nextJsResponse = ctx.res;\n const url = nextJsRequest?.url;\n if (!nextJsResponse || !nextJsRequest || !url) {\n logger.debug(`abandon refreshToken due to PageContext.req = null`);\n return null;\n }\n\n try {\n logger.info(`Check if should request made from first application load`);\n\n if (isRuntimeNextRequest(url)) {\n logger.debug(`Detect runtime next.js request, resolving existing session from cookies if exists`);\n\n const cookies = CookieManager.getSessionCookieFromRequest(nextJsRequest);\n const session = await createSession(cookies, encryption);\n\n if (session) {\n logger.debug(`session resolved from session cookie`);\n return session;\n } else {\n logger.info('Failed to resolve session from cookie, going to refresh token');\n }\n }\n\n if (isOauthCallback(url) || isSamlCallback(url)) {\n /* Prevent refresh token due to oauth login callback */\n logger.debug(`abandon refreshToken for url='/oauth/callback'`);\n return null;\n }\n\n let response: Response | null;\n if (config.isHostedLogin) {\n response = await refreshAccessTokenHostedLogin(nextJsRequest);\n } else {\n response = await refreshAccessTokenEmbedded(nextJsRequest);\n }\n\n const isSecured = config.isSSL;\n if (response === null || !response.ok) {\n CookieManager.removeCookies({\n cookieDomain: config.cookieDomain,\n isSecured,\n req: nextJsRequest,\n res: nextJsResponse,\n });\n return null;\n }\n\n const data = await response.json();\n\n // @ts-ignore the first argument \"raw\" will only work before nextjs 13.4 and the second argument \"getSetCookie\" will only work after\n const cookieHeader: string[] = response.headers?.raw?.()['set-cookie'] ?? response.headers?.getSetCookie?.() ?? [];\n const newSetCookie = CookieManager.modifySetCookie(cookieHeader, isSecured) ?? [];\n\n const [session, decodedJwt, refreshToken] = await createSessionFromAccessToken(data);\n\n if (!session) {\n return null;\n }\n const cookieValue = CookieManager.create({\n value: session,\n expires: new Date(decodedJwt.exp * 1000),\n secure: isSecured,\n req: nextJsRequest,\n });\n newSetCookie.push(...cookieValue);\n ctx.res?.setHeader('set-cookie', newSetCookie);\n\n return {\n accessToken: data.accessToken ?? data.access_token,\n user: decodedJwt,\n refreshToken,\n };\n } catch (e) {\n logger.error('[refreshToken] Failed to create session e', e);\n return null;\n }\n}\n"],"mappings":"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"}