customer-registration 0.0.118 → 0.0.119
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/api/middlewares/validate-customer-registration.js +17 -1
- package/.medusa/server/src/api/store/customers/route.js +7 -2
- package/.medusa/server/src/api/store/customers/shared/__tests__/is-social-pending-customer-registration.test.js +27 -0
- package/.medusa/server/src/api/store/customers/shared/is-social-pending-customer-registration.js +40 -0
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.validateCustomerRegistration = validateCustomerRegistration;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
5
|
const config_1 = require("../../config");
|
|
6
|
+
const is_social_pending_customer_registration_1 = require("../store/customers/shared/is-social-pending-customer-registration");
|
|
6
7
|
const VALID_IDENTIFIERS = ["email", "phone", "both"];
|
|
7
8
|
const EMAIL_REGEX = /^\S+@\S+\.\S+$/;
|
|
8
9
|
const PHONE_REGEX = /^\+?[0-9]{8,15}$/;
|
|
@@ -16,6 +17,10 @@ const PHONE_REGEX = /^\+?[0-9]{8,15}$/;
|
|
|
16
17
|
*
|
|
17
18
|
* Format validation applies to any field that is present, regardless of
|
|
18
19
|
* whether it was required, so bad data is always rejected early.
|
|
20
|
+
*
|
|
21
|
+
* OAuth (e.g. Google) completes with the same route but an auth identity that
|
|
22
|
+
* only has social providers — presence rules for `registration.identifier` do
|
|
23
|
+
* not apply.
|
|
19
24
|
*/
|
|
20
25
|
async function validateCustomerRegistration(req, res, next) {
|
|
21
26
|
// Defensive guard — the matcher in middlewares.ts already limits to POST,
|
|
@@ -33,7 +38,18 @@ async function validateCustomerRegistration(req, res, next) {
|
|
|
33
38
|
const { email, phone } = (req.body ?? {});
|
|
34
39
|
const emailNormalized = email?.trim() || undefined;
|
|
35
40
|
const phoneNormalized = phone?.trim() || undefined;
|
|
41
|
+
const authContext = req.auth_context;
|
|
42
|
+
const socialPending = await (0, is_social_pending_customer_registration_1.isSocialPendingCustomerRegistration)(req.scope, authContext?.auth_identity_id);
|
|
36
43
|
// --- Presence checks (identifier-specific) ---
|
|
44
|
+
if (socialPending) {
|
|
45
|
+
if (emailNormalized && !EMAIL_REGEX.test(emailNormalized)) {
|
|
46
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid email format");
|
|
47
|
+
}
|
|
48
|
+
if (phoneNormalized && !PHONE_REGEX.test(phoneNormalized)) {
|
|
49
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid phone number format. Must be 8–15 digits, optionally prefixed with +");
|
|
50
|
+
}
|
|
51
|
+
return next();
|
|
52
|
+
}
|
|
37
53
|
if (identifier === "email" && !emailNormalized) {
|
|
38
54
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required for registration");
|
|
39
55
|
}
|
|
@@ -57,4 +73,4 @@ async function validateCustomerRegistration(req, res, next) {
|
|
|
57
73
|
}
|
|
58
74
|
next();
|
|
59
75
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtY3VzdG9tZXItcmVnaXN0cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9taWRkbGV3YXJlcy92YWxpZGF0ZS1jdXN0b21lci1yZWdpc3RyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQ0Esb0VBNEdDO0FBdklELHFEQUFrRjtBQUNsRix5Q0FHcUI7QUFDckIsK0hBQXVIO0FBRXZILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBVSxDQUFBO0FBRTdELE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFBO0FBQ3BDLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFBO0FBRXRDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0ksS0FBSyxVQUFVLDRCQUE0QixDQUNoRCxHQUFrQixFQUNsQixHQUFtQixFQUNuQixJQUF3QjtJQUV4QiwwRUFBMEU7SUFDMUUsbURBQW1EO0lBQ25ELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2YsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNwQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQ3hDLENBQUE7SUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFBLDJDQUFrQyxFQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFBO0lBRWxELGlFQUFpRTtJQUNqRSxJQUFJLENBQUUsaUJBQXVDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbURBQW1ELFVBQVUsc0JBQXNCLGlCQUFpQixDQUFDLElBQUks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
|
|
@@ -4,6 +4,7 @@ exports.POST = void 0;
|
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
5
|
const core_flows_1 = require("@medusajs/core-flows");
|
|
6
6
|
const config_1 = require("../../../config");
|
|
7
|
+
const is_social_pending_customer_registration_1 = require("./shared/is-social-pending-customer-registration");
|
|
7
8
|
/** Medusa / Knex raw results may use `rows` (node-pg) or `result[0]` batch shape. */
|
|
8
9
|
function firstKnexRow(result) {
|
|
9
10
|
const fromRows = result.rows?.[0];
|
|
@@ -30,6 +31,9 @@ function firstKnexRow(result) {
|
|
|
30
31
|
* Medusa's existing validations (duplicate email check, etc.) are preserved.
|
|
31
32
|
* For "phone" and "both" we also reject when another customer already has this
|
|
32
33
|
* phone with has_account = true.
|
|
34
|
+
*
|
|
35
|
+
* OAuth-only pending identities (e.g. Google) use the workflow path like email
|
|
36
|
+
* so phone is not required for `identifier` "both" or "phone".
|
|
33
37
|
*/
|
|
34
38
|
const POST = async (req, res) => {
|
|
35
39
|
const authContext = req.auth_context;
|
|
@@ -41,10 +45,11 @@ const POST = async (req, res) => {
|
|
|
41
45
|
const { identifier } = options.registration;
|
|
42
46
|
const authIdentityId = authContext?.auth_identity_id;
|
|
43
47
|
const customerData = (req.body ?? {});
|
|
48
|
+
const socialPending = await (0, is_social_pending_customer_registration_1.isSocialPendingCustomerRegistration)(req.scope, authIdentityId);
|
|
44
49
|
const phoneNormalized = customerData.phone != null && String(customerData.phone).trim() !== ""
|
|
45
50
|
? String(customerData.phone).trim()
|
|
46
51
|
: "";
|
|
47
|
-
if (identifier === "email") {
|
|
52
|
+
if (identifier === "email" || socialPending) {
|
|
48
53
|
const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(req.scope).run({
|
|
49
54
|
input: {
|
|
50
55
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -116,4 +121,4 @@ async function refetchCustomer(customerId, scope) {
|
|
|
116
121
|
const customers = await remoteQuery(queryObject);
|
|
117
122
|
return customers[0];
|
|
118
123
|
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxREFLa0M7QUFDbEMscURBQW9FO0FBQ3BFLDRDQUd3QjtBQUN4Qiw4R0FBc0c7QUFFdEcscUZBQXFGO0FBQ3JGLFNBQVMsWUFBWSxDQUNuQixNQUFtQztJQUVuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakMsSUFBSSxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3pFLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3RCLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxPQUFPLEtBQVUsQ0FBQTtRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNJLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLFdBQVcsR0FDZixHQUdELENBQUMsWUFBWSxDQUFBO0lBRWQsSUFBSSxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLG1CQUFXLENB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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const is_social_pending_customer_registration_1 = require("../is-social-pending-customer-registration");
|
|
5
|
+
(0, vitest_1.describe)("isSocialOnlyProviderList", () => {
|
|
6
|
+
const cases = [
|
|
7
|
+
{ title: "google only", providers: ["google"], want: true },
|
|
8
|
+
{ title: "github only", providers: ["github"], want: true },
|
|
9
|
+
{ title: "empty list", providers: [], want: false },
|
|
10
|
+
{ title: "emailpass only", providers: ["emailpass"], want: false },
|
|
11
|
+
{ title: "phonepass only", providers: ["phonepass"], want: false },
|
|
12
|
+
{
|
|
13
|
+
title: "google and emailpass",
|
|
14
|
+
providers: ["google", "emailpass"],
|
|
15
|
+
want: false,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
title: "multiple social",
|
|
19
|
+
providers: ["google", "facebook"],
|
|
20
|
+
want: true,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
vitest_1.it.each(cases)("$title", ({ providers, want }) => {
|
|
24
|
+
(0, vitest_1.expect)((0, is_social_pending_customer_registration_1.isSocialOnlyProviderList)(providers)).toBe(want);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtc29jaWFsLXBlbmRpbmctY3VzdG9tZXItcmVnaXN0cmF0aW9uLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9zaGFyZWQvX190ZXN0c19fL2lzLXNvY2lhbC1wZW5kaW5nLWN1c3RvbWVyLXJlZ2lzdHJhdGlvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQTZDO0FBQzdDLHdHQUFxRjtBQUVyRixJQUFBLGlCQUFRLEVBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLE1BQU0sS0FBSyxHQUlOO1FBQ0gsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7UUFDM0QsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7UUFDM0QsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUNuRCxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1FBQ2xFLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7UUFDbEU7WUFDRSxLQUFLLEVBQUUsc0JBQXNCO1lBQzdCLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUM7WUFDbEMsSUFBSSxFQUFFLEtBQUs7U0FDWjtRQUNEO1lBQ0UsS0FBSyxFQUFFLGlCQUFpQjtZQUN4QixTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQ2pDLElBQUksRUFBRSxJQUFJO1NBQ1g7S0FDRixDQUFBO0lBRUQsV0FBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQy9DLElBQUEsZUFBTSxFQUFDLElBQUEsa0VBQXdCLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSJ9
|
package/.medusa/server/src/api/store/customers/shared/is-social-pending-customer-registration.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSocialOnlyProviderList = isSocialOnlyProviderList;
|
|
4
|
+
exports.isSocialPendingCustomerRegistration = isSocialPendingCustomerRegistration;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const PASSWORD_AUTH_PROVIDERS = new Set(["emailpass", "phonepass"]);
|
|
7
|
+
/**
|
|
8
|
+
* True when every provider on the identity is non-password (e.g. google only).
|
|
9
|
+
* Used for table-driven tests and for interpreting DB rows.
|
|
10
|
+
*/
|
|
11
|
+
function isSocialOnlyProviderList(providers) {
|
|
12
|
+
if (providers.length === 0) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return providers.every((p) => !PASSWORD_AUTH_PROVIDERS.has(p));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* After OAuth callback the JWT has `auth_identity_id` but no `customer_id` yet.
|
|
19
|
+
* If the identity only has social providers (not emailpass/phonepass), plugin
|
|
20
|
+
* registration rules for email/phone must not apply the same way as password signup.
|
|
21
|
+
*/
|
|
22
|
+
async function isSocialPendingCustomerRegistration(scope, authIdentityId) {
|
|
23
|
+
if (!authIdentityId) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const knex = scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
27
|
+
const raw = await knex.raw(`SELECT provider FROM provider_identity WHERE auth_identity_id = ?`, [authIdentityId]);
|
|
28
|
+
const batch = raw;
|
|
29
|
+
const fromRows = batch.rows;
|
|
30
|
+
const rows = Array.isArray(fromRows)
|
|
31
|
+
? fromRows
|
|
32
|
+
: Array.isArray(batch[0])
|
|
33
|
+
? batch[0]
|
|
34
|
+
: [];
|
|
35
|
+
const providers = rows
|
|
36
|
+
.map((r) => (typeof r?.provider === "string" ? r.provider : ""))
|
|
37
|
+
.filter(Boolean);
|
|
38
|
+
return isSocialOnlyProviderList(providers);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtc29jaWFsLXBlbmRpbmctY3VzdG9tZXItcmVnaXN0cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zdG9yZS9jdXN0b21lcnMvc2hhcmVkL2lzLXNvY2lhbC1wZW5kaW5nLWN1c3RvbWVyLXJlZ2lzdHJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLDREQUtDO0FBT0Qsa0ZBdUJDO0FBM0NELHFEQUFxRTtBQUVyRSxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7QUFFbkU7OztHQUdHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsU0FBNEI7SUFDbkUsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxtQ0FBbUMsQ0FDdkQsS0FBc0IsRUFDdEIsY0FBa0M7SUFFbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDbkUsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUN4QixtRUFBbUUsRUFDbkUsQ0FBQyxjQUFjLENBQUMsQ0FDakIsQ0FBQTtJQUNELE1BQU0sS0FBSyxHQUFHLEdBQTJELENBQUE7SUFDekUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQTtJQUMzQixNQUFNLElBQUksR0FBaUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDaEUsQ0FBQyxDQUFDLFFBQVE7UUFDVixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFFLEtBQUssQ0FBQyxDQUFDLENBQWtDO1lBQzVDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDUixNQUFNLFNBQVMsR0FBRyxJQUFJO1NBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMvRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEIsT0FBTyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUM1QyxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "customer-registration",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.119",
|
|
4
4
|
"description": "Medusa plugin that overrides store customer registration, enforces email/phone verification flags, and provides OTP management module.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|