customer-registration 0.0.111 → 0.0.113

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.
Files changed (50) hide show
  1. package/.medusa/server/src/admin/index.js +3249 -2
  2. package/.medusa/server/src/admin/index.mjs +3232 -2
  3. package/.medusa/server/src/api/admin/account-deletion-requests/route.js +30 -0
  4. package/.medusa/server/src/api/admin/account-deletion-requests/validators.js +12 -0
  5. package/.medusa/server/src/api/auth/customer/emailpass/reset-password/route.js +1 -26
  6. package/.medusa/server/src/api/auth/customer/emailpass/route.js +24 -97
  7. package/.medusa/server/src/api/auth/customer/phonepass/register/route.js +50 -0
  8. package/.medusa/server/src/api/auth/customer/phonepass/route.js +105 -0
  9. package/.medusa/server/src/api/middlewares/guard-account-deletion.js +29 -0
  10. package/.medusa/server/src/api/middlewares/ip-rate-limit.js +48 -0
  11. package/.medusa/server/src/api/middlewares/validate-customer-registration.js +60 -0
  12. package/.medusa/server/src/api/middlewares.js +30 -0
  13. package/.medusa/server/src/api/store/customers/account-deletion/cancel-confirm/route.js +36 -0
  14. package/.medusa/server/src/api/store/customers/account-deletion/cancel-request/route.js +55 -0
  15. package/.medusa/server/src/api/store/customers/account-deletion/confirm/route.js +43 -0
  16. package/.medusa/server/src/api/store/customers/account-deletion/request/route.js +40 -0
  17. package/.medusa/server/src/api/store/customers/account-deletion/validators.js +27 -0
  18. package/.medusa/server/src/api/store/customers/me/contact/route.js +95 -0
  19. package/.medusa/server/src/api/store/customers/me/contact/verify/route.js +83 -0
  20. package/.medusa/server/src/api/store/customers/me/route.js +53 -0
  21. package/.medusa/server/src/api/store/customers/otp/send/route.js +1 -6
  22. package/.medusa/server/src/api/store/customers/otp/verify/route.js +95 -3
  23. package/.medusa/server/src/api/store/customers/route.js +89 -0
  24. package/.medusa/server/src/config.js +44 -13
  25. package/.medusa/server/src/jobs/process-account-deletions.js +69 -0
  26. package/.medusa/server/src/modules/account-deletion-request/index.js +17 -0
  27. package/.medusa/server/src/modules/account-deletion-request/migrations/Migration20250221000000CreateAccountDeletionRequestTable.js +42 -0
  28. package/.medusa/server/src/modules/account-deletion-request/migrations/Migration20250221100000AddCompletedStatusToAccountDeletionRequest.js +30 -0
  29. package/.medusa/server/src/modules/account-deletion-request/models/account-deletion-request.js +26 -0
  30. package/.medusa/server/src/modules/account-deletion-request/service.js +90 -0
  31. package/.medusa/server/src/modules/otp-verification/migrations/Migration20250221000000AddAccountDeletionOtpPurposes.js +35 -0
  32. package/.medusa/server/src/modules/otp-verification/models/otp-verification.js +9 -2
  33. package/.medusa/server/src/modules/otp-verification/service.js +79 -1
  34. package/.medusa/server/src/providers/phonepass/index.js +9 -0
  35. package/.medusa/server/src/providers/phonepass/service.js +133 -0
  36. package/.medusa/server/src/subscribers/password-reset.js +1 -42
  37. package/.medusa/server/src/workflows/change-password.js +40 -64
  38. package/.medusa/server/src/workflows/send-contact-change-otp-workflow.js +41 -0
  39. package/.medusa/server/src/workflows/steps/determine-contact-method-step.js +8 -2
  40. package/.medusa/server/src/workflows/steps/generate-contact-change-otp-step.js +24 -0
  41. package/.medusa/server/src/workflows/steps/index.js +6 -2
  42. package/.medusa/server/src/workflows/steps/resolve-channel-config-step.js +10 -1
  43. package/.medusa/server/src/workflows/steps/send-notification-step.js +1 -11
  44. package/.medusa/server/src/workflows/steps/sync-phonepass-entity-id-step.js +63 -0
  45. package/.medusa/server/src/workflows/steps/update-password-step.js +21 -29
  46. package/.medusa/server/src/workflows/update-contact-workflow.js +100 -0
  47. package/.medusa/server/src/workflows/verify-phone.js +11 -4
  48. package/README.md +389 -147
  49. package/package.json +12 -3
  50. package/.medusa/server/src/subscribers/customer-updated.js +0 -100
@@ -6,15 +6,12 @@ const utils_1 = require("@medusajs/framework/utils");
6
6
  const password_validation_1 = require("../utils/password-validation");
7
7
  const password_hashing_1 = require("../utils/password-hashing");
8
8
  const validatePasswordStep = (0, workflows_sdk_1.createStep)("validate-password", async ({ new_password, confirm_password }) => {
9
- // Validate password strength
10
9
  (0, password_validation_1.validatePasswordStrength)(new_password);
11
- // Validate passwords match
12
10
  (0, password_validation_1.validatePasswordMatch)(new_password, confirm_password);
13
11
  return new workflows_sdk_1.StepResponse({ validated: true });
14
12
  });
15
13
  const verifyCustomerStep = (0, workflows_sdk_1.createStep)("verify-customer", async ({ customer_id }, { container }) => {
16
14
  const customerService = container.resolve(utils_1.Modules.CUSTOMER);
17
- // Verify customer exists
18
15
  const customer = await customerService.retrieveCustomer(customer_id);
19
16
  if (!customer) {
20
17
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
@@ -22,96 +19,75 @@ const verifyCustomerStep = (0, workflows_sdk_1.createStep)("verify-customer", as
22
19
  return new workflows_sdk_1.StepResponse({ customer_id, verified: true });
23
20
  });
24
21
  const verifyOldPasswordStep = (0, workflows_sdk_1.createStep)("verify-old-password", async ({ customer_id, old_password }, { container }) => {
25
- // Get customer to retrieve email
26
22
  const customerService = container.resolve(utils_1.Modules.CUSTOMER);
27
23
  const customer = await customerService.retrieveCustomer(customer_id);
28
- if (!customer || !customer.email) {
29
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found or email missing");
24
+ if (!customer) {
25
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
26
+ }
27
+ // Resolve provider and entity_id — supports both emailpass and phonepass
28
+ const provider = customer.email ? "emailpass" : "phonepass";
29
+ const entity_id = customer.email
30
+ ? customer.email.toLowerCase()
31
+ : customer.phone;
32
+ if (!entity_id) {
33
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer has no email or phone — cannot verify password");
30
34
  }
31
- // Get PostgreSQL connection (Knex instance) from container
32
35
  const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
33
- // Find provider_identity by entity_id (customer email) and provider
34
- const providerIdentityResult = await knex.raw(`SELECT id, provider_metadata
36
+ const result = await knex.raw(`SELECT provider_metadata
35
37
  FROM provider_identity
36
- WHERE entity_id = ? AND provider = 'emailpass'
37
- LIMIT 1`, [customer.email.toLowerCase()]);
38
- const providerIdentity = providerIdentityResult.rows?.[0] || providerIdentityResult[0]?.[0];
38
+ WHERE entity_id = ? AND provider = ?
39
+ LIMIT 1`, [entity_id, provider]);
40
+ const providerIdentity = result.rows?.[0] ?? result[0]?.[0];
39
41
  if (!providerIdentity) {
40
42
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Provider identity not found for customer");
41
43
  }
42
- // Get password hash from provider_metadata
43
- const providerMetadata = providerIdentity.provider_metadata || {};
44
- const passwordHash = providerMetadata.password;
44
+ const passwordHash = providerIdentity.provider_metadata?.password;
45
45
  if (!passwordHash) {
46
46
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No password set for this account");
47
47
  }
48
- // Verify old password using scrypt (matching Medusa's format)
49
48
  const isValid = await (0, password_hashing_1.verifyPassword)(old_password, passwordHash);
50
49
  if (!isValid) {
51
50
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Current password is incorrect");
52
51
  }
53
52
  return new workflows_sdk_1.StepResponse({ verified: true });
54
53
  });
55
- const hashPasswordStep = (0, workflows_sdk_1.createStep)("hash-password", async ({ password }) => {
56
- // Use scrypt to match Medusa's password hashing format
57
- const passwordHash = await (0, password_hashing_1.hashPassword)(password);
58
- return new workflows_sdk_1.StepResponse({ password_hash: passwordHash });
59
- });
60
- const updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id, password_hash }, { container }) => {
61
- // Get customer to retrieve email
54
+ const changePasswordUpdateStep = (0, workflows_sdk_1.createStep)("change-password-update", async ({ customer_id, new_password }, { container }) => {
62
55
  const customerService = container.resolve(utils_1.Modules.CUSTOMER);
63
56
  const customer = await customerService.retrieveCustomer(customer_id);
64
- if (!customer || !customer.email) {
65
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found or email missing");
57
+ if (!customer) {
58
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
66
59
  }
67
- // Get PostgreSQL connection (Knex instance) from container
68
- const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
69
- // Find provider_identity by entity_id (customer email) and provider
70
- const providerIdentityResult = await knex.raw(`SELECT id, provider_metadata
71
- FROM provider_identity
72
- WHERE entity_id = ? AND provider = 'emailpass'
73
- LIMIT 1`, [customer.email.toLowerCase()]);
74
- const providerIdentity = providerIdentityResult.rows?.[0] || providerIdentityResult[0]?.[0];
75
- if (!providerIdentity) {
76
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Provider identity not found for customer");
60
+ // Resolve provider and entity_id supports both emailpass and phonepass
61
+ const provider = customer.email ? "emailpass" : "phonepass";
62
+ const entity_id = customer.email
63
+ ? customer.email.toLowerCase()
64
+ : customer.phone;
65
+ if (!entity_id) {
66
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer has no email or phone — cannot update password");
67
+ }
68
+ // Delegate to AUTH module — it handles hashing internally
69
+ const authService = container.resolve(utils_1.Modules.AUTH);
70
+ const updateResult = await authService.updateProvider(provider, {
71
+ entity_id,
72
+ password: new_password,
73
+ });
74
+ if (!updateResult.success) {
75
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, updateResult.error || "Failed to update password");
77
76
  }
78
- // Update password hash in provider_metadata
79
- await knex.raw(`UPDATE provider_identity
80
- SET provider_metadata = jsonb_set(
81
- COALESCE(provider_metadata, '{}'::jsonb),
82
- '{password}',
83
- to_jsonb(?::text)
84
- ),
85
- updated_at = NOW()
86
- WHERE id = ?`, [password_hash, providerIdentity.id]);
87
77
  return new workflows_sdk_1.StepResponse({ customer_id, success: true });
88
78
  });
89
79
  exports.changePasswordWorkflow = (0, workflows_sdk_1.createWorkflow)("change-password", (input) => {
90
- // Validate password strength and match (runs during execution)
91
80
  validatePasswordStep({
92
81
  new_password: input.new_password,
93
82
  confirm_password: input.confirm_password,
94
83
  });
95
- // Verify customer exists
96
- const { customer_id } = verifyCustomerStep({
97
- customer_id: input.customer_id,
98
- });
99
- // Verify old password
100
- verifyOldPasswordStep({
84
+ const { customer_id } = verifyCustomerStep({ customer_id: input.customer_id });
85
+ verifyOldPasswordStep({ customer_id, old_password: input.old_password });
86
+ const { customer_id: updated_customer_id } = changePasswordUpdateStep({
101
87
  customer_id,
102
- old_password: input.old_password,
103
- });
104
- // Hash the new password
105
- const { password_hash } = hashPasswordStep({ password: input.new_password });
106
- // Update password hash in database
107
- const { customer_id: updated_customer_id } = updatePasswordStep({
108
- customer_id,
109
- password_hash,
110
- });
111
- return new workflows_sdk_1.WorkflowResponse({
112
- customer_id: updated_customer_id,
113
- success: true,
88
+ new_password: input.new_password,
114
89
  });
90
+ return new workflows_sdk_1.WorkflowResponse({ customer_id: updated_customer_id, success: true });
115
91
  });
116
92
  exports.default = exports.changePasswordWorkflow;
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jaGFuZ2UtcGFzc3dvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLHFEQUlrQztBQUVsQyxzRUFBOEY7QUFDOUYsZ0VBQXdFO0FBU3hFLE1BQU0sb0JBQW9CLEdBQUcsSUFBQSwwQkFBVSxFQUNyQyxtQkFBbUIsRUFDbkIsS0FBSyxFQUNILEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFzRCxFQUN0RixFQUFFO0lBQ0YsNkJBQTZCO0lBQzdCLElBQUEsOENBQXdCLEVBQUMsWUFBWSxDQUFDLENBQUE7SUFFdEMsMkJBQTJCO0lBQzNCLElBQUEsMkNBQXFCLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFFckQsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUM5QyxDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBQSwwQkFBVSxFQUNuQyxpQkFBaUIsRUFDakIsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUEyQixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNoRSxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUN2QyxlQUFPLENBQUMsUUFBUSxDQUNTLENBQUE7SUFFM0IseUJBQXlCO0lBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3BFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLG9CQUFvQixDQUNyQixDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsV0FBVyxFQUFF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
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jaGFuZ2UtcGFzc3dvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLHFEQUlrQztBQUVsQyxzRUFBOEY7QUFDOUYsZ0VBQTBEO0FBUzFELE1BQU0sb0JBQW9CLEdBQUcsSUFBQSwwQkFBVSxFQUNyQyxtQkFBbUIsRUFDbkIsS0FBSyxFQUNILEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFzRCxFQUN0RixFQUFFO0lBQ0YsSUFBQSw4Q0FBd0IsRUFBQyxZQUFZLENBQUMsQ0FBQTtJQUN0QyxJQUFBLDJDQUFxQixFQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3JELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDOUMsQ0FBQyxDQUNGLENBQUE7QUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUEsMEJBQVUsRUFDbkMsaUJBQWlCLEVBQ2pCLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBMkIsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDaEUsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBeUIsZUFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ25GLE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3BFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFDRCxPQUFPLElBQUksNEJBQVksQ0FBQyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUMxRCxDQUFD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
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendContactChangeOtpWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const steps_1 = require("./steps");
6
+ /**
7
+ * Generates an OTP whose JWT payload contains the `new_value` (new phone or
8
+ * email) and sends it to that new contact address — NOT the current one on
9
+ * the customer record. No metadata staging is required.
10
+ */
11
+ exports.sendContactChangeOtpWorkflow = (0, workflows_sdk_1.createWorkflow)("send-contact-change-otp", (input) => {
12
+ const { customer } = (0, steps_1.retrieveCustomerStep)({ customer_id: input.customer_id });
13
+ const { channelConfig } = (0, steps_1.resolveChannelConfigStep)({ type: input.otp_type });
14
+ const { token, expires_at, code } = (0, steps_1.generateContactChangeOtpStep)({
15
+ customer_id: input.customer_id,
16
+ type: input.otp_type,
17
+ new_value: input.new_value,
18
+ contact_type: input.contact_type,
19
+ });
20
+ const { templateData } = (0, steps_1.prepareTemplateDataStep)({
21
+ customer,
22
+ otpCode: code,
23
+ });
24
+ const { renderedContent } = (0, steps_1.loadTemplateStep)({
25
+ templatePath: channelConfig.template || null,
26
+ templateData,
27
+ });
28
+ // Send OTP to the NEW contact value, not customer.phone / customer.email
29
+ const notificationInput = (0, workflows_sdk_1.transform)({ input, channelConfig, templateData, renderedContent }, (data) => ({
30
+ to: data.input.new_value,
31
+ channel: data.channelConfig.channel,
32
+ channelConfig: data.channelConfig,
33
+ templateData: data.templateData,
34
+ renderedContent: data.renderedContent,
35
+ contactType: data.input.contact_type,
36
+ }));
37
+ (0, steps_1.sendNotificationStep)(notificationInput);
38
+ return new workflows_sdk_1.WorkflowResponse({ token, expires_at });
39
+ });
40
+ exports.default = exports.sendContactChangeOtpWorkflow;
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1jb250YWN0LWNoYW5nZS1vdHAtd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3NlbmQtY29udGFjdC1jaGFuZ2Utb3RwLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUkwQztBQUUxQyxtQ0FPZ0I7QUFjaEI7Ozs7R0FJRztBQUNVLFFBQUEsNEJBQTRCLEdBQUcsSUFBQSw4QkFBYyxFQUN4RCx5QkFBeUIsRUFDekIsQ0FBQyxLQUFnQyxFQUFnRCxFQUFFO0lBQ2pGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFBLDRCQUFvQixFQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBRTdFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFBLGdDQUF3QixFQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTVFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEsb0NBQTRCLEVBQUM7UUFDL0QsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1FBQzlCLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUTtRQUNwQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO0tBQ2pDLENBQUMsQ0FBQTtJQUVGLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFBLCtCQUF1QixFQUFDO1FBQy9DLFFBQVE7UUFDUixPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQTtJQUVGLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFBLHdCQUFnQixFQUFDO1FBQzNDLFlBQVksRUFBRSxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUk7UUFDNUMsWUFBWTtLQUNiLENBQUMsQ0FBQTtJQUVGLHlFQUF5RTtJQUN6RSxNQUFNLGlCQUFpQixHQUFHLElBQUEseUJBQVMsRUFDakMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsRUFDdkQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO1FBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87UUFDbkMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1FBQ2pDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtRQUMvQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7UUFDckMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtLQUNyQyxDQUFDLENBQ0gsQ0FBQTtJQUNELElBQUEsNEJBQW9CLEVBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLElBQUksZ0NBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtBQUNwRCxDQUFDLENBQ0YsQ0FBQTtBQUVELGtCQUFlLG9DQUE0QixDQUFBIn0=
@@ -7,7 +7,13 @@ exports.determineContactMethodStep = (0, workflows_sdk_1.createStep)("determine-
7
7
  const { customer, channelConfig } = input;
8
8
  const channelName = channelConfig.channel.toLowerCase();
9
9
  const contactType = channelName === "email" ? "email" : "phone";
10
- const contactValue = contactType === "email" ? customer.email : customer.phone;
10
+ let contactValue;
11
+ if (contactType === "email") {
12
+ contactValue = customer.email;
13
+ }
14
+ else {
15
+ contactValue = customer.phone;
16
+ }
11
17
  if (!contactValue) {
12
18
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, contactType === "email"
13
19
  ? "Customer email is required for this verification type"
@@ -18,4 +24,4 @@ exports.determineContactMethodStep = (0, workflows_sdk_1.createStep)("determine-
18
24
  contactType,
19
25
  });
20
26
  });
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZXJtaW5lLWNvbnRhY3QtbWV0aG9kLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2RldGVybWluZS1jb250YWN0LW1ldGhvZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBdUQ7QUFZMUMsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLDBCQUFVLEVBQ2xELDBCQUEwQixFQUMxQixLQUFLLEVBQ0gsS0FBa0MsRUFDbUIsRUFBRTtJQUN2RCxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV6QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3ZELE1BQU0sV0FBVyxHQUNmLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO0lBQzdDLE1BQU0sWUFBWSxHQUNoQixXQUFXLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFBO0lBRTNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixXQUFXLEtBQUssT0FBTztZQUNyQixDQUFDLENBQUMsdURBQXVEO1lBQ3pELENBQUMsQ0FBQyw4REFBOEQsQ0FDbkUsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBK0I7UUFDcEQsWUFBWTtRQUNaLFdBQVc7S0FDWixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZXJtaW5lLWNvbnRhY3QtbWV0aG9kLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2RldGVybWluZS1jb250YWN0LW1ldGhvZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBdUQ7QUFZMUMsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLDBCQUFVLEVBQ2xELDBCQUEwQixFQUMxQixLQUFLLEVBQ0gsS0FBa0MsRUFDbUIsRUFBRTtJQUN2RCxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV6QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ3ZELE1BQU0sV0FBVyxHQUNmLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO0lBRTdDLElBQUksWUFBZ0MsQ0FBQTtJQUVwQyxJQUFJLFdBQVcsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM1QixZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQTtJQUMvQixDQUFDO1NBQU0sQ0FBQztRQUNOLFlBQVksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFBO0lBQy9CLENBQUM7SUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsV0FBVyxLQUFLLE9BQU87WUFDckIsQ0FBQyxDQUFDLHVEQUF1RDtZQUN6RCxDQUFDLENBQUMsOERBQThELENBQ25FLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQStCO1FBQ3BELFlBQVk7UUFDWixXQUFXO0tBQ1osQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateContactChangeOtpStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const otp_verification_1 = require("../../modules/otp-verification");
7
+ /**
8
+ * Generates an OTP for a contact-change request.
9
+ * The new_value and contact_type are embedded in the signed JWT so that no
10
+ * metadata staging on the customer record is required.
11
+ */
12
+ exports.generateContactChangeOtpStep = (0, workflows_sdk_1.createStep)("generate-contact-change-otp", async (input, { container }) => {
13
+ const config = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
14
+ const jwtSecret = config?.projectConfig
15
+ ?.http?.jwtSecret || "supersecret";
16
+ const otpService = container.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
17
+ const otpResult = await otpService.generateOtpForContactChange({ customer_id: input.customer_id, type: input.type }, jwtSecret, input.new_value, input.contact_type);
18
+ return new workflows_sdk_1.StepResponse({
19
+ token: otpResult.token,
20
+ expires_at: otpResult.expires_at,
21
+ code: otpResult.code,
22
+ });
23
+ });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtY29udGFjdC1jaGFuZ2Utb3RwLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2dlbmVyYXRlLWNvbnRhY3QtY2hhbmdlLW90cC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBcUU7QUFDckUscUVBQXdFO0FBaUJ4RTs7OztHQUlHO0FBQ1UsUUFBQSw0QkFBNEIsR0FBRyxJQUFBLDBCQUFVLEVBQ3BELDZCQUE2QixFQUM3QixLQUFLLEVBQUUsS0FBb0MsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDNUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN6RSxNQUFNLFNBQVMsR0FDWixNQUFNLEVBQUUsYUFBNkU7UUFDcEYsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLGFBQWEsQ0FBQTtJQUV0QyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUF5QiwwQ0FBdUIsQ0FBQyxDQUFBO0lBRXJGLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLDJCQUEyQixDQUM1RCxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQ3BELFNBQVMsRUFDVCxLQUFLLENBQUMsU0FBUyxFQUNmLEtBQUssQ0FBQyxZQUFZLENBQ25CLENBQUE7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBaUM7UUFDdEQsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO1FBQ3RCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtRQUNoQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7S0FDckIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updatePasswordStep = exports.findCustomerByEmailStep = exports.prepareTemplateDataStep = exports.generateOtpStep = exports.determineContactMethodStep = exports.retrieveCustomerStep = exports.sendNotificationStep = exports.loadTemplateStep = exports.resolveChannelConfigStep = void 0;
3
+ exports.syncPhonepassEntityIdStep = exports.updatePasswordStep = exports.findCustomerByEmailStep = exports.prepareTemplateDataStep = exports.generateContactChangeOtpStep = exports.generateOtpStep = exports.determineContactMethodStep = exports.retrieveCustomerStep = exports.sendNotificationStep = exports.loadTemplateStep = exports.resolveChannelConfigStep = void 0;
4
4
  var resolve_channel_config_step_1 = require("./resolve-channel-config-step");
5
5
  Object.defineProperty(exports, "resolveChannelConfigStep", { enumerable: true, get: function () { return resolve_channel_config_step_1.resolveChannelConfigStep; } });
6
6
  var load_template_step_1 = require("./load-template-step");
@@ -13,10 +13,14 @@ var determine_contact_method_step_1 = require("./determine-contact-method-step")
13
13
  Object.defineProperty(exports, "determineContactMethodStep", { enumerable: true, get: function () { return determine_contact_method_step_1.determineContactMethodStep; } });
14
14
  var generate_otp_step_1 = require("./generate-otp-step");
15
15
  Object.defineProperty(exports, "generateOtpStep", { enumerable: true, get: function () { return generate_otp_step_1.generateOtpStep; } });
16
+ var generate_contact_change_otp_step_1 = require("./generate-contact-change-otp-step");
17
+ Object.defineProperty(exports, "generateContactChangeOtpStep", { enumerable: true, get: function () { return generate_contact_change_otp_step_1.generateContactChangeOtpStep; } });
16
18
  var prepare_template_data_step_1 = require("./prepare-template-data-step");
17
19
  Object.defineProperty(exports, "prepareTemplateDataStep", { enumerable: true, get: function () { return prepare_template_data_step_1.prepareTemplateDataStep; } });
18
20
  var find_customer_by_email_step_1 = require("./find-customer-by-email-step");
19
21
  Object.defineProperty(exports, "findCustomerByEmailStep", { enumerable: true, get: function () { return find_customer_by_email_step_1.findCustomerByEmailStep; } });
20
22
  var update_password_step_1 = require("./update-password-step");
21
23
  Object.defineProperty(exports, "updatePasswordStep", { enumerable: true, get: function () { return update_password_step_1.updatePasswordStep; } });
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUF3RTtBQUEvRCx1SUFBQSx3QkFBd0IsT0FBQTtBQUNqQywyREFBdUQ7QUFBOUMsc0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsbUVBQStEO0FBQXRELDhIQUFBLG9CQUFvQixPQUFBO0FBQzdCLG1FQUErRDtBQUF0RCw4SEFBQSxvQkFBb0IsT0FBQTtBQUM3QixpRkFBNEU7QUFBbkUsMklBQUEsMEJBQTBCLE9BQUE7QUFDbkMseURBQXFEO0FBQTVDLG9IQUFBLGVBQWUsT0FBQTtBQUN4QiwyRUFBc0U7QUFBN0QscUlBQUEsdUJBQXVCLE9BQUE7QUFDaEMsNkVBQXVFO0FBQTlELHNJQUFBLHVCQUF1QixPQUFBO0FBQ2hDLCtEQUEyRDtBQUFsRCwwSEFBQSxrQkFBa0IsT0FBQSJ9
24
+ var sync_phonepass_entity_id_step_1 = require("./sync-phonepass-entity-id-step");
25
+ Object.defineProperty(exports, "syncPhonepassEntityIdStep", { enumerable: true, get: function () { return sync_phonepass_entity_id_step_1.syncPhonepassEntityIdStep; } });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUF3RTtBQUEvRCx1SUFBQSx3QkFBd0IsT0FBQTtBQUNqQywyREFBdUQ7QUFBOUMsc0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsbUVBQStEO0FBQXRELDhIQUFBLG9CQUFvQixPQUFBO0FBQzdCLG1FQUErRDtBQUF0RCw4SEFBQSxvQkFBb0IsT0FBQTtBQUM3QixpRkFBNEU7QUFBbkUsMklBQUEsMEJBQTBCLE9BQUE7QUFDbkMseURBQXFEO0FBQTVDLG9IQUFBLGVBQWUsT0FBQTtBQUN4Qix1RkFBaUY7QUFBeEUsZ0pBQUEsNEJBQTRCLE9BQUE7QUFDckMsMkVBQXNFO0FBQTdELHFJQUFBLHVCQUF1QixPQUFBO0FBQ2hDLDZFQUF1RTtBQUE5RCxzSUFBQSx1QkFBdUIsT0FBQTtBQUNoQywrREFBMkQ7QUFBbEQsMEhBQUEsa0JBQWtCLE9BQUE7QUFDM0IsaUZBQTJFO0FBQWxFLDBJQUFBLHlCQUF5QixPQUFBIn0=
@@ -4,6 +4,7 @@ exports.resolveChannelConfigStep = void 0;
4
4
  const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
6
  const otp_verification_1 = require("../../modules/otp-verification");
7
+ const otp_verification_2 = require("../../modules/otp-verification/models/otp-verification");
7
8
  exports.resolveChannelConfigStep = (0, workflows_sdk_1.createStep)("resolve-channel-config", async (input, { container }) => {
8
9
  const config = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
9
10
  const otpService = container.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
@@ -11,8 +12,16 @@ exports.resolveChannelConfigStep = (0, workflows_sdk_1.createStep)("resolve-chan
11
12
  if (!channelConfig || !channelConfig.channel) {
12
13
  throw new Error(`Channel configuration not found for type: ${input.type}. Please configure ${input.type} in plugin options with a 'channel' property.`);
13
14
  }
15
+ const deletionPurposes = [
16
+ otp_verification_2.OtpPurpose.ACCOUNT_DELETION_REQUEST,
17
+ otp_verification_2.OtpPurpose.ACCOUNT_DELETION_CANCEL,
18
+ ];
19
+ if (deletionPurposes.includes(input.type) &&
20
+ (!channelConfig.template || typeof channelConfig.template !== "string")) {
21
+ throw new Error(`account_deletion_request.template and account_deletion_cancel.template must be set in plugin options for account deletion flows.`);
22
+ }
14
23
  return new workflows_sdk_1.StepResponse({
15
24
  channelConfig,
16
25
  });
17
26
  });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1jaGFubmVsLWNvbmZpZy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZXNvbHZlLWNoYW5uZWwtY29uZmlnLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBQzVFLHFEQUFxRTtBQUNyRSxxRUFBd0U7QUFZM0QsUUFBQSx3QkFBd0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2hELHdCQUF3QixFQUN4QixLQUFLLEVBQUUsS0FBZ0MsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDeEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN6RSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUNsQywwQ0FBdUIsQ0FDRSxDQUFBO0lBRTNCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyw0QkFBNEIsQ0FDM0QsS0FBSyxDQUFDLElBQUksRUFDVixNQUFNLENBQ0EsQ0FBQTtJQUVSLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYiw2Q0FBNkMsS0FBSyxDQUFDLElBQUksc0JBQXNCLEtBQUssQ0FBQyxJQUFJLCtDQUErQyxDQUN2SSxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUE2QjtRQUNsRCxhQUFhO0tBQ2QsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1jaGFubmVsLWNvbmZpZy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZXNvbHZlLWNoYW5uZWwtY29uZmlnLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBQzVFLHFEQUFxRTtBQUNyRSxxRUFBd0U7QUFFeEUsNkZBQW1GO0FBVXRFLFFBQUEsd0JBQXdCLEdBQUcsSUFBQSwwQkFBVSxFQUNoRCx3QkFBd0IsRUFDeEIsS0FBSyxFQUFFLEtBQWdDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDekUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDbEMsMENBQXVCLENBQ3hCLENBQUE7SUFFRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsNEJBQTRCLENBQzNELEtBQUssQ0FBQyxJQUFJLEVBQ1YsTUFBTSxDQUNBLENBQUE7SUFFUixJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkNBQTZDLEtBQUssQ0FBQyxJQUFJLHNCQUFzQixLQUFLLENBQUMsSUFBSSwrQ0FBK0MsQ0FDdkksQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHO1FBQ3ZCLDZCQUFVLENBQUMsd0JBQXdCO1FBQ25DLDZCQUFVLENBQUMsdUJBQXVCO0tBQ25DLENBQUE7SUFDRCxJQUNFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxJQUFJLE9BQU8sYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsRUFDdkUsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isa0lBQWtJLENBQ25JLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQTZCO1FBQ2xELGFBQWE7S0FDZCxDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
@@ -123,43 +123,33 @@ function prepareSmsPayload(to, channel, renderedContent) {
123
123
  exports.sendNotificationStep = (0, workflows_sdk_1.createStep)("send-notification", async (input, { container }) => {
124
124
  let payload;
125
125
  if (input.contactType === "email") {
126
- console.log("[send-notification] Preparing email payload");
127
126
  payload = prepareEmailPayload(input.to, input.renderedContent, input.channelConfig, input.templateData);
128
- console.log("Email payload:", JSON.stringify(payload, null, 2));
129
127
  }
130
128
  else {
131
- console.log("[send-notification] Preparing SMS payload");
132
129
  payload = prepareSmsPayload(input.to, input.channel, input.renderedContent);
133
- console.log("SMS payload:", JSON.stringify(payload, null, 2));
134
130
  }
135
131
  // Use notification service with payload structure matching sendNotificationsStep
136
132
  const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
137
133
  if (!notificationService) {
138
134
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Notification service is not configured.");
139
135
  }
140
- console.log("=== [send-notification] Attempting to send ===");
141
- console.log("Payload:", JSON.stringify(payload, null, 2));
142
136
  // Use create method with payload structure matching @medusajs/medusa/core-flows
143
137
  try {
144
138
  if (typeof notificationService.create === "function") {
145
139
  await notificationService.create(payload);
146
- console.log("[send-notification] Successfully sent using notificationService.create");
147
140
  }
148
141
  else if (typeof notificationService.createNotifications === "function") {
149
142
  await notificationService.createNotifications([payload]);
150
- console.log("[send-notification] Successfully sent using notificationService.createNotifications");
151
143
  }
152
144
  else {
153
145
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Notification service does not support sending notifications.");
154
146
  }
155
147
  }
156
148
  catch (error) {
157
- console.error("[send-notification] Failed to send notification:", error);
158
149
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to send notification: ${error instanceof Error ? error.message : String(error)}`);
159
150
  }
160
- console.log("=== [send-notification] Notification Sent Successfully ===");
161
151
  return new workflows_sdk_1.StepResponse({
162
152
  sent: true,
163
153
  });
164
154
  });
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1ub3RpZmljYXRpb24tc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc2VuZC1ub3RpZmljYXRpb24tc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxRUFBNEU7QUFDNUUscURBQWdFO0FBQ2hFLDRFQUFtRztBQUNuRywyQ0FBNEI7QUFnQjVCOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQzFCLEVBQVUsRUFDVixlQUE4QixFQUM5QixhQUFrQixFQUNsQixZQUEwQjtJQUUxQixpRUFBaUU7SUFDakUsSUFBSSxTQUFTLEdBQUcsZUFBZSxDQUFBO0lBQy9CLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25DLHlDQUF5QztRQUN6QywwRkFBMEY7UUFDMUYsdUVBQXVFO1FBQ3ZFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDdEMsU0FBUyxFQUNULHNEQUFzRCxDQUN2RCxDQUFBO1FBRUQsU0FBUyxHQUFHLElBQUEsZ0NBQXFCLEVBQUMsbUJBQW1CLEVBQUU7WUFDckQsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHO1lBQ3JCLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYSxJQUFJLFVBQVU7U0FDeEQsQ0FBQyxDQUFBO1FBRUYscURBQXFEO1FBQ3JELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFBO1lBQzdELFNBQVMsR0FBRzs7Ozt1QkFJSyxZQUFZOzs7Z0JBR25CLFlBQVksQ0FBQyxHQUFHOzs7Ozs7O09BT3pCLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLFNBQVMsR0FBRyxTQUFT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
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1ub3RpZmljYXRpb24tc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvc2VuZC1ub3RpZmljYXRpb24tc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxRUFBNEU7QUFDNUUscURBQWdFO0FBQ2hFLDRFQUFtRztBQUNuRywyQ0FBNEI7QUFnQjVCOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQzFCLEVBQVUsRUFDVixlQUE4QixFQUM5QixhQUFrQixFQUNsQixZQUEwQjtJQUUxQixpRUFBaUU7SUFDakUsSUFBSSxTQUFTLEdBQUcsZUFBZSxDQUFBO0lBQy9CLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25DLHlDQUF5QztRQUN6QywwRkFBMEY7UUFDMUYsdUVBQXVFO1FBQ3ZFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDdEMsU0FBUyxFQUNULHNEQUFzRCxDQUN2RCxDQUFBO1FBRUQsU0FBUyxHQUFHLElBQUEsZ0NBQXFCLEVBQUMsbUJBQW1CLEVBQUU7WUFDckQsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHO1lBQ3JCLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYSxJQUFJLFVBQVU7U0FDeEQsQ0FBQyxDQUFBO1FBRUYscURBQXFEO1FBQ3JELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFBO1lBQzdELFNBQVMsR0FBRzs7Ozt1QkFJSyxZQUFZOzs7Z0JBR25CLFlBQVksQ0FBQyxHQUFHOzs7Ozs7O09BT3pCLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxNQUFNLFNBQVMsR0FBRyxTQUFT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
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncPhonepassEntityIdStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ /**
7
+ * After a customer verifies a new phone number, update the phonepass
8
+ * provider_identity.entity_id so the customer can log in with the new number.
9
+ *
10
+ * This is needed because phonepass.authenticate() looks up the identity by
11
+ * entity_id. If the customer changed their phone and the entity_id is stale,
12
+ * login silently fails even though the password is correct.
13
+ */
14
+ exports.syncPhonepassEntityIdStep = (0, workflows_sdk_1.createStep)("sync-phonepass-entity-id", async (input, { container }) => {
15
+ const { login_identifier } = input;
16
+ // Only sync when phonepass is actually used for login
17
+ if (login_identifier !== "phone" && login_identifier !== "both") {
18
+ return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: null }, null);
19
+ }
20
+ const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
21
+ // Get the customer's current phone
22
+ const customerRow = await knex.raw(`SELECT phone FROM customer WHERE id = ? LIMIT 1`, [input.customer_id]);
23
+ const currentPhone = (customerRow.rows?.[0] ?? customerRow[0]?.[0])?.phone ?? null;
24
+ if (!currentPhone) {
25
+ return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: null }, null);
26
+ }
27
+ // Find the auth_identity for this customer
28
+ const authRow = await knex.raw(`SELECT id FROM auth_identity WHERE app_metadata->>'customer_id' = ? LIMIT 1`, [input.customer_id]);
29
+ const authIdentityId = (authRow.rows?.[0] ?? authRow[0]?.[0])?.id ?? null;
30
+ if (!authIdentityId) {
31
+ return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: null }, null);
32
+ }
33
+ // Find the phonepass provider_identity linked to this auth identity
34
+ const piRow = await knex.raw(`SELECT id, entity_id
35
+ FROM provider_identity
36
+ WHERE auth_identity_id = ? AND provider = 'phonepass'
37
+ LIMIT 1`, [authIdentityId]);
38
+ const pi = piRow.rows?.[0] ?? piRow[0]?.[0] ?? null;
39
+ if (!pi) {
40
+ // No phonepass identity exists — nothing to sync
41
+ return new workflows_sdk_1.StepResponse({ synced: false, old_phone: null, new_phone: currentPhone }, null);
42
+ }
43
+ const oldPhone = pi.entity_id;
44
+ if (oldPhone === currentPhone) {
45
+ // entity_id is already up to date
46
+ return new workflows_sdk_1.StepResponse({ synced: false, old_phone: oldPhone, new_phone: currentPhone }, null);
47
+ }
48
+ await knex.raw(`UPDATE provider_identity
49
+ SET entity_id = ?, updated_at = NOW()
50
+ WHERE id = ?`, [currentPhone, pi.id]);
51
+ return new workflows_sdk_1.StepResponse({ synced: true, old_phone: oldPhone, new_phone: currentPhone }, { provider_identity_id: pi.id, old_phone: oldPhone });
52
+ },
53
+ // Compensation: restore the old entity_id if a later step in the workflow fails.
54
+ // Medusa calls this with `undefined` when no compensation data was set.
55
+ async (compensationData, { container }) => {
56
+ if (!compensationData)
57
+ return;
58
+ const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
59
+ await knex.raw(`UPDATE provider_identity
60
+ SET entity_id = ?, updated_at = NOW()
61
+ WHERE id = ?`, [compensationData.old_phone, compensationData.provider_identity_id]);
62
+ });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1waG9uZXBhc3MtZW50aXR5LWlkLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3N5bmMtcGhvbmVwYXNzLWVudGl0eS1pZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBcUU7QUF1QnJFOzs7Ozs7O0dBT0c7QUFDVSxRQUFBLHlCQUF5QixHQUFHLElBQUEsMEJBQVUsRUFDakQsMEJBQTBCLEVBQzFCLEtBQUssRUFBRSxLQUFpQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQXdFLEVBQUU7SUFDL0gsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRWxDLHNEQUFzRDtJQUN0RCxJQUFJLGdCQUFnQixLQUFLLE9BQU8sSUFBSSxnQkFBZ0IsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxPQUFPLElBQUksNEJBQVksQ0FDckIsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUNuRCxJQUFJLENBQ0wsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRXZFLG1DQUFtQztJQUNuQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQ2hDLGlEQUFpRCxFQUNqRCxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FDcEIsQ0FBQTtJQUNELE1BQU0sWUFBWSxHQUNoQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUE7SUFFL0QsSUFBSSxDQUFDLFlBQVksRUFBRSxD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
@@ -3,42 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updatePasswordStep = void 0;
4
4
  const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
5
  const utils_1 = require("@medusajs/framework/utils");
6
- exports.updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id, password_hash }, { container }) => {
6
+ exports.updatePasswordStep = (0, workflows_sdk_1.createStep)("update-password", async ({ customer_id, new_password }, { container }) => {
7
7
  if (!customer_id) {
8
8
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Customer ID is required");
9
9
  }
10
- if (!password_hash) {
11
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password hash is required");
10
+ if (!new_password) {
11
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "New password is required");
12
12
  }
13
- // Get customer to retrieve email
14
13
  const customerService = container.resolve(utils_1.Modules.CUSTOMER);
15
14
  const customer = await customerService.retrieveCustomer(customer_id);
16
- if (!customer || !customer.email) {
17
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found or email missing");
15
+ if (!customer) {
16
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer not found");
18
17
  }
19
- // Get PostgreSQL connection (Knex instance) from container
20
- const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
21
- // Find provider_identity by entity_id (customer email) and provider
22
- const providerIdentityResult = await knex.raw(`SELECT id, provider_metadata
23
- FROM provider_identity
24
- WHERE entity_id = ? AND provider = 'emailpass'
25
- LIMIT 1`, [customer.email.toLowerCase()]);
26
- const providerIdentity = providerIdentityResult.rows?.[0] || providerIdentityResult[0]?.[0];
27
- if (!providerIdentity) {
28
- throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Provider identity not found for customer");
18
+ // Resolve provider and entity_id supports both emailpass and phonepass
19
+ const provider = customer.email ? "emailpass" : "phonepass";
20
+ const entity_id = customer.email
21
+ ? customer.email.toLowerCase()
22
+ : customer.phone;
23
+ if (!entity_id) {
24
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Customer has no email or phone — cannot update password");
29
25
  }
30
- // Update password hash in provider_metadata
31
- await knex.raw(`UPDATE provider_identity
32
- SET provider_metadata = jsonb_set(
33
- COALESCE(provider_metadata, '{}'::jsonb),
34
- '{password}',
35
- to_jsonb(?::text)
36
- ),
37
- updated_at = NOW()
38
- WHERE id = ?`, [password_hash, providerIdentity.id]);
39
- return new workflows_sdk_1.StepResponse({
40
- customer_id,
41
- success: true,
26
+ const authService = container.resolve(utils_1.Modules.AUTH);
27
+ const updateResult = await authService.updateProvider(provider, {
28
+ entity_id,
29
+ password: new_password,
42
30
  });
31
+ if (!updateResult.success) {
32
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, updateResult.error || "Failed to update password");
33
+ }
34
+ return new workflows_sdk_1.StepResponse({ customer_id, success: true });
43
35
  });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXBhc3N3b3JkLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1wYXNzd29yZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBMkY7QUFhOUUsUUFBQSxrQkFBa0IsR0FBRyxJQUFBLDBCQUFVLEVBQzFDLGlCQUFpQixFQUNqQixLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUF1QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMzRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseUJBQXlCLENBQzFCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDJCQUEyQixDQUM1QixDQUFBO0lBQ0gsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUN2QyxlQUFPLENBQUMsUUFBUSxDQUNqQixDQUFBO0lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFcEUsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixxQ0FBcUMsQ0FDdEMsQ0FBQTtJQUNILENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUV2RSxvRUFBb0U7SUFDcEUsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQzNDOzs7ZUFHUyxFQUNULENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUMvQixDQUFBO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTNGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLDBDQUEwQyxDQUMzQyxDQUFBO0lBQ0gsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQ1o7Ozs7Ozs7b0JBT2MsRUFDZCxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FDckMsQ0FBQTtJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUF1QjtRQUM1QyxXQUFXO1FBQ1gsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXBhc3N3b3JkLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3VwZGF0ZS1wYXNzd29yZC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUE0RTtBQUM1RSxxREFBZ0U7QUFjbkQsUUFBQSxrQkFBa0IsR0FBRyxJQUFBLDBCQUFVLEVBQzFDLGlCQUFpQixFQUNqQixLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUF1QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMxRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIseUJBQXlCLENBQzFCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLDBCQUEwQixDQUMzQixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXlCLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVwRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBQzNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLO1FBQzlCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUM5QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQTtJQUVsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQix5REFBeUQsQ0FDMUQsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNuRCxNQUFNLFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1FBQzlELFNBQVM7UUFDVCxRQUFRLEVBQUUsWUFBWTtLQUN2QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsWUFBWSxDQUFDLEtBQUssSUFBSSwyQkFBMkIsQ0FDbEQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBdUIsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDL0UsQ0FBQyxDQUNGLENBQUEifQ==