customer-registration 0.0.115 → 0.0.117

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.
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const config_1 = require("../../../../../config");
6
+ const complete_registration_token_1 = require("../../shared/complete-registration-token");
7
+ const parse_register_body_1 = require("../../shared/parse-register-body");
8
+ /**
9
+ * Unified registration: emailpass and/or phonepass via `service.register`, depending on
10
+ * plugin `registration.identifier` and JSON body. Response: `{ token }` (Medusa default).
11
+ */
12
+ const POST = async (req, res) => {
13
+ const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
14
+ const options = (0, config_1.resolveCustomerRegistrationOptions)(config);
15
+ const registrationIdentifier = options.registration
16
+ .identifier;
17
+ const parsed = (0, parse_register_body_1.parseCustomerRegisterBody)(req.body, registrationIdentifier);
18
+ const service = req.scope.resolve(utils_1.Modules.AUTH);
19
+ const authData = {
20
+ url: req.url,
21
+ headers: req.headers,
22
+ query: req.query,
23
+ body: req.body,
24
+ protocol: req.protocol,
25
+ };
26
+ const provider = parsed.mode === "email" ? "emailpass" : "phonepass";
27
+ const { success, error, authIdentity } = await service.register(provider, authData);
28
+ if (!success || !authIdentity) {
29
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, error || "Registration failed");
30
+ }
31
+ await (0, complete_registration_token_1.respondWithRegistrationToken)(req, res, authIdentity);
32
+ };
33
+ exports.POST = POST;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3JlZ2lzdGVyL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFEQUlrQztBQUNsQyxrREFHOEI7QUFDOUIsMEZBQXVGO0FBQ3ZGLDBFQUd5QztBQUV6Qzs7O0dBR0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBQSwyQ0FBa0MsRUFBQyxNQUEyQixDQUFDLENBQUE7SUFDL0UsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsWUFBWTtTQUNoRCxVQUEwQyxDQUFBO0lBRTdDLE1BQU0sTUFBTSxHQUFHLElBQUEsK0NBQXlCLEVBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUUvQyxNQUFNLFFBQVEsR0FBRztRQUNmLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztRQUNaLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztRQUNwQixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO0tBQ0EsQ0FBQTtJQUN4QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUE7SUFFcEUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUM3RCxRQUFRLEVBQ1IsUUFBUSxDQUNULENBQUE7SUFFRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsS0FBSyxJQUFJLHFCQUFxQixDQUMvQixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sSUFBQSwwREFBNEIsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFlBQXVDLENBQUMsQ0FBQTtBQUN2RixDQUFDLENBQUE7QUFoQ1ksUUFBQSxJQUFJLFFBZ0NoQiJ9
@@ -5,21 +5,28 @@ const utils_1 = require("@medusajs/framework/utils");
5
5
  const generate_jwt_token_1 = require("@medusajs/medusa/api/auth/utils/generate-jwt-token");
6
6
  const otp_verification_1 = require("../../../../../modules/otp-verification");
7
7
  const config_1 = require("../../../../../config");
8
+ const parse_reset_request_body_1 = require("../../shared/parse-reset-request-body");
8
9
  /**
9
10
  * Generate plain text version from HTML by stripping tags
10
11
  */
11
12
  function htmlToPlainText(html) {
12
13
  return html
13
- .replace(/<[^>]*>/g, "") // Remove HTML tags
14
- .replace(/&nbsp;/g, " ") // Replace &nbsp; with space
15
- .replace(/&amp;/g, "&") // Replace &amp; with &
16
- .replace(/&lt;/g, "<") // Replace &lt; with <
17
- .replace(/&gt;/g, ">") // Replace &gt; with >
18
- .replace(/&quot;/g, '"') // Replace &quot; with "
19
- .replace(/&#39;/g, "'") // Replace &#39; with '
20
- .replace(/\n\s*\n/g, "\n\n") // Collapse multiple newlines
14
+ .replace(/<[^>]*>/g, "")
15
+ .replace(/&nbsp;/g, " ")
16
+ .replace(/&amp;/g, "&")
17
+ .replace(/&lt;/g, "<")
18
+ .replace(/&gt;/g, ">")
19
+ .replace(/&quot;/g, '"')
20
+ .replace(/&#39;/g, "'")
21
+ .replace(/\n\s*\n/g, "\n\n")
21
22
  .trim();
22
23
  }
24
+ function renderPasswordResetSmsTemplate(template, vars) {
25
+ return template
26
+ .replace(/\{\{token\}\}/g, vars.token)
27
+ .replace(/\{\{reset_url\}\}/g, vars.reset_url)
28
+ .replace(/\{\{phone\}\}/g, vars.phone);
29
+ }
23
30
  /**
24
31
  * Send password reset email using notification service
25
32
  */
@@ -29,7 +36,6 @@ async function sendPasswordResetEmail(email, token, resetUrl, templatePath, subj
29
36
  console.error("[reset-password] Notification service is not configured");
30
37
  return;
31
38
  }
32
- // Load and render template with variables
33
39
  const htmlContent = (0, otp_verification_1.loadAndRenderTemplate)(templatePath, {
34
40
  token,
35
41
  email,
@@ -38,10 +44,7 @@ async function sendPasswordResetEmail(email, token, resetUrl, templatePath, subj
38
44
  if (!htmlContent) {
39
45
  throw new Error(`Failed to load password reset template from ${templatePath}`);
40
46
  }
41
- // Generate plain text version from HTML
42
47
  const textContent = htmlToPlainText(htmlContent);
43
- // Prepare email payload matching notification service structure
44
- // Include multiple fields for different SMTP provider expectations
45
48
  const payload = {
46
49
  to: email,
47
50
  channel: "email",
@@ -53,127 +56,191 @@ async function sendPasswordResetEmail(email, token, resetUrl, templatePath, subj
53
56
  html: htmlContent,
54
57
  text: textContent,
55
58
  },
56
- // Root level fields for SMTP providers
57
59
  html: htmlContent,
58
60
  text: textContent,
59
- body: htmlContent, // Some providers expect 'body' field
60
- template: htmlContent, // Some providers expect 'template' field
61
- subject, // Include subject at root level too
61
+ body: htmlContent,
62
+ template: htmlContent,
63
+ subject,
62
64
  };
63
- try {
64
- if (typeof notificationService.create === "function") {
65
- await notificationService.create(payload);
66
- }
67
- else if (typeof notificationService.createNotifications === "function") {
68
- await notificationService.createNotifications([payload]);
69
- }
70
- else {
71
- }
65
+ if (typeof notificationService.create === "function") {
66
+ await notificationService.create(payload);
72
67
  }
73
- catch (error) {
74
- if (error instanceof Error) {
68
+ else if (typeof notificationService.createNotifications === "function") {
69
+ await notificationService.createNotifications([payload]);
70
+ }
71
+ }
72
+ async function sendPasswordResetSms(phone, token, resetUrl, smsBodyTemplate, container) {
73
+ const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
74
+ if (!notificationService) {
75
+ console.error("[reset-password] Notification service is not configured");
76
+ return;
77
+ }
78
+ const text = renderPasswordResetSmsTemplate(smsBodyTemplate, {
79
+ token,
80
+ reset_url: resetUrl,
81
+ phone,
82
+ });
83
+ const payload = {
84
+ to: phone,
85
+ channel: "sms",
86
+ content: {
87
+ text,
88
+ },
89
+ data: {
90
+ text,
91
+ token,
92
+ reset_url: resetUrl,
93
+ phone,
94
+ },
95
+ };
96
+ if (typeof notificationService.create === "function") {
97
+ await notificationService.create(payload);
98
+ }
99
+ else if (typeof notificationService.createNotifications === "function") {
100
+ await notificationService.createNotifications([payload]);
101
+ }
102
+ }
103
+ function firstRow(result) {
104
+ const fromRows = result.rows?.[0];
105
+ if (fromRows && typeof fromRows === "object" && !Array.isArray(fromRows)) {
106
+ return fromRows;
107
+ }
108
+ const batch = result[0];
109
+ if (Array.isArray(batch)) {
110
+ const first = batch[0];
111
+ if (first && typeof first === "object" && !Array.isArray(first)) {
112
+ return first;
75
113
  }
76
- throw error;
77
114
  }
115
+ return undefined;
78
116
  }
79
117
  /**
80
- * Password reset request endpoint
81
- *
82
- * This endpoint matches Medusa's built-in `/auth/{actor_type}/{provider}/reset-password` route behavior.
83
- * It generates a password reset token and sends an email.
84
- *
85
- * Note: This custom route overrides Medusa's built-in route. The subscriber listens to
86
- * `auth.password_reset` event (emitted by Medusa's built-in route) but since we're overriding
87
- * the route, we send the email directly here.
88
- *
89
- * To use Medusa's built-in route instead, remove this file and update the subscriber
90
- * to listen to `auth.password_reset` event.
118
+ * Password reset request: `identifier` (email) or `email`, `phone`, or `email_or_phone`.
119
+ * Delivery and allowed fields follow `login.identifier` (see `parseResetRequestBody`).
91
120
  */
92
121
  const POST = async (req, res) => {
93
- // Accept 'identifier' (Medusa's built-in route format) or 'email' for backward compatibility
94
- const { identifier, email } = req.body;
95
- const userEmail = identifier || email;
96
- if (!userEmail || typeof userEmail !== "string" || !userEmail.trim()) {
97
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email (identifier) is required");
122
+ const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
123
+ const pluginOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
124
+ const loginId = pluginOptions.login.identifier;
125
+ const parsed = (0, parse_reset_request_body_1.parseResetRequestBody)(req.body, loginId);
126
+ if (!pluginOptions.password_reset) {
127
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset is not configured for this store.");
98
128
  }
99
- const normalizedEmail = userEmail.toLowerCase().trim();
129
+ const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
130
+ if (!knex) {
131
+ throw new Error("Database connection not available");
132
+ }
133
+ const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
134
+ const { http } = config.projectConfig;
100
135
  try {
101
- // Find customer by email
102
- const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
103
- if (!knex) {
104
- throw new Error("Database connection not available");
136
+ if (parsed.channel === "email") {
137
+ const template = pluginOptions.password_reset.template;
138
+ if (!template?.trim()) {
139
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset email template is not configured.");
140
+ }
141
+ const normalizedEmail = parsed.email;
142
+ const result = await knex.raw(`SELECT id FROM customer WHERE email = ? LIMIT 1`, [normalizedEmail]);
143
+ const row = firstRow(result);
144
+ const customer_id = row?.id;
145
+ if (!customer_id) {
146
+ return res.status(201).json({});
147
+ }
148
+ const providerIdentityResult = await knex.raw(`SELECT pi.id, pi.entity_id, pi.provider, ai.id as auth_identity_id
149
+ FROM provider_identity pi
150
+ LEFT JOIN auth_identity ai ON pi.auth_identity_id = ai.id
151
+ WHERE pi.entity_id = ? AND pi.provider = 'emailpass'
152
+ LIMIT 1`, [normalizedEmail]);
153
+ const providerIdentity = firstRow(providerIdentityResult);
154
+ if (!providerIdentity?.auth_identity_id) {
155
+ return res.status(201).json({});
156
+ }
157
+ const authService = req.scope.resolve(utils_1.Modules.AUTH);
158
+ const authIdentity = await authService.retrieveAuthIdentity(providerIdentity.auth_identity_id);
159
+ if (!authIdentity) {
160
+ return res.status(201).json({});
161
+ }
162
+ const resetToken = (0, generate_jwt_token_1.generateJwtTokenForAuthIdentity)({
163
+ authIdentity: authIdentity,
164
+ actorType: "customer",
165
+ authProvider: "emailpass",
166
+ }, {
167
+ secret: http.jwtSecret,
168
+ expiresIn: "1h",
169
+ options: http.jwtOptions,
170
+ });
171
+ let resetUrl = "";
172
+ if (pluginOptions.storefrontUrl) {
173
+ const url = new URL("/reset-password", pluginOptions.storefrontUrl);
174
+ url.searchParams.set("token", resetToken);
175
+ url.searchParams.set("email", normalizedEmail);
176
+ resetUrl = url.toString();
177
+ }
178
+ try {
179
+ await sendPasswordResetEmail(normalizedEmail, resetToken, resetUrl, template, pluginOptions.password_reset.subject, req.scope);
180
+ }
181
+ catch {
182
+ // Do not reveal whether the account exists
183
+ }
184
+ return res.status(201).json({});
105
185
  }
106
- const result = await knex.raw(`SELECT id FROM customer WHERE email = ? LIMIT 1`, [normalizedEmail]);
107
- const row = result.rows?.[0] || result[0]?.[0];
108
- const customer_id = row?.id;
109
- // If customer doesn't exist, return success anyway (security: don't reveal if email exists)
110
- // This matches Medusa's built-in route behavior
111
- if (!customer_id) {
186
+ const smsBody = pluginOptions.password_reset.sms_body;
187
+ if (!smsBody?.trim()) {
188
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset SMS body is not configured.");
189
+ }
190
+ const normalizedPhone = parsed.phone;
191
+ const customerResult = await knex.raw(`SELECT id FROM customer WHERE phone = ? LIMIT 1`, [normalizedPhone]);
192
+ const customerRow = firstRow(customerResult);
193
+ if (!customerRow?.id) {
112
194
  return res.status(201).json({});
113
195
  }
114
- // Get auth identity from provider_identity table
115
196
  const providerIdentityResult = await knex.raw(`SELECT pi.id, pi.entity_id, pi.provider, ai.id as auth_identity_id
116
197
  FROM provider_identity pi
117
198
  LEFT JOIN auth_identity ai ON pi.auth_identity_id = ai.id
118
- WHERE pi.entity_id = ? AND pi.provider = 'emailpass'
119
- LIMIT 1`, [normalizedEmail]);
120
- const providerIdentity = providerIdentityResult.rows?.[0] || providerIdentityResult[0]?.[0];
121
- if (!providerIdentity || !providerIdentity.auth_identity_id) {
122
- // Return success for security (don't reveal if email exists)
199
+ WHERE pi.entity_id = ? AND pi.provider = 'phonepass'
200
+ LIMIT 1`, [normalizedPhone]);
201
+ const providerIdentity = firstRow(providerIdentityResult);
202
+ if (!providerIdentity?.auth_identity_id) {
123
203
  return res.status(201).json({});
124
204
  }
125
- // Get AUTH service to retrieve the full auth identity object
126
205
  const authService = req.scope.resolve(utils_1.Modules.AUTH);
127
206
  const authIdentity = await authService.retrieveAuthIdentity(providerIdentity.auth_identity_id);
128
207
  if (!authIdentity) {
129
- // Return success for security (don't reveal if email exists)
130
208
  return res.status(201).json({});
131
209
  }
132
- // Get password reset configuration from plugin options
133
- const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
134
- const pluginOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
135
- if (!pluginOptions?.password_reset?.template) {
136
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset template path is not configured. Please set password_reset.template in plugin options.");
137
- }
138
- // Generate reset token (JWT) with 1 hour expiration
139
- // Using the same method Medusa's built-in route uses
140
- const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
141
- const { http } = config.projectConfig;
142
210
  const resetToken = (0, generate_jwt_token_1.generateJwtTokenForAuthIdentity)({
143
- authIdentity,
211
+ authIdentity: authIdentity,
144
212
  actorType: "customer",
145
- authProvider: "emailpass",
213
+ authProvider: "phonepass",
146
214
  }, {
147
215
  secret: http.jwtSecret,
148
- expiresIn: "1h", // 1 hour expiration for reset token
216
+ expiresIn: "1h",
149
217
  options: http.jwtOptions,
150
218
  });
151
- // Build reset URL if storefrontUrl is provided
152
- let resetUrl;
219
+ let resetUrl = "";
153
220
  if (pluginOptions.storefrontUrl) {
154
221
  const url = new URL("/reset-password", pluginOptions.storefrontUrl);
155
222
  url.searchParams.set("token", resetToken);
156
- url.searchParams.set("email", normalizedEmail);
223
+ url.searchParams.set("phone", normalizedPhone);
157
224
  resetUrl = url.toString();
158
225
  }
159
- // Send password reset email
160
- // Note: Medusa's built-in route would emit 'auth.password_reset' event here
161
- // Since we're overriding the route, we send the email directly
162
226
  try {
163
- await sendPasswordResetEmail(normalizedEmail, resetToken, resetUrl || "", pluginOptions.password_reset.template, pluginOptions.password_reset.subject, req.scope);
227
+ await sendPasswordResetSms(normalizedPhone, resetToken, resetUrl, smsBody, req.scope);
164
228
  }
165
- catch (emailError) {
166
- // Continue anyway - don't reveal if email exists
229
+ catch {
230
+ // Do not reveal whether the account exists
167
231
  }
168
- // Return 201 (Created) to match Medusa's built-in route response
169
232
  return res.status(201).json({});
170
233
  }
171
234
  catch (error) {
172
- // Even on error, return success to prevent email enumeration attacks
173
- // This matches Medusa's built-in route behavior
235
+ if (error instanceof utils_1.MedusaError) {
236
+ if (error.type === utils_1.MedusaError.Types.INVALID_DATA ||
237
+ error.type === utils_1.MedusaError.Types.UNAUTHORIZED) {
238
+ throw error;
239
+ }
240
+ }
174
241
  console.error("[reset-password] Error processing reset request:", error);
175
242
  return res.status(201).json({});
176
243
  }
177
244
  };
178
245
  exports.POST = POST;
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3Jlc2V0LXBhc3N3b3JkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUEyRjtBQUUzRiwyRkFBb0c7QUFDcEcsOEVBQStFO0FBQy9FLGtEQUc4QjtBQUU5Qjs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLElBQVk7SUFDbkMsT0FBTyxJQUFJO1NBQ1IsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7U0FDM0MsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyw0QkFBNEI7U0FDcEQsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyx1QkFBdUI7U0FDOUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxzQkFBc0I7U0FDNUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxzQkFBc0I7U0FDNUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyx3QkFBd0I7U0FDaEQsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyx1QkFBdUI7U0FDOUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyw2QkFBNkI7U0FDekQsSUFBSSxFQUFFLENBQUE7QUFDWCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQ25DLEtBQWEsRUFDYixLQUFhLEVBQ2IsUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsT0FBZSxFQUNmLFNBQWM7SUFHZCxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFlBQVksQ0FHakUsQ0FBQTtJQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxL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
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3Jlc2V0LXBhc3N3b3JkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFEQUEyRjtBQUMzRiwyRkFBb0c7QUFDcEcsOEVBQStFO0FBQy9FLGtEQUc4QjtBQUM5QixvRkFBNkU7QUFHN0U7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxJQUFZO0lBQ25DLE9BQU8sSUFBSTtTQUNSLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO1NBQzNCLElBQUksRUFBRSxDQUFBO0FBQ1gsQ0FBQztBQUVELFNBQVMsOEJBQThCLENBQ3JDLFFBQWdCLEVBQ2hCLElBQXlEO0lBRXpELE9BQU8sUUFBUTtTQUNaLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3JDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQzdDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUNuQyxLQUFhLEVBQ2IsS0FBYSxFQUNiLFFBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BC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
@@ -4,7 +4,7 @@ exports.POST = void 0;
4
4
  const customer_login_post_1 = require("../shared/customer-login-post");
5
5
  /**
6
6
  * Customer login (unified): delegates to `handleCustomerLogin`.
7
- * - POST + JSON body: `{ email, password }` **or** `{ phone, password }` (exactly one of email/phone), gated by plugin `login.identifier`.
7
+ * - POST + JSON body: `{ email, password }` **or** `{ phone, password }` (exactly one of email/phone), or `{ email_or_phone, password }` (value with `@` → email, otherwise → phone). Do not mix `email_or_phone` with `email` or `phone`.
8
8
  * - Optional query params can fill missing fields on POST (see `buildUnifiedLoginAuthData`); prefer JSON body for credentials.
9
9
  */
10
10
  const POST = async (req, res) => {
@@ -2,44 +2,44 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.POST = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
+ const config_1 = require("../../../../../config");
6
+ const parse_reset_request_body_1 = require("../../shared/parse-reset-request-body");
7
+ function isUpdateProviderFailure(result) {
8
+ if (result == null) {
9
+ return true;
10
+ }
11
+ if (typeof result === "object" && "success" in result && result.success === false) {
12
+ return true;
13
+ }
14
+ return false;
15
+ }
5
16
  /**
6
- * Password reset completion endpoint
7
- *
8
- * This endpoint uses Medusa's built-in AUTH module updateProvider method
9
- * to update the customer's password. The AUTH module handles:
10
- * 1. Token validation (from Authorization header)
11
- * 2. Password hashing
12
- * 3. Database updates
13
- *
14
- * This matches Medusa's built-in `/auth/{actor_type}/{provider}/update` route behavior.
17
+ * Password reset completion: `Authorization: Bearer {token}` plus `password` and
18
+ * exactly one of `identifier` (email), `email`, `phone`, or `email_or_phone` (gated by `login.identifier`).
15
19
  */
16
20
  const POST = async (req, res) => {
17
- const { email, password } = req.body;
18
- // Get token from Authorization header (required by Medusa's built-in route)
21
+ const { password } = req.body;
19
22
  const resetToken = req.headers.authorization?.replace("Bearer ", "");
20
23
  if (!resetToken) {
21
24
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Reset token is required. Provide it in the 'Authorization: Bearer {token}' header");
22
25
  }
23
- if (!email || typeof email !== "string" || !email.trim()) {
24
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required");
25
- }
26
26
  if (!password || typeof password !== "string" || password.length < 8) {
27
27
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password is required and must be at least 8 characters");
28
28
  }
29
- const normalizedEmail = email.toLowerCase().trim();
29
+ const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
30
+ const pluginOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
31
+ const loginId = pluginOptions.login.identifier;
32
+ const parsed = (0, parse_reset_request_body_1.parseResetRequestBody)(req.body, loginId);
33
+ const provider = parsed.channel === "email" ? "emailpass" : "phonepass";
34
+ const entity_id = parsed.channel === "email" ? parsed.email : parsed.phone;
30
35
  try {
31
- // Get AUTH service
32
36
  const authService = req.scope.resolve(utils_1.Modules.AUTH);
33
- // Use Medusa's built-in updateProvider method
34
- // This method validates the token, hashes the password, and updates it in the database
35
- // Pass the token in the data object (matching SDK behavior)
36
- const result = await authService.updateProvider("emailpass", {
37
- entity_id: normalizedEmail,
38
- password: password,
37
+ const result = await authService.updateProvider(provider, {
38
+ entity_id,
39
+ password,
39
40
  token: resetToken,
40
41
  });
41
- // updateProvider returns the updated auth identity on success
42
- if (!result) {
42
+ if (isUpdateProviderFailure(result)) {
43
43
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Failed to reset password. Invalid or expired token.");
44
44
  }
45
45
  return res.status(200).json({
@@ -48,14 +48,12 @@ const POST = async (req, res) => {
48
48
  });
49
49
  }
50
50
  catch (error) {
51
- // Re-throw MedusaError as-is
52
51
  if (error instanceof utils_1.MedusaError) {
53
52
  throw error;
54
53
  }
55
- // Handle unexpected errors
56
54
  console.error("[reset-password-complete] Unexpected error:", error);
57
55
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to reset password: ${error instanceof Error ? error.message : String(error)}`);
58
56
  }
59
57
  };
60
58
  exports.POST = POST;
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3VwZGF0ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBZ0U7QUFFaEU7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUcvQixDQUFBO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFcEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1GQUFtRixDQUNwRixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbUJBQW1CLENBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix3REFBd0QsQ0FDekQsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFbEQsSUFBSSxDQUFDO1FBQ0gsbUJBQW1CO1FBQ25CLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVuRCw4Q0FBOEM7UUFDOUMsdUZBQXVGO1FBQ3ZGLDREQUE0RDtRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQzdDLFdBQVcsRUFDWDtZQUNFLFNBQVMsRUFBRSxlQUFlO1lBQzFCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLEtBQUssRUFBRSxVQUFVO1NBQ2xCLENBQ0YsQ0FBQTtRQUVELDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxREFBcUQsQ0FDdEQsQ0FBQTtRQUNILENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSw2QkFBNkI7WUFDdEMsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDZCQUE2QjtRQUM3QixJQUFJLEtBQUssWUFBWSxtQkFBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw2QkFBNkIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3RGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBekVZLFFBQUEsSUFBSSxRQXlFaEIifQ==
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3VwZGF0ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBMkY7QUFDM0Ysa0RBRzhCO0FBQzlCLG9GQUE2RTtBQVM3RSxTQUFTLHVCQUF1QixDQUFDLE1BQTRCO0lBQzNELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLFNBQVMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUNsRixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUE2QixDQUFBO0lBRXRELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFcEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1GQUFtRixDQUNwRixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsd0RBQXdELENBQ3pELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3BDLGlDQUF5QixDQUFDLGFBQWEsQ0FDbkIsQ0FBQTtJQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFBLDJDQUFrQyxFQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsVUFBbUMsQ0FBQTtJQUV2RSxNQUFNLE1BQU0sR0FBRyxJQUFBLGdEQUFxQixFQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFFdkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO0lBRTFFLElBQUksQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBS2pELENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQ3hELFNBQVM7WUFDVCxRQUFRO1lBQ1IsS0FBSyxFQUFFLFVBQVU7U0FDbEIsQ0FBQyxDQUFBO1FBRUYsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHFEQUFxRCxDQUN0RCxDQUFBO1FBQ0gsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxFQUFFLDZCQUE2QjtZQUN0QyxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksbUJBQVcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw2QkFBNkIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3RGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBbEVZLFFBQUEsSUFBSSxRQWtFaEIifQ==
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const vitest_1 = require("vitest");
4
+ const utils_1 = require("@medusajs/framework/utils");
4
5
  const build_unified_login_auth_data_1 = require("../build-unified-login-auth-data");
5
6
  function makeReq(partial) {
6
7
  return {
@@ -44,11 +45,99 @@ function makeReq(partial) {
44
45
  }),
45
46
  wantBody: { email: "x@y.com", password: "pw" },
46
47
  },
48
+ {
49
+ name: "email_or_phone with @ becomes email",
50
+ req: makeReq({
51
+ body: { email_or_phone: "user@example.com", password: "pw" },
52
+ }),
53
+ wantBody: { email: "user@example.com", password: "pw" },
54
+ },
55
+ {
56
+ name: "email_or_phone without @ becomes phone",
57
+ req: makeReq({
58
+ body: { email_or_phone: "+919898120674", password: "pw" },
59
+ }),
60
+ wantBody: { phone: "+919898120674", password: "pw" },
61
+ },
62
+ {
63
+ name: "email_or_phone trimmed",
64
+ req: makeReq({
65
+ body: { email_or_phone: " a@b.co ", password: "x" },
66
+ }),
67
+ wantBody: { email: "a@b.co", password: "x" },
68
+ },
69
+ {
70
+ name: "email_or_phone phone trimmed",
71
+ req: makeReq({
72
+ body: { email_or_phone: " +15550001 ", password: "x" },
73
+ }),
74
+ wantBody: { phone: "+15550001", password: "x" },
75
+ },
76
+ {
77
+ name: "query email_or_phone fills when body omits it",
78
+ req: makeReq({
79
+ body: { password: "secret" },
80
+ query: { email_or_phone: "+15551234" },
81
+ }),
82
+ wantBody: { phone: "+15551234", password: "secret" },
83
+ },
84
+ {
85
+ name: "body email_or_phone overrides query email_or_phone",
86
+ req: makeReq({
87
+ body: { email_or_phone: "pick@me.com", password: "p1" },
88
+ query: { email_or_phone: "+1999", password: "p2" },
89
+ }),
90
+ wantBody: { email: "pick@me.com", password: "p1" },
91
+ },
92
+ {
93
+ name: "array query email_or_phone takes first string",
94
+ req: makeReq({
95
+ body: {},
96
+ query: { email_or_phone: ["z@w.com", "a@b.com"], password: "pw" },
97
+ }),
98
+ wantBody: { email: "z@w.com", password: "pw" },
99
+ },
47
100
  ];
48
101
  vitest_1.it.each(cases)("$name", ({ req, wantBody }) => {
49
102
  const auth = (0, build_unified_login_auth_data_1.buildUnifiedLoginAuthData)(req);
50
103
  (0, vitest_1.expect)(auth.body).toEqual(wantBody);
51
104
  (0, vitest_1.expect)(auth.query).toBe(req.query);
52
105
  });
106
+ const errorCases = [
107
+ {
108
+ name: "email_or_phone with email",
109
+ req: makeReq({
110
+ body: {
111
+ email_or_phone: "x@y.com",
112
+ email: "a@b.co",
113
+ password: "p",
114
+ },
115
+ }),
116
+ wantMessageSubstring: "email_or_phone together",
117
+ },
118
+ {
119
+ name: "email_or_phone with phone",
120
+ req: makeReq({
121
+ body: {
122
+ email_or_phone: "+1555",
123
+ phone: "+1666",
124
+ password: "p",
125
+ },
126
+ }),
127
+ wantMessageSubstring: "email_or_phone together",
128
+ },
129
+ ];
130
+ vitest_1.it.each(errorCases)("$name", ({ req, wantMessageSubstring }) => {
131
+ try {
132
+ (0, build_unified_login_auth_data_1.buildUnifiedLoginAuthData)(req);
133
+ vitest_1.expect.fail("expected MedusaError");
134
+ }
135
+ catch (e) {
136
+ (0, vitest_1.expect)(e).toBeInstanceOf(utils_1.MedusaError);
137
+ const err = e;
138
+ (0, vitest_1.expect)(err.type).toBe(utils_1.MedusaError.Types.INVALID_DATA);
139
+ (0, vitest_1.expect)(err.message).toContain(wantMessageSubstring);
140
+ }
141
+ });
53
142
  });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtdW5pZmllZC1sb2dpbi1hdXRoLWRhdGEudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYXV0aC9jdXN0b21lci9zaGFyZWQvX190ZXN0c19fL2J1aWxkLXVuaWZpZWQtbG9naW4tYXV0aC1kYXRhLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBNkM7QUFFN0Msb0ZBQTRFO0FBRTVFLFNBQVMsT0FBTyxDQUFDLE9BR2hCO0lBQ0MsT0FBTztRQUNMLEdBQUcsRUFBRSwwQkFBMEI7UUFDL0IsT0FBTyxFQUFFLEVBQUU7UUFDWCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixRQUFRLEVBQUUsTUFBTTtLQUNBLENBQUE7QUFDcEIsQ0FBQztBQUVELElBQUEsaUJBQVEsRUFBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7SUFDekMsTUFBTSxLQUFLLEdBSU47UUFDSDtZQUNFLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsR0FBRyxFQUFFLE9BQU8sQ0FBQztnQkFDWCxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7YUFDekMsQ0FBQztZQUNGLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtTQUM3QztRQUNEO1lBQ0UsSUFBSSxFQUFFLHFDQUFxQztZQUMzQyxHQUFHLEVBQUUsT0FBTyxDQUFDO2dCQUNYLElBQUksRUFBRSxFQUFFO2dCQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTthQUM5QyxDQUFDO1lBQ0YsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO1NBQ2pEO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsbUNBQW1DO1lBQ3pDLEdBQUcsRUFBRSxPQUFPLENBQUM7Z0JBQ1gsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoRCxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDbEQsQ0FBQztZQUNGLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtTQUNyRDtRQUNEO1lBQ0UsSUFBSSxFQUFFLHNDQUFzQztZQUM1QyxHQUFHLEVBQUUsT0FBTyxDQUFDO2dCQUNYLElBQUksRUFBRSxFQUFFO2dCQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2FBQ3pELENBQUM7WUFDRixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7U0FDL0M7S0FDRixDQUFBO0lBRUQsV0FBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUEseURBQXlCLEVBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0MsSUFBQSxlQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuQyxJQUFBLGVBQU0sRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwQyxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIn0=
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtdW5pZmllZC1sb2dpbi1hdXRoLWRhdGEudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYXV0aC9jdXN0b21lci9zaGFyZWQvX190ZXN0c19fL2J1aWxkLXVuaWZpZWQtbG9naW4tYXV0aC1kYXRhLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBNkM7QUFFN0MscURBQXVEO0FBQ3ZELG9GQUE0RTtBQUU1RSxTQUFTLE9BQU8sQ0FBQyxPQUdoQjtJQUNDLE9BQU87UUFDTCxHQUFHLEVBQUUsMEJBQTBCO1FBQy9CLE9BQU8sRUFBRSxFQUFFO1FBQ1gsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUMxQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsUUFBUSxFQUFFLE1BQU07S0FDQSxDQUFBO0FBQ3BCLENBQUM7QUFFRCxJQUFBLGlCQUFRLEVBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLE1BQU0sS0FBSyxHQUlOO1FBQ0g7WUFDRSxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUM7Z0JBQ1gsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO2FBQ3pDLENBQUM7WUFDRixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7U0FDN0M7UUFDRDtZQUNFLElBQUksRUFBRSxxQ0FBcUM7WUFDM0MsR0FBRyxFQUFFLE9BQU8sQ0FBQztnQkFDWCxJQUFJLEVBQUUsRUFBRTtnQkFDUixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7YUFDOUMsQ0FBQztZQUNGLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFB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