@logto/remix 2.1.9 → 2.2.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/README.md CHANGED
@@ -84,6 +84,10 @@ export const loader = logto.handleAuthRoutes({
84
84
  path: "/api/logto/sign-out",
85
85
  redirectBackTo: "/",
86
86
  },
87
+ "sign-up": {
88
+ path: "/api/logto/sign-up",
89
+ redirectBackTo: "/api/logto/callback",
90
+ },
87
91
  });
88
92
  ```
89
93
 
package/lib/index.d.ts CHANGED
@@ -19,6 +19,10 @@ export declare const makeLogtoRemix: (config: Config, deps: {
19
19
  readonly path: string;
20
20
  readonly redirectBackTo: string;
21
21
  };
22
+ "sign-up": {
23
+ readonly path: string;
24
+ readonly redirectBackTo: string;
25
+ };
22
26
  }) => import("@remix-run/node").LoaderFunction;
23
27
  getContext: (dto: GetContextParameters) => (request: Request) => Promise<import("@logto/node").LogtoContext>;
24
28
  }>;
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ class HandleSignUpCommand {
4
+ static { this.fromDependencies = (dependencies) => new HandleSignUpCommand({ createClient: dependencies.createClient }); }
5
+ constructor(properties) {
6
+ this.properties = properties;
7
+ this.navigateToUrl = '/api/sign-up';
8
+ }
9
+ async execute(request) {
10
+ const { createClient } = this.properties;
11
+ const client = createClient((url) => {
12
+ this.navigateToUrl = url;
13
+ });
14
+ await client.signIn({ redirectUri: request.redirectUri, interactionMode: 'signUp' });
15
+ return {
16
+ navigateToUrl: this.navigateToUrl,
17
+ };
18
+ }
19
+ }
20
+ const makeHandleSignUp = (deps) => async (request) => {
21
+ const { storage, createClient } = deps;
22
+ const command = HandleSignUpCommand.fromDependencies({ createClient });
23
+ const { navigateToUrl } = await command.execute(request);
24
+ return {
25
+ session: storage.session,
26
+ navigateToUrl,
27
+ };
28
+ };
29
+
30
+ exports.makeHandleSignUp = makeHandleSignUp;
@@ -0,0 +1,15 @@
1
+ import type { Session } from '@remix-run/node';
2
+ import type { CreateLogtoClient } from './create-client.js';
3
+ import type { LogtoStorage } from './create-storage.js';
4
+ type HandleSignUpRequest = {
5
+ readonly redirectUri: string;
6
+ };
7
+ type HandleSignUpResponse = {
8
+ readonly session: Session;
9
+ readonly navigateToUrl: string;
10
+ };
11
+ export declare const makeHandleSignUp: (deps: {
12
+ storage: LogtoStorage;
13
+ createClient: CreateLogtoClient;
14
+ }) => (request: HandleSignUpRequest) => Promise<HandleSignUpResponse>;
15
+ export {};
@@ -0,0 +1,28 @@
1
+ class HandleSignUpCommand {
2
+ static { this.fromDependencies = (dependencies) => new HandleSignUpCommand({ createClient: dependencies.createClient }); }
3
+ constructor(properties) {
4
+ this.properties = properties;
5
+ this.navigateToUrl = '/api/sign-up';
6
+ }
7
+ async execute(request) {
8
+ const { createClient } = this.properties;
9
+ const client = createClient((url) => {
10
+ this.navigateToUrl = url;
11
+ });
12
+ await client.signIn({ redirectUri: request.redirectUri, interactionMode: 'signUp' });
13
+ return {
14
+ navigateToUrl: this.navigateToUrl,
15
+ };
16
+ }
17
+ }
18
+ const makeHandleSignUp = (deps) => async (request) => {
19
+ const { storage, createClient } = deps;
20
+ const command = HandleSignUpCommand.fromDependencies({ createClient });
21
+ const { navigateToUrl } = await command.execute(request);
22
+ return {
23
+ session: storage.session,
24
+ navigateToUrl,
25
+ };
26
+ };
27
+
28
+ export { makeHandleSignUp };
@@ -6,6 +6,7 @@ var getContext = require('./get-context.cjs');
6
6
  var handleSignInCallback = require('./handle-sign-in-callback.cjs');
7
7
  var handleSignIn = require('./handle-sign-in.cjs');
8
8
  var handleSignOut = require('./handle-sign-out.cjs');
9
+ var handleSignUp = require('./handle-sign-up.cjs');
9
10
 
10
11
  const makeLogtoAdapter = (config) => (session) => {
11
12
  const storage = createStorage.createStorage(session);
@@ -14,6 +15,7 @@ const makeLogtoAdapter = (config) => (session) => {
14
15
  handleSignIn: handleSignIn.makeHandleSignIn({ storage, createClient: createClient$1 }),
15
16
  handleSignInCallback: handleSignInCallback.makeHandleSignInCallback({ storage, createClient: createClient$1 }),
16
17
  handleSignOut: handleSignOut.makeHandleSignOut({ createClient: createClient$1 }),
18
+ handleSignUp: handleSignUp.makeHandleSignUp({ storage, createClient: createClient$1 }),
17
19
  getContext: getContext.makeGetContext({ storage, createClient: createClient$1 }),
18
20
  };
19
21
  };
@@ -18,6 +18,12 @@ export declare const makeLogtoAdapter: (config: MakeLogtoAdapterConfiguration) =
18
18
  }) => Promise<{
19
19
  readonly navigateToUrl: string;
20
20
  }>;
21
+ handleSignUp: (request: {
22
+ readonly redirectUri: string;
23
+ }) => Promise<{
24
+ readonly session: Session<import("@remix-run/node").SessionData, import("@remix-run/node").SessionData>;
25
+ readonly navigateToUrl: string;
26
+ }>;
21
27
  getContext: (request: import("@logto/node").GetContextParameters) => Promise<{
22
28
  readonly context: import("@logto/node").LogtoContext;
23
29
  }>;
@@ -4,6 +4,7 @@ import { makeGetContext } from './get-context.js';
4
4
  import { makeHandleSignInCallback } from './handle-sign-in-callback.js';
5
5
  import { makeHandleSignIn } from './handle-sign-in.js';
6
6
  import { makeHandleSignOut } from './handle-sign-out.js';
7
+ import { makeHandleSignUp } from './handle-sign-up.js';
7
8
 
8
9
  const makeLogtoAdapter = (config) => (session) => {
9
10
  const storage = createStorage(session);
@@ -12,6 +13,7 @@ const makeLogtoAdapter = (config) => (session) => {
12
13
  handleSignIn: makeHandleSignIn({ storage, createClient }),
13
14
  handleSignInCallback: makeHandleSignInCallback({ storage, createClient }),
14
15
  handleSignOut: makeHandleSignOut({ createClient }),
16
+ handleSignUp: makeHandleSignUp({ storage, createClient }),
15
17
  getContext: makeGetContext({ storage, createClient }),
16
18
  };
17
19
  };
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('../handleSignIn/index.cjs');
4
- var index$1 = require('../handleSignInCallback/index.cjs');
3
+ var index$3 = require('../handleSignIn/index.cjs');
4
+ var index$2 = require('../handleSignInCallback/index.cjs');
5
5
  var index = require('../handleSignOut/index.cjs');
6
+ var index$1 = require('../handleSignUp/index.cjs');
6
7
  var HandleAuthRoutesError = require('./HandleAuthRoutesError.cjs');
7
8
 
8
9
  const makeHandleAuthRoutes = (deps) => (dto) => async ({ request }) => {
@@ -18,13 +19,19 @@ const makeHandleAuthRoutes = (deps) => (dto) => async ({ request }) => {
18
19
  const config = dto[configKey];
19
20
  switch (configKey) {
20
21
  case 'sign-in': {
21
- const handler = index$2.makeHandleSignIn({
22
+ const handler = index$3.makeHandleSignIn({
22
23
  redirectBackTo: `${baseUrl}${config.redirectBackTo}`,
23
24
  }, { sessionStorage, createLogtoAdapter });
24
25
  return handler(request);
25
26
  }
26
27
  case 'sign-in-callback': {
27
- const handler = index$1.makeHandleSignInCallback({
28
+ const handler = index$2.makeHandleSignInCallback({
29
+ redirectBackTo: `${baseUrl}${config.redirectBackTo}`,
30
+ }, { sessionStorage, createLogtoAdapter });
31
+ return handler(request);
32
+ }
33
+ case 'sign-up': {
34
+ const handler = index$1.makeHandleSignUp({
28
35
  redirectBackTo: `${baseUrl}${config.redirectBackTo}`,
29
36
  }, { sessionStorage, createLogtoAdapter });
30
37
  return handler(request);
@@ -4,7 +4,7 @@ type AuthRouteConfig = {
4
4
  readonly path: string;
5
5
  readonly redirectBackTo: string;
6
6
  };
7
- type PossibleRouteTypes = 'sign-in' | 'sign-in-callback' | 'sign-out';
7
+ type PossibleRouteTypes = 'sign-in' | 'sign-in-callback' | 'sign-out' | 'sign-up';
8
8
  type HandleAuthRoutesDto = Record<PossibleRouteTypes, AuthRouteConfig>;
9
9
  type MakeHandleAuthRoutesDto = {
10
10
  readonly baseUrl: string;
@@ -1,6 +1,7 @@
1
1
  import { makeHandleSignIn } from '../handleSignIn/index.js';
2
2
  import { makeHandleSignInCallback } from '../handleSignInCallback/index.js';
3
3
  import { makeHandleSignOut } from '../handleSignOut/index.js';
4
+ import { makeHandleSignUp } from '../handleSignUp/index.js';
4
5
  import { HandleAuthRoutesError } from './HandleAuthRoutesError.js';
5
6
 
6
7
  const makeHandleAuthRoutes = (deps) => (dto) => async ({ request }) => {
@@ -27,6 +28,12 @@ const makeHandleAuthRoutes = (deps) => (dto) => async ({ request }) => {
27
28
  }, { sessionStorage, createLogtoAdapter });
28
29
  return handler(request);
29
30
  }
31
+ case 'sign-up': {
32
+ const handler = makeHandleSignUp({
33
+ redirectBackTo: `${baseUrl}${config.redirectBackTo}`,
34
+ }, { sessionStorage, createLogtoAdapter });
35
+ return handler(request);
36
+ }
30
37
  case 'sign-out': {
31
38
  const handler = makeHandleSignOut({
32
39
  redirectBackTo: `${baseUrl}${config.redirectBackTo}`,
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var node = require('@remix-run/node');
4
+ var getCookieHeaderFromRequest = require('../../framework/get-cookie-header-from-request.cjs');
5
+
6
+ class HandleSignUpController {
7
+ static { this.fromDto = (dto) => new HandleSignUpController({
8
+ useCase: dto.useCase,
9
+ redirectUri: dto.redirectUri,
10
+ }); }
11
+ constructor(properties) {
12
+ this.properties = properties;
13
+ this.useCase = this.properties.useCase;
14
+ this.redirectUri = this.properties.redirectUri;
15
+ this.execute = async (request) => {
16
+ const cookieHeader = getCookieHeaderFromRequest.getCookieHeaderFromRequest(request);
17
+ const { redirectUri } = this;
18
+ const result = await this.useCase({
19
+ cookieHeader: cookieHeader ?? undefined,
20
+ redirectUri,
21
+ });
22
+ return node.redirect(result.navigateToUrl, {
23
+ headers: {
24
+ 'Set-Cookie': result.cookieHeader,
25
+ },
26
+ });
27
+ };
28
+ }
29
+ }
30
+
31
+ exports.HandleSignUpController = HandleSignUpController;
@@ -0,0 +1,15 @@
1
+ import type { TypedResponse } from '@remix-run/node';
2
+ import type { HandleSignUpUseCase } from './HandleSignUpUseCase.js';
3
+ type HandleSignUpControllerDto = {
4
+ readonly redirectUri: string;
5
+ readonly useCase: HandleSignUpUseCase;
6
+ };
7
+ export declare class HandleSignUpController {
8
+ private readonly properties;
9
+ static readonly fromDto: (dto: HandleSignUpControllerDto) => HandleSignUpController;
10
+ private readonly useCase;
11
+ private readonly redirectUri;
12
+ private constructor();
13
+ readonly execute: (request: Request) => Promise<TypedResponse<never>>;
14
+ }
15
+ export {};
@@ -0,0 +1,29 @@
1
+ import { redirect } from '@remix-run/node';
2
+ import { getCookieHeaderFromRequest } from '../../framework/get-cookie-header-from-request.js';
3
+
4
+ class HandleSignUpController {
5
+ static { this.fromDto = (dto) => new HandleSignUpController({
6
+ useCase: dto.useCase,
7
+ redirectUri: dto.redirectUri,
8
+ }); }
9
+ constructor(properties) {
10
+ this.properties = properties;
11
+ this.useCase = this.properties.useCase;
12
+ this.redirectUri = this.properties.redirectUri;
13
+ this.execute = async (request) => {
14
+ const cookieHeader = getCookieHeaderFromRequest(request);
15
+ const { redirectUri } = this;
16
+ const result = await this.useCase({
17
+ cookieHeader: cookieHeader ?? undefined,
18
+ redirectUri,
19
+ });
20
+ return redirect(result.navigateToUrl, {
21
+ headers: {
22
+ 'Set-Cookie': result.cookieHeader,
23
+ },
24
+ });
25
+ };
26
+ }
27
+ }
28
+
29
+ export { HandleSignUpController };
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ const makeHandleSignUpUseCase = (deps) => async (request) => {
4
+ const { sessionStorage, createLogtoAdapter } = deps;
5
+ const session = await sessionStorage.getSession(request.cookieHeader);
6
+ const logto = createLogtoAdapter(session);
7
+ const response = await logto.handleSignUp({
8
+ redirectUri: request.redirectUri,
9
+ });
10
+ const cookieHeader = await sessionStorage.commitSession(response.session);
11
+ return {
12
+ cookieHeader,
13
+ navigateToUrl: response.navigateToUrl,
14
+ };
15
+ };
16
+
17
+ exports.makeHandleSignUpUseCase = makeHandleSignUpUseCase;
@@ -0,0 +1,16 @@
1
+ import type { SessionStorage } from '@remix-run/node';
2
+ import type { CreateLogtoAdapter } from '../../infrastructure/logto/index.js';
3
+ type SignUpRequest = {
4
+ readonly cookieHeader: string | undefined;
5
+ readonly redirectUri: string;
6
+ };
7
+ type SignUpResponse = {
8
+ readonly cookieHeader: string;
9
+ readonly navigateToUrl: string;
10
+ };
11
+ export declare const makeHandleSignUpUseCase: (deps: {
12
+ createLogtoAdapter: CreateLogtoAdapter;
13
+ sessionStorage: SessionStorage;
14
+ }) => (request: SignUpRequest) => Promise<SignUpResponse>;
15
+ export type HandleSignUpUseCase = ReturnType<typeof makeHandleSignUpUseCase>;
16
+ export {};
@@ -0,0 +1,15 @@
1
+ const makeHandleSignUpUseCase = (deps) => async (request) => {
2
+ const { sessionStorage, createLogtoAdapter } = deps;
3
+ const session = await sessionStorage.getSession(request.cookieHeader);
4
+ const logto = createLogtoAdapter(session);
5
+ const response = await logto.handleSignUp({
6
+ redirectUri: request.redirectUri,
7
+ });
8
+ const cookieHeader = await sessionStorage.commitSession(response.session);
9
+ return {
10
+ cookieHeader,
11
+ navigateToUrl: response.navigateToUrl,
12
+ };
13
+ };
14
+
15
+ export { makeHandleSignUpUseCase };
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var HandleSignUpController = require('./HandleSignUpController.cjs');
4
+ var HandleSignUpUseCase = require('./HandleSignUpUseCase.cjs');
5
+
6
+ const makeHandleSignUp = (dto, deps) => async (request) => {
7
+ const { createLogtoAdapter, sessionStorage } = deps;
8
+ const useCase = HandleSignUpUseCase.makeHandleSignUpUseCase({
9
+ createLogtoAdapter,
10
+ sessionStorage,
11
+ });
12
+ const controller = HandleSignUpController.HandleSignUpController.fromDto({
13
+ useCase,
14
+ redirectUri: dto.redirectBackTo,
15
+ });
16
+ return controller.execute(request);
17
+ };
18
+
19
+ exports.makeHandleSignUp = makeHandleSignUp;
@@ -0,0 +1,11 @@
1
+ import type { SessionStorage } from '@remix-run/node';
2
+ import type { CreateLogtoAdapter } from '../../infrastructure/logto/index.js';
3
+ type HandleSignUpDto = {
4
+ readonly redirectBackTo: string;
5
+ };
6
+ type HandleSignUpDeps = {
7
+ readonly createLogtoAdapter: CreateLogtoAdapter;
8
+ readonly sessionStorage: SessionStorage;
9
+ };
10
+ export declare const makeHandleSignUp: (dto: HandleSignUpDto, deps: HandleSignUpDeps) => (request: Request) => Promise<import("@remix-run/node").TypedResponse<never>>;
11
+ export {};
@@ -0,0 +1,17 @@
1
+ import { HandleSignUpController } from './HandleSignUpController.js';
2
+ import { makeHandleSignUpUseCase } from './HandleSignUpUseCase.js';
3
+
4
+ const makeHandleSignUp = (dto, deps) => async (request) => {
5
+ const { createLogtoAdapter, sessionStorage } = deps;
6
+ const useCase = makeHandleSignUpUseCase({
7
+ createLogtoAdapter,
8
+ sessionStorage,
9
+ });
10
+ const controller = HandleSignUpController.fromDto({
11
+ useCase,
12
+ redirectUri: dto.redirectBackTo,
13
+ });
14
+ return controller.execute(request);
15
+ };
16
+
17
+ export { makeHandleSignUp };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logto/remix",
3
- "version": "2.1.9",
3
+ "version": "2.2.1",
4
4
  "type": "module",
5
5
  "main": "./lib/index.cjs",
6
6
  "module": "./lib/index.js",
@@ -21,7 +21,7 @@
21
21
  "directory": "packages/remix"
22
22
  },
23
23
  "dependencies": {
24
- "@logto/node": "^2.5.0"
24
+ "@logto/node": "^2.5.2"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@remix-run/node": "^2.0.0",