@medialane/ui 0.174.0 → 0.175.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +26 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/app-wallet.cjs +84 -0
- package/dist/utils/app-wallet.cjs.map +1 -0
- package/dist/utils/app-wallet.d.cts +26 -0
- package/dist/utils/app-wallet.d.ts +26 -0
- package/dist/utils/app-wallet.js +65 -0
- package/dist/utils/app-wallet.js.map +1 -0
- package/dist/utils/email-code.cjs +58 -0
- package/dist/utils/email-code.cjs.map +1 -0
- package/dist/utils/email-code.d.cts +32 -0
- package/dist/utils/email-code.d.ts +32 -0
- package/dist/utils/email-code.js +30 -0
- package/dist/utils/email-code.js.map +1 -0
- package/dist/utils/passkey-support.cjs +37 -0
- package/dist/utils/passkey-support.cjs.map +1 -0
- package/dist/utils/passkey-support.d.cts +7 -0
- package/dist/utils/passkey-support.d.ts +7 -0
- package/dist/utils/passkey-support.js +13 -0
- package/dist/utils/passkey-support.js.map +1 -0
- package/dist/utils/wallet-failure.cjs +63 -0
- package/dist/utils/wallet-failure.cjs.map +1 -0
- package/dist/utils/wallet-failure.d.cts +12 -0
- package/dist/utils/wallet-failure.d.ts +12 -0
- package/dist/utils/wallet-failure.js +38 -0
- package/dist/utils/wallet-failure.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var app_wallet_exports = {};
|
|
20
|
+
__export(app_wallet_exports, {
|
|
21
|
+
createAppWallet: () => createAppWallet,
|
|
22
|
+
decodeCredentialId: () => decodeCredentialId,
|
|
23
|
+
stableUserId: () => stableUserId
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(app_wallet_exports);
|
|
26
|
+
var import_starknet = require("@medialane/sdk/starknet");
|
|
27
|
+
const encode = (value) => new TextEncoder().encode(value);
|
|
28
|
+
async function stableUserId(email) {
|
|
29
|
+
return new Uint8Array(await crypto.subtle.digest("SHA-256", encode(email)));
|
|
30
|
+
}
|
|
31
|
+
function decodeCredentialId(id) {
|
|
32
|
+
const binary = atob(id);
|
|
33
|
+
const raw = new Uint8Array(binary.length);
|
|
34
|
+
for (let i = 0; i < binary.length; i++) raw[i] = binary.charCodeAt(i);
|
|
35
|
+
return raw;
|
|
36
|
+
}
|
|
37
|
+
function createAppWallet(config) {
|
|
38
|
+
const ownerStore = (0, import_starknet.createOwnerStore)({ storeKey: config.storeKey, changeEvent: config.changeEvent });
|
|
39
|
+
const passkeyOwner = (0, import_starknet.createPasskeyOwner)({
|
|
40
|
+
appName: config.appName,
|
|
41
|
+
relyingPartyName: config.appName,
|
|
42
|
+
relyingPartyId: config.relyingPartyId,
|
|
43
|
+
prfSalt: encode(config.prfSalt),
|
|
44
|
+
hkdfInfo: encode(config.hkdfInfo),
|
|
45
|
+
passkeyUser: async () => {
|
|
46
|
+
const email = config.loadAccountEmail();
|
|
47
|
+
if (!email) {
|
|
48
|
+
return {
|
|
49
|
+
id: crypto.getRandomValues(new Uint8Array(16)),
|
|
50
|
+
name: config.appName,
|
|
51
|
+
displayName: config.appName
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return { id: await stableUserId(email), name: email, displayName: email };
|
|
55
|
+
},
|
|
56
|
+
knownCredentials: () => {
|
|
57
|
+
const id = ownerStore.load()?.credentialId;
|
|
58
|
+
return id ? [{ type: "public-key", id: decodeCredentialId(id) }] : [];
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const walletConsent = (0, import_starknet.createSelfFundConsent)(
|
|
62
|
+
(address, calls) => (0, import_starknet.estimateSelfFundedFee)(config.provider(), address, calls)
|
|
63
|
+
);
|
|
64
|
+
const mediaWallet = (0, import_starknet.createMediaWallet)({
|
|
65
|
+
store: ownerStore,
|
|
66
|
+
passkey: passkeyOwner,
|
|
67
|
+
executor: (0, import_starknet.sponsoredExecutor)({
|
|
68
|
+
provider: config.provider,
|
|
69
|
+
proxyUrl: config.sponsoredInvokeUrl ?? "/api/wallet/sponsored-invoke",
|
|
70
|
+
consent: walletConsent
|
|
71
|
+
}),
|
|
72
|
+
provider: config.provider,
|
|
73
|
+
backendUrl: config.backendUrl ?? "/api/proxy",
|
|
74
|
+
deployProxyUrl: config.deployProxyUrl ?? "/api/wallet/deploy-sponsored"
|
|
75
|
+
});
|
|
76
|
+
return { ownerStore, passkeyOwner, walletConsent, mediaWallet };
|
|
77
|
+
}
|
|
78
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
79
|
+
0 && (module.exports = {
|
|
80
|
+
createAppWallet,
|
|
81
|
+
decodeCredentialId,
|
|
82
|
+
stableUserId
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=app-wallet.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/app-wallet.ts"],"sourcesContent":["import {\n createMediaWallet,\n createOwnerStore,\n createPasskeyOwner,\n createSelfFundConsent,\n estimateSelfFundedFee,\n sponsoredExecutor,\n type MediaWalletConfig,\n} from \"@medialane/sdk/starknet\";\n\nexport interface AppWalletConfig {\n appName: string;\n relyingPartyId: () => string;\n storeKey: string;\n changeEvent: string;\n prfSalt: string;\n hkdfInfo: string;\n provider: MediaWalletConfig[\"provider\"];\n loadAccountEmail: () => string | null;\n backendUrl?: string;\n sponsoredInvokeUrl?: string;\n deployProxyUrl?: string;\n}\n\nconst encode = (value: string): Uint8Array<ArrayBuffer> => new TextEncoder().encode(value) as Uint8Array<ArrayBuffer>;\n\nexport async function stableUserId(email: string): Promise<Uint8Array<ArrayBuffer>> {\n return new Uint8Array(await crypto.subtle.digest(\"SHA-256\", encode(email)));\n}\n\nexport function decodeCredentialId(id: string): Uint8Array<ArrayBuffer> {\n const binary = atob(id);\n const raw = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) raw[i] = binary.charCodeAt(i);\n return raw;\n}\n\nexport function createAppWallet(config: AppWalletConfig) {\n const ownerStore = createOwnerStore({ storeKey: config.storeKey, changeEvent: config.changeEvent });\n\n const passkeyOwner = createPasskeyOwner({\n appName: config.appName,\n relyingPartyName: config.appName,\n relyingPartyId: config.relyingPartyId,\n prfSalt: encode(config.prfSalt),\n hkdfInfo: encode(config.hkdfInfo),\n passkeyUser: async () => {\n const email = config.loadAccountEmail();\n if (!email) {\n return {\n id: crypto.getRandomValues(new Uint8Array(16)),\n name: config.appName,\n displayName: config.appName,\n };\n }\n return { id: await stableUserId(email), name: email, displayName: email };\n },\n knownCredentials: () => {\n const id = ownerStore.load()?.credentialId;\n return id ? [{ type: \"public-key\", id: decodeCredentialId(id) }] : [];\n },\n });\n\n const walletConsent = createSelfFundConsent((address, calls) =>\n estimateSelfFundedFee(config.provider(), address, calls),\n );\n\n const mediaWallet = createMediaWallet({\n store: ownerStore,\n passkey: passkeyOwner,\n executor: sponsoredExecutor({\n provider: config.provider,\n proxyUrl: config.sponsoredInvokeUrl ?? \"/api/wallet/sponsored-invoke\",\n consent: walletConsent,\n }),\n provider: config.provider,\n backendUrl: config.backendUrl ?? \"/api/proxy\",\n deployProxyUrl: config.deployProxyUrl ?? \"/api/wallet/deploy-sponsored\",\n });\n\n return { ownerStore, passkeyOwner, walletConsent, mediaWallet };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAQO;AAgBP,MAAM,SAAS,CAAC,UAA2C,IAAI,YAAY,EAAE,OAAO,KAAK;AAEzF,eAAsB,aAAa,OAAiD;AAClF,SAAO,IAAI,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK,CAAC,CAAC;AAC5E;AAEO,SAAS,mBAAmB,IAAqC;AACtE,QAAM,SAAS,KAAK,EAAE;AACtB,QAAM,MAAM,IAAI,WAAW,OAAO,MAAM;AACxC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,KAAI,CAAC,IAAI,OAAO,WAAW,CAAC;AACpE,SAAO;AACT;AAEO,SAAS,gBAAgB,QAAyB;AACvD,QAAM,iBAAa,kCAAiB,EAAE,UAAU,OAAO,UAAU,aAAa,OAAO,YAAY,CAAC;AAElG,QAAM,mBAAe,oCAAmB;AAAA,IACtC,SAAS,OAAO;AAAA,IAChB,kBAAkB,OAAO;AAAA,IACzB,gBAAgB,OAAO;AAAA,IACvB,SAAS,OAAO,OAAO,OAAO;AAAA,IAC9B,UAAU,OAAO,OAAO,QAAQ;AAAA,IAChC,aAAa,YAAY;AACvB,YAAM,QAAQ,OAAO,iBAAiB;AACtC,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,IAAI,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC;AAAA,UAC7C,MAAM,OAAO;AAAA,UACb,aAAa,OAAO;AAAA,QACtB;AAAA,MACF;AACA,aAAO,EAAE,IAAI,MAAM,aAAa,KAAK,GAAG,MAAM,OAAO,aAAa,MAAM;AAAA,IAC1E;AAAA,IACA,kBAAkB,MAAM;AACtB,YAAM,KAAK,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK,CAAC,EAAE,MAAM,cAAc,IAAI,mBAAmB,EAAE,EAAE,CAAC,IAAI,CAAC;AAAA,IACtE;AAAA,EACF,CAAC;AAED,QAAM,oBAAgB;AAAA,IAAsB,CAAC,SAAS,cACpD,uCAAsB,OAAO,SAAS,GAAG,SAAS,KAAK;AAAA,EACzD;AAEA,QAAM,kBAAc,mCAAkB;AAAA,IACpC,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAU,mCAAkB;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO,sBAAsB;AAAA,MACvC,SAAS;AAAA,IACX,CAAC;AAAA,IACD,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO,cAAc;AAAA,IACjC,gBAAgB,OAAO,kBAAkB;AAAA,EAC3C,CAAC;AAED,SAAO,EAAE,YAAY,cAAc,eAAe,YAAY;AAChE;","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as _medialane_sdk_starknet from '@medialane/sdk/starknet';
|
|
2
|
+
import { MediaWalletConfig } from '@medialane/sdk/starknet';
|
|
3
|
+
|
|
4
|
+
interface AppWalletConfig {
|
|
5
|
+
appName: string;
|
|
6
|
+
relyingPartyId: () => string;
|
|
7
|
+
storeKey: string;
|
|
8
|
+
changeEvent: string;
|
|
9
|
+
prfSalt: string;
|
|
10
|
+
hkdfInfo: string;
|
|
11
|
+
provider: MediaWalletConfig["provider"];
|
|
12
|
+
loadAccountEmail: () => string | null;
|
|
13
|
+
backendUrl?: string;
|
|
14
|
+
sponsoredInvokeUrl?: string;
|
|
15
|
+
deployProxyUrl?: string;
|
|
16
|
+
}
|
|
17
|
+
declare function stableUserId(email: string): Promise<Uint8Array<ArrayBuffer>>;
|
|
18
|
+
declare function decodeCredentialId(id: string): Uint8Array<ArrayBuffer>;
|
|
19
|
+
declare function createAppWallet(config: AppWalletConfig): {
|
|
20
|
+
ownerStore: _medialane_sdk_starknet.OwnerStore;
|
|
21
|
+
passkeyOwner: _medialane_sdk_starknet.PasskeyOwner;
|
|
22
|
+
walletConsent: _medialane_sdk_starknet.SelfFundConsent;
|
|
23
|
+
mediaWallet: _medialane_sdk_starknet.MediaWallet;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { type AppWalletConfig, createAppWallet, decodeCredentialId, stableUserId };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as _medialane_sdk_starknet from '@medialane/sdk/starknet';
|
|
2
|
+
import { MediaWalletConfig } from '@medialane/sdk/starknet';
|
|
3
|
+
|
|
4
|
+
interface AppWalletConfig {
|
|
5
|
+
appName: string;
|
|
6
|
+
relyingPartyId: () => string;
|
|
7
|
+
storeKey: string;
|
|
8
|
+
changeEvent: string;
|
|
9
|
+
prfSalt: string;
|
|
10
|
+
hkdfInfo: string;
|
|
11
|
+
provider: MediaWalletConfig["provider"];
|
|
12
|
+
loadAccountEmail: () => string | null;
|
|
13
|
+
backendUrl?: string;
|
|
14
|
+
sponsoredInvokeUrl?: string;
|
|
15
|
+
deployProxyUrl?: string;
|
|
16
|
+
}
|
|
17
|
+
declare function stableUserId(email: string): Promise<Uint8Array<ArrayBuffer>>;
|
|
18
|
+
declare function decodeCredentialId(id: string): Uint8Array<ArrayBuffer>;
|
|
19
|
+
declare function createAppWallet(config: AppWalletConfig): {
|
|
20
|
+
ownerStore: _medialane_sdk_starknet.OwnerStore;
|
|
21
|
+
passkeyOwner: _medialane_sdk_starknet.PasskeyOwner;
|
|
22
|
+
walletConsent: _medialane_sdk_starknet.SelfFundConsent;
|
|
23
|
+
mediaWallet: _medialane_sdk_starknet.MediaWallet;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { type AppWalletConfig, createAppWallet, decodeCredentialId, stableUserId };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createMediaWallet,
|
|
3
|
+
createOwnerStore,
|
|
4
|
+
createPasskeyOwner,
|
|
5
|
+
createSelfFundConsent,
|
|
6
|
+
estimateSelfFundedFee,
|
|
7
|
+
sponsoredExecutor
|
|
8
|
+
} from "@medialane/sdk/starknet";
|
|
9
|
+
const encode = (value) => new TextEncoder().encode(value);
|
|
10
|
+
async function stableUserId(email) {
|
|
11
|
+
return new Uint8Array(await crypto.subtle.digest("SHA-256", encode(email)));
|
|
12
|
+
}
|
|
13
|
+
function decodeCredentialId(id) {
|
|
14
|
+
const binary = atob(id);
|
|
15
|
+
const raw = new Uint8Array(binary.length);
|
|
16
|
+
for (let i = 0; i < binary.length; i++) raw[i] = binary.charCodeAt(i);
|
|
17
|
+
return raw;
|
|
18
|
+
}
|
|
19
|
+
function createAppWallet(config) {
|
|
20
|
+
const ownerStore = createOwnerStore({ storeKey: config.storeKey, changeEvent: config.changeEvent });
|
|
21
|
+
const passkeyOwner = createPasskeyOwner({
|
|
22
|
+
appName: config.appName,
|
|
23
|
+
relyingPartyName: config.appName,
|
|
24
|
+
relyingPartyId: config.relyingPartyId,
|
|
25
|
+
prfSalt: encode(config.prfSalt),
|
|
26
|
+
hkdfInfo: encode(config.hkdfInfo),
|
|
27
|
+
passkeyUser: async () => {
|
|
28
|
+
const email = config.loadAccountEmail();
|
|
29
|
+
if (!email) {
|
|
30
|
+
return {
|
|
31
|
+
id: crypto.getRandomValues(new Uint8Array(16)),
|
|
32
|
+
name: config.appName,
|
|
33
|
+
displayName: config.appName
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { id: await stableUserId(email), name: email, displayName: email };
|
|
37
|
+
},
|
|
38
|
+
knownCredentials: () => {
|
|
39
|
+
const id = ownerStore.load()?.credentialId;
|
|
40
|
+
return id ? [{ type: "public-key", id: decodeCredentialId(id) }] : [];
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const walletConsent = createSelfFundConsent(
|
|
44
|
+
(address, calls) => estimateSelfFundedFee(config.provider(), address, calls)
|
|
45
|
+
);
|
|
46
|
+
const mediaWallet = createMediaWallet({
|
|
47
|
+
store: ownerStore,
|
|
48
|
+
passkey: passkeyOwner,
|
|
49
|
+
executor: sponsoredExecutor({
|
|
50
|
+
provider: config.provider,
|
|
51
|
+
proxyUrl: config.sponsoredInvokeUrl ?? "/api/wallet/sponsored-invoke",
|
|
52
|
+
consent: walletConsent
|
|
53
|
+
}),
|
|
54
|
+
provider: config.provider,
|
|
55
|
+
backendUrl: config.backendUrl ?? "/api/proxy",
|
|
56
|
+
deployProxyUrl: config.deployProxyUrl ?? "/api/wallet/deploy-sponsored"
|
|
57
|
+
});
|
|
58
|
+
return { ownerStore, passkeyOwner, walletConsent, mediaWallet };
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
createAppWallet,
|
|
62
|
+
decodeCredentialId,
|
|
63
|
+
stableUserId
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=app-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/app-wallet.ts"],"sourcesContent":["import {\n createMediaWallet,\n createOwnerStore,\n createPasskeyOwner,\n createSelfFundConsent,\n estimateSelfFundedFee,\n sponsoredExecutor,\n type MediaWalletConfig,\n} from \"@medialane/sdk/starknet\";\n\nexport interface AppWalletConfig {\n appName: string;\n relyingPartyId: () => string;\n storeKey: string;\n changeEvent: string;\n prfSalt: string;\n hkdfInfo: string;\n provider: MediaWalletConfig[\"provider\"];\n loadAccountEmail: () => string | null;\n backendUrl?: string;\n sponsoredInvokeUrl?: string;\n deployProxyUrl?: string;\n}\n\nconst encode = (value: string): Uint8Array<ArrayBuffer> => new TextEncoder().encode(value) as Uint8Array<ArrayBuffer>;\n\nexport async function stableUserId(email: string): Promise<Uint8Array<ArrayBuffer>> {\n return new Uint8Array(await crypto.subtle.digest(\"SHA-256\", encode(email)));\n}\n\nexport function decodeCredentialId(id: string): Uint8Array<ArrayBuffer> {\n const binary = atob(id);\n const raw = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) raw[i] = binary.charCodeAt(i);\n return raw;\n}\n\nexport function createAppWallet(config: AppWalletConfig) {\n const ownerStore = createOwnerStore({ storeKey: config.storeKey, changeEvent: config.changeEvent });\n\n const passkeyOwner = createPasskeyOwner({\n appName: config.appName,\n relyingPartyName: config.appName,\n relyingPartyId: config.relyingPartyId,\n prfSalt: encode(config.prfSalt),\n hkdfInfo: encode(config.hkdfInfo),\n passkeyUser: async () => {\n const email = config.loadAccountEmail();\n if (!email) {\n return {\n id: crypto.getRandomValues(new Uint8Array(16)),\n name: config.appName,\n displayName: config.appName,\n };\n }\n return { id: await stableUserId(email), name: email, displayName: email };\n },\n knownCredentials: () => {\n const id = ownerStore.load()?.credentialId;\n return id ? [{ type: \"public-key\", id: decodeCredentialId(id) }] : [];\n },\n });\n\n const walletConsent = createSelfFundConsent((address, calls) =>\n estimateSelfFundedFee(config.provider(), address, calls),\n );\n\n const mediaWallet = createMediaWallet({\n store: ownerStore,\n passkey: passkeyOwner,\n executor: sponsoredExecutor({\n provider: config.provider,\n proxyUrl: config.sponsoredInvokeUrl ?? \"/api/wallet/sponsored-invoke\",\n consent: walletConsent,\n }),\n provider: config.provider,\n backendUrl: config.backendUrl ?? \"/api/proxy\",\n deployProxyUrl: config.deployProxyUrl ?? \"/api/wallet/deploy-sponsored\",\n });\n\n return { ownerStore, passkeyOwner, walletConsent, mediaWallet };\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAgBP,MAAM,SAAS,CAAC,UAA2C,IAAI,YAAY,EAAE,OAAO,KAAK;AAEzF,eAAsB,aAAa,OAAiD;AAClF,SAAO,IAAI,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK,CAAC,CAAC;AAC5E;AAEO,SAAS,mBAAmB,IAAqC;AACtE,QAAM,SAAS,KAAK,EAAE;AACtB,QAAM,MAAM,IAAI,WAAW,OAAO,MAAM;AACxC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,KAAI,CAAC,IAAI,OAAO,WAAW,CAAC;AACpE,SAAO;AACT;AAEO,SAAS,gBAAgB,QAAyB;AACvD,QAAM,aAAa,iBAAiB,EAAE,UAAU,OAAO,UAAU,aAAa,OAAO,YAAY,CAAC;AAElG,QAAM,eAAe,mBAAmB;AAAA,IACtC,SAAS,OAAO;AAAA,IAChB,kBAAkB,OAAO;AAAA,IACzB,gBAAgB,OAAO;AAAA,IACvB,SAAS,OAAO,OAAO,OAAO;AAAA,IAC9B,UAAU,OAAO,OAAO,QAAQ;AAAA,IAChC,aAAa,YAAY;AACvB,YAAM,QAAQ,OAAO,iBAAiB;AACtC,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,IAAI,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC;AAAA,UAC7C,MAAM,OAAO;AAAA,UACb,aAAa,OAAO;AAAA,QACtB;AAAA,MACF;AACA,aAAO,EAAE,IAAI,MAAM,aAAa,KAAK,GAAG,MAAM,OAAO,aAAa,MAAM;AAAA,IAC1E;AAAA,IACA,kBAAkB,MAAM;AACtB,YAAM,KAAK,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK,CAAC,EAAE,MAAM,cAAc,IAAI,mBAAmB,EAAE,EAAE,CAAC,IAAI,CAAC;AAAA,IACtE;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB;AAAA,IAAsB,CAAC,SAAS,UACpD,sBAAsB,OAAO,SAAS,GAAG,SAAS,KAAK;AAAA,EACzD;AAEA,QAAM,cAAc,kBAAkB;AAAA,IACpC,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU,kBAAkB;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO,sBAAsB;AAAA,MACvC,SAAS;AAAA,IACX,CAAC;AAAA,IACD,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO,cAAc;AAAA,IACjC,gBAAgB,OAAO,kBAAkB;AAAA,EAC3C,CAAC;AAED,SAAO,EAAE,YAAY,cAAc,eAAe,YAAY;AAChE;","names":[]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var email_code_exports = {};
|
|
20
|
+
__export(email_code_exports, {
|
|
21
|
+
RESEND_COOLDOWN_SECONDS: () => RESEND_COOLDOWN_SECONDS,
|
|
22
|
+
canResendCode: () => canResendCode,
|
|
23
|
+
canVerifyCode: () => canVerifyCode,
|
|
24
|
+
emailCodeReducer: () => emailCodeReducer,
|
|
25
|
+
initialEmailCodeState: () => initialEmailCodeState
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(email_code_exports);
|
|
28
|
+
const RESEND_COOLDOWN_SECONDS = 60;
|
|
29
|
+
const initialEmailCodeState = { status: "idle", code: "", error: null, cooldown: 0 };
|
|
30
|
+
function emailCodeReducer(state, action) {
|
|
31
|
+
switch (action.type) {
|
|
32
|
+
case "code-changed":
|
|
33
|
+
return { ...state, code: action.code.replace(/\D/g, "").slice(0, 6) };
|
|
34
|
+
case "send-started":
|
|
35
|
+
return { ...state, status: "sending", error: null };
|
|
36
|
+
case "send-succeeded":
|
|
37
|
+
return { ...state, status: "ready", error: null, cooldown: RESEND_COOLDOWN_SECONDS };
|
|
38
|
+
case "send-failed":
|
|
39
|
+
return { ...state, status: "idle", error: action.message };
|
|
40
|
+
case "verify-started":
|
|
41
|
+
return { ...state, status: "verifying", error: null };
|
|
42
|
+
case "verify-failed":
|
|
43
|
+
return { ...state, status: "ready", code: "", error: action.message };
|
|
44
|
+
case "tick":
|
|
45
|
+
return state.cooldown > 0 ? { ...state, cooldown: state.cooldown - 1 } : state;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const canVerifyCode = (state) => state.status === "ready" && state.code.length === 6;
|
|
49
|
+
const canResendCode = (state) => state.cooldown === 0 && state.status !== "sending" && state.status !== "verifying";
|
|
50
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
51
|
+
0 && (module.exports = {
|
|
52
|
+
RESEND_COOLDOWN_SECONDS,
|
|
53
|
+
canResendCode,
|
|
54
|
+
canVerifyCode,
|
|
55
|
+
emailCodeReducer,
|
|
56
|
+
initialEmailCodeState
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=email-code.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/email-code.ts"],"sourcesContent":["export const RESEND_COOLDOWN_SECONDS = 60;\n\nexport type EmailCodeStatus = \"idle\" | \"sending\" | \"ready\" | \"verifying\";\n\nexport interface EmailCodeState {\n status: EmailCodeStatus;\n code: string;\n error: string | null;\n cooldown: number;\n}\n\nexport type EmailCodeAction =\n | { type: \"code-changed\"; code: string }\n | { type: \"send-started\" }\n | { type: \"send-succeeded\" }\n | { type: \"send-failed\"; message: string }\n | { type: \"verify-started\" }\n | { type: \"verify-failed\"; message: string }\n | { type: \"tick\" };\n\nexport const initialEmailCodeState: EmailCodeState = { status: \"idle\", code: \"\", error: null, cooldown: 0 };\n\nexport function emailCodeReducer(state: EmailCodeState, action: EmailCodeAction): EmailCodeState {\n switch (action.type) {\n case \"code-changed\":\n return { ...state, code: action.code.replace(/\\D/g, \"\").slice(0, 6) };\n case \"send-started\":\n return { ...state, status: \"sending\", error: null };\n case \"send-succeeded\":\n return { ...state, status: \"ready\", error: null, cooldown: RESEND_COOLDOWN_SECONDS };\n case \"send-failed\":\n return { ...state, status: \"idle\", error: action.message };\n case \"verify-started\":\n return { ...state, status: \"verifying\", error: null };\n case \"verify-failed\":\n return { ...state, status: \"ready\", code: \"\", error: action.message };\n case \"tick\":\n return state.cooldown > 0 ? { ...state, cooldown: state.cooldown - 1 } : state;\n }\n}\n\nexport const canVerifyCode = (state: EmailCodeState): boolean =>\n state.status === \"ready\" && state.code.length === 6;\n\nexport const canResendCode = (state: EmailCodeState): boolean =>\n state.cooldown === 0 && state.status !== \"sending\" && state.status !== \"verifying\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,0BAA0B;AAoBhC,MAAM,wBAAwC,EAAE,QAAQ,QAAQ,MAAM,IAAI,OAAO,MAAM,UAAU,EAAE;AAEnG,SAAS,iBAAiB,OAAuB,QAAyC;AAC/F,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,MAAM,OAAO,KAAK,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE;AAAA,IACtE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,OAAO,KAAK;AAAA,IACpD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,OAAO,MAAM,UAAU,wBAAwB;AAAA,IACrF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAAQ;AAAA,IAC3D,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,aAAa,OAAO,KAAK;AAAA,IACtD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,MAAM,IAAI,OAAO,OAAO,QAAQ;AAAA,IACtE,KAAK;AACH,aAAO,MAAM,WAAW,IAAI,EAAE,GAAG,OAAO,UAAU,MAAM,WAAW,EAAE,IAAI;AAAA,EAC7E;AACF;AAEO,MAAM,gBAAgB,CAAC,UAC5B,MAAM,WAAW,WAAW,MAAM,KAAK,WAAW;AAE7C,MAAM,gBAAgB,CAAC,UAC5B,MAAM,aAAa,KAAK,MAAM,WAAW,aAAa,MAAM,WAAW;","names":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
declare const RESEND_COOLDOWN_SECONDS = 60;
|
|
2
|
+
type EmailCodeStatus = "idle" | "sending" | "ready" | "verifying";
|
|
3
|
+
interface EmailCodeState {
|
|
4
|
+
status: EmailCodeStatus;
|
|
5
|
+
code: string;
|
|
6
|
+
error: string | null;
|
|
7
|
+
cooldown: number;
|
|
8
|
+
}
|
|
9
|
+
type EmailCodeAction = {
|
|
10
|
+
type: "code-changed";
|
|
11
|
+
code: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: "send-started";
|
|
14
|
+
} | {
|
|
15
|
+
type: "send-succeeded";
|
|
16
|
+
} | {
|
|
17
|
+
type: "send-failed";
|
|
18
|
+
message: string;
|
|
19
|
+
} | {
|
|
20
|
+
type: "verify-started";
|
|
21
|
+
} | {
|
|
22
|
+
type: "verify-failed";
|
|
23
|
+
message: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: "tick";
|
|
26
|
+
};
|
|
27
|
+
declare const initialEmailCodeState: EmailCodeState;
|
|
28
|
+
declare function emailCodeReducer(state: EmailCodeState, action: EmailCodeAction): EmailCodeState;
|
|
29
|
+
declare const canVerifyCode: (state: EmailCodeState) => boolean;
|
|
30
|
+
declare const canResendCode: (state: EmailCodeState) => boolean;
|
|
31
|
+
|
|
32
|
+
export { type EmailCodeAction, type EmailCodeState, type EmailCodeStatus, RESEND_COOLDOWN_SECONDS, canResendCode, canVerifyCode, emailCodeReducer, initialEmailCodeState };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
declare const RESEND_COOLDOWN_SECONDS = 60;
|
|
2
|
+
type EmailCodeStatus = "idle" | "sending" | "ready" | "verifying";
|
|
3
|
+
interface EmailCodeState {
|
|
4
|
+
status: EmailCodeStatus;
|
|
5
|
+
code: string;
|
|
6
|
+
error: string | null;
|
|
7
|
+
cooldown: number;
|
|
8
|
+
}
|
|
9
|
+
type EmailCodeAction = {
|
|
10
|
+
type: "code-changed";
|
|
11
|
+
code: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: "send-started";
|
|
14
|
+
} | {
|
|
15
|
+
type: "send-succeeded";
|
|
16
|
+
} | {
|
|
17
|
+
type: "send-failed";
|
|
18
|
+
message: string;
|
|
19
|
+
} | {
|
|
20
|
+
type: "verify-started";
|
|
21
|
+
} | {
|
|
22
|
+
type: "verify-failed";
|
|
23
|
+
message: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: "tick";
|
|
26
|
+
};
|
|
27
|
+
declare const initialEmailCodeState: EmailCodeState;
|
|
28
|
+
declare function emailCodeReducer(state: EmailCodeState, action: EmailCodeAction): EmailCodeState;
|
|
29
|
+
declare const canVerifyCode: (state: EmailCodeState) => boolean;
|
|
30
|
+
declare const canResendCode: (state: EmailCodeState) => boolean;
|
|
31
|
+
|
|
32
|
+
export { type EmailCodeAction, type EmailCodeState, type EmailCodeStatus, RESEND_COOLDOWN_SECONDS, canResendCode, canVerifyCode, emailCodeReducer, initialEmailCodeState };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const RESEND_COOLDOWN_SECONDS = 60;
|
|
2
|
+
const initialEmailCodeState = { status: "idle", code: "", error: null, cooldown: 0 };
|
|
3
|
+
function emailCodeReducer(state, action) {
|
|
4
|
+
switch (action.type) {
|
|
5
|
+
case "code-changed":
|
|
6
|
+
return { ...state, code: action.code.replace(/\D/g, "").slice(0, 6) };
|
|
7
|
+
case "send-started":
|
|
8
|
+
return { ...state, status: "sending", error: null };
|
|
9
|
+
case "send-succeeded":
|
|
10
|
+
return { ...state, status: "ready", error: null, cooldown: RESEND_COOLDOWN_SECONDS };
|
|
11
|
+
case "send-failed":
|
|
12
|
+
return { ...state, status: "idle", error: action.message };
|
|
13
|
+
case "verify-started":
|
|
14
|
+
return { ...state, status: "verifying", error: null };
|
|
15
|
+
case "verify-failed":
|
|
16
|
+
return { ...state, status: "ready", code: "", error: action.message };
|
|
17
|
+
case "tick":
|
|
18
|
+
return state.cooldown > 0 ? { ...state, cooldown: state.cooldown - 1 } : state;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const canVerifyCode = (state) => state.status === "ready" && state.code.length === 6;
|
|
22
|
+
const canResendCode = (state) => state.cooldown === 0 && state.status !== "sending" && state.status !== "verifying";
|
|
23
|
+
export {
|
|
24
|
+
RESEND_COOLDOWN_SECONDS,
|
|
25
|
+
canResendCode,
|
|
26
|
+
canVerifyCode,
|
|
27
|
+
emailCodeReducer,
|
|
28
|
+
initialEmailCodeState
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=email-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/email-code.ts"],"sourcesContent":["export const RESEND_COOLDOWN_SECONDS = 60;\n\nexport type EmailCodeStatus = \"idle\" | \"sending\" | \"ready\" | \"verifying\";\n\nexport interface EmailCodeState {\n status: EmailCodeStatus;\n code: string;\n error: string | null;\n cooldown: number;\n}\n\nexport type EmailCodeAction =\n | { type: \"code-changed\"; code: string }\n | { type: \"send-started\" }\n | { type: \"send-succeeded\" }\n | { type: \"send-failed\"; message: string }\n | { type: \"verify-started\" }\n | { type: \"verify-failed\"; message: string }\n | { type: \"tick\" };\n\nexport const initialEmailCodeState: EmailCodeState = { status: \"idle\", code: \"\", error: null, cooldown: 0 };\n\nexport function emailCodeReducer(state: EmailCodeState, action: EmailCodeAction): EmailCodeState {\n switch (action.type) {\n case \"code-changed\":\n return { ...state, code: action.code.replace(/\\D/g, \"\").slice(0, 6) };\n case \"send-started\":\n return { ...state, status: \"sending\", error: null };\n case \"send-succeeded\":\n return { ...state, status: \"ready\", error: null, cooldown: RESEND_COOLDOWN_SECONDS };\n case \"send-failed\":\n return { ...state, status: \"idle\", error: action.message };\n case \"verify-started\":\n return { ...state, status: \"verifying\", error: null };\n case \"verify-failed\":\n return { ...state, status: \"ready\", code: \"\", error: action.message };\n case \"tick\":\n return state.cooldown > 0 ? { ...state, cooldown: state.cooldown - 1 } : state;\n }\n}\n\nexport const canVerifyCode = (state: EmailCodeState): boolean =>\n state.status === \"ready\" && state.code.length === 6;\n\nexport const canResendCode = (state: EmailCodeState): boolean =>\n state.cooldown === 0 && state.status !== \"sending\" && state.status !== \"verifying\";\n"],"mappings":"AAAO,MAAM,0BAA0B;AAoBhC,MAAM,wBAAwC,EAAE,QAAQ,QAAQ,MAAM,IAAI,OAAO,MAAM,UAAU,EAAE;AAEnG,SAAS,iBAAiB,OAAuB,QAAyC;AAC/F,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,MAAM,OAAO,KAAK,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE;AAAA,IACtE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,WAAW,OAAO,KAAK;AAAA,IACpD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,OAAO,MAAM,UAAU,wBAAwB;AAAA,IACrF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAAQ;AAAA,IAC3D,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,aAAa,OAAO,KAAK;AAAA,IACtD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,QAAQ,SAAS,MAAM,IAAI,OAAO,OAAO,QAAQ;AAAA,IACtE,KAAK;AACH,aAAO,MAAM,WAAW,IAAI,EAAE,GAAG,OAAO,UAAU,MAAM,WAAW,EAAE,IAAI;AAAA,EAC7E;AACF;AAEO,MAAM,gBAAgB,CAAC,UAC5B,MAAM,WAAW,WAAW,MAAM,KAAK,WAAW;AAE7C,MAAM,gBAAgB,CAAC,UAC5B,MAAM,aAAa,KAAK,MAAM,WAAW,aAAa,MAAM,WAAW;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var passkey_support_exports = {};
|
|
20
|
+
__export(passkey_support_exports, {
|
|
21
|
+
detectPasskeySupport: () => detectPasskeySupport
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(passkey_support_exports);
|
|
24
|
+
async function detectPasskeySupport(api = typeof PublicKeyCredential === "undefined" ? void 0 : PublicKeyCredential) {
|
|
25
|
+
if (!api) return "unavailable";
|
|
26
|
+
if (typeof api.isUserVerifyingPlatformAuthenticatorAvailable !== "function") return "unknown";
|
|
27
|
+
try {
|
|
28
|
+
return await api.isUserVerifyingPlatformAuthenticatorAvailable() ? "available" : "unavailable";
|
|
29
|
+
} catch {
|
|
30
|
+
return "unknown";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
34
|
+
0 && (module.exports = {
|
|
35
|
+
detectPasskeySupport
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=passkey-support.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/passkey-support.ts"],"sourcesContent":["export type PasskeySupport = \"available\" | \"unavailable\" | \"unknown\";\n\ninterface PlatformPasskeyApi {\n isUserVerifyingPlatformAuthenticatorAvailable?: () => Promise<boolean>;\n}\n\nexport async function detectPasskeySupport(\n api: PlatformPasskeyApi | undefined = typeof PublicKeyCredential === \"undefined\" ? undefined : PublicKeyCredential,\n): Promise<PasskeySupport> {\n if (!api) return \"unavailable\";\n if (typeof api.isUserVerifyingPlatformAuthenticatorAvailable !== \"function\") return \"unknown\";\n try {\n return (await api.isUserVerifyingPlatformAuthenticatorAvailable()) ? \"available\" : \"unavailable\";\n } catch {\n return \"unknown\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,eAAsB,qBACpB,MAAsC,OAAO,wBAAwB,cAAc,SAAY,qBACtE;AACzB,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,OAAO,IAAI,kDAAkD,WAAY,QAAO;AACpF,MAAI;AACF,WAAQ,MAAM,IAAI,8CAA8C,IAAK,cAAc;AAAA,EACrF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type PasskeySupport = "available" | "unavailable" | "unknown";
|
|
2
|
+
interface PlatformPasskeyApi {
|
|
3
|
+
isUserVerifyingPlatformAuthenticatorAvailable?: () => Promise<boolean>;
|
|
4
|
+
}
|
|
5
|
+
declare function detectPasskeySupport(api?: PlatformPasskeyApi | undefined): Promise<PasskeySupport>;
|
|
6
|
+
|
|
7
|
+
export { type PasskeySupport, detectPasskeySupport };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type PasskeySupport = "available" | "unavailable" | "unknown";
|
|
2
|
+
interface PlatformPasskeyApi {
|
|
3
|
+
isUserVerifyingPlatformAuthenticatorAvailable?: () => Promise<boolean>;
|
|
4
|
+
}
|
|
5
|
+
declare function detectPasskeySupport(api?: PlatformPasskeyApi | undefined): Promise<PasskeySupport>;
|
|
6
|
+
|
|
7
|
+
export { type PasskeySupport, detectPasskeySupport };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
async function detectPasskeySupport(api = typeof PublicKeyCredential === "undefined" ? void 0 : PublicKeyCredential) {
|
|
2
|
+
if (!api) return "unavailable";
|
|
3
|
+
if (typeof api.isUserVerifyingPlatformAuthenticatorAvailable !== "function") return "unknown";
|
|
4
|
+
try {
|
|
5
|
+
return await api.isUserVerifyingPlatformAuthenticatorAvailable() ? "available" : "unavailable";
|
|
6
|
+
} catch {
|
|
7
|
+
return "unknown";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
detectPasskeySupport
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=passkey-support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/passkey-support.ts"],"sourcesContent":["export type PasskeySupport = \"available\" | \"unavailable\" | \"unknown\";\n\ninterface PlatformPasskeyApi {\n isUserVerifyingPlatformAuthenticatorAvailable?: () => Promise<boolean>;\n}\n\nexport async function detectPasskeySupport(\n api: PlatformPasskeyApi | undefined = typeof PublicKeyCredential === \"undefined\" ? undefined : PublicKeyCredential,\n): Promise<PasskeySupport> {\n if (!api) return \"unavailable\";\n if (typeof api.isUserVerifyingPlatformAuthenticatorAvailable !== \"function\") return \"unknown\";\n try {\n return (await api.isUserVerifyingPlatformAuthenticatorAvailable()) ? \"available\" : \"unavailable\";\n } catch {\n return \"unknown\";\n }\n}\n"],"mappings":"AAMA,eAAsB,qBACpB,MAAsC,OAAO,wBAAwB,cAAc,SAAY,qBACtE;AACzB,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,OAAO,IAAI,kDAAkD,WAAY,QAAO;AACpF,MAAI;AACF,WAAQ,MAAM,IAAI,8CAA8C,IAAK,cAAc;AAAA,EACrF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var wallet_failure_exports = {};
|
|
20
|
+
__export(wallet_failure_exports, {
|
|
21
|
+
describeWalletFailure: () => describeWalletFailure,
|
|
22
|
+
isPasskeyCancelled: () => isPasskeyCancelled
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(wallet_failure_exports);
|
|
25
|
+
const isPasskeyCancelled = (err) => typeof err === "object" && err !== null && err.name === "PasskeyCancelledError";
|
|
26
|
+
const message = (err) => err instanceof Error ? err.message : "";
|
|
27
|
+
function describeWalletFailure(err, support = "unknown") {
|
|
28
|
+
const raw = message(err);
|
|
29
|
+
if (isPasskeyCancelled(err)) {
|
|
30
|
+
return support === "unavailable" ? {
|
|
31
|
+
kind: "no-passkeys",
|
|
32
|
+
message: "Passkeys aren't available in this window. Open Medialane in a regular browser window (not Guest or Incognito) and try again.",
|
|
33
|
+
canRetry: true
|
|
34
|
+
} : {
|
|
35
|
+
kind: "cancelled",
|
|
36
|
+
message: "The passkey prompt was closed. Try again to finish setting up your account. If your browser says your device can't be used, open Medialane in a regular browser window (not Guest or Incognito).",
|
|
37
|
+
canRetry: true
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (/PRF/.test(raw)) {
|
|
41
|
+
return { kind: "unsupported-browser", message: "Browser not supported. Please try another browser.", canRetry: false };
|
|
42
|
+
}
|
|
43
|
+
if (/has not appeared|submitted but/i.test(raw)) {
|
|
44
|
+
return {
|
|
45
|
+
kind: "still-deploying",
|
|
46
|
+
message: "Your wallet is still being set up. Give it a minute, then try again. Nothing is lost.",
|
|
47
|
+
canRetry: true
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (/deploy/i.test(raw)) {
|
|
51
|
+
return { kind: "deployment", message: "We couldn't finish setting up your wallet. Please try again in a moment.", canRetry: true };
|
|
52
|
+
}
|
|
53
|
+
if (/failed to fetch|networkerror|load failed|network request failed/i.test(raw)) {
|
|
54
|
+
return { kind: "network", message: "We couldn't reach Medialane. Check your connection and try again.", canRetry: true };
|
|
55
|
+
}
|
|
56
|
+
return { kind: "unknown", message: "We couldn't finish setting up your account. Please try again.", canRetry: true };
|
|
57
|
+
}
|
|
58
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
59
|
+
0 && (module.exports = {
|
|
60
|
+
describeWalletFailure,
|
|
61
|
+
isPasskeyCancelled
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=wallet-failure.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/wallet-failure.ts"],"sourcesContent":["import type { PasskeySupport } from \"./passkey-support.js\";\n\nexport type WalletFailureKind =\n | \"cancelled\"\n | \"no-passkeys\"\n | \"unsupported-browser\"\n | \"network\"\n | \"still-deploying\"\n | \"deployment\"\n | \"unknown\";\n\nexport interface WalletFailureNotice {\n kind: WalletFailureKind;\n message: string;\n canRetry: boolean;\n}\n\nexport const isPasskeyCancelled = (err: unknown): boolean =>\n typeof err === \"object\" && err !== null && (err as { name?: unknown }).name === \"PasskeyCancelledError\";\n\nconst message = (err: unknown): string => (err instanceof Error ? err.message : \"\");\n\nexport function describeWalletFailure(err: unknown, support: PasskeySupport = \"unknown\"): WalletFailureNotice {\n const raw = message(err);\n\n if (isPasskeyCancelled(err)) {\n return support === \"unavailable\"\n ? {\n kind: \"no-passkeys\",\n message: \"Passkeys aren't available in this window. Open Medialane in a regular browser window (not Guest or Incognito) and try again.\",\n canRetry: true,\n }\n : {\n kind: \"cancelled\",\n message:\n \"The passkey prompt was closed. Try again to finish setting up your account. If your browser says your device can't be used, open Medialane in a regular browser window (not Guest or Incognito).\",\n canRetry: true,\n };\n }\n\n if (/PRF/.test(raw)) {\n return { kind: \"unsupported-browser\", message: \"Browser not supported. Please try another browser.\", canRetry: false };\n }\n\n if (/has not appeared|submitted but/i.test(raw)) {\n return {\n kind: \"still-deploying\",\n message: \"Your wallet is still being set up. Give it a minute, then try again. Nothing is lost.\",\n canRetry: true,\n };\n }\n\n if (/deploy/i.test(raw)) {\n return { kind: \"deployment\", message: \"We couldn't finish setting up your wallet. Please try again in a moment.\", canRetry: true };\n }\n\n if (/failed to fetch|networkerror|load failed|network request failed/i.test(raw)) {\n return { kind: \"network\", message: \"We couldn't reach Medialane. Check your connection and try again.\", canRetry: true };\n }\n\n return { kind: \"unknown\", message: \"We couldn't finish setting up your account. Please try again.\", canRetry: true };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBO,MAAM,qBAAqB,CAAC,QACjC,OAAO,QAAQ,YAAY,QAAQ,QAAS,IAA2B,SAAS;AAElF,MAAM,UAAU,CAAC,QAA0B,eAAe,QAAQ,IAAI,UAAU;AAEzE,SAAS,sBAAsB,KAAc,UAA0B,WAAgC;AAC5G,QAAM,MAAM,QAAQ,GAAG;AAEvB,MAAI,mBAAmB,GAAG,GAAG;AAC3B,WAAO,YAAY,gBACf;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACN;AAEA,MAAI,MAAM,KAAK,GAAG,GAAG;AACnB,WAAO,EAAE,MAAM,uBAAuB,SAAS,sDAAsD,UAAU,MAAM;AAAA,EACvH;AAEA,MAAI,kCAAkC,KAAK,GAAG,GAAG;AAC/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,UAAU,KAAK,GAAG,GAAG;AACvB,WAAO,EAAE,MAAM,cAAc,SAAS,4EAA4E,UAAU,KAAK;AAAA,EACnI;AAEA,MAAI,mEAAmE,KAAK,GAAG,GAAG;AAChF,WAAO,EAAE,MAAM,WAAW,SAAS,qEAAqE,UAAU,KAAK;AAAA,EACzH;AAEA,SAAO,EAAE,MAAM,WAAW,SAAS,iEAAiE,UAAU,KAAK;AACrH;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PasskeySupport } from './passkey-support.cjs';
|
|
2
|
+
|
|
3
|
+
type WalletFailureKind = "cancelled" | "no-passkeys" | "unsupported-browser" | "network" | "still-deploying" | "deployment" | "unknown";
|
|
4
|
+
interface WalletFailureNotice {
|
|
5
|
+
kind: WalletFailureKind;
|
|
6
|
+
message: string;
|
|
7
|
+
canRetry: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare const isPasskeyCancelled: (err: unknown) => boolean;
|
|
10
|
+
declare function describeWalletFailure(err: unknown, support?: PasskeySupport): WalletFailureNotice;
|
|
11
|
+
|
|
12
|
+
export { type WalletFailureKind, type WalletFailureNotice, describeWalletFailure, isPasskeyCancelled };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PasskeySupport } from './passkey-support.js';
|
|
2
|
+
|
|
3
|
+
type WalletFailureKind = "cancelled" | "no-passkeys" | "unsupported-browser" | "network" | "still-deploying" | "deployment" | "unknown";
|
|
4
|
+
interface WalletFailureNotice {
|
|
5
|
+
kind: WalletFailureKind;
|
|
6
|
+
message: string;
|
|
7
|
+
canRetry: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare const isPasskeyCancelled: (err: unknown) => boolean;
|
|
10
|
+
declare function describeWalletFailure(err: unknown, support?: PasskeySupport): WalletFailureNotice;
|
|
11
|
+
|
|
12
|
+
export { type WalletFailureKind, type WalletFailureNotice, describeWalletFailure, isPasskeyCancelled };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const isPasskeyCancelled = (err) => typeof err === "object" && err !== null && err.name === "PasskeyCancelledError";
|
|
2
|
+
const message = (err) => err instanceof Error ? err.message : "";
|
|
3
|
+
function describeWalletFailure(err, support = "unknown") {
|
|
4
|
+
const raw = message(err);
|
|
5
|
+
if (isPasskeyCancelled(err)) {
|
|
6
|
+
return support === "unavailable" ? {
|
|
7
|
+
kind: "no-passkeys",
|
|
8
|
+
message: "Passkeys aren't available in this window. Open Medialane in a regular browser window (not Guest or Incognito) and try again.",
|
|
9
|
+
canRetry: true
|
|
10
|
+
} : {
|
|
11
|
+
kind: "cancelled",
|
|
12
|
+
message: "The passkey prompt was closed. Try again to finish setting up your account. If your browser says your device can't be used, open Medialane in a regular browser window (not Guest or Incognito).",
|
|
13
|
+
canRetry: true
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (/PRF/.test(raw)) {
|
|
17
|
+
return { kind: "unsupported-browser", message: "Browser not supported. Please try another browser.", canRetry: false };
|
|
18
|
+
}
|
|
19
|
+
if (/has not appeared|submitted but/i.test(raw)) {
|
|
20
|
+
return {
|
|
21
|
+
kind: "still-deploying",
|
|
22
|
+
message: "Your wallet is still being set up. Give it a minute, then try again. Nothing is lost.",
|
|
23
|
+
canRetry: true
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (/deploy/i.test(raw)) {
|
|
27
|
+
return { kind: "deployment", message: "We couldn't finish setting up your wallet. Please try again in a moment.", canRetry: true };
|
|
28
|
+
}
|
|
29
|
+
if (/failed to fetch|networkerror|load failed|network request failed/i.test(raw)) {
|
|
30
|
+
return { kind: "network", message: "We couldn't reach Medialane. Check your connection and try again.", canRetry: true };
|
|
31
|
+
}
|
|
32
|
+
return { kind: "unknown", message: "We couldn't finish setting up your account. Please try again.", canRetry: true };
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
describeWalletFailure,
|
|
36
|
+
isPasskeyCancelled
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=wallet-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/wallet-failure.ts"],"sourcesContent":["import type { PasskeySupport } from \"./passkey-support.js\";\n\nexport type WalletFailureKind =\n | \"cancelled\"\n | \"no-passkeys\"\n | \"unsupported-browser\"\n | \"network\"\n | \"still-deploying\"\n | \"deployment\"\n | \"unknown\";\n\nexport interface WalletFailureNotice {\n kind: WalletFailureKind;\n message: string;\n canRetry: boolean;\n}\n\nexport const isPasskeyCancelled = (err: unknown): boolean =>\n typeof err === \"object\" && err !== null && (err as { name?: unknown }).name === \"PasskeyCancelledError\";\n\nconst message = (err: unknown): string => (err instanceof Error ? err.message : \"\");\n\nexport function describeWalletFailure(err: unknown, support: PasskeySupport = \"unknown\"): WalletFailureNotice {\n const raw = message(err);\n\n if (isPasskeyCancelled(err)) {\n return support === \"unavailable\"\n ? {\n kind: \"no-passkeys\",\n message: \"Passkeys aren't available in this window. Open Medialane in a regular browser window (not Guest or Incognito) and try again.\",\n canRetry: true,\n }\n : {\n kind: \"cancelled\",\n message:\n \"The passkey prompt was closed. Try again to finish setting up your account. If your browser says your device can't be used, open Medialane in a regular browser window (not Guest or Incognito).\",\n canRetry: true,\n };\n }\n\n if (/PRF/.test(raw)) {\n return { kind: \"unsupported-browser\", message: \"Browser not supported. Please try another browser.\", canRetry: false };\n }\n\n if (/has not appeared|submitted but/i.test(raw)) {\n return {\n kind: \"still-deploying\",\n message: \"Your wallet is still being set up. Give it a minute, then try again. Nothing is lost.\",\n canRetry: true,\n };\n }\n\n if (/deploy/i.test(raw)) {\n return { kind: \"deployment\", message: \"We couldn't finish setting up your wallet. Please try again in a moment.\", canRetry: true };\n }\n\n if (/failed to fetch|networkerror|load failed|network request failed/i.test(raw)) {\n return { kind: \"network\", message: \"We couldn't reach Medialane. Check your connection and try again.\", canRetry: true };\n }\n\n return { kind: \"unknown\", message: \"We couldn't finish setting up your account. Please try again.\", canRetry: true };\n}\n"],"mappings":"AAiBO,MAAM,qBAAqB,CAAC,QACjC,OAAO,QAAQ,YAAY,QAAQ,QAAS,IAA2B,SAAS;AAElF,MAAM,UAAU,CAAC,QAA0B,eAAe,QAAQ,IAAI,UAAU;AAEzE,SAAS,sBAAsB,KAAc,UAA0B,WAAgC;AAC5G,QAAM,MAAM,QAAQ,GAAG;AAEvB,MAAI,mBAAmB,GAAG,GAAG;AAC3B,WAAO,YAAY,gBACf;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACN;AAEA,MAAI,MAAM,KAAK,GAAG,GAAG;AACnB,WAAO,EAAE,MAAM,uBAAuB,SAAS,sDAAsD,UAAU,MAAM;AAAA,EACvH;AAEA,MAAI,kCAAkC,KAAK,GAAG,GAAG;AAC/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,UAAU,KAAK,GAAG,GAAG;AACvB,WAAO,EAAE,MAAM,cAAc,SAAS,4EAA4E,UAAU,KAAK;AAAA,EACnI;AAEA,MAAI,mEAAmE,KAAK,GAAG,GAAG;AAChF,WAAO,EAAE,MAAM,WAAW,SAAS,qEAAqE,UAAU,KAAK;AAAA,EACzH;AAEA,SAAO,EAAE,MAAM,WAAW,SAAS,iEAAiE,UAAU,KAAK;AACrH;","names":[]}
|