@rpcbase/auth 0.97.0 → 0.98.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.
@@ -1,7 +1,7 @@
1
1
  import crypto from "crypto";
2
2
  import { models } from "@rpcbase/db";
3
3
  import { sendEmail } from "@rpcbase/server";
4
- import { o as object, s as string, b as boolean } from "./schemas-BCQJ62HD.js";
4
+ import { o as object, s as string, b as boolean } from "./schemas-Dn3gHDGz.js";
5
5
  const Route = "/api/rb/auth/resend-otp";
6
6
  const requestSchema = object({
7
7
  email: string().email()
@@ -49,4 +49,4 @@ const handler = (api) => {
49
49
  export {
50
50
  handler as default
51
51
  };
52
- //# sourceMappingURL=handler-DJwOgqtP.js.map
52
+ //# sourceMappingURL=handler-2sZNHSqb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-DJwOgqtP.js","sources":["../src/api/resend-otp/index.ts","../src/api/resend-otp/handler.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().email(),\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})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n\n","import crypto from \"crypto\"\n\nimport { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\nimport { sendEmail } from \"@rpcbase/server\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as ResendOtp from \"./index\"\n\n\nconst resendOtp: ApiHandler<ResendOtp.RequestPayload, ResendOtp.ResponsePayload, AuthSessionUser> = async (\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<ResendOtp.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n\n const parsed = ResendOtp.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { email } = parsed.data\n\n const user = await User.findOne({ email })\n\n if (!user) {\n // TODO(auth): avoid account enumeration (return a generic success response even when the user doesn't exist)\n ctx.res.status(404)\n return { success: false, error: \"user_not_found\" }\n }\n\n // TODO(auth): add server-side throttling / rate limiting for resend-otp\n const emailVerificationCode = crypto.randomInt(0, 1_000_000).toString().padStart(6, \"0\")\n const emailVerificationExpiresAt = new Date(Date.now() + 10 * 60 * 1000)\n\n user.emailVerificationCode = emailVerificationCode\n user.emailVerificationExpiresAt = emailVerificationExpiresAt\n await user.save()\n\n try {\n await sendEmail({\n to: email,\n subject: `Your verification code: ${emailVerificationCode}`,\n html: `\n <p>Your verification code is <strong>${emailVerificationCode}</strong>. It expires in 10 minutes.</p>\n <p>If you didn't request this, you can ignore this message.</p>\n `,\n text: `Your verification code is ${emailVerificationCode}. It expires in 10 minutes. If you didn't request this, you can ignore this message.`,\n })\n } catch (err) {\n console.warn(\"failed to resend otp email\", err)\n }\n\n return { success: true }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(ResendOtp.Route, resendOtp)\n}\n"],"names":["z.object","z.string","z.boolean","ResendOtp.requestSchema","ResendOtp.Route"],"mappings":";;;;AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OAAS;AAAA,EACpC,OAAOC,OAAE,EAAS,MAAA;AACpB,CAAC;AAI6BD,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AACpB,CAAC;ACHD,MAAM,YAA8F,OAClG,SACA,QACuC;AACvC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AAEjD,QAAM,SAASE,cAAwB,UAAU,OAAO;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAEA,QAAM,EAAE,UAAU,OAAO;AAEzB,QAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,OAAO;AAEzC,MAAI,CAAC,MAAM;AAET,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,iBAAA;AAAA,EAClC;AAGA,QAAM,wBAAwB,OAAO,UAAU,GAAG,GAAS,EAAE,WAAW,SAAS,GAAG,GAAG;AACvF,QAAM,6BAA6B,IAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,GAAI;AAEvE,OAAK,wBAAwB;AAC7B,OAAK,6BAA6B;AAClC,QAAM,KAAK,KAAA;AAEX,MAAI;AACF,UAAM,UAAU;AAAA,MACd,IAAI;AAAA,MACJ,SAAS,2BAA2B,qBAAqB;AAAA,MACzD,MAAM;AAAA,+CACmC,qBAAqB;AAAA;AAAA;AAAA,MAG9D,MAAM,6BAA6B,qBAAqB;AAAA,IAAA,CACzD;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,KAAK,8BAA8B,GAAG;AAAA,EAChD;AAEA,SAAO,EAAE,SAAS,KAAA;AACpB;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAiB,SAAS;AACrC;"}
1
+ {"version":3,"file":"handler-2sZNHSqb.js","sources":["../src/api/resend-otp/index.ts","../src/api/resend-otp/handler.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().email(),\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})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n\n","import crypto from \"crypto\"\n\nimport { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\nimport { sendEmail } from \"@rpcbase/server\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as ResendOtp from \"./index\"\n\n\nconst resendOtp: ApiHandler<ResendOtp.RequestPayload, ResendOtp.ResponsePayload, AuthSessionUser> = async (\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<ResendOtp.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n\n const parsed = ResendOtp.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { email } = parsed.data\n\n const user = await User.findOne({ email })\n\n if (!user) {\n // TODO(auth): avoid account enumeration (return a generic success response even when the user doesn't exist)\n ctx.res.status(404)\n return { success: false, error: \"user_not_found\" }\n }\n\n // TODO(auth): add server-side throttling / rate limiting for resend-otp\n const emailVerificationCode = crypto.randomInt(0, 1_000_000).toString().padStart(6, \"0\")\n const emailVerificationExpiresAt = new Date(Date.now() + 10 * 60 * 1000)\n\n user.emailVerificationCode = emailVerificationCode\n user.emailVerificationExpiresAt = emailVerificationExpiresAt\n await user.save()\n\n try {\n await sendEmail({\n to: email,\n subject: `Your verification code: ${emailVerificationCode}`,\n html: `\n <p>Your verification code is <strong>${emailVerificationCode}</strong>. It expires in 10 minutes.</p>\n <p>If you didn't request this, you can ignore this message.</p>\n `,\n text: `Your verification code is ${emailVerificationCode}. It expires in 10 minutes. If you didn't request this, you can ignore this message.`,\n })\n } catch (err) {\n console.warn(\"failed to resend otp email\", err)\n }\n\n return { success: true }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(ResendOtp.Route, resendOtp)\n}\n"],"names":["z.object","z.string","z.boolean","ResendOtp.requestSchema","ResendOtp.Route"],"mappings":";;;;AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OAAS;AAAA,EACpC,OAAOC,OAAE,EAAS,MAAA;AACpB,CAAC;AAI6BD,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AACpB,CAAC;ACHD,MAAM,YAA8F,OAClG,SACA,QACuC;AACvC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AAEjD,QAAM,SAASE,cAAwB,UAAU,OAAO;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAEA,QAAM,EAAE,UAAU,OAAO;AAEzB,QAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,OAAO;AAEzC,MAAI,CAAC,MAAM;AAET,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,iBAAA;AAAA,EAClC;AAGA,QAAM,wBAAwB,OAAO,UAAU,GAAG,GAAS,EAAE,WAAW,SAAS,GAAG,GAAG;AACvF,QAAM,6BAA6B,IAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,GAAI;AAEvE,OAAK,wBAAwB;AAC7B,OAAK,6BAA6B;AAClC,QAAM,KAAK,KAAA;AAEX,MAAI;AACF,UAAM,UAAU;AAAA,MACd,IAAI;AAAA,MACJ,SAAS,2BAA2B,qBAAqB;AAAA,MACzD,MAAM;AAAA,+CACmC,qBAAqB;AAAA;AAAA;AAAA,MAG9D,MAAM,6BAA6B,qBAAqB;AAAA,IAAA,CACzD;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,KAAK,8BAA8B,GAAG;AAAA,EAChD;AAEA,SAAO,EAAE,SAAS,KAAA;AACpB;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAiB,SAAS;AACrC;"}
@@ -1,5 +1,5 @@
1
1
  import { models } from "@rpcbase/db";
2
- import { o as object, b as boolean, s as string } from "./schemas-BCQJ62HD.js";
2
+ import { o as object, b as boolean, s as string } from "./schemas-Dn3gHDGz.js";
3
3
  const Route = "/api/rb/auth/verify-otp";
4
4
  const requestSchema = object({
5
5
  email: string().email(),
@@ -58,4 +58,4 @@ const handler = (api) => {
58
58
  export {
59
59
  handler as default
60
60
  };
61
- //# sourceMappingURL=handler-DyqylA1h.js.map
61
+ //# sourceMappingURL=handler-Bj9EhP0l.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-DyqylA1h.js","sources":["../src/api/verify-otp/index.ts","../src/api/verify-otp/handler.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().email(),\n code: z.string().length(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","import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as VerifyOtp from \"./index\"\n\n\nconst verifyOtp: ApiHandler<VerifyOtp.RequestPayload, VerifyOtp.ResponsePayload, AuthSessionUser> = async (\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<VerifyOtp.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n\n const parsed = VerifyOtp.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { email, code } = parsed.data\n\n const user = await User.findOne({ email }, { emailVerificationCode: 1, emailVerificationExpiresAt: 1, tenants: 1, tenantRoles: 1 })\n\n if (!user) {\n ctx.res.status(404)\n return { success: false, error: \"user_not_found\" }\n }\n\n const storedCode = user.emailVerificationCode\n const expiresAt = user.emailVerificationExpiresAt\n\n const isExpired = expiresAt instanceof Date && expiresAt.getTime() < Date.now()\n if (!storedCode || storedCode !== code || isExpired) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_code\" }\n }\n\n user.emailVerificationCode = undefined\n user.emailVerificationExpiresAt = undefined\n await user.save()\n\n const tenantId = user.tenants?.[0]?.toString?.() || \"00000000\"\n const signedInTenants = (user.tenants || []).map((t: any) => t.toString?.() || String(t)) || [tenantId]\n\n const tenantRolesRaw = (user as unknown as { tenantRoles?: unknown }).tenantRoles\n const tenantRoles = tenantRolesRaw instanceof Map\n ? Object.fromEntries(tenantRolesRaw.entries())\n : tenantRolesRaw && typeof tenantRolesRaw === \"object\"\n ? tenantRolesRaw\n : undefined\n\n if (!ctx.req.session) {\n ctx.res.status(500)\n return { success: false, error: \"session_unavailable\" }\n }\n\n ctx.req.session.user = {\n id: user._id.toString(),\n currentTenantId: tenantId,\n signedInTenants: signedInTenants.length ? signedInTenants : [tenantId],\n isEntryGateAuthorized: true,\n tenantRoles,\n }\n\n return { success: true, userId: user._id.toString(), tenantId }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(VerifyOtp.Route, verifyOtp)\n}\n"],"names":["z.object","z.string","z.boolean","VerifyOtp.requestSchema","VerifyOtp.Route"],"mappings":";;AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OAAS;AAAA,EACpC,OAAOC,OAAE,EAAS,MAAA;AAAA,EAClB,MAAMA,OAAE,EAAS,OAAO,GAAG,uBAAuB;AAAA,EAClD,YAAYC,UAAY,QAAQ,IAAI;AACtC,CAAC;AAI6BF,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AAAA,EAClB,QAAQA,OAAE,EAAS,SAAA;AAAA,EACnB,UAAUA,OAAE,EAAS,SAAA;AACvB,CAAC;ACVD,MAAM,YAA8F,OAClG,SACA,QACuC;AACvC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AAEjD,QAAM,SAASE,cAAwB,UAAU,OAAO;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAEA,QAAM,EAAE,OAAO,KAAA,IAAS,OAAO;AAE/B,QAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,SAAS,EAAE,uBAAuB,GAAG,4BAA4B,GAAG,SAAS,GAAG,aAAa,GAAG;AAElI,MAAI,CAAC,MAAM;AACT,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,iBAAA;AAAA,EAClC;AAEA,QAAM,aAAa,KAAK;AACxB,QAAM,YAAY,KAAK;AAEvB,QAAM,YAAY,qBAAqB,QAAQ,UAAU,QAAA,IAAY,KAAK,IAAA;AAC1E,MAAI,CAAC,cAAc,eAAe,QAAQ,WAAW;AACnD,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,eAAA;AAAA,EAClC;AAEA,OAAK,wBAAwB;AAC7B,OAAK,6BAA6B;AAClC,QAAM,KAAK,KAAA;AAEX,QAAM,WAAW,KAAK,UAAU,CAAC,GAAG,gBAAgB;AACpD,QAAM,mBAAmB,KAAK,WAAW,CAAA,GAAI,IAAI,CAAC,MAAW,EAAE,WAAA,KAAgB,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ;AAEtG,QAAM,iBAAkB,KAA8C;AACtE,QAAM,cAAc,0BAA0B,MAC1C,OAAO,YAAY,eAAe,QAAA,CAAS,IAC3C,kBAAkB,OAAO,mBAAmB,WAC1C,iBACA;AAEN,MAAI,CAAC,IAAI,IAAI,SAAS;AACpB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,MAAI,IAAI,QAAQ,OAAO;AAAA,IACrB,IAAI,KAAK,IAAI,SAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB,gBAAgB,SAAS,kBAAkB,CAAC,QAAQ;AAAA,IACrE,uBAAuB;AAAA,IACvB;AAAA,EAAA;AAGF,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAA,GAAY,SAAA;AACvD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAiB,SAAS;AACrC;"}
1
+ {"version":3,"file":"handler-Bj9EhP0l.js","sources":["../src/api/verify-otp/index.ts","../src/api/verify-otp/handler.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().email(),\n code: z.string().length(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","import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as VerifyOtp from \"./index\"\n\n\nconst verifyOtp: ApiHandler<VerifyOtp.RequestPayload, VerifyOtp.ResponsePayload, AuthSessionUser> = async (\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<VerifyOtp.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n\n const parsed = VerifyOtp.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { email, code } = parsed.data\n\n const user = await User.findOne({ email }, { emailVerificationCode: 1, emailVerificationExpiresAt: 1, tenants: 1, tenantRoles: 1 })\n\n if (!user) {\n ctx.res.status(404)\n return { success: false, error: \"user_not_found\" }\n }\n\n const storedCode = user.emailVerificationCode\n const expiresAt = user.emailVerificationExpiresAt\n\n const isExpired = expiresAt instanceof Date && expiresAt.getTime() < Date.now()\n if (!storedCode || storedCode !== code || isExpired) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_code\" }\n }\n\n user.emailVerificationCode = undefined\n user.emailVerificationExpiresAt = undefined\n await user.save()\n\n const tenantId = user.tenants?.[0]?.toString?.() || \"00000000\"\n const signedInTenants = (user.tenants || []).map((t: any) => t.toString?.() || String(t)) || [tenantId]\n\n const tenantRolesRaw = (user as unknown as { tenantRoles?: unknown }).tenantRoles\n const tenantRoles = tenantRolesRaw instanceof Map\n ? Object.fromEntries(tenantRolesRaw.entries())\n : tenantRolesRaw && typeof tenantRolesRaw === \"object\"\n ? tenantRolesRaw\n : undefined\n\n if (!ctx.req.session) {\n ctx.res.status(500)\n return { success: false, error: \"session_unavailable\" }\n }\n\n ctx.req.session.user = {\n id: user._id.toString(),\n currentTenantId: tenantId,\n signedInTenants: signedInTenants.length ? signedInTenants : [tenantId],\n isEntryGateAuthorized: true,\n tenantRoles,\n }\n\n return { success: true, userId: user._id.toString(), tenantId }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(VerifyOtp.Route, verifyOtp)\n}\n"],"names":["z.object","z.string","z.boolean","VerifyOtp.requestSchema","VerifyOtp.Route"],"mappings":";;AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OAAS;AAAA,EACpC,OAAOC,OAAE,EAAS,MAAA;AAAA,EAClB,MAAMA,OAAE,EAAS,OAAO,GAAG,uBAAuB;AAAA,EAClD,YAAYC,UAAY,QAAQ,IAAI;AACtC,CAAC;AAI6BF,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AAAA,EAClB,QAAQA,OAAE,EAAS,SAAA;AAAA,EACnB,UAAUA,OAAE,EAAS,SAAA;AACvB,CAAC;ACVD,MAAM,YAA8F,OAClG,SACA,QACuC;AACvC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AAEjD,QAAM,SAASE,cAAwB,UAAU,OAAO;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAEA,QAAM,EAAE,OAAO,KAAA,IAAS,OAAO;AAE/B,QAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,SAAS,EAAE,uBAAuB,GAAG,4BAA4B,GAAG,SAAS,GAAG,aAAa,GAAG;AAElI,MAAI,CAAC,MAAM;AACT,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,iBAAA;AAAA,EAClC;AAEA,QAAM,aAAa,KAAK;AACxB,QAAM,YAAY,KAAK;AAEvB,QAAM,YAAY,qBAAqB,QAAQ,UAAU,QAAA,IAAY,KAAK,IAAA;AAC1E,MAAI,CAAC,cAAc,eAAe,QAAQ,WAAW;AACnD,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,eAAA;AAAA,EAClC;AAEA,OAAK,wBAAwB;AAC7B,OAAK,6BAA6B;AAClC,QAAM,KAAK,KAAA;AAEX,QAAM,WAAW,KAAK,UAAU,CAAC,GAAG,gBAAgB;AACpD,QAAM,mBAAmB,KAAK,WAAW,CAAA,GAAI,IAAI,CAAC,MAAW,EAAE,WAAA,KAAgB,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ;AAEtG,QAAM,iBAAkB,KAA8C;AACtE,QAAM,cAAc,0BAA0B,MAC1C,OAAO,YAAY,eAAe,QAAA,CAAS,IAC3C,kBAAkB,OAAO,mBAAmB,WAC1C,iBACA;AAEN,MAAI,CAAC,IAAI,IAAI,SAAS;AACpB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,MAAI,IAAI,QAAQ,OAAO;AAAA,IACrB,IAAI,KAAK,IAAI,SAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB,gBAAgB,SAAS,kBAAkB,CAAC,QAAQ;AAAA,IACrE,uBAAuB;AAAA,IACvB;AAAA,EAAA;AAGF,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAA,GAAY,SAAA;AACvD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAiB,SAAS;AACrC;"}
@@ -1,4 +1,4 @@
1
- import { o as object, b as boolean } from "./schemas-BCQJ62HD.js";
1
+ import { o as object, b as boolean } from "./schemas-Dn3gHDGz.js";
2
2
  const Route = "/api/rb/auth/sign-out";
3
3
  object({});
4
4
  object({
@@ -19,4 +19,4 @@ const handler = (api) => {
19
19
  export {
20
20
  handler as default
21
21
  };
22
- //# sourceMappingURL=handler-Zcu5rM1_.js.map
22
+ //# sourceMappingURL=handler-D9OypiUL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-Zcu5rM1_.js","sources":["../src/api/sign-out/index.ts","../src/api/sign-out/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const Route = \"/api/rb/auth/sign-out\"\n\n// No request payload needed for signout\nexport const requestSchema = z.object({})\n\nexport type RequestPayload = z.infer<typeof requestSchema>;\n\nexport const responseSchema = z.object({\n success: z.boolean()\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>;\n","import { Api, Ctx } from \"@rpcbase/api\"\n\nimport * as SignOut from \"./index\"\n\n\nconst handleSignOut = async(_: SignOut.RequestPayload, ctx: Ctx): Promise<SignOut.ResponsePayload> => {\n // Destroy the session\n if (!ctx.req.session) {\n return { success: true }\n }\n\n await new Promise<void>((resolve) => ctx.req.session!.destroy(() => resolve()))\n\n return {\n success: true\n }\n}\n\nexport default (api: Api) => {\n api.post(SignOut.Route, handleSignOut)\n}\n"],"names":["z.object","z.boolean","SignOut.Route"],"mappings":";AAGO,MAAM,QAAQ;AAGQA,OAAS,CAAA,CAAE;AAIVA,OAAS;AAAA,EACrC,SAASC,QAAE;AACb,CAAC;ACPD,MAAM,gBAAgB,OAAM,GAA2B,QAA+C;AAEpG,MAAI,CAAC,IAAI,IAAI,SAAS;AACpB,WAAO,EAAE,SAAS,KAAA;AAAA,EACpB;AAEA,QAAM,IAAI,QAAc,CAAC,YAAY,IAAI,IAAI,QAAS,QAAQ,MAAM,QAAA,CAAS,CAAC;AAE9E,SAAO;AAAA,IACL,SAAS;AAAA,EAAA;AAEb;AAEA,MAAA,UAAe,CAAC,QAAa;AAC3B,MAAI,KAAKC,OAAe,aAAa;AACvC;"}
1
+ {"version":3,"file":"handler-D9OypiUL.js","sources":["../src/api/sign-out/index.ts","../src/api/sign-out/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const Route = \"/api/rb/auth/sign-out\"\n\n// No request payload needed for signout\nexport const requestSchema = z.object({})\n\nexport type RequestPayload = z.infer<typeof requestSchema>;\n\nexport const responseSchema = z.object({\n success: z.boolean()\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>;\n","import { Api, Ctx } from \"@rpcbase/api\"\n\nimport * as SignOut from \"./index\"\n\n\nconst handleSignOut = async(_: SignOut.RequestPayload, ctx: Ctx): Promise<SignOut.ResponsePayload> => {\n // Destroy the session\n if (!ctx.req.session) {\n return { success: true }\n }\n\n await new Promise<void>((resolve) => ctx.req.session!.destroy(() => resolve()))\n\n return {\n success: true\n }\n}\n\nexport default (api: Api) => {\n api.post(SignOut.Route, handleSignOut)\n}\n"],"names":["z.object","z.boolean","SignOut.Route"],"mappings":";AAGO,MAAM,QAAQ;AAGQA,OAAS,CAAA,CAAE;AAIVA,OAAS;AAAA,EACrC,SAASC,QAAE;AACb,CAAC;ACPD,MAAM,gBAAgB,OAAM,GAA2B,QAA+C;AAEpG,MAAI,CAAC,IAAI,IAAI,SAAS;AACpB,WAAO,EAAE,SAAS,KAAA;AAAA,EACpB;AAEA,QAAM,IAAI,QAAc,CAAC,YAAY,IAAI,IAAI,QAAS,QAAQ,MAAM,QAAA,CAAS,CAAC;AAE9E,SAAO;AAAA,IACL,SAAS;AAAA,EAAA;AAEb;AAEA,MAAA,UAAe,CAAC,QAAa;AAC3B,MAAI,KAAKC,OAAe,aAAa;AACvC;"}
@@ -1,6 +1,6 @@
1
1
  import { models } from "@rpcbase/db";
2
2
  import { verifyPasswordFromStorage } from "@rpcbase/server";
3
- import { R as Route, r as requestSchema } from "./index-BCacnRCE.js";
3
+ import { R as Route, r as requestSchema } from "./index-BfZTJlGT.js";
4
4
  const signIn = async (payload, ctx) => {
5
5
  const User = await models.getGlobal("RBUser", ctx);
6
6
  const parsed = requestSchema.safeParse(payload);
@@ -46,4 +46,4 @@ const handler = (api) => {
46
46
  export {
47
47
  handler as default
48
48
  };
49
- //# sourceMappingURL=handler-CUtZEFQm.js.map
49
+ //# sourceMappingURL=handler-DKNeylFQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-CUtZEFQm.js","sources":["../src/api/sign-in/handler.ts"],"sourcesContent":["import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\nimport { verifyPasswordFromStorage } from \"@rpcbase/server\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as SignIn from \"./index\"\n\n\nconst signIn: ApiHandler<SignIn.RequestPayload, SignIn.ResponsePayload, AuthSessionUser> = async(\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<SignIn.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n\n const parsed = SignIn.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { email, password } = parsed.data\n\n const user = await User.findOne({ email }, { password: 1, tenants: 1, tenantRoles: 1 })\n\n if (!user?.password) {\n ctx.res.status(401)\n return { success: false, error: \"invalid_credentials\" }\n }\n\n const stored = String(user.password)\n const passwordMatches = await verifyPasswordFromStorage(password, stored)\n\n if (!passwordMatches) {\n if (!stored.startsWith(\"$scrypt$\")) {\n console.warn(\"auth::sign-in invalid stored password format\", user._id.toString())\n }\n ctx.res.status(401)\n return { success: false, error: \"invalid_credentials\" }\n }\n\n const tenantId = user.tenants?.[0]?.toString?.() || \"00000000\"\n const signedInTenants = (user.tenants || []).map((t: any) => t.toString?.() || String(t)) || [tenantId]\n\n const tenantRolesRaw = (user as unknown as { tenantRoles?: unknown }).tenantRoles\n const tenantRoles = tenantRolesRaw instanceof Map\n ? Object.fromEntries(tenantRolesRaw.entries())\n : tenantRolesRaw && typeof tenantRolesRaw === \"object\"\n ? tenantRolesRaw\n : undefined\n\n if (!ctx.req.session) {\n ctx.res.status(500)\n return { success: false, error: \"session_unavailable\" }\n }\n\n ctx.req.session.user = {\n id: user._id.toString(),\n currentTenantId: tenantId,\n signedInTenants: signedInTenants.length ? signedInTenants : [tenantId],\n isEntryGateAuthorized: true,\n tenantRoles,\n }\n\n return { success: true, userId: user._id.toString(), tenantId }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(SignIn.Route, signIn)\n}\n"],"names":["SignIn.requestSchema","SignIn.Route"],"mappings":";;;AASA,MAAM,SAAqF,OACzF,SACA,QACoC;AACpC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AAEjD,QAAM,SAASA,cAAqB,UAAU,OAAO;AAErD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAEA,QAAM,EAAE,OAAO,SAAA,IAAa,OAAO;AAEnC,QAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,MAAA,GAAS,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG;AAEtF,MAAI,CAAC,MAAM,UAAU;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,QAAM,SAAS,OAAO,KAAK,QAAQ;AACnC,QAAM,kBAAkB,MAAM,0BAA0B,UAAU,MAAM;AAExE,MAAI,CAAC,iBAAiB;AACpB,QAAI,CAAC,OAAO,WAAW,UAAU,GAAG;AAClC,cAAQ,KAAK,gDAAgD,KAAK,IAAI,UAAU;AAAA,IAClF;AACA,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,QAAM,WAAW,KAAK,UAAU,CAAC,GAAG,gBAAgB;AACpD,QAAM,mBAAmB,KAAK,WAAW,CAAA,GAAI,IAAI,CAAC,MAAW,EAAE,WAAA,KAAgB,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ;AAEtG,QAAM,iBAAkB,KAA8C;AACtE,QAAM,cAAc,0BAA0B,MAC1C,OAAO,YAAY,eAAe,QAAA,CAAS,IAC3C,kBAAkB,OAAO,mBAAmB,WAC1C,iBACA;AAEN,MAAI,CAAC,IAAI,IAAI,SAAS;AACpB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,MAAI,IAAI,QAAQ,OAAO;AAAA,IACrB,IAAI,KAAK,IAAI,SAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB,gBAAgB,SAAS,kBAAkB,CAAC,QAAQ;AAAA,IACrE,uBAAuB;AAAA,IACvB;AAAA,EAAA;AAGF,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAA,GAAY,SAAA;AACvD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAc,MAAM;AAC/B;"}
1
+ {"version":3,"file":"handler-DKNeylFQ.js","sources":["../src/api/sign-in/handler.ts"],"sourcesContent":["import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\nimport { verifyPasswordFromStorage } from \"@rpcbase/server\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as SignIn from \"./index\"\n\n\nconst signIn: ApiHandler<SignIn.RequestPayload, SignIn.ResponsePayload, AuthSessionUser> = async(\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<SignIn.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n\n const parsed = SignIn.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { email, password } = parsed.data\n\n const user = await User.findOne({ email }, { password: 1, tenants: 1, tenantRoles: 1 })\n\n if (!user?.password) {\n ctx.res.status(401)\n return { success: false, error: \"invalid_credentials\" }\n }\n\n const stored = String(user.password)\n const passwordMatches = await verifyPasswordFromStorage(password, stored)\n\n if (!passwordMatches) {\n if (!stored.startsWith(\"$scrypt$\")) {\n console.warn(\"auth::sign-in invalid stored password format\", user._id.toString())\n }\n ctx.res.status(401)\n return { success: false, error: \"invalid_credentials\" }\n }\n\n const tenantId = user.tenants?.[0]?.toString?.() || \"00000000\"\n const signedInTenants = (user.tenants || []).map((t: any) => t.toString?.() || String(t)) || [tenantId]\n\n const tenantRolesRaw = (user as unknown as { tenantRoles?: unknown }).tenantRoles\n const tenantRoles = tenantRolesRaw instanceof Map\n ? Object.fromEntries(tenantRolesRaw.entries())\n : tenantRolesRaw && typeof tenantRolesRaw === \"object\"\n ? tenantRolesRaw\n : undefined\n\n if (!ctx.req.session) {\n ctx.res.status(500)\n return { success: false, error: \"session_unavailable\" }\n }\n\n ctx.req.session.user = {\n id: user._id.toString(),\n currentTenantId: tenantId,\n signedInTenants: signedInTenants.length ? signedInTenants : [tenantId],\n isEntryGateAuthorized: true,\n tenantRoles,\n }\n\n return { success: true, userId: user._id.toString(), tenantId }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(SignIn.Route, signIn)\n}\n"],"names":["SignIn.requestSchema","SignIn.Route"],"mappings":";;;AASA,MAAM,SAAqF,OACzF,SACA,QACoC;AACpC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AAEjD,QAAM,SAASA,cAAqB,UAAU,OAAO;AAErD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAEA,QAAM,EAAE,OAAO,SAAA,IAAa,OAAO;AAEnC,QAAM,OAAO,MAAM,KAAK,QAAQ,EAAE,MAAA,GAAS,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG;AAEtF,MAAI,CAAC,MAAM,UAAU;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,QAAM,SAAS,OAAO,KAAK,QAAQ;AACnC,QAAM,kBAAkB,MAAM,0BAA0B,UAAU,MAAM;AAExE,MAAI,CAAC,iBAAiB;AACpB,QAAI,CAAC,OAAO,WAAW,UAAU,GAAG;AAClC,cAAQ,KAAK,gDAAgD,KAAK,IAAI,UAAU;AAAA,IAClF;AACA,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,QAAM,WAAW,KAAK,UAAU,CAAC,GAAG,gBAAgB;AACpD,QAAM,mBAAmB,KAAK,WAAW,CAAA,GAAI,IAAI,CAAC,MAAW,EAAE,WAAA,KAAgB,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ;AAEtG,QAAM,iBAAkB,KAA8C;AACtE,QAAM,cAAc,0BAA0B,MAC1C,OAAO,YAAY,eAAe,QAAA,CAAS,IAC3C,kBAAkB,OAAO,mBAAmB,WAC1C,iBACA;AAEN,MAAI,CAAC,IAAI,IAAI,SAAS;AACpB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,sBAAA;AAAA,EAClC;AAEA,MAAI,IAAI,QAAQ,OAAO;AAAA,IACrB,IAAI,KAAK,IAAI,SAAA;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB,gBAAgB,SAAS,kBAAkB,CAAC,QAAQ;AAAA,IACrE,uBAAuB;AAAA,IACvB;AAAA,EAAA;AAGF,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAA,GAAY,SAAA;AACvD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAc,MAAM;AAC/B;"}
@@ -1,6 +1,6 @@
1
1
  import { models } from "@rpcbase/db";
2
2
  import { r as restrictSessionMiddleware } from "./middleware-BiMXO6Dq.js";
3
- import { o as object, s as string, a as array } from "./schemas-BCQJ62HD.js";
3
+ import { o as object, s as string, a as array } from "./schemas-Dn3gHDGz.js";
4
4
  const Route = "/api/rb/auth/me";
5
5
  object({});
6
6
  object({
@@ -55,4 +55,4 @@ const handler = (api) => {
55
55
  export {
56
56
  handler as default
57
57
  };
58
- //# sourceMappingURL=handler-DvUXoOYN.js.map
58
+ //# sourceMappingURL=handler-DoVmy5fg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-DvUXoOYN.js","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 = sessionUser.currentTenantId || user.tenants?.[0]?.toString?.() || \"00000000\"\n\n return {\n id: user._id.toString(),\n email: user.email,\n phone: (user as any).phone,\n name: user.name,\n tenants: (user.tenants || []).map((t: any) => t.toString?.() || String(t)),\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"],"names":["z.object","z.string","z.array","Me.Route"],"mappings":";;;AAGO,MAAM,QAAQ;AAEQA,OAAS,CAAA,CAAE;AAGVA,OAAS;AAAA,EACrC,IAAIC,OAAE,EAAS,SAAA;AAAA,EACf,OAAOA,OAAE,EAAS,MAAA,EAAQ,SAAA;AAAA,EAC1B,OAAOA,OAAE,EAAS,SAAA;AAAA,EAClB,MAAMA,OAAE,EAAS,SAAA;AAAA,EACjB,SAASC,MAAQD,QAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACvC,iBAAiBA,OAAE,EAAS,SAAA;AAAA,EAC5B,iBAAiBC,MAAQD,OAAE,CAAQ,EAAE,QAAQ,CAAA,CAAE,EAAE,SAAA;AAAA,EACjD,OAAOA,OAAE,EAAS,SAAA;AACpB,CAAC;ACRD,MAAM,KAAyE,OAC7E,UACA,QACgC;AAChC,QAAM,cAAc,IAAI,IAAI,SAAS;AAErC,MAAI,CAAC,aAAa,IAAI;AACpB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,iBAAiB;AAAA,MACjB,iBAAiB,CAAA;AAAA,MACjB,SAAS,CAAA;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AAEA,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AACjD,QAAM,OAAO,MAAM,KAAK,SAAS,YAAY,EAAE;AAE/C,MAAI,CAAC,MAAM;AACT,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,iBAAiB;AAAA,MACjB,iBAAiB,CAAA;AAAA,MACjB,SAAS,CAAA;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AAEA,QAAM,WAAW,YAAY,mBAAmB,KAAK,UAAU,CAAC,GAAG,gBAAgB;AAEnF,SAAO;AAAA,IACL,IAAI,KAAK,IAAI,SAAA;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,OAAQ,KAAa;AAAA,IACrB,MAAM,KAAK;AAAA,IACX,UAAU,KAAK,WAAW,CAAA,GAAI,IAAI,CAAC,MAAW,EAAE,WAAA,KAAgB,OAAO,CAAC,CAAC;AAAA,IACzE,iBAAiB;AAAA,IACjB,iBAAiB,YAAY,mBAAmB,CAAA;AAAA,EAAC;AAErD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,IAAIE,OAAU,yBAAyB;AAC3C,MAAI,IAAIA,OAAU,EAAE;AACtB;"}
1
+ {"version":3,"file":"handler-DoVmy5fg.js","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 = sessionUser.currentTenantId || user.tenants?.[0]?.toString?.() || \"00000000\"\n\n return {\n id: user._id.toString(),\n email: user.email,\n phone: (user as any).phone,\n name: user.name,\n tenants: (user.tenants || []).map((t: any) => t.toString?.() || String(t)),\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"],"names":["z.object","z.string","z.array","Me.Route"],"mappings":";;;AAGO,MAAM,QAAQ;AAEQA,OAAS,CAAA,CAAE;AAGVA,OAAS;AAAA,EACrC,IAAIC,OAAE,EAAS,SAAA;AAAA,EACf,OAAOA,OAAE,EAAS,MAAA,EAAQ,SAAA;AAAA,EAC1B,OAAOA,OAAE,EAAS,SAAA;AAAA,EAClB,MAAMA,OAAE,EAAS,SAAA;AAAA,EACjB,SAASC,MAAQD,QAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,EACvC,iBAAiBA,OAAE,EAAS,SAAA;AAAA,EAC5B,iBAAiBC,MAAQD,OAAE,CAAQ,EAAE,QAAQ,CAAA,CAAE,EAAE,SAAA;AAAA,EACjD,OAAOA,OAAE,EAAS,SAAA;AACpB,CAAC;ACRD,MAAM,KAAyE,OAC7E,UACA,QACgC;AAChC,QAAM,cAAc,IAAI,IAAI,SAAS;AAErC,MAAI,CAAC,aAAa,IAAI;AACpB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,iBAAiB;AAAA,MACjB,iBAAiB,CAAA;AAAA,MACjB,SAAS,CAAA;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AAEA,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AACjD,QAAM,OAAO,MAAM,KAAK,SAAS,YAAY,EAAE;AAE/C,MAAI,CAAC,MAAM;AACT,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,iBAAiB;AAAA,MACjB,iBAAiB,CAAA;AAAA,MACjB,SAAS,CAAA;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AAEA,QAAM,WAAW,YAAY,mBAAmB,KAAK,UAAU,CAAC,GAAG,gBAAgB;AAEnF,SAAO;AAAA,IACL,IAAI,KAAK,IAAI,SAAA;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,OAAQ,KAAa;AAAA,IACrB,MAAM,KAAK;AAAA,IACX,UAAU,KAAK,WAAW,CAAA,GAAI,IAAI,CAAC,MAAW,EAAE,WAAA,KAAgB,OAAO,CAAC,CAAC;AAAA,IACzE,iBAAiB;AAAA,IACjB,iBAAiB,YAAY,mBAAmB,CAAA;AAAA,EAAC;AAErD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,IAAIE,OAAU,yBAAyB;AAC3C,MAAI,IAAIA,OAAU,EAAE;AACtB;"}
@@ -1,7 +1,7 @@
1
1
  import crypto from "crypto";
2
2
  import { models } from "@rpcbase/db";
3
3
  import { hashPasswordForStorage, sendEmail } from "@rpcbase/server";
4
- import { R as Route, r as requestSchema } from "./index-DdTRbuS-.js";
4
+ import { R as Route, r as requestSchema } from "./index-DQy-Vgjt.js";
5
5
  const signUp = async (payload, ctx) => {
6
6
  const User = await models.getGlobal("RBUser", ctx);
7
7
  const Tenant = await models.getGlobal("RBTenant", ctx);
@@ -63,4 +63,4 @@ const handler = (api) => {
63
63
  export {
64
64
  handler as default
65
65
  };
66
- //# sourceMappingURL=handler-sUCM6Ee3.js.map
66
+ //# sourceMappingURL=handler-j0RdiReb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-sUCM6Ee3.js","sources":["../src/api/sign-up/handler.ts"],"sourcesContent":["import crypto from \"crypto\"\n\nimport { Api, Ctx, ApiHandler } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\nimport { hashPasswordForStorage, sendEmail } from \"@rpcbase/server\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as SignUp from \"./index\"\n\n\nconst signUp: ApiHandler<SignUp.RequestPayload, SignUp.ResponsePayload, AuthSessionUser> = async(\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<SignUp.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n const Tenant = await models.getGlobal(\"RBTenant\", ctx)\n\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { email, password, rememberMe: _rememberMe } = parsed.data\n\n const existingUser = await User.findOne({ email })\n\n if (existingUser) {\n console.log(\"user with email already exists\", email)\n // For security, we don't want to reveal if an email is registered.\n // But for this implementation, we'll make it simple.\n ctx.res.status(409)\n return { success: false, error: \"user_exists\" }\n }\n\n const hashedPassword = await hashPasswordForStorage(password)\n\n const tenantId = crypto.randomUUID()\n\n const emailVerificationCode = crypto.randomInt(0, 1_000_000).toString().padStart(6, \"0\")\n const emailVerificationExpiresAt = new Date(Date.now() + 10 * 60 * 1000)\n\n const user = new User({\n email,\n password: hashedPassword,\n tenants: [tenantId],\n tenantRoles: {\n [tenantId]: [\"owner\"],\n },\n emailVerificationCode,\n emailVerificationExpiresAt,\n })\n await user.save()\n\n try {\n await sendEmail({\n to: email,\n subject: `Verify your email: ${emailVerificationCode}`,\n html: `\n <p>Welcome to rpcbase!</p>\n <p>Your verification code is <strong>${emailVerificationCode}</strong>. It expires in 10 minutes.</p>\n <p>If you didn't request this, you can ignore this message.</p>\n `,\n text: `Welcome to rpcbase! Your verification code is ${emailVerificationCode}. It expires in 10 minutes. If you didn't request this, you can ignore this message.`,\n })\n } catch (err) {\n console.warn(\"failed to send sign-up email\", err)\n }\n\n try {\n await Tenant.create({\n tenantId,\n name: email,\n })\n } catch (err) {\n // best-effort tenant creation; log and continue\n console.warn(\"failed to create tenant for user\", err)\n }\n\n console.log(\"created new user\", user._id.toString())\n\n return { success: true, userId: user._id.toString(), tenantId }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(SignUp.Route, signUp)\n}\n"],"names":["SignUp.requestSchema","SignUp.Route"],"mappings":";;;;AAWA,MAAM,SAAqF,OACzF,SACA,QACoC;AACpC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AACjD,QAAM,SAAS,MAAM,OAAO,UAAU,YAAY,GAAG;AAErD,QAAM,SAASA,cAAqB,UAAU,OAAO;AAErD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAGA,QAAM,EAAE,OAAO,UAAU,YAAY,YAAA,IAAgB,OAAO;AAE5D,QAAM,eAAe,MAAM,KAAK,QAAQ,EAAE,OAAO;AAEjD,MAAI,cAAc;AAChB,YAAQ,IAAI,kCAAkC,KAAK;AAGnD,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,cAAA;AAAA,EAClC;AAEA,QAAM,iBAAiB,MAAM,uBAAuB,QAAQ;AAE5D,QAAM,WAAW,OAAO,WAAA;AAExB,QAAM,wBAAwB,OAAO,UAAU,GAAG,GAAS,EAAE,WAAW,SAAS,GAAG,GAAG;AACvF,QAAM,6BAA6B,IAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,GAAI;AAEvE,QAAM,OAAO,IAAI,KAAK;AAAA,IACpB;AAAA,IACA,UAAU;AAAA,IACV,SAAS,CAAC,QAAQ;AAAA,IAClB,aAAa;AAAA,MACX,CAAC,QAAQ,GAAG,CAAC,OAAO;AAAA,IAAA;AAAA,IAEtB;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,KAAK,KAAA;AAEX,MAAI;AACF,UAAM,UAAU;AAAA,MACd,IAAI;AAAA,MACJ,SAAS,sBAAsB,qBAAqB;AAAA,MACpD,MAAM;AAAA;AAAA,+CAEmC,qBAAqB;AAAA;AAAA;AAAA,MAG9D,MAAM,iDAAiD,qBAAqB;AAAA,IAAA,CAC7E;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,KAAK,gCAAgC,GAAG;AAAA,EAClD;AAEA,MAAI;AACF,UAAM,OAAO,OAAO;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,IAAA,CACP;AAAA,EACH,SAAS,KAAK;AAEZ,YAAQ,KAAK,oCAAoC,GAAG;AAAA,EACtD;AAEA,UAAQ,IAAI,oBAAoB,KAAK,IAAI,UAAU;AAEnD,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAA,GAAY,SAAA;AACvD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAc,MAAM;AAC/B;"}
1
+ {"version":3,"file":"handler-j0RdiReb.js","sources":["../src/api/sign-up/handler.ts"],"sourcesContent":["import crypto from \"crypto\"\n\nimport { Api, Ctx, ApiHandler } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\nimport { hashPasswordForStorage, sendEmail } from \"@rpcbase/server\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as SignUp from \"./index\"\n\n\nconst signUp: ApiHandler<SignUp.RequestPayload, SignUp.ResponsePayload, AuthSessionUser> = async(\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<SignUp.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n const Tenant = await models.getGlobal(\"RBTenant\", ctx)\n\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { email, password, rememberMe: _rememberMe } = parsed.data\n\n const existingUser = await User.findOne({ email })\n\n if (existingUser) {\n console.log(\"user with email already exists\", email)\n // For security, we don't want to reveal if an email is registered.\n // But for this implementation, we'll make it simple.\n ctx.res.status(409)\n return { success: false, error: \"user_exists\" }\n }\n\n const hashedPassword = await hashPasswordForStorage(password)\n\n const tenantId = crypto.randomUUID()\n\n const emailVerificationCode = crypto.randomInt(0, 1_000_000).toString().padStart(6, \"0\")\n const emailVerificationExpiresAt = new Date(Date.now() + 10 * 60 * 1000)\n\n const user = new User({\n email,\n password: hashedPassword,\n tenants: [tenantId],\n tenantRoles: {\n [tenantId]: [\"owner\"],\n },\n emailVerificationCode,\n emailVerificationExpiresAt,\n })\n await user.save()\n\n try {\n await sendEmail({\n to: email,\n subject: `Verify your email: ${emailVerificationCode}`,\n html: `\n <p>Welcome to rpcbase!</p>\n <p>Your verification code is <strong>${emailVerificationCode}</strong>. It expires in 10 minutes.</p>\n <p>If you didn't request this, you can ignore this message.</p>\n `,\n text: `Welcome to rpcbase! Your verification code is ${emailVerificationCode}. It expires in 10 minutes. If you didn't request this, you can ignore this message.`,\n })\n } catch (err) {\n console.warn(\"failed to send sign-up email\", err)\n }\n\n try {\n await Tenant.create({\n tenantId,\n name: email,\n })\n } catch (err) {\n // best-effort tenant creation; log and continue\n console.warn(\"failed to create tenant for user\", err)\n }\n\n console.log(\"created new user\", user._id.toString())\n\n return { success: true, userId: user._id.toString(), tenantId }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(SignUp.Route, signUp)\n}\n"],"names":["SignUp.requestSchema","SignUp.Route"],"mappings":";;;;AAWA,MAAM,SAAqF,OACzF,SACA,QACoC;AACpC,QAAM,OAAO,MAAM,OAAO,UAAU,UAAU,GAAG;AACjD,QAAM,SAAS,MAAM,OAAO,UAAU,YAAY,GAAG;AAErD,QAAM,SAASA,cAAqB,UAAU,OAAO;AAErD,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,kBAAA;AAAA,EAClC;AAGA,QAAM,EAAE,OAAO,UAAU,YAAY,YAAA,IAAgB,OAAO;AAE5D,QAAM,eAAe,MAAM,KAAK,QAAQ,EAAE,OAAO;AAEjD,MAAI,cAAc;AAChB,YAAQ,IAAI,kCAAkC,KAAK;AAGnD,QAAI,IAAI,OAAO,GAAG;AAClB,WAAO,EAAE,SAAS,OAAO,OAAO,cAAA;AAAA,EAClC;AAEA,QAAM,iBAAiB,MAAM,uBAAuB,QAAQ;AAE5D,QAAM,WAAW,OAAO,WAAA;AAExB,QAAM,wBAAwB,OAAO,UAAU,GAAG,GAAS,EAAE,WAAW,SAAS,GAAG,GAAG;AACvF,QAAM,6BAA6B,IAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,GAAI;AAEvE,QAAM,OAAO,IAAI,KAAK;AAAA,IACpB;AAAA,IACA,UAAU;AAAA,IACV,SAAS,CAAC,QAAQ;AAAA,IAClB,aAAa;AAAA,MACX,CAAC,QAAQ,GAAG,CAAC,OAAO;AAAA,IAAA;AAAA,IAEtB;AAAA,IACA;AAAA,EAAA,CACD;AACD,QAAM,KAAK,KAAA;AAEX,MAAI;AACF,UAAM,UAAU;AAAA,MACd,IAAI;AAAA,MACJ,SAAS,sBAAsB,qBAAqB;AAAA,MACpD,MAAM;AAAA;AAAA,+CAEmC,qBAAqB;AAAA;AAAA;AAAA,MAG9D,MAAM,iDAAiD,qBAAqB;AAAA,IAAA,CAC7E;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ,KAAK,gCAAgC,GAAG;AAAA,EAClD;AAEA,MAAI;AACF,UAAM,OAAO,OAAO;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,IAAA,CACP;AAAA,EACH,SAAS,KAAK;AAEZ,YAAQ,KAAK,oCAAoC,GAAG;AAAA,EACtD;AAEA,UAAQ,IAAI,oBAAoB,KAAK,IAAI,UAAU;AAEnD,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAA,GAAY,SAAA;AACvD;AAEA,MAAA,UAAe,CAAC,QAA8B;AAC5C,MAAI,KAAKC,OAAc,MAAM;AAC/B;"}
@@ -1,4 +1,4 @@
1
- import { o as object, b as boolean, s as string } from "./schemas-BCQJ62HD.js";
1
+ import { o as object, b as boolean, s as string } from "./schemas-Dn3gHDGz.js";
2
2
  const Route = "/api/rb/auth/sign-in";
3
3
  const requestSchema = object({
4
4
  email: string().nonempty("Email is required").email("Please enter a valid email address"),
@@ -15,4 +15,4 @@ export {
15
15
  Route as R,
16
16
  requestSchema as r
17
17
  };
18
- //# sourceMappingURL=index-BCacnRCE.js.map
18
+ //# sourceMappingURL=index-BfZTJlGT.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BCacnRCE.js","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 .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"],"names":["z.object","z.string","z.boolean"],"mappings":";AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OAAS;AAAA,EACpC,OAAOC,OACJ,EACA,SAAS,mBAAmB,EAC5B,MAAM,oCAAoC;AAAA,EAC7C,UAAUA,OAAE,EAAS,IAAI,GAAG,EAAE,SAAS,wBAAwB;AAAA,EAC/D,YAAYC,UAAY,QAAQ,IAAI;AACtC,CAAC;AAI6BF,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AAAA,EAClB,QAAQA,OAAE,EAAS,SAAA;AAAA,EACnB,UAAUA,OAAE,EAAS,SAAA;AACvB,CAAC;"}
1
+ {"version":3,"file":"index-BfZTJlGT.js","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 .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"],"names":["z.object","z.string","z.boolean"],"mappings":";AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OAAS;AAAA,EACpC,OAAOC,OACJ,EACA,SAAS,mBAAmB,EAC5B,MAAM,oCAAoC;AAAA,EAC7C,UAAUA,OAAE,EAAS,IAAI,GAAG,EAAE,SAAS,wBAAwB;AAAA,EAC/D,YAAYC,UAAY,QAAQ,IAAI;AACtC,CAAC;AAI6BF,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AAAA,EAClB,QAAQA,OAAE,EAAS,SAAA;AAAA,EACnB,UAAUA,OAAE,EAAS,SAAA;AACvB,CAAC;"}
@@ -1,4 +1,4 @@
1
- import { o as object, b as boolean, s as string } from "./schemas-BCQJ62HD.js";
1
+ import { o as object, b as boolean, s as string } from "./schemas-Dn3gHDGz.js";
2
2
  const Route = "/api/rb/auth/sign-up";
3
3
  const requestSchema = object({
4
4
  email: string().nonempty("Email is required").email("Please enter a valid email address"),
@@ -15,4 +15,4 @@ export {
15
15
  Route as R,
16
16
  requestSchema as r
17
17
  };
18
- //# sourceMappingURL=index-DdTRbuS-.js.map
18
+ //# sourceMappingURL=index-DQy-Vgjt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DdTRbuS-.js","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 email: z\n .string()\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 })\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"],"names":["z.object","z.string","z.boolean"],"mappings":";AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OACnB;AAAA,EACN,OAAOC,OACJ,EACA,SAAS,mBAAmB,EAC5B,MAAM,oCAAoC;AAAA,EAC7C,UAAUA,OAAE,EAAS,IAAI,GAAG,EAAE,SAAS,gDAAgD;AAAA,EACvF,YAAYC,UAAY,QAAQ,IAAI;AACtC,CAAC;AAI2BF,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AAAA,EAClB,QAAQA,OAAE,EAAS,SAAA;AAAA,EACnB,UAAUA,OAAE,EAAS,SAAA;AACvB,CAAC;"}
1
+ {"version":3,"file":"index-DQy-Vgjt.js","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 email: z\n .string()\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 })\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"],"names":["z.object","z.string","z.boolean"],"mappings":";AAGO,MAAM,QAAQ;AAEd,MAAM,gBAAgBA,OACnB;AAAA,EACN,OAAOC,OACJ,EACA,SAAS,mBAAmB,EAC5B,MAAM,oCAAoC;AAAA,EAC7C,UAAUA,OAAE,EAAS,IAAI,GAAG,EAAE,SAAS,gDAAgD;AAAA,EACvF,YAAYC,UAAY,QAAQ,IAAI;AACtC,CAAC;AAI2BF,OAAS;AAAA,EACrC,SAASE,QAAE;AAAA,EACX,OAAOD,OAAE,EAAS,SAAA;AAAA,EAClB,QAAQA,OAAE,EAAS,SAAA;AAAA,EACnB,UAAUA,OAAE,EAAS,SAAA;AACvB,CAAC;"}
package/dist/index.js CHANGED
@@ -2,9 +2,9 @@ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useLocation, Link, useNavigate, useSearchParams } from "@rpcbase/router";
3
3
  import clsx from "clsx";
4
4
  import { useFormContext, useForm, zodResolver, FormProvider } from "@rpcbase/form";
5
- import { r as requestSchema } from "./index-BCacnRCE.js";
5
+ import { r as requestSchema } from "./index-BfZTJlGT.js";
6
6
  import { useState, forwardRef, createElement, useEffect, useCallback, useMemo } from "react";
7
- import { r as requestSchema$1 } from "./index-DdTRbuS-.js";
7
+ import { r as requestSchema$1 } from "./index-DQy-Vgjt.js";
8
8
  import { b, a, r } from "./middleware-BiMXO6Dq.js";
9
9
  const LINKS_REDIRECTION_MAP = {
10
10
  "/auth/sign-in": {
package/dist/routes.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const routes = Object.entries({
2
- .../* @__PURE__ */ Object.assign({ "./api/me/handler.ts": () => import("./handler-DvUXoOYN.js"), "./api/resend-otp/handler.ts": () => import("./handler-DJwOgqtP.js"), "./api/sign-in/handler.ts": () => import("./handler-CUtZEFQm.js"), "./api/sign-out/handler.ts": () => import("./handler-Zcu5rM1_.js"), "./api/sign-up/handler.ts": () => import("./handler-sUCM6Ee3.js"), "./api/verify-otp/handler.ts": () => import("./handler-DyqylA1h.js") })
2
+ .../* @__PURE__ */ Object.assign({ "./api/me/handler.ts": () => import("./handler-DoVmy5fg.js"), "./api/resend-otp/handler.ts": () => import("./handler-2sZNHSqb.js"), "./api/sign-in/handler.ts": () => import("./handler-DKNeylFQ.js"), "./api/sign-out/handler.ts": () => import("./handler-D9OypiUL.js"), "./api/sign-up/handler.ts": () => import("./handler-j0RdiReb.js"), "./api/verify-otp/handler.ts": () => import("./handler-Bj9EhP0l.js") })
3
3
  }).reduce((acc, [path, mod]) => {
4
4
  acc[path.replace("./api/", "@rpcbase/auth/api/")] = mod;
5
5
  return acc;
@@ -887,7 +887,7 @@ class Doc {
887
887
  const version = {
888
888
  major: 4,
889
889
  minor: 3,
890
- patch: 5
890
+ patch: 6
891
891
  };
892
892
  const $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => {
893
893
  var _a2;
@@ -2727,7 +2727,7 @@ function finalize(ctx, schema) {
2727
2727
  }
2728
2728
  }
2729
2729
  }
2730
- if (refSchema.$ref) {
2730
+ if (refSchema.$ref && refSeen.def) {
2731
2731
  for (const key in schema2) {
2732
2732
  if (key === "$ref" || key === "allOf")
2733
2733
  continue;
@@ -3703,4 +3703,4 @@ export {
3703
3703
  object as o,
3704
3704
  string as s
3705
3705
  };
3706
- //# sourceMappingURL=schemas-BCQJ62HD.js.map
3706
+ //# sourceMappingURL=schemas-Dn3gHDGz.js.map