@rpcbase/auth 0.199.0 → 0.200.0
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/dist/api/resend-otp/handler.d.ts.map +1 -1
- package/dist/api/resend-otp/index.d.ts +5 -0
- package/dist/api/resend-otp/index.d.ts.map +1 -1
- package/dist/api/resend-otp/index.js +16 -0
- package/dist/api/resend-otp/index.js.map +1 -0
- package/dist/api/sign-in/handler.d.ts +3 -1
- package/dist/api/sign-in/handler.d.ts.map +1 -1
- package/dist/api/sign-in/index.d.ts.map +1 -1
- package/dist/{sign-in-DYq3bJeH.js → api/sign-in/index.js} +5 -5
- package/dist/api/sign-in/index.js.map +1 -0
- package/dist/api/sign-up/handler.d.ts.map +1 -1
- package/dist/api/sign-up/index.d.ts +27 -1
- package/dist/api/sign-up/index.d.ts.map +1 -1
- package/dist/api/sign-up/index.js +32 -0
- package/dist/api/sign-up/index.js.map +1 -0
- package/dist/api/verify-otp/handler.d.ts +3 -1
- package/dist/api/verify-otp/handler.d.ts.map +1 -1
- package/dist/api/verify-otp/index.js +18 -0
- package/dist/api/verify-otp/index.js.map +1 -0
- package/dist/components/PasswordInput/index.d.ts.map +1 -1
- package/dist/components/SignInForm/index.d.ts.map +1 -1
- package/dist/emailVerification-DA9pZ0N_.js +65 -0
- package/dist/emailVerification-DA9pZ0N_.js.map +1 -0
- package/dist/emailVerification.d.ts +20 -0
- package/dist/emailVerification.d.ts.map +1 -0
- package/dist/handler-0uaKeuYp.js +213 -0
- package/dist/handler-0uaKeuYp.js.map +1 -0
- package/dist/{handler-BgjYCWF4.js → handler-B6roBozS.js} +2 -2
- package/dist/{handler-BgjYCWF4.js.map → handler-B6roBozS.js.map} +1 -1
- package/dist/handler-BPoWo5Qy.js +85 -0
- package/dist/handler-BPoWo5Qy.js.map +1 -0
- package/dist/{handler-DBbjgU-f.js → handler-BenTgwfT.js} +2 -2
- package/dist/{handler-DBbjgU-f.js.map → handler-BenTgwfT.js.map} +1 -1
- package/dist/{handler-Dbw6BOmj.js → handler-BhPmGpUq.js} +3 -3
- package/dist/handler-BhPmGpUq.js.map +1 -0
- package/dist/handler-DCk7C1pI.js +80 -0
- package/dist/handler-DCk7C1pI.js.map +1 -0
- package/dist/{handler-iT2eSHpE.js → handler-DCljRBBf.js} +3 -3
- package/dist/handler-DCljRBBf.js.map +1 -0
- package/dist/{handler-CF3fSh8e.js → handler-JKQLI2iL.js} +2 -2
- package/dist/{handler-CF3fSh8e.js.map → handler-JKQLI2iL.js.map} +1 -1
- package/dist/{handler-DgIcxthg.js → handler-b6PvhATs.js} +3 -3
- package/dist/handler-b6PvhATs.js.map +1 -0
- package/dist/handler-cj7IkJB-.js +98 -0
- package/dist/handler-cj7IkJB-.js.map +1 -0
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/oauth/index.js +30 -1
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/lib.d.ts.map +1 -1
- package/dist/registrationStatus-BP6yReMw.js +7 -0
- package/dist/registrationStatus-BP6yReMw.js.map +1 -0
- package/dist/registrationStatus.d.ts +16 -0
- package/dist/registrationStatus.d.ts.map +1 -0
- package/dist/routes.js +10 -10
- package/dist/{schemas-CMgO_xn9.js → schemas-DABNKHVA.js} +2 -2
- package/dist/{schemas-CMgO_xn9.js.map → schemas-DABNKHVA.js.map} +1 -1
- package/package.json +21 -1
- package/dist/handler-1Jy7G8dM.js +0 -92
- package/dist/handler-1Jy7G8dM.js.map +0 -1
- package/dist/handler-B1Z9YpER.js +0 -77
- package/dist/handler-B1Z9YpER.js.map +0 -1
- package/dist/handler-BkZLC8Bg.js +0 -92
- package/dist/handler-BkZLC8Bg.js.map +0 -1
- package/dist/handler-D4ui5jV4.js +0 -74
- package/dist/handler-D4ui5jV4.js.map +0 -1
- package/dist/handler-Dbw6BOmj.js.map +0 -1
- package/dist/handler-DgIcxthg.js.map +0 -1
- package/dist/handler-iT2eSHpE.js.map +0 -1
- package/dist/sign-in-DYq3bJeH.js.map +0 -1
- package/dist/sign-up-CYGadNUe.js +0 -18
- package/dist/sign-up-CYGadNUe.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/resend-otp/handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/resend-otp/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAY,MAAM,cAAc,CAAA;AAQ7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,KAAK,SAAS,MAAM,SAAS,CAAA;AAGpC,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,eAAe,EAAE,eAAe,CA0DtG,CAAA;yBAEe,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAEC"}
|
|
@@ -2,11 +2,16 @@ import { z } from 'zod';
|
|
|
2
2
|
export declare const ROUTE = "/api/rb/auth/resend-otp";
|
|
3
3
|
export declare const requestSchema: z.ZodObject<{
|
|
4
4
|
email: z.ZodString;
|
|
5
|
+
locale: z.ZodDefault<z.ZodEnum<{
|
|
6
|
+
fr: "fr";
|
|
7
|
+
en: "en";
|
|
8
|
+
}>>;
|
|
5
9
|
}, z.core.$strip>;
|
|
6
10
|
export type RequestPayload = z.infer<typeof requestSchema>;
|
|
7
11
|
export declare const responseSchema: z.ZodObject<{
|
|
8
12
|
success: z.ZodBoolean;
|
|
9
13
|
error: z.ZodOptional<z.ZodString>;
|
|
14
|
+
retryAfterSeconds: z.ZodOptional<z.ZodNumber>;
|
|
10
15
|
}, z.core.$strip>;
|
|
11
16
|
export type ResponsePayload = z.infer<typeof responseSchema>;
|
|
12
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/resend-otp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,4BAA4B,CAAA;AAE9C,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/resend-otp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,4BAA4B,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;iBAGxB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAE1D,eAAO,MAAM,cAAc;;;;iBAIzB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { a as object, i as number, o as string, r as boolean, t as _enum } from "../../schemas-DABNKHVA.js";
|
|
2
|
+
//#region src/api/resend-otp/index.ts
|
|
3
|
+
var ROUTE = "/api/rb/auth/resend-otp";
|
|
4
|
+
var requestSchema = object({
|
|
5
|
+
email: string().trim().toLowerCase().email(),
|
|
6
|
+
locale: _enum(["fr", "en"]).default("en")
|
|
7
|
+
});
|
|
8
|
+
var responseSchema = object({
|
|
9
|
+
success: boolean(),
|
|
10
|
+
error: string().optional(),
|
|
11
|
+
retryAfterSeconds: number().int().positive().optional()
|
|
12
|
+
});
|
|
13
|
+
//#endregion
|
|
14
|
+
export { ROUTE, requestSchema, responseSchema };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/api/resend-otp/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/auth/resend-otp\"\n\nexport const requestSchema = z.object({\n email: z.string().trim().toLowerCase().email(),\n locale: z.enum([\"fr\", \"en\"]).default(\"en\"),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n retryAfterSeconds: z.number().int().positive().optional(),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n"],"mappings":";;AAGA,IAAa,QAAQ;AAErB,IAAa,gBAAgB,OAAS;CACpC,OAAO,OAAS,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM;CAC7C,QAAQ,MAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI;AAC3C,CAAC;AAID,IAAa,iBAAiB,OAAS;CACrC,SAAS,QAAU;CACnB,OAAO,OAAS,CAAC,CAAC,SAAS;CAC3B,mBAAmB,OAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;AAC1D,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { Api } from '@rpcbase/api';
|
|
1
|
+
import { Api, ApiHandler } from '@rpcbase/api';
|
|
2
2
|
import { AuthSessionUser } from '../../types';
|
|
3
|
+
import * as SignIn from "./index";
|
|
4
|
+
export declare const signIn: ApiHandler<SignIn.RequestPayload, SignIn.ResponsePayload, AuthSessionUser>;
|
|
3
5
|
declare const _default: (api: Api<AuthSessionUser>) => void;
|
|
4
6
|
export default _default;
|
|
5
7
|
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAY,MAAM,cAAc,CAAA;AAM7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,KAAK,MAAM,MAAM,SAAS,CAAA;AAGjC,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,eAAe,CAqE7F,CAAA;yBAEe,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAEC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,yBAAyB,CAAA;AAE3C,eAAO,MAAM,aAAa;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-in/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,yBAAyB,CAAA;AAE3C,eAAO,MAAM,aAAa;;;;iBASxB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAE1D,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as object, o as string, r as boolean } from "../../schemas-DABNKHVA.js";
|
|
2
2
|
//#region src/api/sign-in/index.ts
|
|
3
3
|
var ROUTE = "/api/rb/auth/sign-in";
|
|
4
4
|
var requestSchema = object({
|
|
5
|
-
email: string().nonempty("Email is required").email("Please enter a valid email address"),
|
|
5
|
+
email: string().trim().toLowerCase().nonempty("Email is required").email("Please enter a valid email address"),
|
|
6
6
|
password: string().min(1, { message: "Password is required" }),
|
|
7
7
|
rememberMe: boolean().default(true)
|
|
8
8
|
});
|
|
9
|
-
object({
|
|
9
|
+
var responseSchema = object({
|
|
10
10
|
success: boolean(),
|
|
11
11
|
error: string().optional(),
|
|
12
12
|
userId: string().optional(),
|
|
13
13
|
tenantId: string().optional()
|
|
14
14
|
});
|
|
15
15
|
//#endregion
|
|
16
|
-
export { requestSchema
|
|
16
|
+
export { ROUTE, requestSchema, responseSchema };
|
|
17
17
|
|
|
18
|
-
//# sourceMappingURL=
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/api/sign-in/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/auth/sign-in\"\n\nexport const requestSchema = z.object({\n email: z\n .string()\n .trim()\n .toLowerCase()\n .nonempty(\"Email is required\")\n .email(\"Please enter a valid email address\"),\n password: z.string().min(1, { message: \"Password is required\" }),\n rememberMe: z.boolean().default(true),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n userId: z.string().optional(),\n tenantId: z.string().optional(),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n"],"mappings":";;AAGA,IAAa,QAAQ;AAErB,IAAa,gBAAgB,OAAS;CACpC,OAAO,OACG,CAAC,CACR,KAAK,CAAC,CACN,YAAY,CAAC,CACb,SAAS,mBAAmB,CAAC,CAC7B,MAAM,oCAAoC;CAC7C,UAAU,OAAS,CAAC,CAAC,IAAI,GAAG,EAAE,SAAS,uBAAuB,CAAC;CAC/D,YAAY,QAAU,CAAC,CAAC,QAAQ,IAAI;AACtC,CAAC;AAID,IAAa,iBAAiB,OAAS;CACrC,SAAS,QAAU;CACnB,OAAO,OAAS,CAAC,CAAC,SAAS;CAC3B,QAAQ,OAAS,CAAC,CAAC,SAAS;CAC5B,UAAU,OAAS,CAAC,CAAC,SAAS;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAY,MAAM,cAAc,CAAA;AAa7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,KAAK,MAAM,MAAM,SAAS,CAAA;AAiGjC,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,eAAe,CAkJ7F,CAAA;yBAEe,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAEC"}
|
|
@@ -1,16 +1,42 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const ROUTE = "/api/rb/auth/sign-up";
|
|
3
3
|
export declare const requestSchema: z.ZodObject<{
|
|
4
|
+
name: z.ZodOptional<z.ZodString>;
|
|
4
5
|
email: z.ZodString;
|
|
5
6
|
password: z.ZodString;
|
|
6
7
|
rememberMe: z.ZodDefault<z.ZodBoolean>;
|
|
8
|
+
locale: z.ZodDefault<z.ZodEnum<{
|
|
9
|
+
fr: "fr";
|
|
10
|
+
en: "en";
|
|
11
|
+
}>>;
|
|
7
12
|
}, z.core.$strip>;
|
|
8
13
|
export type RequestPayload = z.infer<typeof requestSchema>;
|
|
14
|
+
export declare const signUpErrorSchema: z.ZodEnum<{
|
|
15
|
+
invalid_payload: "invalid_payload";
|
|
16
|
+
user_exists: "user_exists";
|
|
17
|
+
rate_limited: "rate_limited";
|
|
18
|
+
tenant_initialization_in_progress: "tenant_initialization_in_progress";
|
|
19
|
+
tenant_initialization_failed: "tenant_initialization_failed";
|
|
20
|
+
email_delivery_failed: "email_delivery_failed";
|
|
21
|
+
sign_up_failed: "sign_up_failed";
|
|
22
|
+
}>;
|
|
23
|
+
export type SignUpError = z.infer<typeof signUpErrorSchema>;
|
|
9
24
|
export declare const responseSchema: z.ZodObject<{
|
|
10
25
|
success: z.ZodBoolean;
|
|
11
|
-
error: z.ZodOptional<z.
|
|
26
|
+
error: z.ZodOptional<z.ZodEnum<{
|
|
27
|
+
invalid_payload: "invalid_payload";
|
|
28
|
+
user_exists: "user_exists";
|
|
29
|
+
rate_limited: "rate_limited";
|
|
30
|
+
tenant_initialization_in_progress: "tenant_initialization_in_progress";
|
|
31
|
+
tenant_initialization_failed: "tenant_initialization_failed";
|
|
32
|
+
email_delivery_failed: "email_delivery_failed";
|
|
33
|
+
sign_up_failed: "sign_up_failed";
|
|
34
|
+
}>>;
|
|
12
35
|
userId: z.ZodOptional<z.ZodString>;
|
|
13
36
|
tenantId: z.ZodOptional<z.ZodString>;
|
|
37
|
+
verificationRequired: z.ZodOptional<z.ZodBoolean>;
|
|
38
|
+
email: z.ZodOptional<z.ZodString>;
|
|
39
|
+
retryAfterSeconds: z.ZodOptional<z.ZodNumber>;
|
|
14
40
|
}, z.core.$strip>;
|
|
15
41
|
export type ResponsePayload = z.infer<typeof responseSchema>;
|
|
16
42
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,yBAAyB,CAAA;AAE3C,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/sign-up/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,KAAK,yBAAyB,CAAA;AAE3C,eAAO,MAAM,aAAa;;;;;;;;;iBAYtB,CAAA;AAEJ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAE1D,eAAO,MAAM,iBAAiB;;;;;;;;EAQ5B,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;iBAQzB,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { a as object, i as number, o as string, r as boolean, t as _enum } from "../../schemas-DABNKHVA.js";
|
|
2
|
+
//#region src/api/sign-up/index.ts
|
|
3
|
+
var ROUTE = "/api/rb/auth/sign-up";
|
|
4
|
+
var requestSchema = object({
|
|
5
|
+
name: string().trim().min(1).optional(),
|
|
6
|
+
email: string().trim().toLowerCase().nonempty("Email is required").email("Please enter a valid email address"),
|
|
7
|
+
password: string().min(8, { message: "Password must be at least 8 characters long." }),
|
|
8
|
+
rememberMe: boolean().default(true),
|
|
9
|
+
locale: _enum(["fr", "en"]).default("en")
|
|
10
|
+
});
|
|
11
|
+
var signUpErrorSchema = _enum([
|
|
12
|
+
"invalid_payload",
|
|
13
|
+
"user_exists",
|
|
14
|
+
"rate_limited",
|
|
15
|
+
"tenant_initialization_in_progress",
|
|
16
|
+
"tenant_initialization_failed",
|
|
17
|
+
"email_delivery_failed",
|
|
18
|
+
"sign_up_failed"
|
|
19
|
+
]);
|
|
20
|
+
var responseSchema = object({
|
|
21
|
+
success: boolean(),
|
|
22
|
+
error: signUpErrorSchema.optional(),
|
|
23
|
+
userId: string().optional(),
|
|
24
|
+
tenantId: string().optional(),
|
|
25
|
+
verificationRequired: boolean().optional(),
|
|
26
|
+
email: string().email().optional(),
|
|
27
|
+
retryAfterSeconds: number().int().positive().optional()
|
|
28
|
+
});
|
|
29
|
+
//#endregion
|
|
30
|
+
export { ROUTE, requestSchema, responseSchema, signUpErrorSchema };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/api/sign-up/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/auth/sign-up\"\n\nexport const requestSchema = z\n .object({\n name: z.string().trim().min(1).optional(),\n email: z\n .string()\n .trim()\n .toLowerCase()\n .nonempty(\"Email is required\")\n .email(\"Please enter a valid email address\"),\n password: z.string().min(8, { message: \"Password must be at least 8 characters long.\" }),\n rememberMe: z.boolean().default(true),\n locale: z.enum([\"fr\", \"en\"]).default(\"en\"),\n })\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const signUpErrorSchema = z.enum([\n \"invalid_payload\",\n \"user_exists\",\n \"rate_limited\",\n \"tenant_initialization_in_progress\",\n \"tenant_initialization_failed\",\n \"email_delivery_failed\",\n \"sign_up_failed\",\n])\n\nexport type SignUpError = z.infer<typeof signUpErrorSchema>\n\nexport const responseSchema = z.object({\n success: z.boolean(),\n error: signUpErrorSchema.optional(),\n userId: z.string().optional(),\n tenantId: z.string().optional(),\n verificationRequired: z.boolean().optional(),\n email: z.string().email().optional(),\n retryAfterSeconds: z.number().int().positive().optional(),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n"],"mappings":";;AAGA,IAAa,QAAQ;AAErB,IAAa,gBAAgB,OACnB;CACN,MAAM,OAAS,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACxC,OAAO,OACG,CAAC,CACR,KAAK,CAAC,CACN,YAAY,CAAC,CACb,SAAS,mBAAmB,CAAC,CAC7B,MAAM,oCAAoC;CAC7C,UAAU,OAAS,CAAC,CAAC,IAAI,GAAG,EAAE,SAAS,+CAA+C,CAAC;CACvF,YAAY,QAAU,CAAC,CAAC,QAAQ,IAAI;CACpC,QAAQ,MAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI;AAC3C,CAAC;AAIH,IAAa,oBAAoB,MAAO;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;AAAgB,CACjB;AAID,IAAa,iBAAiB,OAAS;CACrC,SAAS,QAAU;CACnB,OAAO,kBAAkB,SAAS;CAClC,QAAQ,OAAS,CAAC,CAAC,SAAS;CAC5B,UAAU,OAAS,CAAC,CAAC,SAAS;CAC9B,sBAAsB,QAAU,CAAC,CAAC,SAAS;CAC3C,OAAO,OAAS,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS;CACnC,mBAAmB,OAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;AAC1D,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { Api } from '@rpcbase/api';
|
|
1
|
+
import { Api, ApiHandler } from '@rpcbase/api';
|
|
2
2
|
import { AuthSessionUser } from '../../types';
|
|
3
|
+
import * as VerifyOtp from "./index";
|
|
4
|
+
export declare const verifyOtp: ApiHandler<VerifyOtp.RequestPayload, VerifyOtp.ResponsePayload, AuthSessionUser>;
|
|
3
5
|
declare const _default: (api: Api<AuthSessionUser>) => void;
|
|
4
6
|
export default _default;
|
|
5
7
|
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/verify-otp/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/api/verify-otp/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAY,MAAM,cAAc,CAAA;AAK7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,KAAK,SAAS,MAAM,SAAS,CAAA;AAGpC,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,eAAe,EAAE,eAAe,CAyFtG,CAAA;yBAEe,KAAK,GAAG,CAAC,eAAe,CAAC;AAAzC,wBAEC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { a as object, o as string, r as boolean } from "../../schemas-DABNKHVA.js";
|
|
2
|
+
//#region src/api/verify-otp/index.ts
|
|
3
|
+
var ROUTE = "/api/rb/auth/verify-otp";
|
|
4
|
+
var requestSchema = object({
|
|
5
|
+
email: string().trim().toLowerCase().email(),
|
|
6
|
+
code: string().regex(/^\d{6}$/, "Code must be 6 digits"),
|
|
7
|
+
rememberMe: boolean().default(true)
|
|
8
|
+
});
|
|
9
|
+
var responseSchema = object({
|
|
10
|
+
success: boolean(),
|
|
11
|
+
error: string().optional(),
|
|
12
|
+
userId: string().optional(),
|
|
13
|
+
tenantId: string().optional()
|
|
14
|
+
});
|
|
15
|
+
//#endregion
|
|
16
|
+
export { ROUTE, requestSchema, responseSchema };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/api/verify-otp/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/auth/verify-otp\"\n\nexport const requestSchema = z.object({\n email: z.string().trim().toLowerCase().email(),\n code: z.string().regex(/^\\d{6}$/, \"Code must be 6 digits\"),\n rememberMe: z.boolean().default(true),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n userId: z.string().optional(),\n tenantId: z.string().optional(),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n"],"mappings":";;AAGA,IAAa,QAAQ;AAErB,IAAa,gBAAgB,OAAS;CACpC,OAAO,OAAS,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM;CAC7C,MAAM,OAAS,CAAC,CAAC,MAAM,WAAW,uBAAuB;CACzD,YAAY,QAAU,CAAC,CAAC,QAAQ,IAAI;AACtC,CAAC;AAID,IAAa,iBAAiB,OAAS;CACrC,SAAS,QAAU;CACnB,OAAO,OAAS,CAAC,CAAC,SAAS;CAC3B,QAAQ,OAAS,CAAC,CAAC,SAAS;CAC5B,UAAU,OAAS,CAAC,CAAC,SAAS;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/PasswordInput/index.tsx"],"names":[],"mappings":"AAMA,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,qDAM3B,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/PasswordInput/index.tsx"],"names":[],"mappings":"AAMA,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,qDAM3B,kBAAkB,gCA4CpB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SignInForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAYjC,eAAO,MAAM,UAAU,GAAI,yBAGxB;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SignInForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAYjC,eAAO,MAAM,UAAU,GAAI,yBAGxB;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,gCAgEA,CAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { n as pendingRegistrationCondition } from "./registrationStatus-BP6yReMw.js";
|
|
2
|
+
import { sendEmail } from "@rpcbase/server";
|
|
3
|
+
import crypto from "node:crypto";
|
|
4
|
+
var OTP_RESEND_COOLDOWN_MS = 6e4;
|
|
5
|
+
var createVerificationCode = () => crypto.randomInt(0, 1e6).toString().padStart(6, "0");
|
|
6
|
+
var sendVerificationEmail = async ({ email, code, locale }) => {
|
|
7
|
+
const french = locale === "fr";
|
|
8
|
+
const subject = french ? `Votre code de vérification : ${code}` : `Verify your email: ${code}`;
|
|
9
|
+
const intro = french ? "Bienvenue ! Utilisez ce code pour vérifier votre adresse email." : "Welcome! Use this code to verify your email address.";
|
|
10
|
+
const expiration = french ? "Il expire dans 10 minutes." : "It expires in 10 minutes.";
|
|
11
|
+
const ignore = french ? "Si vous n’êtes pas à l’origine de cette demande, vous pouvez ignorer cet email." : "If you did not request this, you can ignore this email.";
|
|
12
|
+
await sendEmail({
|
|
13
|
+
to: email,
|
|
14
|
+
subject,
|
|
15
|
+
html: `<p>${intro}</p><p><strong>${code}</strong></p><p>${expiration}</p><p>${ignore}</p>`,
|
|
16
|
+
text: `${intro} ${code}. ${expiration} ${ignore}`
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
var issueVerificationCode = async ({ User, userId, email, locale, passwordHash, enforceCooldown = false }) => {
|
|
20
|
+
const code = createVerificationCode();
|
|
21
|
+
const now = /* @__PURE__ */ new Date();
|
|
22
|
+
const conditions = [pendingRegistrationCondition()];
|
|
23
|
+
const userFilter = {
|
|
24
|
+
_id: userId,
|
|
25
|
+
$and: conditions
|
|
26
|
+
};
|
|
27
|
+
if (enforceCooldown) conditions.push({ $or: [{ emailVerificationSentAt: { $exists: false } }, { emailVerificationSentAt: { $lte: /* @__PURE__ */ new Date(now.getTime() - OTP_RESEND_COOLDOWN_MS) } }] });
|
|
28
|
+
if ((await User.updateOne(userFilter, { $set: {
|
|
29
|
+
registrationStatus: "pending_verification",
|
|
30
|
+
emailVerificationCode: code,
|
|
31
|
+
emailVerificationExpiresAt: new Date(now.getTime() + 6e5),
|
|
32
|
+
emailVerificationSentAt: now,
|
|
33
|
+
...passwordHash ? { password: passwordHash } : {}
|
|
34
|
+
} })).matchedCount !== 1) return false;
|
|
35
|
+
try {
|
|
36
|
+
await sendVerificationEmail({
|
|
37
|
+
email,
|
|
38
|
+
code,
|
|
39
|
+
locale
|
|
40
|
+
});
|
|
41
|
+
} catch (error) {
|
|
42
|
+
try {
|
|
43
|
+
await User.updateOne({
|
|
44
|
+
_id: userId,
|
|
45
|
+
...pendingRegistrationCondition(),
|
|
46
|
+
emailVerificationCode: code
|
|
47
|
+
}, { $unset: {
|
|
48
|
+
emailVerificationCode: "",
|
|
49
|
+
emailVerificationExpiresAt: "",
|
|
50
|
+
emailVerificationSentAt: ""
|
|
51
|
+
} });
|
|
52
|
+
} catch (cleanupError) {
|
|
53
|
+
console.error("auth::failed_to_release_unsent_verification_code", {
|
|
54
|
+
userId: String(userId),
|
|
55
|
+
cleanupError
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { issueVerificationCode as n, OTP_RESEND_COOLDOWN_MS as t };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=emailVerification-DA9pZ0N_.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailVerification-DA9pZ0N_.js","names":[],"sources":["../src/emailVerification.ts"],"sourcesContent":["import crypto from \"node:crypto\"\n\nimport { models } from \"@rpcbase/db\"\nimport { sendEmail } from \"@rpcbase/server\"\n\nimport { pendingRegistrationCondition } from \"./registrationStatus\"\n\n\nexport const OTP_LIFETIME_MS = 10 * 60 * 1000\nexport const OTP_RESEND_COOLDOWN_MS = 60 * 1000\n\ntype GlobalModel = Awaited<ReturnType<typeof models.getGlobal>>\n\nexport const createVerificationCode = (): string =>\n crypto.randomInt(0, 1_000_000).toString().padStart(6, \"0\")\n\nexport const sendVerificationEmail = async ({\n email,\n code,\n locale,\n}: {\n email: string\n code: string\n locale: \"fr\" | \"en\"\n}): Promise<void> => {\n const french = locale === \"fr\"\n const subject = french\n ? `Votre code de vérification : ${code}`\n : `Verify your email: ${code}`\n const intro = french\n ? \"Bienvenue ! Utilisez ce code pour vérifier votre adresse email.\"\n : \"Welcome! Use this code to verify your email address.\"\n const expiration = french\n ? \"Il expire dans 10 minutes.\"\n : \"It expires in 10 minutes.\"\n const ignore = french\n ? \"Si vous n’êtes pas à l’origine de cette demande, vous pouvez ignorer cet email.\"\n : \"If you did not request this, you can ignore this email.\"\n\n await sendEmail({\n to: email,\n subject,\n html: `<p>${intro}</p><p><strong>${code}</strong></p><p>${expiration}</p><p>${ignore}</p>`,\n text: `${intro} ${code}. ${expiration} ${ignore}`,\n })\n}\n\nexport const issueVerificationCode = async ({\n User,\n userId,\n email,\n locale,\n passwordHash,\n enforceCooldown = false,\n}: {\n User: GlobalModel\n userId: unknown\n email: string\n locale: \"fr\" | \"en\"\n passwordHash?: string\n enforceCooldown?: boolean\n}): Promise<boolean> => {\n const code = createVerificationCode()\n const now = new Date()\n const conditions: Record<string, unknown>[] = [pendingRegistrationCondition()]\n const userFilter: Record<string, unknown> = {\n _id: userId,\n $and: conditions,\n }\n\n if (enforceCooldown) {\n conditions.push({\n $or: [\n { emailVerificationSentAt: { $exists: false } },\n { emailVerificationSentAt: { $lte: new Date(now.getTime() - OTP_RESEND_COOLDOWN_MS) } },\n ],\n })\n }\n\n const update = await User.updateOne(\n userFilter,\n {\n $set: {\n registrationStatus: \"pending_verification\",\n emailVerificationCode: code,\n emailVerificationExpiresAt: new Date(now.getTime() + OTP_LIFETIME_MS),\n emailVerificationSentAt: now,\n ...(passwordHash ? { password: passwordHash } : {}),\n },\n },\n )\n\n if (update.matchedCount !== 1) return false\n\n try {\n await sendVerificationEmail({ email, code, locale })\n } catch (error) {\n try {\n await User.updateOne(\n {\n _id: userId,\n ...pendingRegistrationCondition(),\n emailVerificationCode: code,\n },\n {\n $unset: {\n emailVerificationCode: \"\",\n emailVerificationExpiresAt: \"\",\n emailVerificationSentAt: \"\",\n },\n },\n )\n } catch (cleanupError) {\n console.error(\"auth::failed_to_release_unsent_verification_code\", {\n userId: String(userId),\n cleanupError,\n })\n }\n\n throw error\n }\n\n return true\n}\n"],"mappings":";;;AASA,IAAa,yBAAyB;AAItC,IAAa,+BACX,OAAO,UAAU,GAAG,GAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG;AAE3D,IAAa,wBAAwB,OAAO,EAC1C,OACA,MACA,aAKmB;CACnB,MAAM,SAAS,WAAW;CAC1B,MAAM,UAAU,SACZ,gCAAgC,SAChC,sBAAsB;CAC1B,MAAM,QAAQ,SACV,oEACA;CACJ,MAAM,aAAa,SACf,+BACA;CACJ,MAAM,SAAS,SACX,oFACA;CAEJ,MAAM,UAAU;EACd,IAAI;EACJ;EACA,MAAM,MAAM,MAAK,iBAAkB,KAAI,kBAAmB,WAAU,SAAU,OAAM;EACpF,MAAM,GAAG,MAAK,GAAI,KAAI,IAAK,WAAU,GAAI;CAC3C,CAAC;AACH;AAEA,IAAa,wBAAwB,OAAO,EAC1C,MACA,QACA,OACA,QACA,cACA,kBAAkB,YAQI;CACtB,MAAM,OAAO,uBAAuB;CACpC,MAAM,sBAAM,IAAI,KAAK;CACrB,MAAM,aAAwC,CAAC,6BAA6B,CAAC;CAC7E,MAAM,aAAsC;EAC1C,KAAK;EACL,MAAM;CACR;CAEA,IAAI,iBACF,WAAW,KAAK,EACd,KAAK,CACH,EAAE,yBAAyB,EAAE,SAAS,MAAM,EAAE,GAC9C,EAAE,yBAAyB,EAAE,sBAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,sBAAsB,EAAE,EAAE,CAAC,EAE3F,CAAC;CAgBH,KAAI,MAbiB,KAAK,UACxB,YACA,EACE,MAAM;EACJ,oBAAoB;EACpB,uBAAuB;EACvB,4BAA4B,IAAI,KAAK,IAAI,QAAQ,IAAA,GAAmB;EACpE,yBAAyB;EACzB,GAAI,eAAe,EAAE,UAAU,aAAa,IAAI,CAAC;CACnD,EACF,CACF,EAAA,CAEW,iBAAiB,GAAG,OAAO;CAEtC,IAAI;EACF,MAAM,sBAAsB;GAAE;GAAO;GAAM;EAAO,CAAC;CACrD,SAAS,OAAO;EACd,IAAI;GACF,MAAM,KAAK,UACT;IACE,KAAK;IACL,GAAG,6BAA6B;IAChC,uBAAuB;GACzB,GACA,EACE,QAAQ;IACN,uBAAuB;IACvB,4BAA4B;IAC5B,yBAAyB;GAC3B,EACF,CACF;EACF,SAAS,cAAc;GACrB,QAAQ,MAAM,oDAAoD;IAChE,QAAQ,OAAO,MAAM;IACrB;GACF,CAAC;EACH;EAEA,MAAM;CACR;CAEA,OAAO;AACT"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { models } from '@rpcbase/db';
|
|
2
|
+
export declare const OTP_LIFETIME_MS: number;
|
|
3
|
+
export declare const OTP_RESEND_COOLDOWN_MS: number;
|
|
4
|
+
type GlobalModel = Awaited<ReturnType<typeof models.getGlobal>>;
|
|
5
|
+
export declare const createVerificationCode: () => string;
|
|
6
|
+
export declare const sendVerificationEmail: ({ email, code, locale, }: {
|
|
7
|
+
email: string;
|
|
8
|
+
code: string;
|
|
9
|
+
locale: "fr" | "en";
|
|
10
|
+
}) => Promise<void>;
|
|
11
|
+
export declare const issueVerificationCode: ({ User, userId, email, locale, passwordHash, enforceCooldown, }: {
|
|
12
|
+
User: GlobalModel;
|
|
13
|
+
userId: unknown;
|
|
14
|
+
email: string;
|
|
15
|
+
locale: "fr" | "en";
|
|
16
|
+
passwordHash?: string;
|
|
17
|
+
enforceCooldown?: boolean;
|
|
18
|
+
}) => Promise<boolean>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=emailVerification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emailVerification.d.ts","sourceRoot":"","sources":["../src/emailVerification.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMpC,eAAO,MAAM,eAAe,QAAiB,CAAA;AAC7C,eAAO,MAAM,sBAAsB,QAAY,CAAA;AAE/C,KAAK,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;AAE/D,eAAO,MAAM,sBAAsB,QAAO,MACkB,CAAA;AAE5D,eAAO,MAAM,qBAAqB,GAAU,0BAIzC;IACD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,IAAI,GAAG,IAAI,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CAqBf,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAU,iEAOzC;IACD,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,IAAI,GAAG,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,KAAG,OAAO,CAAC,OAAO,CA8DlB,CAAA"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { ROUTE, requestSchema } from "./api/sign-up/index.js";
|
|
2
|
+
import { t as email_validation_exports } from "./email-validation/index.js";
|
|
3
|
+
import { n as pendingRegistrationCondition, t as isPendingRegistration } from "./registrationStatus-BP6yReMw.js";
|
|
4
|
+
import { n as issueVerificationCode, t as OTP_RESEND_COOLDOWN_MS } from "./emailVerification-DA9pZ0N_.js";
|
|
5
|
+
import { createProvisionedTenant, models } from "@rpcbase/db";
|
|
6
|
+
import { hashPasswordForStorage } from "@rpcbase/server";
|
|
7
|
+
import crypto from "node:crypto";
|
|
8
|
+
//#region src/api/sign-up/handler.ts
|
|
9
|
+
var firstTenantId = (user) => {
|
|
10
|
+
if (!Array.isArray(user.tenants)) return "";
|
|
11
|
+
const first = user.tenants[0];
|
|
12
|
+
return typeof first === "string" ? first.trim() : String(first ?? "").trim();
|
|
13
|
+
};
|
|
14
|
+
var handlePendingUser = async ({ user, User, Tenant, email, locale, password }) => {
|
|
15
|
+
const tenantId = firstTenantId(user);
|
|
16
|
+
const tenant = tenantId ? await Tenant.findOne({ tenantId }, { provisioningStatus: 1 }).lean() : null;
|
|
17
|
+
if (tenant?.provisioningStatus === "initializing") return {
|
|
18
|
+
success: false,
|
|
19
|
+
error: "tenant_initialization_in_progress",
|
|
20
|
+
retryAfterSeconds: 3
|
|
21
|
+
};
|
|
22
|
+
if (tenant?.provisioningStatus === "active") {
|
|
23
|
+
const sentAt = user.emailVerificationSentAt;
|
|
24
|
+
if (sentAt instanceof Date) {
|
|
25
|
+
const remainingMs = OTP_RESEND_COOLDOWN_MS - (Date.now() - sentAt.getTime());
|
|
26
|
+
if (remainingMs > 0) return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: "rate_limited",
|
|
29
|
+
retryAfterSeconds: Math.max(1, Math.ceil(remainingMs / 1e3))
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const passwordHash = await hashPasswordForStorage(password);
|
|
34
|
+
if (!await issueVerificationCode({
|
|
35
|
+
User,
|
|
36
|
+
userId: user._id,
|
|
37
|
+
email,
|
|
38
|
+
locale,
|
|
39
|
+
passwordHash,
|
|
40
|
+
enforceCooldown: true
|
|
41
|
+
})) return {
|
|
42
|
+
success: false,
|
|
43
|
+
error: "rate_limited",
|
|
44
|
+
retryAfterSeconds: OTP_RESEND_COOLDOWN_MS / 1e3
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
success: true,
|
|
48
|
+
verificationRequired: true,
|
|
49
|
+
email
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error("auth::failed_to_resend_signup_verification_email", error);
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: "email_delivery_failed"
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
await User.deleteOne({
|
|
60
|
+
_id: user._id,
|
|
61
|
+
...pendingRegistrationCondition()
|
|
62
|
+
});
|
|
63
|
+
return null;
|
|
64
|
+
};
|
|
65
|
+
var signUp = async (payload, ctx) => {
|
|
66
|
+
const parsed = requestSchema.safeParse(payload);
|
|
67
|
+
if (!parsed.success) {
|
|
68
|
+
ctx.res.status(400);
|
|
69
|
+
return {
|
|
70
|
+
success: false,
|
|
71
|
+
error: "invalid_payload"
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const { name, email, password, locale } = parsed.data;
|
|
75
|
+
if (!await (0, email_validation_exports.isEmailAddressValid)(email)) return { success: true };
|
|
76
|
+
const [User, Tenant] = await Promise.all([models.getGlobal("RBUser", ctx), models.getGlobal("RBTenant", ctx)]);
|
|
77
|
+
const existingUser = await User.findOne({ email }, {
|
|
78
|
+
tenants: 1,
|
|
79
|
+
registrationStatus: 1,
|
|
80
|
+
emailVerificationCode: 1,
|
|
81
|
+
emailVerificationSentAt: 1
|
|
82
|
+
}).lean();
|
|
83
|
+
if (existingUser) {
|
|
84
|
+
if (isPendingRegistration(existingUser)) {
|
|
85
|
+
const pendingResponse = await handlePendingUser({
|
|
86
|
+
user: existingUser,
|
|
87
|
+
User,
|
|
88
|
+
Tenant,
|
|
89
|
+
email,
|
|
90
|
+
locale,
|
|
91
|
+
password
|
|
92
|
+
});
|
|
93
|
+
if (pendingResponse) {
|
|
94
|
+
if (!pendingResponse.success) {
|
|
95
|
+
if (pendingResponse.error === "rate_limited") {
|
|
96
|
+
if (pendingResponse.retryAfterSeconds) ctx.res.setHeader("Retry-After", String(pendingResponse.retryAfterSeconds));
|
|
97
|
+
ctx.res.status(429);
|
|
98
|
+
} else if (pendingResponse.error === "email_delivery_failed") ctx.res.status(500);
|
|
99
|
+
else ctx.res.status(503);
|
|
100
|
+
}
|
|
101
|
+
return pendingResponse;
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
ctx.res.status(409);
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
error: "user_exists"
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const tenantId = crypto.randomUUID();
|
|
112
|
+
const hashedPassword = await hashPasswordForStorage(password);
|
|
113
|
+
const user = new User({
|
|
114
|
+
name,
|
|
115
|
+
email,
|
|
116
|
+
password: hashedPassword,
|
|
117
|
+
tenants: [tenantId],
|
|
118
|
+
tenantRoles: { [tenantId]: ["owner"] },
|
|
119
|
+
registrationStatus: "pending_verification"
|
|
120
|
+
});
|
|
121
|
+
try {
|
|
122
|
+
await user.save();
|
|
123
|
+
} catch (error) {
|
|
124
|
+
const duplicate = Boolean(error && typeof error === "object" && "code" in error && error.code === 11e3);
|
|
125
|
+
ctx.res.status(duplicate ? 409 : 500);
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
error: duplicate ? "user_exists" : "sign_up_failed"
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
await createProvisionedTenant(Tenant, {
|
|
133
|
+
tenantId,
|
|
134
|
+
name: name ?? email
|
|
135
|
+
});
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.error("auth::failed_to_initialize_signup_tenant", {
|
|
138
|
+
tenantId,
|
|
139
|
+
error
|
|
140
|
+
});
|
|
141
|
+
try {
|
|
142
|
+
await User.deleteOne({
|
|
143
|
+
_id: user._id,
|
|
144
|
+
...pendingRegistrationCondition()
|
|
145
|
+
});
|
|
146
|
+
} catch (rollbackError) {
|
|
147
|
+
console.error("auth::failed_to_rollback_signup_user", {
|
|
148
|
+
tenantId,
|
|
149
|
+
userId: user._id.toString(),
|
|
150
|
+
rollbackError
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
ctx.res.status(500);
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
error: "tenant_initialization_failed"
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
if (!await issueVerificationCode({
|
|
161
|
+
User,
|
|
162
|
+
userId: user._id,
|
|
163
|
+
email,
|
|
164
|
+
locale,
|
|
165
|
+
passwordHash: hashedPassword
|
|
166
|
+
})) {
|
|
167
|
+
ctx.res.status(409);
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
error: "user_exists"
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error("auth::failed_to_send_signup_verification_email", {
|
|
175
|
+
tenantId,
|
|
176
|
+
userId: user._id.toString(),
|
|
177
|
+
error
|
|
178
|
+
});
|
|
179
|
+
try {
|
|
180
|
+
if ((await User.deleteOne({
|
|
181
|
+
_id: user._id,
|
|
182
|
+
...pendingRegistrationCondition(),
|
|
183
|
+
emailVerificationCode: { $exists: false }
|
|
184
|
+
})).deletedCount === 1) await Tenant.deleteOne({
|
|
185
|
+
tenantId,
|
|
186
|
+
provisioningStatus: "active"
|
|
187
|
+
});
|
|
188
|
+
} catch (rollbackError) {
|
|
189
|
+
console.error("auth::failed_to_rollback_undeliverable_signup", {
|
|
190
|
+
tenantId,
|
|
191
|
+
userId: user._id.toString(),
|
|
192
|
+
rollbackError
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
ctx.res.status(500);
|
|
196
|
+
return {
|
|
197
|
+
success: false,
|
|
198
|
+
error: "email_delivery_failed"
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
success: true,
|
|
203
|
+
verificationRequired: true,
|
|
204
|
+
email
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
var handler_default = (api) => {
|
|
208
|
+
api.post(ROUTE, signUp);
|
|
209
|
+
};
|
|
210
|
+
//#endregion
|
|
211
|
+
export { handler_default as default, signUp };
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=handler-0uaKeuYp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-0uaKeuYp.js","names":[],"sources":["../src/api/sign-up/handler.ts"],"sourcesContent":["import crypto from \"node:crypto\"\n\nimport { Api, type ApiHandler, type Ctx } from \"@rpcbase/api\"\nimport { createProvisionedTenant, models } from \"@rpcbase/db\"\nimport { hashPasswordForStorage } from \"@rpcbase/server\"\n\nimport {\n issueVerificationCode,\n OTP_RESEND_COOLDOWN_MS,\n} from \"../../emailVerification\"\nimport { isEmailAddressValid } from \"../../email-validation\"\nimport {\n isPendingRegistration,\n pendingRegistrationCondition,\n} from \"../../registrationStatus\"\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as SignUp from \"./index\"\n\n\ntype PendingUser = {\n _id: { toString(): string }\n tenants?: unknown\n registrationStatus?: unknown\n emailVerificationCode?: unknown\n emailVerificationSentAt?: unknown\n}\n\ntype TenantState = {\n provisioningStatus?: unknown\n}\n\ntype GlobalModel = Awaited<ReturnType<typeof models.getGlobal>>\n\nconst firstTenantId = (user: PendingUser): string => {\n if (!Array.isArray(user.tenants)) return \"\"\n const first = user.tenants[0]\n return typeof first === \"string\" ? first.trim() : String(first ?? \"\").trim()\n}\n\nconst handlePendingUser = async ({\n user,\n User,\n Tenant,\n email,\n locale,\n password,\n}: {\n user: PendingUser\n User: GlobalModel\n Tenant: GlobalModel\n email: string\n locale: \"fr\" | \"en\"\n password: string\n}): Promise<SignUp.ResponsePayload | null> => {\n const tenantId = firstTenantId(user)\n const tenant = tenantId\n ? await Tenant.findOne({ tenantId }, { provisioningStatus: 1 }).lean() as TenantState | null\n : null\n\n if (tenant?.provisioningStatus === \"initializing\") {\n return {\n success: false,\n error: \"tenant_initialization_in_progress\",\n retryAfterSeconds: 3,\n }\n }\n\n if (tenant?.provisioningStatus === \"active\") {\n const sentAt = user.emailVerificationSentAt\n if (sentAt instanceof Date) {\n const remainingMs = OTP_RESEND_COOLDOWN_MS - (Date.now() - sentAt.getTime())\n if (remainingMs > 0) {\n return {\n success: false,\n error: \"rate_limited\",\n retryAfterSeconds: Math.max(1, Math.ceil(remainingMs / 1000)),\n }\n }\n }\n\n try {\n const passwordHash = await hashPasswordForStorage(password)\n const issued = await issueVerificationCode({\n User,\n userId: user._id,\n email,\n locale,\n passwordHash,\n enforceCooldown: true,\n })\n\n if (!issued) {\n return {\n success: false,\n error: \"rate_limited\",\n retryAfterSeconds: OTP_RESEND_COOLDOWN_MS / 1000,\n }\n }\n\n return { success: true, verificationRequired: true, email }\n } catch (error) {\n console.error(\"auth::failed_to_resend_signup_verification_email\", error)\n return { success: false, error: \"email_delivery_failed\" }\n }\n }\n\n await User.deleteOne({\n _id: user._id,\n ...pendingRegistrationCondition(),\n })\n return null\n}\n\nexport const signUp: ApiHandler<SignUp.RequestPayload, SignUp.ResponsePayload, AuthSessionUser> = async (\n payload,\n ctx: Ctx<AuthSessionUser>,\n): Promise<SignUp.ResponsePayload> => {\n const parsed = SignUp.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { name, email, password, locale } = parsed.data\n if (!await isEmailAddressValid(email)) {\n return { success: true }\n }\n\n const [User, Tenant] = await Promise.all([\n models.getGlobal(\"RBUser\", ctx),\n models.getGlobal(\"RBTenant\", ctx),\n ])\n\n const existingUser = await User.findOne(\n { email },\n {\n tenants: 1,\n registrationStatus: 1,\n emailVerificationCode: 1,\n emailVerificationSentAt: 1,\n },\n ).lean() as PendingUser | null\n\n if (existingUser) {\n if (isPendingRegistration(existingUser)) {\n const pendingResponse = await handlePendingUser({\n user: existingUser,\n User,\n Tenant,\n email,\n locale,\n password,\n })\n\n if (pendingResponse) {\n if (!pendingResponse.success) {\n if (pendingResponse.error === \"rate_limited\") {\n if (pendingResponse.retryAfterSeconds) {\n ctx.res.setHeader(\"Retry-After\", String(pendingResponse.retryAfterSeconds))\n }\n ctx.res.status(429)\n } else if (pendingResponse.error === \"email_delivery_failed\") {\n ctx.res.status(500)\n } else {\n ctx.res.status(503)\n }\n }\n return pendingResponse\n }\n } else {\n ctx.res.status(409)\n return { success: false, error: \"user_exists\" }\n }\n }\n\n const tenantId = crypto.randomUUID()\n const hashedPassword = await hashPasswordForStorage(password)\n const user = new User({\n name,\n email,\n password: hashedPassword,\n tenants: [tenantId],\n tenantRoles: { [tenantId]: [\"owner\"] },\n registrationStatus: \"pending_verification\",\n })\n\n try {\n await user.save()\n } catch (error) {\n const duplicate = Boolean(\n error\n && typeof error === \"object\"\n && \"code\" in error\n && (error as { code?: unknown }).code === 11000,\n )\n ctx.res.status(duplicate ? 409 : 500)\n return {\n success: false,\n error: duplicate ? \"user_exists\" : \"sign_up_failed\",\n }\n }\n\n try {\n await createProvisionedTenant(Tenant, { tenantId, name: name ?? email })\n } catch (error) {\n console.error(\"auth::failed_to_initialize_signup_tenant\", { tenantId, error })\n try {\n await User.deleteOne({ _id: user._id, ...pendingRegistrationCondition() })\n } catch (rollbackError) {\n console.error(\"auth::failed_to_rollback_signup_user\", {\n tenantId,\n userId: user._id.toString(),\n rollbackError,\n })\n }\n ctx.res.status(500)\n return { success: false, error: \"tenant_initialization_failed\" }\n }\n\n try {\n const issued = await issueVerificationCode({\n User,\n userId: user._id,\n email,\n locale,\n passwordHash: hashedPassword,\n })\n if (!issued) {\n ctx.res.status(409)\n return { success: false, error: \"user_exists\" }\n }\n } catch (error) {\n console.error(\"auth::failed_to_send_signup_verification_email\", {\n tenantId,\n userId: user._id.toString(),\n error,\n })\n try {\n const deletion = await User.deleteOne({\n _id: user._id,\n ...pendingRegistrationCondition(),\n emailVerificationCode: { $exists: false },\n })\n if (deletion.deletedCount === 1) {\n await Tenant.deleteOne({ tenantId, provisioningStatus: \"active\" })\n }\n } catch (rollbackError) {\n console.error(\"auth::failed_to_rollback_undeliverable_signup\", {\n tenantId,\n userId: user._id.toString(),\n rollbackError,\n })\n }\n ctx.res.status(500)\n return { success: false, error: \"email_delivery_failed\" }\n }\n\n return { success: true, verificationRequired: true, email }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(SignUp.ROUTE, signUp)\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as object, n as array, o as string } from "./schemas-DABNKHVA.js";
|
|
2
2
|
import { r as restrictSessionMiddleware } from "./middleware-BT3Uput1.js";
|
|
3
3
|
import { models } from "@rpcbase/db";
|
|
4
4
|
//#region src/api/me/index.ts
|
|
@@ -67,4 +67,4 @@ var handler_default = (api) => {
|
|
|
67
67
|
//#endregion
|
|
68
68
|
export { handler_default as default };
|
|
69
69
|
|
|
70
|
-
//# sourceMappingURL=handler-
|
|
70
|
+
//# sourceMappingURL=handler-B6roBozS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler-
|
|
1
|
+
{"version":3,"file":"handler-B6roBozS.js","names":[],"sources":["../src/api/me/index.ts","../src/api/me/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/auth/me\"\n\nexport const requestSchema = z.object({})\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n id: z.string().optional(),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n name: z.string().optional(),\n tenants: z.array(z.string()).default([]),\n currentTenantId: z.string().optional(),\n signedInTenants: z.array(z.string()).default([]).optional(),\n error: z.string().optional(),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n","import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\n\nimport type { AuthSessionUser } from \"../../types\"\nimport { restrictSessionMiddleware } from \"../../middleware\"\n\nimport * as Me from \"./index\"\n\n\nconst me: ApiHandler<Me.RequestPayload, Me.ResponsePayload, AuthSessionUser> = async(\n _payload: Me.RequestPayload,\n ctx: Ctx<AuthSessionUser>\n): Promise<Me.ResponsePayload> => {\n const sessionUser = ctx.req.session?.user\n\n if (!sessionUser?.id) {\n ctx.res.status(401)\n return {\n id: \"\",\n currentTenantId: \"\",\n signedInTenants: [],\n tenants: [],\n error: \"not_authenticated\",\n } as unknown as Me.ResponsePayload\n }\n\n const User = await models.getGlobal(\"RBUser\", ctx)\n const user = await User.findById(sessionUser.id)\n\n if (!user) {\n ctx.res.status(404)\n return {\n id: \"\",\n currentTenantId: \"\",\n signedInTenants: [],\n tenants: [],\n error: \"user_not_found\",\n } as unknown as Me.ResponsePayload\n }\n\n const tenantId = typeof sessionUser.currentTenantId === \"string\" ? sessionUser.currentTenantId.trim() : \"\"\n if (!tenantId) {\n ctx.res.status(500)\n return {\n id: \"\",\n currentTenantId: \"\",\n signedInTenants: [],\n tenants: [],\n error: \"tenant_missing\",\n } as unknown as Me.ResponsePayload\n }\n\n return {\n id: user._id.toString(),\n email: user.email,\n phone: user.get(\"phone\") as string | undefined,\n name: user.name,\n tenants: (user.tenants || []).map(String),\n currentTenantId: tenantId,\n signedInTenants: sessionUser.signedInTenants || [],\n }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.use(Me.ROUTE, restrictSessionMiddleware)\n api.get(Me.ROUTE, me)\n}\n"],"mappings":";;;;AAGA,IAAa,QAAQ;AAEQ,OAAS,CAAC,CAAC;AAGV,OAAS;CACrC,IAAI,OAAS,CAAC,CAAC,SAAS;CACxB,OAAO,OAAS,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS;CACnC,OAAO,OAAS,CAAC,CAAC,SAAS;CAC3B,MAAM,OAAS,CAAC,CAAC,SAAS;CAC1B,SAAS,MAAQ,OAAS,CAAC,CAAC,CAAC,QAAQ,CAAA,CAAE;CACvC,iBAAiB,OAAS,CAAC,CAAC,SAAS;CACrC,iBAAiB,MAAQ,OAAS,CAAC,CAAC,CAAC,QAAQ,CAAA,CAAE,CAAC,CAAC,SAAS;CAC1D,OAAO,OAAS,CAAC,CAAC,SAAS;AAC7B,CAAC;;;ACRD,IAAM,KAAyE,OAC7E,UACA,QACgC;CAChC,MAAM,cAAc,IAAI,IAAI,SAAS;CAErC,IAAI,CAAC,aAAa,IAAI;EACpB,IAAI,IAAI,OAAO,GAAG;EAClB,OAAO;GACL,IAAI;GACJ,iBAAiB;GACjB,iBAAiB,CAAA;GACjB,SAAS,CAAA;GACT,OAAO;EACT;CACF;CAGA,MAAM,OAAO,OAAM,MADA,OAAO,UAAU,UAAU,GAAG,EAAA,CACzB,SAAS,YAAY,EAAE;CAE/C,IAAI,CAAC,MAAM;EACT,IAAI,IAAI,OAAO,GAAG;EAClB,OAAO;GACL,IAAI;GACJ,iBAAiB;GACjB,iBAAiB,CAAA;GACjB,SAAS,CAAA;GACT,OAAO;EACT;CACF;CAEA,MAAM,WAAW,OAAO,YAAY,oBAAoB,WAAW,YAAY,gBAAgB,KAAK,IAAI;CACxG,IAAI,CAAC,UAAU;EACb,IAAI,IAAI,OAAO,GAAG;EAClB,OAAO;GACL,IAAI;GACJ,iBAAiB;GACjB,iBAAiB,CAAA;GACjB,SAAS,CAAA;GACT,OAAO;EACT;CACF;CAEA,OAAO;EACL,IAAI,KAAK,IAAI,SAAS;EACtB,OAAO,KAAK;EACZ,OAAO,KAAK,IAAI,OAAO;EACvB,MAAM,KAAK;EACX,UAAU,KAAK,WAAW,CAAA,EAAA,CAAI,IAAI,MAAM;EACxC,iBAAiB;EACjB,iBAAiB,YAAY,mBAAmB,CAAA;CAClD;AACF;AAEA,IAAA,mBAAgB,QAA8B;CAC5C,IAAI,IAAI,OAAU,yBAAyB;CAC3C,IAAI,IAAI,OAAU,EAAE;AACtB"}
|