@lana-commerce/core 13.1.0-alpha.11 → 13.1.0-alpha.13
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/CHANGELOG.md +1 -0
- package/cjs/graphql/fragments/Customer.js +1 -1
- package/cjs/graphql/fragments/Shop.js +1 -1
- package/cjs/modules/customer.js +98 -7
- package/esm/graphql/fragments/Customer.js +1 -1
- package/esm/graphql/fragments/Shop.js +1 -1
- package/esm/modules/customer.js +98 -7
- package/package.json +1 -1
- package/types/dataLoader.d.ts +1 -0
- package/types/graphql/fragments/Customer.d.ts +1 -1
- package/types/graphql/fragments/Shop.d.ts +1 -1
- package/types/graphql/types.d.ts +2 -0
- package/types/json/commerceTypes.d.ts +4 -0
- package/types/json/storefrontTypes.d.ts +2 -0
- package/types/modules/customer.d.ts +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -15,6 +15,7 @@ This project adheres to [Semantic Versioning][semantic versioning].
|
|
|
15
15
|
- Add "wrapWebSocket" function to "websocket" lib.
|
|
16
16
|
- Propagate new "meta" field for invoice line item descriptions.
|
|
17
17
|
- Add "webauthn" logic to "customer" module.
|
|
18
|
+
- Add webauthn related fields to customer/shop fragments.
|
|
18
19
|
|
|
19
20
|
### Patch Changes
|
|
20
21
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = "fragment Customer on StorefrontCustomer{id email name display_name mobile mobile_notifications accepts_marketing reminder_messages addresses{...FullAddress}mobile mobile_notifications default_billing_address_id default_shipping_address_id default_payment_source_id is_guest password_defined oauth_provider}\n";
|
|
3
|
+
exports.default = "fragment Customer on StorefrontCustomer{id email name display_name mobile mobile_notifications accepts_marketing reminder_messages addresses{...FullAddress}mobile mobile_notifications default_billing_address_id default_shipping_address_id default_payment_source_id is_guest password_defined oauth_provider webauthn_enabled}\n";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = "fragment Shop on StorefrontShop{app_domain created_at currency customer_service_email id name product_review_enabled tax_label timezone primary_domain{domain id}customer_oauth_providers{...CustomerOAuthProvider}tips_enabled tips_variant{id}}\n";
|
|
3
|
+
exports.default = "fragment Shop on StorefrontShop{app_domain created_at currency customer_service_email id name product_review_enabled tax_label timezone primary_domain{domain id}customer_oauth_providers{...CustomerOAuthProvider}tips_enabled tips_variant{id}customer_webauthn}\n";
|
package/cjs/modules/customer.js
CHANGED
|
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const jwt_decode_1 = tslib_1.__importDefault(require("jwt-decode"));
|
|
6
6
|
const effector_1 = require("effector");
|
|
7
7
|
const browser_1 = require("@simplewebauthn/browser");
|
|
8
|
+
const AddWebauthnMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/AddWebauthnMutation.js"));
|
|
8
9
|
const ApplyGiftCardMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/ApplyGiftCardMutation.js"));
|
|
9
10
|
const CancelOrderMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/CancelOrderMutation.js"));
|
|
10
11
|
const CancelSubscriptionMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/CancelSubscriptionMutation.js"));
|
|
@@ -14,6 +15,7 @@ const CreatePaymentSourceMutation_js_1 = tslib_1.__importDefault(require("../gra
|
|
|
14
15
|
const CreateReturnMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/CreateReturnMutation.js"));
|
|
15
16
|
const DeleteFavoriteMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/DeleteFavoriteMutation.js"));
|
|
16
17
|
const DeletePaymentSourceMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/DeletePaymentSourceMutation.js"));
|
|
18
|
+
const DeleteWebauthnMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/DeleteWebauthnMutation.js"));
|
|
17
19
|
const DisconnectOAuth2Mutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/DisconnectOAuth2Mutation.js"));
|
|
18
20
|
const EditSubscriptionMutation_js_1 = tslib_1.__importDefault(require("../graphql/operations/EditSubscriptionMutation.js"));
|
|
19
21
|
const GetCustomerAddressesPageDataQuery_js_1 = tslib_1.__importDefault(require("../graphql/operations/GetCustomerAddressesPageDataQuery.js"));
|
|
@@ -388,7 +390,7 @@ function createWebauthnSignupPageGraph(binding) {
|
|
|
388
390
|
}
|
|
389
391
|
catch (err) {
|
|
390
392
|
console.error(err);
|
|
391
|
-
return { kind: "custom_error", text: "failure" };
|
|
393
|
+
return { kind: "custom_error", text: "webauthn failure" };
|
|
392
394
|
}
|
|
393
395
|
return (0, request_js_1.request)(SignUpMutation_js_1.default)({
|
|
394
396
|
shopID,
|
|
@@ -1783,7 +1785,7 @@ function createSigninPageGraph(binding) {
|
|
|
1783
1785
|
}
|
|
1784
1786
|
catch (err) {
|
|
1785
1787
|
console.error(err);
|
|
1786
|
-
return { kind: "custom_error", text: "failure" };
|
|
1788
|
+
return { kind: "custom_error", text: "webauthn failure" };
|
|
1787
1789
|
}
|
|
1788
1790
|
return (0, request_js_1.request)(SignInMutation_js_1.default)({
|
|
1789
1791
|
shopID,
|
|
@@ -1875,10 +1877,7 @@ function createSigninPageGraph(binding) {
|
|
|
1875
1877
|
});
|
|
1876
1878
|
const webauthnClick = (0, effector_1.createEvent)();
|
|
1877
1879
|
(0, effector_1.guard)({
|
|
1878
|
-
source: (0, effector_1.sample)(binding.internalConfig, webauthnClick, (config,
|
|
1879
|
-
config,
|
|
1880
|
-
data: {},
|
|
1881
|
-
})),
|
|
1880
|
+
source: (0, effector_1.sample)(binding.internalConfig, webauthnClick, (config, data) => ({ config, data })),
|
|
1882
1881
|
filter: binding.everythingIdle,
|
|
1883
1882
|
target: signInViaWebauthnFx,
|
|
1884
1883
|
});
|
|
@@ -2003,6 +2002,92 @@ function createOAuth2UtilsGraph(binding) {
|
|
|
2003
2002
|
somethingIsPending: (0, combineSome_js_1.combineSome)(connectFx.pending, disconnectFx.pending),
|
|
2004
2003
|
};
|
|
2005
2004
|
}
|
|
2005
|
+
//--------------------------------------------------------------------------------------------------------------------
|
|
2006
|
+
//--------------------------------------------------------------------------------------------------------------------
|
|
2007
|
+
//--------------------------------------------------------------------------------------------------------------------
|
|
2008
|
+
// not really a part of any page, but somewhat follows page graph conventions, except it doesn't have init.
|
|
2009
|
+
function createWebauthnUtilsGraph(binding) {
|
|
2010
|
+
const createWebauthn = (0, effector_1.createEvent)();
|
|
2011
|
+
const deleteWebauthn = (0, effector_1.createEvent)();
|
|
2012
|
+
const createFx = (0, effector_1.createEffect)((p) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
2013
|
+
const { shopID, opts } = p.config;
|
|
2014
|
+
if (!p.data) {
|
|
2015
|
+
return { kind: "custom_error", text: "no customer info" };
|
|
2016
|
+
}
|
|
2017
|
+
const email = p.data.customer.email;
|
|
2018
|
+
const name = p.data.customer.name;
|
|
2019
|
+
const resp = yield (0, request_js_1.request)(InitWebauthnMutation_js_1.default)({ shopID, email, name }, opts);
|
|
2020
|
+
if (resp.kind !== "data") {
|
|
2021
|
+
return resp;
|
|
2022
|
+
}
|
|
2023
|
+
let sessionID;
|
|
2024
|
+
let credential;
|
|
2025
|
+
try {
|
|
2026
|
+
sessionID = resp.data.session_id;
|
|
2027
|
+
credential = yield (0, browser_1.startRegistration)({ optionsJSON: JSON.parse(resp.data.options).publicKey });
|
|
2028
|
+
}
|
|
2029
|
+
catch (err) {
|
|
2030
|
+
console.error(err);
|
|
2031
|
+
return { kind: "custom_error", text: "webauthn failure" };
|
|
2032
|
+
}
|
|
2033
|
+
return (0, request_js_1.request)(AddWebauthnMutation_js_1.default)({ shopID, data: { webauthn_credential: JSON.stringify(credential), webauthn_session_id: sessionID } }, opts);
|
|
2034
|
+
}));
|
|
2035
|
+
const deleteFx = (0, effector_1.createEffect)((p) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
2036
|
+
const { shopID, opts } = p.config;
|
|
2037
|
+
return (0, request_js_1.request)(DeleteWebauthnMutation_js_1.default)({ shopID }, opts);
|
|
2038
|
+
}));
|
|
2039
|
+
// create flow
|
|
2040
|
+
{
|
|
2041
|
+
(0, effector_1.guard)({
|
|
2042
|
+
source: (0, effector_1.sample)((0, effector_1.combine)({ config: binding.internalConfig, customerInfo: binding.customerInfo }), createWebauthn, ({ config, customerInfo }, _data) => ({ config, data: customerInfo })),
|
|
2043
|
+
filter: binding.everythingIdle,
|
|
2044
|
+
target: createFx,
|
|
2045
|
+
});
|
|
2046
|
+
const { data: connectData, error: connectError } = (0, requestResponse_js_1.requestResponseSplit)(createFx.doneData);
|
|
2047
|
+
// success
|
|
2048
|
+
(0, effector_1.forward)({
|
|
2049
|
+
from: connectData,
|
|
2050
|
+
to: binding.fetchCustomerInfoNow,
|
|
2051
|
+
});
|
|
2052
|
+
(0, effector_1.forward)({
|
|
2053
|
+
from: connectData.map(() => "webauthn_created"),
|
|
2054
|
+
to: binding.message,
|
|
2055
|
+
});
|
|
2056
|
+
// failure
|
|
2057
|
+
(0, effector_1.forward)({
|
|
2058
|
+
from: connectError,
|
|
2059
|
+
to: binding.unexpectedError,
|
|
2060
|
+
});
|
|
2061
|
+
}
|
|
2062
|
+
// delete flow
|
|
2063
|
+
{
|
|
2064
|
+
(0, effector_1.guard)({
|
|
2065
|
+
source: (0, effector_1.sample)(binding.internalConfig, deleteWebauthn, (config, data) => ({ config, data })),
|
|
2066
|
+
filter: binding.everythingIdle,
|
|
2067
|
+
target: deleteFx,
|
|
2068
|
+
});
|
|
2069
|
+
const { data: disconnectData, error: disconnectError } = (0, requestResponse_js_1.requestResponseSplit)(deleteFx.doneData);
|
|
2070
|
+
// success
|
|
2071
|
+
(0, effector_1.forward)({
|
|
2072
|
+
from: disconnectData,
|
|
2073
|
+
to: binding.fetchCustomerInfoNow,
|
|
2074
|
+
});
|
|
2075
|
+
(0, effector_1.forward)({
|
|
2076
|
+
from: disconnectData.map(() => "webauthn_deleted"),
|
|
2077
|
+
to: binding.message,
|
|
2078
|
+
});
|
|
2079
|
+
// failure
|
|
2080
|
+
(0, effector_1.forward)({
|
|
2081
|
+
from: disconnectError,
|
|
2082
|
+
to: binding.unexpectedError,
|
|
2083
|
+
});
|
|
2084
|
+
}
|
|
2085
|
+
return {
|
|
2086
|
+
createWebauthn,
|
|
2087
|
+
deleteWebauthn,
|
|
2088
|
+
somethingIsPending: (0, combineSome_js_1.combineSome)(createFx.pending, deleteFx.pending),
|
|
2089
|
+
};
|
|
2090
|
+
}
|
|
2006
2091
|
function createCustomer(config, init) {
|
|
2007
2092
|
var _a;
|
|
2008
2093
|
const currency = config.currency || (0, effector_1.createStore)(config.shopCurrency);
|
|
@@ -2072,6 +2157,7 @@ function createCustomer(config, init) {
|
|
|
2072
2157
|
message,
|
|
2073
2158
|
fetchCustomerInfoNow,
|
|
2074
2159
|
oauth2,
|
|
2160
|
+
customerInfo,
|
|
2075
2161
|
};
|
|
2076
2162
|
config.jwt.on(setJWT, (_, v) => v);
|
|
2077
2163
|
customerInfo.on(setFavorites, (pv, favorites) => {
|
|
@@ -2125,6 +2211,7 @@ function createCustomer(config, init) {
|
|
|
2125
2211
|
paymentMethods: createPaymentMethodsPageGraph(binding),
|
|
2126
2212
|
};
|
|
2127
2213
|
const oauth2Utils = createOAuth2UtilsGraph(binding);
|
|
2214
|
+
const webauthnUtils = createWebauthnUtilsGraph(binding);
|
|
2128
2215
|
const currentPage = (0, effector_1.createStore)(null);
|
|
2129
2216
|
const loadPage = (0, effector_1.createEvent)();
|
|
2130
2217
|
const loadPageExt = (0, effector_1.sample)(currentPage, loadPage, (p, param) => ({
|
|
@@ -2188,7 +2275,7 @@ function createCustomer(config, init) {
|
|
|
2188
2275
|
],
|
|
2189
2276
|
to: currentPage,
|
|
2190
2277
|
});
|
|
2191
|
-
const somethingPending = (0, combineSome_js_1.combineSome)(pages.signin.somethingIsPending, pages.signup.somethingIsPending, pages.webauthnSignup.somethingIsPending, pages.resetPassword.somethingIsPending, pages.addresses.somethingIsPending, pages.favorites.somethingIsPending, pages.orders.somethingIsPending, pages.subscriptions.somethingIsPending, pages.returns.somethingIsPending, pages.order.somethingIsPending, pages.subscription.somethingIsPending, pages.return.somethingIsPending, pages.createReturn.somethingIsPending, pages.storeCredit.somethingIsPending, pages.profile.somethingIsPending, pages.paymentMethods.somethingIsPending, oauth2Utils.somethingIsPending);
|
|
2278
|
+
const somethingPending = (0, combineSome_js_1.combineSome)(pages.signin.somethingIsPending, pages.signup.somethingIsPending, pages.webauthnSignup.somethingIsPending, pages.resetPassword.somethingIsPending, pages.addresses.somethingIsPending, pages.favorites.somethingIsPending, pages.orders.somethingIsPending, pages.subscriptions.somethingIsPending, pages.returns.somethingIsPending, pages.order.somethingIsPending, pages.subscription.somethingIsPending, pages.return.somethingIsPending, pages.createReturn.somethingIsPending, pages.storeCredit.somethingIsPending, pages.profile.somethingIsPending, pages.paymentMethods.somethingIsPending, oauth2Utils.somethingIsPending, webauthnUtils.somethingIsPending);
|
|
2192
2279
|
(0, effector_1.forward)({
|
|
2193
2280
|
from: somethingPending.map((v) => !v),
|
|
2194
2281
|
to: everythingIdle,
|
|
@@ -2292,6 +2379,10 @@ function createCustomer(config, init) {
|
|
|
2292
2379
|
connect: oauth2Utils.connectOAuth2,
|
|
2293
2380
|
disconnect: oauth2Utils.disconnectOAuth2,
|
|
2294
2381
|
},
|
|
2382
|
+
webauthn: {
|
|
2383
|
+
create: webauthnUtils.createWebauthn,
|
|
2384
|
+
delete: webauthnUtils.deleteWebauthn,
|
|
2385
|
+
},
|
|
2295
2386
|
};
|
|
2296
2387
|
}
|
|
2297
2388
|
exports.createCustomer = createCustomer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default "fragment Customer on StorefrontCustomer{id email name display_name mobile mobile_notifications accepts_marketing reminder_messages addresses{...FullAddress}mobile mobile_notifications default_billing_address_id default_shipping_address_id default_payment_source_id is_guest password_defined oauth_provider}\n";
|
|
1
|
+
export default "fragment Customer on StorefrontCustomer{id email name display_name mobile mobile_notifications accepts_marketing reminder_messages addresses{...FullAddress}mobile mobile_notifications default_billing_address_id default_shipping_address_id default_payment_source_id is_guest password_defined oauth_provider webauthn_enabled}\n";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default "fragment Shop on StorefrontShop{app_domain created_at currency customer_service_email id name product_review_enabled tax_label timezone primary_domain{domain id}customer_oauth_providers{...CustomerOAuthProvider}tips_enabled tips_variant{id}}\n";
|
|
1
|
+
export default "fragment Shop on StorefrontShop{app_domain created_at currency customer_service_email id name product_review_enabled tax_label timezone primary_domain{domain id}customer_oauth_providers{...CustomerOAuthProvider}tips_enabled tips_variant{id}customer_webauthn}\n";
|
package/esm/modules/customer.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import jwtDecode from "jwt-decode";
|
|
2
2
|
import { combine, createEffect, createEvent, createStore, forward, guard, restore, sample, } from "effector";
|
|
3
3
|
import { startAuthentication, startRegistration } from "@simplewebauthn/browser";
|
|
4
|
+
import addWebauthnMutation from "../graphql/operations/AddWebauthnMutation.js";
|
|
4
5
|
import applyGiftCardMutation from "../graphql/operations/ApplyGiftCardMutation.js";
|
|
5
6
|
import cancelOrderMutation from "../graphql/operations/CancelOrderMutation.js";
|
|
6
7
|
import cancelSubscriptionMutation from "../graphql/operations/CancelSubscriptionMutation.js";
|
|
@@ -10,6 +11,7 @@ import createPaymentSourceMutation from "../graphql/operations/CreatePaymentSour
|
|
|
10
11
|
import createReturnMutation from "../graphql/operations/CreateReturnMutation.js";
|
|
11
12
|
import deleteFavoriteMutation from "../graphql/operations/DeleteFavoriteMutation.js";
|
|
12
13
|
import deletePaymentSourceMutation from "../graphql/operations/DeletePaymentSourceMutation.js";
|
|
14
|
+
import deletedWebauthnMutation from "../graphql/operations/DeleteWebauthnMutation.js";
|
|
13
15
|
import disconnectOAuth2Mutation from "../graphql/operations/DisconnectOAuth2Mutation.js";
|
|
14
16
|
import editSubscriptionMutation from "../graphql/operations/EditSubscriptionMutation.js";
|
|
15
17
|
import getCustomerAddressesPageDataQuery from "../graphql/operations/GetCustomerAddressesPageDataQuery.js";
|
|
@@ -389,7 +391,7 @@ function createWebauthnSignupPageGraph(binding) {
|
|
|
389
391
|
}
|
|
390
392
|
catch (err) {
|
|
391
393
|
console.error(err);
|
|
392
|
-
return { kind: "custom_error", text: "failure" };
|
|
394
|
+
return { kind: "custom_error", text: "webauthn failure" };
|
|
393
395
|
}
|
|
394
396
|
return request(signUpMutation)({
|
|
395
397
|
shopID,
|
|
@@ -1801,7 +1803,7 @@ function createSigninPageGraph(binding) {
|
|
|
1801
1803
|
}
|
|
1802
1804
|
catch (err) {
|
|
1803
1805
|
console.error(err);
|
|
1804
|
-
return { kind: "custom_error", text: "failure" };
|
|
1806
|
+
return { kind: "custom_error", text: "webauthn failure" };
|
|
1805
1807
|
}
|
|
1806
1808
|
return request(signInMutation)({
|
|
1807
1809
|
shopID,
|
|
@@ -1890,10 +1892,7 @@ function createSigninPageGraph(binding) {
|
|
|
1890
1892
|
});
|
|
1891
1893
|
const webauthnClick = createEvent();
|
|
1892
1894
|
guard({
|
|
1893
|
-
source: sample(binding.internalConfig, webauthnClick, (config,
|
|
1894
|
-
config,
|
|
1895
|
-
data: {},
|
|
1896
|
-
})),
|
|
1895
|
+
source: sample(binding.internalConfig, webauthnClick, (config, data) => ({ config, data })),
|
|
1897
1896
|
filter: binding.everythingIdle,
|
|
1898
1897
|
target: signInViaWebauthnFx,
|
|
1899
1898
|
});
|
|
@@ -2017,6 +2016,92 @@ function createOAuth2UtilsGraph(binding) {
|
|
|
2017
2016
|
somethingIsPending: combineSome(connectFx.pending, disconnectFx.pending),
|
|
2018
2017
|
};
|
|
2019
2018
|
}
|
|
2019
|
+
//--------------------------------------------------------------------------------------------------------------------
|
|
2020
|
+
//--------------------------------------------------------------------------------------------------------------------
|
|
2021
|
+
//--------------------------------------------------------------------------------------------------------------------
|
|
2022
|
+
// not really a part of any page, but somewhat follows page graph conventions, except it doesn't have init.
|
|
2023
|
+
function createWebauthnUtilsGraph(binding) {
|
|
2024
|
+
const createWebauthn = createEvent();
|
|
2025
|
+
const deleteWebauthn = createEvent();
|
|
2026
|
+
const createFx = createEffect(async (p) => {
|
|
2027
|
+
const { shopID, opts } = p.config;
|
|
2028
|
+
if (!p.data) {
|
|
2029
|
+
return { kind: "custom_error", text: "no customer info" };
|
|
2030
|
+
}
|
|
2031
|
+
const email = p.data.customer.email;
|
|
2032
|
+
const name = p.data.customer.name;
|
|
2033
|
+
const resp = await request(initWebauthnMutation)({ shopID, email, name }, opts);
|
|
2034
|
+
if (resp.kind !== "data") {
|
|
2035
|
+
return resp;
|
|
2036
|
+
}
|
|
2037
|
+
let sessionID;
|
|
2038
|
+
let credential;
|
|
2039
|
+
try {
|
|
2040
|
+
sessionID = resp.data.session_id;
|
|
2041
|
+
credential = await startRegistration({ optionsJSON: JSON.parse(resp.data.options).publicKey });
|
|
2042
|
+
}
|
|
2043
|
+
catch (err) {
|
|
2044
|
+
console.error(err);
|
|
2045
|
+
return { kind: "custom_error", text: "webauthn failure" };
|
|
2046
|
+
}
|
|
2047
|
+
return request(addWebauthnMutation)({ shopID, data: { webauthn_credential: JSON.stringify(credential), webauthn_session_id: sessionID } }, opts);
|
|
2048
|
+
});
|
|
2049
|
+
const deleteFx = createEffect(async (p) => {
|
|
2050
|
+
const { shopID, opts } = p.config;
|
|
2051
|
+
return request(deletedWebauthnMutation)({ shopID }, opts);
|
|
2052
|
+
});
|
|
2053
|
+
// create flow
|
|
2054
|
+
{
|
|
2055
|
+
guard({
|
|
2056
|
+
source: sample(combine({ config: binding.internalConfig, customerInfo: binding.customerInfo }), createWebauthn, ({ config, customerInfo }, _data) => ({ config, data: customerInfo })),
|
|
2057
|
+
filter: binding.everythingIdle,
|
|
2058
|
+
target: createFx,
|
|
2059
|
+
});
|
|
2060
|
+
const { data: connectData, error: connectError } = requestResponseSplit(createFx.doneData);
|
|
2061
|
+
// success
|
|
2062
|
+
forward({
|
|
2063
|
+
from: connectData,
|
|
2064
|
+
to: binding.fetchCustomerInfoNow,
|
|
2065
|
+
});
|
|
2066
|
+
forward({
|
|
2067
|
+
from: connectData.map(() => "webauthn_created"),
|
|
2068
|
+
to: binding.message,
|
|
2069
|
+
});
|
|
2070
|
+
// failure
|
|
2071
|
+
forward({
|
|
2072
|
+
from: connectError,
|
|
2073
|
+
to: binding.unexpectedError,
|
|
2074
|
+
});
|
|
2075
|
+
}
|
|
2076
|
+
// delete flow
|
|
2077
|
+
{
|
|
2078
|
+
guard({
|
|
2079
|
+
source: sample(binding.internalConfig, deleteWebauthn, (config, data) => ({ config, data })),
|
|
2080
|
+
filter: binding.everythingIdle,
|
|
2081
|
+
target: deleteFx,
|
|
2082
|
+
});
|
|
2083
|
+
const { data: disconnectData, error: disconnectError } = requestResponseSplit(deleteFx.doneData);
|
|
2084
|
+
// success
|
|
2085
|
+
forward({
|
|
2086
|
+
from: disconnectData,
|
|
2087
|
+
to: binding.fetchCustomerInfoNow,
|
|
2088
|
+
});
|
|
2089
|
+
forward({
|
|
2090
|
+
from: disconnectData.map(() => "webauthn_deleted"),
|
|
2091
|
+
to: binding.message,
|
|
2092
|
+
});
|
|
2093
|
+
// failure
|
|
2094
|
+
forward({
|
|
2095
|
+
from: disconnectError,
|
|
2096
|
+
to: binding.unexpectedError,
|
|
2097
|
+
});
|
|
2098
|
+
}
|
|
2099
|
+
return {
|
|
2100
|
+
createWebauthn,
|
|
2101
|
+
deleteWebauthn,
|
|
2102
|
+
somethingIsPending: combineSome(createFx.pending, deleteFx.pending),
|
|
2103
|
+
};
|
|
2104
|
+
}
|
|
2020
2105
|
export function createCustomer(config, init) {
|
|
2021
2106
|
const currency = config.currency || createStore(config.shopCurrency);
|
|
2022
2107
|
const oauth2 = createOAuth2RequestGraph(config);
|
|
@@ -2088,6 +2173,7 @@ export function createCustomer(config, init) {
|
|
|
2088
2173
|
message,
|
|
2089
2174
|
fetchCustomerInfoNow,
|
|
2090
2175
|
oauth2,
|
|
2176
|
+
customerInfo,
|
|
2091
2177
|
};
|
|
2092
2178
|
config.jwt.on(setJWT, (_, v) => v);
|
|
2093
2179
|
customerInfo.on(setFavorites, (pv, favorites) => {
|
|
@@ -2150,6 +2236,7 @@ export function createCustomer(config, init) {
|
|
|
2150
2236
|
paymentMethods: createPaymentMethodsPageGraph(binding),
|
|
2151
2237
|
};
|
|
2152
2238
|
const oauth2Utils = createOAuth2UtilsGraph(binding);
|
|
2239
|
+
const webauthnUtils = createWebauthnUtilsGraph(binding);
|
|
2153
2240
|
const currentPage = createStore(null);
|
|
2154
2241
|
const loadPage = createEvent();
|
|
2155
2242
|
const loadPageExt = sample(currentPage, loadPage, (p, param) => ({
|
|
@@ -2213,7 +2300,7 @@ export function createCustomer(config, init) {
|
|
|
2213
2300
|
],
|
|
2214
2301
|
to: currentPage,
|
|
2215
2302
|
});
|
|
2216
|
-
const somethingPending = combineSome(pages.signin.somethingIsPending, pages.signup.somethingIsPending, pages.webauthnSignup.somethingIsPending, pages.resetPassword.somethingIsPending, pages.addresses.somethingIsPending, pages.favorites.somethingIsPending, pages.orders.somethingIsPending, pages.subscriptions.somethingIsPending, pages.returns.somethingIsPending, pages.order.somethingIsPending, pages.subscription.somethingIsPending, pages.return.somethingIsPending, pages.createReturn.somethingIsPending, pages.storeCredit.somethingIsPending, pages.profile.somethingIsPending, pages.paymentMethods.somethingIsPending, oauth2Utils.somethingIsPending);
|
|
2303
|
+
const somethingPending = combineSome(pages.signin.somethingIsPending, pages.signup.somethingIsPending, pages.webauthnSignup.somethingIsPending, pages.resetPassword.somethingIsPending, pages.addresses.somethingIsPending, pages.favorites.somethingIsPending, pages.orders.somethingIsPending, pages.subscriptions.somethingIsPending, pages.returns.somethingIsPending, pages.order.somethingIsPending, pages.subscription.somethingIsPending, pages.return.somethingIsPending, pages.createReturn.somethingIsPending, pages.storeCredit.somethingIsPending, pages.profile.somethingIsPending, pages.paymentMethods.somethingIsPending, oauth2Utils.somethingIsPending, webauthnUtils.somethingIsPending);
|
|
2217
2304
|
forward({
|
|
2218
2305
|
from: somethingPending.map((v) => !v),
|
|
2219
2306
|
to: everythingIdle,
|
|
@@ -2317,5 +2404,9 @@ export function createCustomer(config, init) {
|
|
|
2317
2404
|
connect: oauth2Utils.connectOAuth2,
|
|
2318
2405
|
disconnect: oauth2Utils.disconnectOAuth2,
|
|
2319
2406
|
},
|
|
2407
|
+
webauthn: {
|
|
2408
|
+
create: webauthnUtils.createWebauthn,
|
|
2409
|
+
delete: webauthnUtils.deleteWebauthn,
|
|
2410
|
+
},
|
|
2320
2411
|
};
|
|
2321
2412
|
}
|
package/package.json
CHANGED
package/types/dataLoader.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "fragment Customer on StorefrontCustomer{id email name display_name mobile mobile_notifications accepts_marketing reminder_messages addresses{...FullAddress}mobile mobile_notifications default_billing_address_id default_shipping_address_id default_payment_source_id is_guest password_defined oauth_provider}\n";
|
|
1
|
+
declare const _default: "fragment Customer on StorefrontCustomer{id email name display_name mobile mobile_notifications accepts_marketing reminder_messages addresses{...FullAddress}mobile mobile_notifications default_billing_address_id default_shipping_address_id default_payment_source_id is_guest password_defined oauth_provider webauthn_enabled}\n";
|
|
2
2
|
export default _default;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "fragment Shop on StorefrontShop{app_domain created_at currency customer_service_email id name product_review_enabled tax_label timezone primary_domain{domain id}customer_oauth_providers{...CustomerOAuthProvider}tips_enabled tips_variant{id}}\n";
|
|
1
|
+
declare const _default: "fragment Shop on StorefrontShop{app_domain created_at currency customer_service_email id name product_review_enabled tax_label timezone primary_domain{domain id}customer_oauth_providers{...CustomerOAuthProvider}tips_enabled tips_variant{id}customer_webauthn}\n";
|
|
2
2
|
export default _default;
|
package/types/graphql/types.d.ts
CHANGED
|
@@ -469,6 +469,7 @@ export interface CustomerFragment {
|
|
|
469
469
|
oauth_provider: CustomerOAuthProviderKind | null;
|
|
470
470
|
password_defined: boolean;
|
|
471
471
|
reminder_messages: boolean;
|
|
472
|
+
webauthn_enabled: boolean;
|
|
472
473
|
}
|
|
473
474
|
export interface CustomerBalanceFragment {
|
|
474
475
|
balance: Array<{
|
|
@@ -1270,6 +1271,7 @@ export interface ShopFragment {
|
|
|
1270
1271
|
currency: string;
|
|
1271
1272
|
customer_oauth_providers: Array<CustomerOAuthProviderFragment>;
|
|
1272
1273
|
customer_service_email: string;
|
|
1274
|
+
customer_webauthn: boolean;
|
|
1273
1275
|
id: string;
|
|
1274
1276
|
name: string;
|
|
1275
1277
|
primary_domain: {
|
|
@@ -7070,6 +7070,8 @@ export interface ShopSettings {
|
|
|
7070
7070
|
customer_oauth_providers: Array<CustomerOAuthProvider>;
|
|
7071
7071
|
/** This address is mentioned in emails sent to customers */
|
|
7072
7072
|
customer_service_email: string;
|
|
7073
|
+
/** Whether customers can signup/signin using webauthn */
|
|
7074
|
+
customer_webauthn: boolean;
|
|
7073
7075
|
/** Default payment method */
|
|
7074
7076
|
default_payment_method?: {
|
|
7075
7077
|
id: string;
|
|
@@ -7195,6 +7197,8 @@ export interface ShopSettingsCreate {
|
|
|
7195
7197
|
customer_oauth_providers?: Array<CustomerOAuthProviderCreate> | null;
|
|
7196
7198
|
/** This address is mentioned in emails sent to customers */
|
|
7197
7199
|
customer_service_email?: string | null;
|
|
7200
|
+
/** Whether customers can signup/signin using webauthn */
|
|
7201
|
+
customer_webauthn?: boolean | null;
|
|
7198
7202
|
/** Unique payment method identifier. See also: [Unique Identifiers](/overview/concepts/unique-identifiers) */
|
|
7199
7203
|
default_payment_method_id?: string | null;
|
|
7200
7204
|
/** Unique tax rule identifier. See also: [Unique Identifiers](/overview/concepts/unique-identifiers) */
|
|
@@ -2732,6 +2732,8 @@ export interface StorefrontShop {
|
|
|
2732
2732
|
customer_oauth_providers: Array<StorefrontCustomerOAuthProvider>;
|
|
2733
2733
|
/** This address is mentioned in emails sent to customers */
|
|
2734
2734
|
customer_service_email: string;
|
|
2735
|
+
/** Whether customers can signup/signin using webauthn */
|
|
2736
|
+
customer_webauthn: boolean;
|
|
2735
2737
|
/** Unique shop identifier. See also: [Unique Identifiers](/overview/concepts/unique-identifiers) */
|
|
2736
2738
|
id: string;
|
|
2737
2739
|
language?: {
|
|
@@ -6,7 +6,7 @@ import { GraphQLOpts, RequestResponseError } from "../request.js";
|
|
|
6
6
|
import { InvalidInputField } from "../mapInvalidInput.js";
|
|
7
7
|
import { StripeCVCError, StripeExpiryError, StripeNumberError } from "../stripeError.js";
|
|
8
8
|
import { Validator } from "../effector/validator.js";
|
|
9
|
-
export type MessageType = "favorite_added" | "favorite_deleted" | "favorite_modified" | "oauth2_connected" | "oauth2_disconnected";
|
|
9
|
+
export type MessageType = "favorite_added" | "favorite_deleted" | "favorite_modified" | "oauth2_connected" | "oauth2_disconnected" | "webauthn_created" | "webauthn_deleted";
|
|
10
10
|
export interface CustomerInfo {
|
|
11
11
|
customer: CustomerFragment;
|
|
12
12
|
favorites: {
|
|
@@ -637,6 +637,10 @@ export declare function createCustomer(config: CustomerConfig, init: CustomerIni
|
|
|
637
637
|
connect: Event<CustomerOAuthProviderKind>;
|
|
638
638
|
disconnect: Event<void>;
|
|
639
639
|
};
|
|
640
|
+
webauthn: {
|
|
641
|
+
create: Event<void>;
|
|
642
|
+
delete: Event<void>;
|
|
643
|
+
};
|
|
640
644
|
};
|
|
641
645
|
export type Customer = ReturnType<typeof createCustomer>;
|
|
642
646
|
export {};
|