@logto/next 1.0.0-beta.0 → 1.0.0-beta.1
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/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -1
- package/lib/index.js.map +1 -1
- package/lib/module.js +9 -1
- package/lib/module.js.map +1 -1
- package/package.json +2 -2
package/lib/index.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export default class LogtoClient {
|
|
|
37
37
|
handleSignInCallback: (redirectTo?: string) => NextApiHandler;
|
|
38
38
|
handleSignOut: (redirectUri?: string) => NextApiHandler;
|
|
39
39
|
handleUser: (config?: WithLogtoConfig | undefined) => NextApiHandler<any>;
|
|
40
|
+
handleAuthRoutes: (configs?: WithLogtoConfig | undefined) => NextApiHandler;
|
|
40
41
|
withLogtoApiRoute: (handler: NextApiHandler, config?: WithLogtoConfig) => NextApiHandler;
|
|
41
42
|
withLogtoSsr: <P extends Record<string, unknown> = Record<string, unknown>>(handler: (context: GetServerSidePropsContext) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>, config?: WithLogtoConfig) => (context: GetServerSidePropsContext<import("querystring").ParsedUrlQuery, import("next").PreviewData>) => Promise<GetServerSidePropsResult<P>>;
|
|
42
43
|
private get ironSessionConfigs();
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;ACMA,eAAe,cAAc,CAAC;IAC5B,UAAU,eAAe;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CACF;AAED,eAAe,MAAM,CAAC;IACpB,UAAU,eAAe;QACvB,IAAI,EAAE,SAAS,CAAC;KACjB;CACF;AAED,uBAA8B,WAAW,GAAG;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAwB;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,uBAA8B;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AC7BF;gBAG+B,MAAM,EAAE,eAAe;IAEpD,YAAY,
|
|
1
|
+
{"mappings":";;ACMA,eAAe,cAAc,CAAC;IAC5B,UAAU,eAAe;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CACF;AAED,eAAe,MAAM,CAAC;IACpB,UAAU,eAAe;QACvB,IAAI,EAAE,SAAS,CAAC;KACjB;CACF;AAED,uBAA8B,WAAW,GAAG;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAwB;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,uBAA8B;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AC7BF;gBAG+B,MAAM,EAAE,eAAe;IAEpD,YAAY,4BAET,cAAc,CASa;IAE9B,oBAAoB,2BAAuC,cAAc,CAS3C;IAE9B,aAAa,4BAAwC,cAAc,CAWrC;IAE9B,UAAU,gEAGG;IAEb,gBAAgB,6CACe,cAAc,CAqBzC;IAEJ,iBAAiB,YAAa,cAAc,WAAU,eAAe,KAAQ,cAAc,CAQ7D;IAE9B,YAAY,mFAEC,yBAAyB,kFAE5B,eAAe,oJAQK;IAmB9B,OAAO,KAAK,kBAAkB,GAS7B;CAwCF","sources":["packages/next/src/src/storage.ts","packages/next/src/src/types.ts","packages/next/src/src/index.ts","packages/next/src/index.ts"],"sourcesContent":[null,null,null,"import { IncomingMessage } from 'http';\n\nimport NodeClient from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig, LogtoUser, WithLogtoConfig } from './types';\n\nexport type { LogtoUser } from './types';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (config?: WithLogtoConfig) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, config);\n\n handleAuthRoutes =\n (configs?: WithLogtoConfig): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (handler: NextApiHandler, config: WithLogtoConfig = {}): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n config: WithLogtoConfig = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, config.getAccessToken);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(\n {\n ...this.config,\n persistAccessToken: this.config.persistAccessToken ?? true,\n },\n {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n }\n );\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, getAccessToken?: boolean) {\n const nodeClient = this.createNodeClient(request);\n const { isAuthenticated } = nodeClient;\n\n if (!isAuthenticated) {\n const user: LogtoUser = {\n isAuthenticated,\n };\n\n return user;\n }\n\n if (!getAccessToken) {\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n };\n\n return user;\n }\n\n try {\n const accessToken = await nodeClient.getAccessToken();\n await this.storage?.save();\n\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n accessToken,\n };\n\n return user;\n } catch {\n return {\n isAuthenticated: false,\n };\n }\n }\n}\n"],"names":[],"version":3,"file":"index.d.ts.map"}
|
package/lib/index.js
CHANGED
|
@@ -45,7 +45,7 @@ class $1abf01985e812f74$export$2e2bcd8739ae039 {
|
|
|
45
45
|
class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
46
46
|
constructor(config1){
|
|
47
47
|
this.config = config1;
|
|
48
|
-
this.handleSignIn = (redirectUri = `${this.config.baseUrl}/api/sign-in-callback`)=>(0, $j3Dy6$ironsessionnext.withIronSessionApiRoute)(async (request, response)=>{
|
|
48
|
+
this.handleSignIn = (redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`)=>(0, $j3Dy6$ironsessionnext.withIronSessionApiRoute)(async (request, response)=>{
|
|
49
49
|
const nodeClient = this.createNodeClient(request);
|
|
50
50
|
await nodeClient.signIn(redirectUri);
|
|
51
51
|
await this.storage?.save();
|
|
@@ -69,6 +69,14 @@ class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
|
69
69
|
this.handleUser = (config)=>this.withLogtoApiRoute((request, response)=>{
|
|
70
70
|
response.json(request.user);
|
|
71
71
|
}, config);
|
|
72
|
+
this.handleAuthRoutes = (configs)=>(request, response)=>{
|
|
73
|
+
const { action: action } = request.query;
|
|
74
|
+
if (action === "sign-in") return this.handleSignIn()(request, response);
|
|
75
|
+
if (action === "sign-in-callback") return this.handleSignInCallback()(request, response);
|
|
76
|
+
if (action === "sign-out") return this.handleSignOut()(request, response);
|
|
77
|
+
if (action === "user") return this.handleUser(configs)(request, response);
|
|
78
|
+
response.status(404).end();
|
|
79
|
+
};
|
|
72
80
|
this.withLogtoApiRoute = (handler, config = {})=>(0, $j3Dy6$ironsessionnext.withIronSessionApiRoute)(async (request, response)=>{
|
|
73
81
|
const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);
|
|
74
82
|
// eslint-disable-next-line @silverhand/fp/no-mutating-methods
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig, LogtoUser, WithLogtoConfig } from './types';\n\nexport type { LogtoUser } from './types';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (redirectUri = `${this.config.baseUrl}/api/sign-in-callback`): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (config?: WithLogtoConfig) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, config);\n\n withLogtoApiRoute = (handler: NextApiHandler, config: WithLogtoConfig = {}): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n config: WithLogtoConfig = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, config.getAccessToken);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(\n {\n ...this.config,\n persistAccessToken: this.config.persistAccessToken ?? true,\n },\n {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n }\n );\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, getAccessToken?: boolean) {\n const nodeClient = this.createNodeClient(request);\n const { isAuthenticated } = nodeClient;\n\n if (!isAuthenticated) {\n const user: LogtoUser = {\n isAuthenticated,\n };\n\n return user;\n }\n\n if (!getAccessToken) {\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n };\n\n return user;\n }\n\n try {\n const accessToken = await nodeClient.getAccessToken();\n await this.storage?.save();\n\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n accessToken,\n };\n\n return user;\n } catch {\n return {\n isAuthenticated: false,\n };\n }\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
|
|
1
|
+
{"mappings":"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","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig, LogtoUser, WithLogtoConfig } from './types';\n\nexport type { LogtoUser } from './types';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (config?: WithLogtoConfig) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, config);\n\n handleAuthRoutes =\n (configs?: WithLogtoConfig): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (handler: NextApiHandler, config: WithLogtoConfig = {}): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n config: WithLogtoConfig = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, config.getAccessToken);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(\n {\n ...this.config,\n persistAccessToken: this.config.persistAccessToken ?? true,\n },\n {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n }\n );\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, getAccessToken?: boolean) {\n const nodeClient = this.createNodeClient(request);\n const { isAuthenticated } = nodeClient;\n\n if (!isAuthenticated) {\n const user: LogtoUser = {\n isAuthenticated,\n };\n\n return user;\n }\n\n if (!getAccessToken) {\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n };\n\n return user;\n }\n\n try {\n const accessToken = await nodeClient.getAccessToken();\n await this.storage?.save();\n\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n accessToken,\n };\n\n return user;\n } catch {\n return {\n isAuthenticated: false,\n };\n }\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
|
package/lib/module.js
CHANGED
|
@@ -32,7 +32,7 @@ class $8fa7922f9b3d24ed$export$2e2bcd8739ae039 {
|
|
|
32
32
|
class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
33
33
|
constructor(config1){
|
|
34
34
|
this.config = config1;
|
|
35
|
-
this.handleSignIn = (redirectUri = `${this.config.baseUrl}/api/sign-in-callback`)=>(0, $a8eQ2$withIronSessionApiRoute)(async (request, response)=>{
|
|
35
|
+
this.handleSignIn = (redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`)=>(0, $a8eQ2$withIronSessionApiRoute)(async (request, response)=>{
|
|
36
36
|
const nodeClient = this.createNodeClient(request);
|
|
37
37
|
await nodeClient.signIn(redirectUri);
|
|
38
38
|
await this.storage?.save();
|
|
@@ -56,6 +56,14 @@ class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
|
56
56
|
this.handleUser = (config)=>this.withLogtoApiRoute((request, response)=>{
|
|
57
57
|
response.json(request.user);
|
|
58
58
|
}, config);
|
|
59
|
+
this.handleAuthRoutes = (configs)=>(request, response)=>{
|
|
60
|
+
const { action: action } = request.query;
|
|
61
|
+
if (action === "sign-in") return this.handleSignIn()(request, response);
|
|
62
|
+
if (action === "sign-in-callback") return this.handleSignInCallback()(request, response);
|
|
63
|
+
if (action === "sign-out") return this.handleSignOut()(request, response);
|
|
64
|
+
if (action === "user") return this.handleUser(configs)(request, response);
|
|
65
|
+
response.status(404).end();
|
|
66
|
+
};
|
|
59
67
|
this.withLogtoApiRoute = (handler, config = {})=>(0, $a8eQ2$withIronSessionApiRoute)(async (request, response)=>{
|
|
60
68
|
const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);
|
|
61
69
|
// eslint-disable-next-line @silverhand/fp/no-mutating-methods
|
package/lib/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig, LogtoUser, WithLogtoConfig } from './types';\n\nexport type { LogtoUser } from './types';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (redirectUri = `${this.config.baseUrl}/api/sign-in-callback`): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (config?: WithLogtoConfig) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, config);\n\n withLogtoApiRoute = (handler: NextApiHandler, config: WithLogtoConfig = {}): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n config: WithLogtoConfig = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, config.getAccessToken);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(\n {\n ...this.config,\n persistAccessToken: this.config.persistAccessToken ?? true,\n },\n {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n }\n );\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, getAccessToken?: boolean) {\n const nodeClient = this.createNodeClient(request);\n const { isAuthenticated } = nodeClient;\n\n if (!isAuthenticated) {\n const user: LogtoUser = {\n isAuthenticated,\n };\n\n return user;\n }\n\n if (!getAccessToken) {\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n };\n\n return user;\n }\n\n try {\n const accessToken = await nodeClient.getAccessToken();\n await this.storage?.save();\n\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n accessToken,\n };\n\n return user;\n } catch {\n return {\n isAuthenticated: false,\n };\n }\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
|
1
|
+
{"mappings":";;;AAAA;;ACIe;IAEb,YAA6B,OAAwB,CAAE;aAA1B,OAAwB,GAAxB,OAAwB;aAD7C,cAAc,GAAG,KAAK;KAC2B;IAEzD,MAAM,OAAO,CAAC,GAAe,EAAE,KAAa,EAAE;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;KAC5B;IAED,OAAO,CAAC,GAAe,EAAE;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,AAAC;QAExC,IAAI,KAAK,KAAK,SAAS,EACrB,OAAO,IAAI,CAAC;QAGd,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;IAED,UAAU,CAAC,GAAe,EAAE;QAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;KAC5B;IAED,MAAM,IAAI,GAAG;QACX,IAAI,CAAC,IAAI,CAAC,cAAc,EACtB,OAAO;QAGT,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;KAC7B;CACF;;;ADzBc;IAGb,YAA6B,OAAuB,CAAE;aAAzB,MAAuB,GAAvB,OAAuB;aAEpD,YAAY,GAAG,CACb,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,GAEjE,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;gBAClD,MAAM,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACrC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBAE3B,IAAI,IAAI,CAAC,WAAW,EAClB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAEvC,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,oBAAoB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GACtD,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;gBAElD,IAAI,OAAO,CAAC,GAAG,EAAE;oBACf,MAAM,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC9E,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC3B,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;iBAC/B;aACF,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,aAAa,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAChD,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;gBAClD,MAAM,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAEtC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBAE3B,IAAI,IAAI,CAAC,WAAW,EAClB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAEvC,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,UAAU,GAAG,CAAC,MAAwB,GACpC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,QAAQ,GAAK;gBAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC7B,EAAE,MAAM,CAAC;aAEZ,gBAAgB,GACd,CAAC,OAAyB,GAC1B,CAAC,OAAO,EAAE,QAAQ,GAAK;gBACrB,MAAM,UAAE,MAAM,CAAA,EAAE,GAAG,OAAO,CAAC,KAAK,AAAC;gBAEjC,IAAI,MAAM,KAAK,SAAS,EACtB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGhD,IAAI,MAAM,KAAK,kBAAkB,EAC/B,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGxD,IAAI,MAAM,KAAK,UAAU,EACvB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGjD,IAAI,MAAM,KAAK,MAAM,EACnB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGrD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;aAC5B;aAEH,iBAAiB,GAAG,CAAC,OAAuB,EAAE,MAAuB,GAAG,EAAE,GACxE,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,AAAC;gBAEhF,8DAA8D;gBAC9D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;oBAAE,UAAU,EAAE,IAAI;oBAAE,GAAG,EAAE,IAAM,IAAI;iBAAE,CAAC,CAAC;gBAE9E,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;aACnC,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,YAAY,GAAG,CACb,OAEuE,EACvE,MAAuB,GAAG,EAAE,GAE5B,CAAA,GAAA,yBAAkB,CAAA,CAAC,OAAO,OAAO,GAAK;gBACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,AAAC;gBACpF,8DAA8D;gBAC9D,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE;oBAAE,UAAU,EAAE,IAAI;oBAAE,GAAG,EAAE,IAAM,IAAI;iBAAE,CAAC,CAAC;gBAElF,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;aACzB,EAAE,IAAI,CAAC,kBAAkB,CAAC;KA1F2B;IA4FxD,AAAQ,gBAAgB,CAAC,OAAwB,EAAE;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA,GAAA,wCAAW,CAAA,CAAC,OAAO,CAAC,CAAC;QAExC,OAAO,IAAI,CAAA,GAAA,gBAAU,CAAA,CACnB;YACE,GAAG,IAAI,CAAC,MAAM;YACd,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI;SAC3D,EACD;YACE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,CAAC,GAAG,GAAK;gBACjB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;aACxB;SACF,CACF,CAAC;KACH;IAED,IAAY,kBAAkB,GAAG;QAC/B,OAAO;YACL,UAAU,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YAClC,aAAa,EAAE;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBAChC,MAAM,EAAE,OAAiB;aAC1B;SACF,CAAC;KACH;IAED,MAAc,uBAAuB,CAAC,OAAwB,EAAE,cAAwB,EAAE;QACxF,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;QAClD,MAAM,mBAAE,eAAe,CAAA,EAAE,GAAG,UAAU,AAAC;QAEvC,IAAI,CAAC,eAAe,EAAE;YACpB,MAAM,IAAI,GAAc;iCACtB,eAAe;aAChB,AAAC;YAEF,OAAO,IAAI,CAAC;SACb;QAED,IAAI,CAAC,cAAc,EAAE;YACnB,MAAM,IAAI,GAAc;iCACtB,eAAe;gBACf,MAAM,EAAE,UAAU,CAAC,gBAAgB,EAAE;aACtC,AAAC;YAEF,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,AAAC;YACtD,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YAE3B,MAAM,IAAI,GAAc;iCACtB,eAAe;gBACf,MAAM,EAAE,UAAU,CAAC,gBAAgB,EAAE;6BACrC,WAAW;aACZ,AAAC;YAEF,OAAO,IAAI,CAAC;SACb,CAAC,OAAM;YACN,OAAO;gBACL,eAAe,EAAE,KAAK;aACvB,CAAC;SACH;KACF;CACF","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig, LogtoUser, WithLogtoConfig } from './types';\n\nexport type { LogtoUser } from './types';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (config?: WithLogtoConfig) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, config);\n\n handleAuthRoutes =\n (configs?: WithLogtoConfig): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (handler: NextApiHandler, config: WithLogtoConfig = {}): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n config: WithLogtoConfig = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, config.getAccessToken);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(\n {\n ...this.config,\n persistAccessToken: this.config.persistAccessToken ?? true,\n },\n {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n }\n );\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, getAccessToken?: boolean) {\n const nodeClient = this.createNodeClient(request);\n const { isAuthenticated } = nodeClient;\n\n if (!isAuthenticated) {\n const user: LogtoUser = {\n isAuthenticated,\n };\n\n return user;\n }\n\n if (!getAccessToken) {\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n };\n\n return user;\n }\n\n try {\n const accessToken = await nodeClient.getAccessToken();\n await this.storage?.save();\n\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n accessToken,\n };\n\n return user;\n } catch {\n return {\n isAuthenticated: false,\n };\n }\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logto/next",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
4
|
"source": "./src/index.ts",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "79f30b484e8d2f961836bfb229e7d25947b08f19"
|
|
77
77
|
}
|