@auth-link/web 0.0.5 → 2.0.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/CHANGELOG.md +27 -0
- package/README.md +111 -759
- package/dist/index.js +466 -178
- package/dist/index.js.map +3 -3
- package/dist/react.js +466 -177
- package/dist/react.js.map +3 -3
- package/dist/styles.css +11 -49
- package/dist/types/core.d.ts +2 -0
- package/dist/types/i18n.d.ts +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/modal.d.ts +3 -3
- package/dist/types/passcode.d.ts +28 -0
- package/dist/types/react.d.ts +5 -1
- package/dist/types/types.d.ts +2 -4
- package/dist/types/view.d.ts +5 -4
- package/dist/types/vue.d.ts +5 -1
- package/dist/vue.js +479 -176
- package/dist/vue.js.map +3 -3
- package/docs/README.en.md +39 -255
- package/docs/README.ja.md +39 -255
- package/docs/README.zh-CN.md +39 -255
- package/examples/react-client.tsx +16 -34
- package/examples/vue-client.vue +22 -46
- package/package.json +2 -2
package/dist/vue.js
CHANGED
|
@@ -1676,10 +1676,9 @@ function validateTicket(value, expectedMode, trustedOrigin) {
|
|
|
1676
1676
|
}
|
|
1677
1677
|
if (qr.v !== 1 || qr.requestId !== m.requestId || typeof qr.token !== "string" || !token.test(qr.token) || origin.protocol !== "https:" || origin.origin !== qr.origin || origin.origin.length > 512 || origin.username || origin.password || trustedOrigin && origin.origin !== trustedOrigin) fail("UNTRUSTED_QR");
|
|
1678
1678
|
const displayCode = m.displayCode === void 0 ? void 0 : validateDisplayCode(m.displayCode);
|
|
1679
|
-
if (m.purpose === "confirm" && !displayCode) fail("DYNAMIC_CODE_REQUIRED");
|
|
1680
1679
|
const expiry = Date.parse(String(m.expiresAt));
|
|
1681
1680
|
const now = displayCode ? Date.parse(displayCode.serverTime) : Date.now();
|
|
1682
|
-
if (!Number.isFinite(expiry) || expiry > now +
|
|
1681
|
+
if (!Number.isFinite(expiry) || expiry > now + 36e4) fail("INVALID_EXPIRY");
|
|
1683
1682
|
return {
|
|
1684
1683
|
requestId: m.requestId,
|
|
1685
1684
|
purpose: m.purpose,
|
|
@@ -1711,116 +1710,117 @@ function abortable(promise, signal) {
|
|
|
1711
1710
|
}
|
|
1712
1711
|
async function observeRequest(input, options) {
|
|
1713
1712
|
const { client, signal, onUpdate } = options;
|
|
1714
|
-
const interval = options.intervalMs ?? 1500;
|
|
1715
1713
|
let ticket;
|
|
1716
1714
|
try {
|
|
1717
|
-
if (interval < 250 || interval > 1e4 || !Number.isFinite(interval)) fail("INVALID_INTERVAL");
|
|
1718
1715
|
ticket = validateTicket(input, options.expectedMode);
|
|
1719
1716
|
} catch (error) {
|
|
1720
|
-
if (!signal.aborted)
|
|
1721
|
-
const e = error instanceof Error ? error : new AuthLinkError("INVALID_TICKET");
|
|
1722
|
-
onUpdate({ ...initialSnapshot(), status: "error", error: e });
|
|
1723
|
-
options.onError?.(e);
|
|
1724
|
-
}
|
|
1717
|
+
if (!signal.aborted) options.onError?.(error);
|
|
1725
1718
|
return;
|
|
1726
1719
|
}
|
|
1727
|
-
let frame = ticket.displayCode;
|
|
1728
|
-
let serverAnchor = frame ? Date.parse(frame.serverTime) : Date.now();
|
|
1729
|
-
let monotonicAnchor = performance.now();
|
|
1730
|
-
const serverNow = () => serverAnchor + performance.now() - monotonicAnchor;
|
|
1731
1720
|
const expiry = Date.parse(ticket.expiresAt);
|
|
1732
|
-
|
|
1721
|
+
const deadline = performance.now() + Math.max(0, expiry - Date.now());
|
|
1722
|
+
let ended = false, busy = false;
|
|
1723
|
+
let done;
|
|
1724
|
+
const finished = new Promise((resolve) => {
|
|
1725
|
+
done = resolve;
|
|
1726
|
+
});
|
|
1733
1727
|
const controller = new AbortController();
|
|
1734
|
-
const cancel = () =>
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
const update = (value) => {
|
|
1739
|
-
if (signal.aborted) return;
|
|
1740
|
-
if (JSON.stringify(value) !== JSON.stringify(last)) {
|
|
1741
|
-
last = value;
|
|
1742
|
-
onUpdate(value);
|
|
1743
|
-
}
|
|
1728
|
+
const cancel = () => {
|
|
1729
|
+
ended = true;
|
|
1730
|
+
controller.abort();
|
|
1731
|
+
done();
|
|
1744
1732
|
};
|
|
1733
|
+
signal.addEventListener("abort", cancel, { once: true });
|
|
1734
|
+
let snapshot = initialSnapshot();
|
|
1735
|
+
const remaining = () => Math.max(0, (deadline - performance.now()) / 1e3);
|
|
1745
1736
|
const tick = () => {
|
|
1746
1737
|
if (ended || signal.aborted) return;
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
controller.abort(
|
|
1738
|
+
if (remaining() <= 0) {
|
|
1739
|
+
ended = true;
|
|
1740
|
+
controller.abort();
|
|
1741
|
+
onUpdate({ ...snapshot, status: "expired", code: null, submitting: false });
|
|
1742
|
+
void Promise.resolve().then(() => options.onExpired?.()).catch(() => options.onError?.(new AuthLinkError("CALLBACK_FAILED")));
|
|
1743
|
+
done();
|
|
1750
1744
|
return;
|
|
1751
1745
|
}
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
update({
|
|
1746
|
+
snapshot = {
|
|
1747
|
+
...snapshot,
|
|
1755
1748
|
status: "pending",
|
|
1756
|
-
code:
|
|
1757
|
-
secondsRemaining: Math.
|
|
1758
|
-
codeSecondsRemaining: Math.ceil(
|
|
1759
|
-
|
|
1760
|
-
}
|
|
1749
|
+
code: ticket.pairingCode,
|
|
1750
|
+
secondsRemaining: Math.ceil(remaining()),
|
|
1751
|
+
codeSecondsRemaining: Math.ceil(remaining()),
|
|
1752
|
+
submitting: busy
|
|
1753
|
+
};
|
|
1754
|
+
onUpdate(snapshot);
|
|
1761
1755
|
};
|
|
1762
|
-
const
|
|
1763
|
-
|
|
1764
|
-
if (
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
let effect = void 0;
|
|
1769
|
-
if (status === "confirmed") effect = options.onConfirmed?.(result);
|
|
1770
|
-
else if (status === "rejected") effect = options.onRejected?.({ status: "rejected", code: "REJECTED", requestId: ticket.requestId, purpose: ticket.purpose });
|
|
1771
|
-
else if (status === "expired") effect = options.onExpired?.();
|
|
1772
|
-
else options.onError?.(error);
|
|
1773
|
-
void Promise.resolve(effect).catch(() => {
|
|
1774
|
-
if (!signal.aborted) options.onError?.(new AuthLinkError("CALLBACK_FAILED"));
|
|
1775
|
-
});
|
|
1776
|
-
} catch {
|
|
1777
|
-
if (status !== "error") options.onError?.(new AuthLinkError("CALLBACK_FAILED"));
|
|
1756
|
+
const submit = async (confirmationCode) => {
|
|
1757
|
+
if (ended || signal.aborted || busy) return;
|
|
1758
|
+
if (!/^[0-9]{6}$/.test(confirmationCode)) {
|
|
1759
|
+
snapshot = { ...snapshot, error: new AuthLinkError("CONFIRMATION_CODE_REQUIRED") };
|
|
1760
|
+
tick();
|
|
1761
|
+
return;
|
|
1778
1762
|
}
|
|
1779
|
-
|
|
1780
|
-
|
|
1763
|
+
if (remaining() <= 0) {
|
|
1764
|
+
tick();
|
|
1765
|
+
return;
|
|
1766
|
+
}
|
|
1767
|
+
busy = true;
|
|
1768
|
+
snapshot = { ...snapshot, error: null };
|
|
1781
1769
|
tick();
|
|
1782
|
-
|
|
1783
|
-
controller.signal.
|
|
1784
|
-
|
|
1785
|
-
controller.signal.throwIfAborted();
|
|
1770
|
+
try {
|
|
1771
|
+
const value = object(await abortable(client.result(ticket, controller.signal, confirmationCode), controller.signal));
|
|
1772
|
+
if (ended || signal.aborted) return;
|
|
1786
1773
|
if (value.requestId !== ticket.requestId) fail("REQUEST_MISMATCH");
|
|
1787
1774
|
if (value.status === "confirmed") {
|
|
1788
|
-
if (!token.test(String(value.verificationId)) ||
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
if (value.
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1775
|
+
if (!token.test(String(value.verificationId)) || value.authenticationPolicy !== "device-presence.v1" || value.expiresAt !== ticket.expiresAt || value.purpose !== ticket.purpose || remaining() <= 0 || "action" in value || "transactionHash" in value) fail("INVALID_CONFIRMATION");
|
|
1776
|
+
ended = true;
|
|
1777
|
+
onUpdate({ ...snapshot, status: "confirmed", code: null, submitting: false });
|
|
1778
|
+
try {
|
|
1779
|
+
await options.onConfirmed?.(value);
|
|
1780
|
+
} catch {
|
|
1781
|
+
options.onError?.(new AuthLinkError("CALLBACK_FAILED"));
|
|
1782
|
+
}
|
|
1783
|
+
done();
|
|
1784
|
+
} else if (value.status === "rejected" || value.status === "expired") {
|
|
1785
|
+
ended = true;
|
|
1786
|
+
onUpdate({ ...snapshot, status: value.status, code: null, submitting: false });
|
|
1787
|
+
try {
|
|
1788
|
+
if (value.status === "rejected") await options.onRejected?.({ status: "rejected", code: "REJECTED", requestId: ticket.requestId, purpose: ticket.purpose });
|
|
1789
|
+
else await options.onExpired?.();
|
|
1790
|
+
} catch {
|
|
1791
|
+
options.onError?.(new AuthLinkError("CALLBACK_FAILED"));
|
|
1792
|
+
} finally {
|
|
1793
|
+
done();
|
|
1804
1794
|
}
|
|
1805
|
-
|
|
1795
|
+
} else {
|
|
1796
|
+
fail("CONFIRMATION_NOT_READY");
|
|
1806
1797
|
}
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1798
|
+
} catch (error) {
|
|
1799
|
+
if (!ended && !signal.aborted) {
|
|
1800
|
+
const raw = error instanceof Error ? error : new AuthLinkError("NETWORK_ERROR");
|
|
1801
|
+
const code = raw.message.replace(/^AUTHLINK_/, "");
|
|
1802
|
+
const failure = ["CONFIRMATION_CODE_LOCKED", "CONFIRMATION_CODE_INVALID", "APPROVAL_REQUIRED", "REQUEST_EXPIRED"].includes(code) ? new AuthLinkError(code) : raw;
|
|
1803
|
+
snapshot = { ...snapshot, error: failure };
|
|
1804
|
+
if (code === "CONFIRMATION_CODE_LOCKED" || code === "REQUEST_EXPIRED") {
|
|
1805
|
+
ended = true;
|
|
1806
|
+
onUpdate({ ...snapshot, code: null, submitting: false, status: code === "REQUEST_EXPIRED" ? "expired" : "error" });
|
|
1807
|
+
if (code === "REQUEST_EXPIRED") void Promise.resolve().then(() => options.onExpired?.()).catch(() => options.onError?.(new AuthLinkError("CALLBACK_FAILED")));
|
|
1808
|
+
else options.onError?.(failure);
|
|
1809
|
+
done();
|
|
1810
|
+
} else options.onError?.(failure);
|
|
1815
1811
|
}
|
|
1812
|
+
} finally {
|
|
1813
|
+
busy = false;
|
|
1814
|
+
tick();
|
|
1816
1815
|
}
|
|
1817
|
-
}
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1816
|
+
};
|
|
1817
|
+
tick();
|
|
1818
|
+
options.onReady?.(submit);
|
|
1819
|
+
const timer = setInterval(tick, 1e3);
|
|
1820
|
+
if (signal.aborted) cancel();
|
|
1821
|
+
try {
|
|
1822
|
+
await finished;
|
|
1822
1823
|
} finally {
|
|
1823
|
-
ended = true;
|
|
1824
1824
|
clearInterval(timer);
|
|
1825
1825
|
controller.abort();
|
|
1826
1826
|
signal.removeEventListener("abort", cancel);
|
|
@@ -1832,8 +1832,8 @@ var en_default = {
|
|
|
1832
1832
|
bind: "Bind your phone",
|
|
1833
1833
|
confirm: "Confirm verification",
|
|
1834
1834
|
scan: "Scan with AuthLink",
|
|
1835
|
-
code: "Matching
|
|
1836
|
-
help: "
|
|
1835
|
+
code: "Matching digits",
|
|
1836
|
+
help: "Approve in the App, then enter its 6-digit confirmation code here.",
|
|
1837
1837
|
waiting: "Waiting for your phone",
|
|
1838
1838
|
loading: "Connecting",
|
|
1839
1839
|
confirmed: "Confirmed",
|
|
@@ -1846,7 +1846,16 @@ var en_default = {
|
|
|
1846
1846
|
close: "Close",
|
|
1847
1847
|
cancel: "Cancel",
|
|
1848
1848
|
autoUpdate: "Code updates automatically every 30 seconds",
|
|
1849
|
-
expiring: "Request expiring soon"
|
|
1849
|
+
expiring: "Request expiring soon",
|
|
1850
|
+
confirmationCode: "App confirmation code",
|
|
1851
|
+
submitCode: "Verify",
|
|
1852
|
+
codeError: "The code could not be verified. Check the code and approval, then retry.",
|
|
1853
|
+
codeLocked: "Too many incorrect codes. Close this window and start a new request.",
|
|
1854
|
+
otpCode: "App verification code",
|
|
1855
|
+
otpHelp: "Open AuthLink and enter this account\u2019s current six-digit code. No approval is needed.",
|
|
1856
|
+
otpWaiting: "Enter the current code",
|
|
1857
|
+
otpError: "Verification failed. Check the account; wait for a new code if already used. After repeated failures, try again later.",
|
|
1858
|
+
otpSetup: "Enable verification codes on this account\u2019s card in the app first."
|
|
1850
1859
|
};
|
|
1851
1860
|
|
|
1852
1861
|
// src/locales/zh-CN.json
|
|
@@ -1854,8 +1863,8 @@ var zh_CN_default = {
|
|
|
1854
1863
|
bind: "\u7ED1\u5B9A\u624B\u673A",
|
|
1855
1864
|
confirm: "\u786E\u8BA4\u8EAB\u4EFD\u9A8C\u8BC1",
|
|
1856
1865
|
scan: "\u4F7F\u7528 AuthLink \u626B\u63CF\u4E8C\u7EF4\u7801",
|
|
1857
|
-
code: "\
|
|
1858
|
-
help: "\
|
|
1866
|
+
code: "\u6838\u5BF9\u6570\u5B57",
|
|
1867
|
+
help: "\u5728 App \u6838\u5BF9\u5E76\u6279\u51C6\u540E\uFF0C\u5C06 App \u663E\u793A\u7684 6 \u4F4D\u786E\u8BA4\u7801\u8F93\u5165\u4E0B\u65B9\u3002",
|
|
1859
1868
|
waiting: "\u7B49\u5F85\u624B\u673A\u786E\u8BA4",
|
|
1860
1869
|
loading: "\u6B63\u5728\u8FDE\u63A5",
|
|
1861
1870
|
confirmed: "\u5DF2\u786E\u8BA4",
|
|
@@ -1868,7 +1877,16 @@ var zh_CN_default = {
|
|
|
1868
1877
|
close: "\u5173\u95ED",
|
|
1869
1878
|
cancel: "\u53D6\u6D88",
|
|
1870
1879
|
autoUpdate: "\u6838\u5BF9\u7801\u6BCF 30 \u79D2\u81EA\u52A8\u66F4\u65B0",
|
|
1871
|
-
expiring: "\u8BF7\u6C42\u5373\u5C06\u8FC7\u671F"
|
|
1880
|
+
expiring: "\u8BF7\u6C42\u5373\u5C06\u8FC7\u671F",
|
|
1881
|
+
confirmationCode: "App \u786E\u8BA4\u7801",
|
|
1882
|
+
submitCode: "\u63D0\u4EA4\u9A8C\u8BC1",
|
|
1883
|
+
codeError: "\u9A8C\u8BC1\u672A\u901A\u8FC7\uFF0C\u8BF7\u68C0\u67E5\u786E\u8BA4\u7801\u548C\u624B\u673A\u6279\u51C6\u72B6\u6001\u540E\u91CD\u8BD5\u3002",
|
|
1884
|
+
codeLocked: "\u786E\u8BA4\u7801\u8F93\u5165\u9519\u8BEF\u6B21\u6570\u8FC7\u591A\uFF0C\u8BF7\u5173\u95ED\u7A97\u53E3\u540E\u91CD\u65B0\u53D1\u8D77\u8BF7\u6C42\u3002",
|
|
1885
|
+
otpCode: "App \u52A8\u6001\u7801",
|
|
1886
|
+
otpHelp: "\u6253\u5F00 AuthLink\uFF0C\u8F93\u5165\u8BE5\u8D26\u53F7\u5F53\u524D\u7684\u516D\u4F4D\u52A8\u6001\u7801\uFF0C\u65E0\u9700\u6279\u51C6\u8BF7\u6C42\u3002",
|
|
1887
|
+
otpWaiting: "\u8BF7\u8F93\u5165\u5F53\u524D\u52A8\u6001\u7801",
|
|
1888
|
+
otpError: "\u9A8C\u8BC1\u672A\u901A\u8FC7\u3002\u8BF7\u6838\u5BF9\u8D26\u53F7\uFF1B\u5DF2\u4F7F\u7528\u7684\u7801\u9700\u7B49\u5F85\u66F4\u65B0\uFF0C\u591A\u6B21\u5931\u8D25\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",
|
|
1889
|
+
otpSetup: "\u8BF7\u5148\u5728 App \u7684\u8D26\u53F7\u5361\u7247\u4E2D\u542F\u7528\u52A8\u6001\u7801\u3002"
|
|
1872
1890
|
};
|
|
1873
1891
|
|
|
1874
1892
|
// src/locales/zh-TW.json
|
|
@@ -1876,8 +1894,8 @@ var zh_TW_default = {
|
|
|
1876
1894
|
bind: "\u7D81\u5B9A\u624B\u6A5F",
|
|
1877
1895
|
confirm: "\u78BA\u8A8D\u8EAB\u5206\u9A57\u8B49",
|
|
1878
1896
|
scan: "\u4F7F\u7528 AuthLink \u6383\u63CF QR \u78BC",
|
|
1879
|
-
code: "\
|
|
1880
|
-
help: "\
|
|
1897
|
+
code: "\u6838\u5C0D\u6578\u5B57",
|
|
1898
|
+
help: "\u5728 App \u6838\u5C0D\u4E26\u6279\u51C6\u5F8C\uFF0C\u5C07 App \u986F\u793A\u7684 6 \u4F4D\u78BA\u8A8D\u78BC\u8F38\u5165\u4E0B\u65B9\u3002",
|
|
1881
1899
|
waiting: "\u7B49\u5F85\u624B\u6A5F\u78BA\u8A8D",
|
|
1882
1900
|
loading: "\u6B63\u5728\u9023\u7DDA",
|
|
1883
1901
|
confirmed: "\u5DF2\u78BA\u8A8D",
|
|
@@ -1890,7 +1908,16 @@ var zh_TW_default = {
|
|
|
1890
1908
|
close: "\u95DC\u9589",
|
|
1891
1909
|
cancel: "\u53D6\u6D88",
|
|
1892
1910
|
autoUpdate: "\u6838\u5C0D\u78BC\u6BCF 30 \u79D2\u81EA\u52D5\u66F4\u65B0",
|
|
1893
|
-
expiring: "\u8ACB\u6C42\u5373\u5C07\u5230\u671F"
|
|
1911
|
+
expiring: "\u8ACB\u6C42\u5373\u5C07\u5230\u671F",
|
|
1912
|
+
confirmationCode: "App \u78BA\u8A8D\u78BC",
|
|
1913
|
+
submitCode: "\u63D0\u4EA4\u9A57\u8B49",
|
|
1914
|
+
codeError: "\u9A57\u8B49\u672A\u901A\u904E\uFF0C\u8ACB\u6AA2\u67E5\u78BA\u8A8D\u78BC\u53CA\u624B\u6A5F\u6279\u51C6\u72C0\u614B\u5F8C\u91CD\u8A66\u3002",
|
|
1915
|
+
codeLocked: "\u78BA\u8A8D\u78BC\u8F38\u5165\u932F\u8AA4\u6B21\u6578\u904E\u591A\uFF0C\u8ACB\u95DC\u9589\u8996\u7A97\u5F8C\u91CD\u65B0\u767C\u8D77\u8ACB\u6C42\u3002",
|
|
1916
|
+
otpCode: "App \u52D5\u614B\u78BC",
|
|
1917
|
+
otpHelp: "\u958B\u555F AuthLink\uFF0C\u8F38\u5165\u6B64\u5E33\u865F\u76EE\u524D\u7684\u516D\u4F4D\u52D5\u614B\u78BC\uFF0C\u7121\u9700\u6279\u51C6\u8ACB\u6C42\u3002",
|
|
1918
|
+
otpWaiting: "\u8ACB\u8F38\u5165\u76EE\u524D\u7684\u52D5\u614B\u78BC",
|
|
1919
|
+
otpError: "\u9A57\u8B49\u672A\u901A\u904E\u3002\u8ACB\u6838\u5C0D\u5E33\u865F\uFF1B\u5DF2\u4F7F\u7528\u7684\u78BC\u9700\u7B49\u5F85\u66F4\u65B0\uFF0C\u591A\u6B21\u5931\u6557\u8ACB\u7A0D\u5F8C\u91CD\u8A66\u3002",
|
|
1920
|
+
otpSetup: "\u8ACB\u5148\u5728 App \u7684\u5E33\u865F\u5361\u7247\u4E2D\u555F\u7528\u52D5\u614B\u78BC\u3002"
|
|
1894
1921
|
};
|
|
1895
1922
|
|
|
1896
1923
|
// src/locales/ja.json
|
|
@@ -1898,8 +1925,8 @@ var ja_default = {
|
|
|
1898
1925
|
bind: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3092\u767B\u9332",
|
|
1899
1926
|
confirm: "\u672C\u4EBA\u78BA\u8A8D",
|
|
1900
1927
|
scan: "AuthLink \u3067 QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3",
|
|
1901
|
-
code: "\u7167\u5408\
|
|
1902
|
-
help: "\
|
|
1928
|
+
code: "\u7167\u5408\u7528\u306E\u6570\u5B57",
|
|
1929
|
+
help: "App \u3067\u627F\u8A8D\u3057\u305F\u5F8C\u3001\u8868\u793A\u3055\u308C\u305F6\u6841\u306E\u78BA\u8A8D\u30B3\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1903
1930
|
waiting: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u306E\u78BA\u8A8D\u3092\u5F85\u3063\u3066\u3044\u307E\u3059",
|
|
1904
1931
|
loading: "\u63A5\u7D9A\u4E2D",
|
|
1905
1932
|
confirmed: "\u78BA\u8A8D\u6E08\u307F",
|
|
@@ -1912,7 +1939,16 @@ var ja_default = {
|
|
|
1912
1939
|
close: "\u9589\u3058\u308B",
|
|
1913
1940
|
cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB",
|
|
1914
1941
|
autoUpdate: "\u7167\u5408\u30B3\u30FC\u30C9\u306F30\u79D2\u3054\u3068\u306B\u81EA\u52D5\u66F4\u65B0",
|
|
1915
|
-
expiring: "\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u6709\u52B9\u671F\u9650\u304C\u307E\u3082\u306A\u304F\u5207\u308C\u307E\u3059"
|
|
1942
|
+
expiring: "\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u6709\u52B9\u671F\u9650\u304C\u307E\u3082\u306A\u304F\u5207\u308C\u307E\u3059",
|
|
1943
|
+
confirmationCode: "App \u306E\u78BA\u8A8D\u30B3\u30FC\u30C9",
|
|
1944
|
+
submitCode: "\u78BA\u8A8D\u3059\u308B",
|
|
1945
|
+
codeError: "\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30B3\u30FC\u30C9\u3068\u627F\u8A8D\u72B6\u6CC1\u3092\u78BA\u8A8D\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1946
|
+
codeLocked: "\u30B3\u30FC\u30C9\u306E\u8AA4\u5165\u529B\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u753B\u9762\u3092\u9589\u3058\u3001\u65B0\u3057\u3044\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u958B\u59CB\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1947
|
+
otpCode: "\u30A2\u30D7\u30EA\u306E\u8A8D\u8A3C\u30B3\u30FC\u30C9",
|
|
1948
|
+
otpHelp: "AuthLink \u3092\u958B\u304D\u3001\u3053\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u73FE\u5728\u306E6\u6841\u30B3\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u627F\u8A8D\u64CD\u4F5C\u306F\u4E0D\u8981\u3067\u3059\u3002",
|
|
1949
|
+
otpWaiting: "\u73FE\u5728\u306E\u30B3\u30FC\u30C9\u3092\u5165\u529B",
|
|
1950
|
+
otpError: "\u8A8D\u8A3C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3057\u3001\u4F7F\u7528\u6E08\u307F\u306A\u3089\u6B21\u306E\u30B3\u30FC\u30C9\u3092\u5F85\u3063\u3066\u304F\u3060\u3055\u3044\u3002\u5931\u6557\u304C\u7D9A\u304F\u5834\u5408\u306F\u6642\u9593\u3092\u304A\u3044\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1951
|
+
otpSetup: "\u5148\u306B\u30A2\u30D7\u30EA\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u753B\u9762\u3067\u8A8D\u8A3C\u30B3\u30FC\u30C9\u3092\u6709\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"
|
|
1916
1952
|
};
|
|
1917
1953
|
|
|
1918
1954
|
// src/locales/bn.json
|
|
@@ -1921,7 +1957,7 @@ var bn_default = {
|
|
|
1921
1957
|
confirm: "\u09AF\u09BE\u099A\u09BE\u0987\u0995\u09B0\u09A3 \u09A8\u09BF\u09B6\u09CD\u099A\u09BF\u09A4 \u0995\u09B0\u09C1\u09A8",
|
|
1922
1958
|
scan: "AuthLink \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
|
|
1923
1959
|
code: "\u09AE\u09BF\u09B2\u09BF\u09AF\u09BC\u09C7 \u09A6\u09C7\u0996\u09BE\u09B0 \u0995\u09CB\u09A1",
|
|
1924
|
-
help: "\u0985\u09CD\u09AF\u09BE\u09AA\u09C7
|
|
1960
|
+
help: "\u0985\u09CD\u09AF\u09BE\u09AA\u09C7 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u09A6\u09BF\u09A8, \u09A4\u09BE\u09B0\u09AA\u09B0 \u098F\u0996\u09BE\u09A8\u09C7 \u09EC \u09B8\u0982\u0996\u09CD\u09AF\u09BE\u09B0 \u09A8\u09BF\u09B6\u09CD\u099A\u09BF\u09A4\u0995\u09B0\u09A3 \u0995\u09CB\u09A1 \u09B2\u09BF\u0996\u09C1\u09A8\u0964",
|
|
1925
1961
|
waiting: "\u09AB\u09CB\u09A8\u09C7 \u09A8\u09BF\u09B6\u09CD\u099A\u09BF\u09A4\u0995\u09B0\u09A3\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
|
|
1926
1962
|
loading: "\u09B8\u0982\u09AF\u09CB\u0997 \u0995\u09B0\u09BE \u09B9\u099A\u09CD\u099B\u09C7",
|
|
1927
1963
|
confirmed: "\u09A8\u09BF\u09B6\u09CD\u099A\u09BF\u09A4 \u09B9\u09AF\u09BC\u09C7\u099B\u09C7",
|
|
@@ -1934,7 +1970,16 @@ var bn_default = {
|
|
|
1934
1970
|
close: "\u09AC\u09A8\u09CD\u09A7 \u0995\u09B0\u09C1\u09A8",
|
|
1935
1971
|
cancel: "\u09AC\u09BE\u09A4\u09BF\u09B2",
|
|
1936
1972
|
autoUpdate: "\u0995\u09CB\u09A1 \u09AA\u09CD\u09B0\u09A4\u09BF \u09E9\u09E6 \u09B8\u09C7\u0995\u09C7\u09A8\u09CD\u09A1\u09C7 \u09B8\u09CD\u09AC\u09AF\u09BC\u0982\u0995\u09CD\u09B0\u09BF\u09AF\u09BC\u09AD\u09BE\u09AC\u09C7 \u09AC\u09A6\u09B2\u09BE\u09AF\u09BC",
|
|
1937
|
-
expiring: "\u0985\u09A8\u09C1\u09B0\u09CB\u09A7\u09C7\u09B0 \u09AE\u09C7\u09AF\u09BC\u09BE\u09A6 \u09B6\u09C0\u0998\u09CD\u09B0\u0987 \u09B6\u09C7\u09B7 \u09B9\u09AC\u09C7"
|
|
1973
|
+
expiring: "\u0985\u09A8\u09C1\u09B0\u09CB\u09A7\u09C7\u09B0 \u09AE\u09C7\u09AF\u09BC\u09BE\u09A6 \u09B6\u09C0\u0998\u09CD\u09B0\u0987 \u09B6\u09C7\u09B7 \u09B9\u09AC\u09C7",
|
|
1974
|
+
confirmationCode: "\u0985\u09CD\u09AF\u09BE\u09AA\u09C7\u09B0 \u09A8\u09BF\u09B6\u09CD\u099A\u09BF\u09A4\u0995\u09B0\u09A3 \u0995\u09CB\u09A1",
|
|
1975
|
+
submitCode: "\u09AF\u09BE\u099A\u09BE\u0987 \u0995\u09B0\u09C1\u09A8",
|
|
1976
|
+
codeError: "\u09AF\u09BE\u099A\u09BE\u0987 \u0995\u09B0\u09BE \u09AF\u09BE\u09AF\u09BC\u09A8\u09BF\u0964 \u0995\u09CB\u09A1 \u0993 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u09AA\u09B0\u09C0\u0995\u09CD\u09B7\u09BE \u0995\u09B0\u09C7 \u0986\u09AC\u09BE\u09B0 \u099A\u09C7\u09B7\u09CD\u099F\u09BE \u0995\u09B0\u09C1\u09A8\u0964",
|
|
1977
|
+
codeLocked: "\u0985\u09A8\u09C7\u0995\u09AC\u09BE\u09B0 \u09AD\u09C1\u09B2 \u0995\u09CB\u09A1 \u09A6\u09C7\u0993\u09AF\u09BC\u09BE \u09B9\u09AF\u09BC\u09C7\u099B\u09C7\u0964 \u0989\u0987\u09A8\u09CD\u09A1\u09CB \u09AC\u09A8\u09CD\u09A7 \u0995\u09B0\u09C7 \u09A8\u09A4\u09C1\u09A8 \u0985\u09A8\u09C1\u09B0\u09CB\u09A7 \u09B6\u09C1\u09B0\u09C1 \u0995\u09B0\u09C1\u09A8\u0964",
|
|
1978
|
+
otpCode: "\u0985\u09CD\u09AF\u09BE\u09AA\u09C7\u09B0 \u0995\u09CB\u09A1",
|
|
1979
|
+
otpHelp: "AuthLink \u0996\u09C1\u09B2\u09C7 \u098F\u0987 \u0985\u09CD\u09AF\u09BE\u0995\u09BE\u0989\u09A8\u09CD\u099F\u09C7\u09B0 \u09AC\u09B0\u09CD\u09A4\u09AE\u09BE\u09A8 \u099B\u09AF\u09BC \u0985\u0999\u09CD\u0995\u09C7\u09B0 \u0995\u09CB\u09A1 \u09B2\u09BF\u0996\u09C1\u09A8\u0964 \u0985\u09A8\u09C1\u09B0\u09CB\u09A7 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8\u09C7\u09B0 \u09AA\u09CD\u09B0\u09AF\u09BC\u09CB\u099C\u09A8 \u09A8\u09C7\u0987\u0964",
|
|
1980
|
+
otpWaiting: "\u09AC\u09B0\u09CD\u09A4\u09AE\u09BE\u09A8 \u0995\u09CB\u09A1 \u09B2\u09BF\u0996\u09C1\u09A8",
|
|
1981
|
+
otpError: "\u09AF\u09BE\u099A\u09BE\u0987 \u09AC\u09CD\u09AF\u09B0\u09CD\u09A5\u0964 \u0985\u09CD\u09AF\u09BE\u0995\u09BE\u0989\u09A8\u09CD\u099F \u09AA\u09B0\u09C0\u0995\u09CD\u09B7\u09BE \u0995\u09B0\u09C1\u09A8 \u098F\u09AC\u0982 \u09AC\u09CD\u09AF\u09AC\u09B9\u09C3\u09A4 \u0995\u09CB\u09A1 \u09B9\u09B2\u09C7 \u09A8\u09A4\u09C1\u09A8 \u0995\u09CB\u09A1\u09C7\u09B0 \u099C\u09A8\u09CD\u09AF \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE \u0995\u09B0\u09C1\u09A8\u0964 \u09AC\u09BE\u09B0\u09AC\u09BE\u09B0 \u09AC\u09CD\u09AF\u09B0\u09CD\u09A5 \u09B9\u09B2\u09C7 \u09AA\u09B0\u09C7 \u099A\u09C7\u09B7\u09CD\u099F\u09BE \u0995\u09B0\u09C1\u09A8\u0964",
|
|
1982
|
+
otpSetup: "\u09AA\u09CD\u09B0\u09A5\u09AE\u09C7 \u0985\u09CD\u09AF\u09BE\u09AA\u09C7 \u098F\u0987 \u0985\u09CD\u09AF\u09BE\u0995\u09BE\u0989\u09A8\u09CD\u099F\u09C7\u09B0 \u0995\u09BE\u09B0\u09CD\u09A1\u09C7 \u0995\u09CB\u09A1 \u099A\u09BE\u09B2\u09C1 \u0995\u09B0\u09C1\u09A8\u0964"
|
|
1938
1983
|
};
|
|
1939
1984
|
|
|
1940
1985
|
// src/locales/es.json
|
|
@@ -1943,7 +1988,7 @@ var es_default = {
|
|
|
1943
1988
|
confirm: "Confirma la verificaci\xF3n",
|
|
1944
1989
|
scan: "Escanea con AuthLink",
|
|
1945
1990
|
code: "C\xF3digo de comparaci\xF3n",
|
|
1946
|
-
help: "
|
|
1991
|
+
help: "Aprueba en la app e introduce aqu\xED su c\xF3digo de 6 d\xEDgitos.",
|
|
1947
1992
|
waiting: "Esperando la confirmaci\xF3n del tel\xE9fono",
|
|
1948
1993
|
loading: "Conectando",
|
|
1949
1994
|
confirmed: "Confirmado",
|
|
@@ -1956,7 +2001,16 @@ var es_default = {
|
|
|
1956
2001
|
close: "Cerrar",
|
|
1957
2002
|
cancel: "Cancelar",
|
|
1958
2003
|
autoUpdate: "El c\xF3digo se actualiza autom\xE1ticamente cada 30 segundos",
|
|
1959
|
-
expiring: "La solicitud est\xE1 por caducar"
|
|
2004
|
+
expiring: "La solicitud est\xE1 por caducar",
|
|
2005
|
+
confirmationCode: "C\xF3digo de confirmaci\xF3n de la app",
|
|
2006
|
+
submitCode: "Verificar",
|
|
2007
|
+
codeError: "No se pudo verificar. Revisa el c\xF3digo y la aprobaci\xF3n.",
|
|
2008
|
+
codeLocked: "Demasiados c\xF3digos incorrectos. Cierra la ventana e inicia una nueva solicitud.",
|
|
2009
|
+
otpCode: "C\xF3digo de la app",
|
|
2010
|
+
otpHelp: "Abre AuthLink e introduce el c\xF3digo actual de seis d\xEDgitos de esta cuenta. No hace falta aprobar una solicitud.",
|
|
2011
|
+
otpWaiting: "Introduce el c\xF3digo actual",
|
|
2012
|
+
otpError: "No se pudo verificar. Comprueba la cuenta y espera un c\xF3digo nuevo si ya lo usaste. Si fallas varias veces, int\xE9ntalo m\xE1s tarde.",
|
|
2013
|
+
otpSetup: "Activa primero los c\xF3digos en la tarjeta de esta cuenta en la app."
|
|
1960
2014
|
};
|
|
1961
2015
|
|
|
1962
2016
|
// src/locales/fil.json
|
|
@@ -1965,7 +2019,7 @@ var fil_default = {
|
|
|
1965
2019
|
confirm: "Kumpirmahin ang pagpapatunay",
|
|
1966
2020
|
scan: "Mag-scan gamit ang AuthLink",
|
|
1967
2021
|
code: "Code na paghahambingin",
|
|
1968
|
-
help: "
|
|
2022
|
+
help: "Aprubahan sa app, saka ilagay dito ang 6-digit na confirmation code.",
|
|
1969
2023
|
waiting: "Hinihintay ang kumpirmasyon sa telepono",
|
|
1970
2024
|
loading: "Kumokonekta",
|
|
1971
2025
|
confirmed: "Nakumpirma",
|
|
@@ -1978,7 +2032,16 @@ var fil_default = {
|
|
|
1978
2032
|
close: "Isara",
|
|
1979
2033
|
cancel: "Kanselahin",
|
|
1980
2034
|
autoUpdate: "Awtomatikong nagbabago ang code kada 30 segundo",
|
|
1981
|
-
expiring: "Malapit nang mag-expire ang kahilingan"
|
|
2035
|
+
expiring: "Malapit nang mag-expire ang kahilingan",
|
|
2036
|
+
confirmationCode: "Confirmation code ng app",
|
|
2037
|
+
submitCode: "I-verify",
|
|
2038
|
+
codeError: "Hindi ma-verify. Suriin ang code at pag-apruba at subukan muli.",
|
|
2039
|
+
codeLocked: "Masyadong maraming maling code. Isara ang window at magsimula ng bagong request.",
|
|
2040
|
+
otpCode: "Code ng app",
|
|
2041
|
+
otpHelp: "Buksan ang AuthLink at ilagay ang kasalukuyang anim na digit na code ng account na ito. Hindi kailangang aprubahan ang request.",
|
|
2042
|
+
otpWaiting: "Ilagay ang kasalukuyang code",
|
|
2043
|
+
otpError: "Hindi napatunayan. Tingnan ang account at maghintay ng bagong code kung nagamit na. Subukang muli mamaya kung maraming maling pagtatangka.",
|
|
2044
|
+
otpSetup: "Paganahin muna ang mga code sa card ng account na ito sa app."
|
|
1982
2045
|
};
|
|
1983
2046
|
|
|
1984
2047
|
// src/locales/hi.json
|
|
@@ -1987,7 +2050,7 @@ var hi_default = {
|
|
|
1987
2050
|
confirm: "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930\u0947\u0902",
|
|
1988
2051
|
scan: "AuthLink \u0938\u0947 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
|
|
1989
2052
|
code: "\u092E\u093F\u0932\u093E\u0928 \u0915\u094B\u0921",
|
|
1990
|
-
help: "\u0910\u092A \u092E\u0947\u0902 \u0938\
|
|
2053
|
+
help: "\u0910\u092A \u092E\u0947\u0902 \u0938\u094D\u0935\u0940\u0915\u0943\u0924\u093F \u0926\u0947\u0902, \u092B\u093F\u0930 \u092F\u0939\u093E\u0901 6 \u0905\u0902\u0915\u094B\u0902 \u0915\u093E \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u094B\u0921 \u0926\u0930\u094D\u091C \u0915\u0930\u0947\u0902\u0964",
|
|
1991
2054
|
waiting: "\u092B\u093C\u094B\u0928 \u092A\u0930 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
|
|
1992
2055
|
loading: "\u0915\u0928\u0947\u0915\u094D\u091F \u0939\u094B \u0930\u0939\u093E \u0939\u0948",
|
|
1993
2056
|
confirmed: "\u092A\u0941\u0937\u094D\u091F\u093F \u0939\u094B \u0917\u0908",
|
|
@@ -2000,7 +2063,16 @@ var hi_default = {
|
|
|
2000
2063
|
close: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
|
|
2001
2064
|
cancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
|
|
2002
2065
|
autoUpdate: "\u0915\u094B\u0921 \u0939\u0930 30 \u0938\u0947\u0915\u0902\u0921 \u092E\u0947\u0902 \u0905\u092A\u0928\u0947 \u0906\u092A \u092C\u0926\u0932\u0924\u093E \u0939\u0948",
|
|
2003
|
-
expiring: "\u0905\u0928\u0941\u0930\u094B\u0927 \u0915\u0940 \u0938\u092E\u092F-\u0938\u0940\u092E\u093E \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B\u0928\u0947 \u0935\u093E\u0932\u0940 \u0939\u0948"
|
|
2066
|
+
expiring: "\u0905\u0928\u0941\u0930\u094B\u0927 \u0915\u0940 \u0938\u092E\u092F-\u0938\u0940\u092E\u093E \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B\u0928\u0947 \u0935\u093E\u0932\u0940 \u0939\u0948",
|
|
2067
|
+
confirmationCode: "\u0910\u092A \u0915\u093E \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u094B\u0921",
|
|
2068
|
+
submitCode: "\u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0915\u0930\u0947\u0902",
|
|
2069
|
+
codeError: "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0935\u093F\u092B\u0932 \u0930\u0939\u093E\u0964 \u0915\u094B\u0921 \u0914\u0930 \u0938\u094D\u0935\u0940\u0915\u0943\u0924\u093F \u091C\u093E\u0901\u091A\u0915\u0930 \u092A\u0941\u0928\u0903 \u092A\u094D\u0930\u092F\u093E\u0938 \u0915\u0930\u0947\u0902\u0964",
|
|
2070
|
+
codeLocked: "\u092C\u0939\u0941\u0924 \u0905\u0927\u093F\u0915 \u0917\u0932\u0924 \u0915\u094B\u0921\u0964 \u0935\u093F\u0902\u0921\u094B \u092C\u0902\u0926 \u0915\u0930\u0915\u0947 \u0928\u092F\u093E \u0905\u0928\u0941\u0930\u094B\u0927 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902\u0964",
|
|
2071
|
+
otpCode: "\u0910\u092A \u0915\u093E \u0915\u094B\u0921",
|
|
2072
|
+
otpHelp: "AuthLink \u0916\u094B\u0932\u0947\u0902 \u0914\u0930 \u0907\u0938 \u0916\u093E\u0924\u0947 \u0915\u093E \u0935\u0930\u094D\u0924\u092E\u093E\u0928 \u091B\u0939 \u0905\u0902\u0915\u094B\u0902 \u0915\u093E \u0915\u094B\u0921 \u0926\u0930\u094D\u091C \u0915\u0930\u0947\u0902\u0964 \u0905\u0928\u0941\u0930\u094B\u0927 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0928\u0947 \u0915\u0940 \u0906\u0935\u0936\u094D\u092F\u0915\u0924\u093E \u0928\u0939\u0940\u0902 \u0939\u0948\u0964",
|
|
2073
|
+
otpWaiting: "\u0935\u0930\u094D\u0924\u092E\u093E\u0928 \u0915\u094B\u0921 \u0926\u0930\u094D\u091C \u0915\u0930\u0947\u0902",
|
|
2074
|
+
otpError: "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0905\u0938\u092B\u0932\u0964 \u0916\u093E\u0924\u093E \u091C\u093E\u0901\u091A\u0947\u0902 \u0914\u0930 \u0909\u092A\u092F\u094B\u0917 \u0939\u094B \u091A\u0941\u0915\u093E \u0939\u094B \u0924\u094B \u0928\u090F \u0915\u094B\u0921 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\u0964 \u092C\u093E\u0930-\u092C\u093E\u0930 \u0905\u0938\u092B\u0932 \u0939\u094B\u0928\u0947 \u092A\u0930 \u092C\u093E\u0926 \u092E\u0947\u0902 \u092A\u094D\u0930\u092F\u093E\u0938 \u0915\u0930\u0947\u0902\u0964",
|
|
2075
|
+
otpSetup: "\u092A\u0939\u0932\u0947 \u0910\u092A \u092E\u0947\u0902 \u0907\u0938 \u0916\u093E\u0924\u0947 \u0915\u0947 \u0915\u093E\u0930\u094D\u0921 \u092A\u0930 \u0915\u094B\u0921 \u0938\u0915\u094D\u0937\u092E \u0915\u0930\u0947\u0902\u0964"
|
|
2004
2076
|
};
|
|
2005
2077
|
|
|
2006
2078
|
// src/locales/id.json
|
|
@@ -2009,7 +2081,7 @@ var id_default = {
|
|
|
2009
2081
|
confirm: "Konfirmasi verifikasi",
|
|
2010
2082
|
scan: "Pindai dengan AuthLink",
|
|
2011
2083
|
code: "Kode pencocokan",
|
|
2012
|
-
help: "
|
|
2084
|
+
help: "Setujui di aplikasi, lalu masukkan kode konfirmasi 6 digit di sini.",
|
|
2013
2085
|
waiting: "Menunggu konfirmasi dari ponsel",
|
|
2014
2086
|
loading: "Menghubungkan",
|
|
2015
2087
|
confirmed: "Dikonfirmasi",
|
|
@@ -2022,7 +2094,16 @@ var id_default = {
|
|
|
2022
2094
|
close: "Tutup",
|
|
2023
2095
|
cancel: "Batal",
|
|
2024
2096
|
autoUpdate: "Kode diperbarui otomatis setiap 30 detik",
|
|
2025
|
-
expiring: "Permintaan akan segera kedaluwarsa"
|
|
2097
|
+
expiring: "Permintaan akan segera kedaluwarsa",
|
|
2098
|
+
confirmationCode: "Kode konfirmasi aplikasi",
|
|
2099
|
+
submitCode: "Verifikasi",
|
|
2100
|
+
codeError: "Verifikasi gagal. Periksa kode dan persetujuan, lalu coba lagi.",
|
|
2101
|
+
codeLocked: "Terlalu banyak kode salah. Tutup jendela dan mulai permintaan baru.",
|
|
2102
|
+
otpCode: "Kode aplikasi",
|
|
2103
|
+
otpHelp: "Buka AuthLink dan masukkan kode enam digit terkini untuk akun ini. Tidak perlu menyetujui permintaan.",
|
|
2104
|
+
otpWaiting: "Masukkan kode terkini",
|
|
2105
|
+
otpError: "Verifikasi gagal. Periksa akun dan tunggu kode baru jika sudah digunakan. Setelah beberapa kegagalan, coba lagi nanti.",
|
|
2106
|
+
otpSetup: "Aktifkan kode di kartu akun ini dalam aplikasi terlebih dahulu."
|
|
2026
2107
|
};
|
|
2027
2108
|
|
|
2028
2109
|
// src/locales/ms.json
|
|
@@ -2031,7 +2112,7 @@ var ms_default = {
|
|
|
2031
2112
|
confirm: "Sahkan pengesahan",
|
|
2032
2113
|
scan: "Imbas dengan AuthLink",
|
|
2033
2114
|
code: "Kod padanan",
|
|
2034
|
-
help: "
|
|
2115
|
+
help: "Luluskan dalam aplikasi, kemudian masukkan kod pengesahan 6 digit di sini.",
|
|
2035
2116
|
waiting: "Menunggu pengesahan daripada telefon",
|
|
2036
2117
|
loading: "Sedang menyambung",
|
|
2037
2118
|
confirmed: "Disahkan",
|
|
@@ -2044,7 +2125,16 @@ var ms_default = {
|
|
|
2044
2125
|
close: "Tutup",
|
|
2045
2126
|
cancel: "Batal",
|
|
2046
2127
|
autoUpdate: "Kod dikemas kini secara automatik setiap 30 saat",
|
|
2047
|
-
expiring: "Permintaan akan tamat tempoh tidak lama lagi"
|
|
2128
|
+
expiring: "Permintaan akan tamat tempoh tidak lama lagi",
|
|
2129
|
+
confirmationCode: "Kod pengesahan aplikasi",
|
|
2130
|
+
submitCode: "Sahkan",
|
|
2131
|
+
codeError: "Pengesahan gagal. Semak kod dan kelulusan, kemudian cuba lagi.",
|
|
2132
|
+
codeLocked: "Terlalu banyak kod salah. Tutup tetingkap dan mulakan permintaan baharu.",
|
|
2133
|
+
otpCode: "Kod aplikasi",
|
|
2134
|
+
otpHelp: "Buka AuthLink dan masukkan kod enam digit semasa untuk akaun ini. Tiada kelulusan permintaan diperlukan.",
|
|
2135
|
+
otpWaiting: "Masukkan kod semasa",
|
|
2136
|
+
otpError: "Pengesahan gagal. Semak akaun dan tunggu kod baharu jika sudah digunakan. Selepas beberapa kegagalan, cuba lagi kemudian.",
|
|
2137
|
+
otpSetup: "Aktifkan kod pada kad akaun ini dalam aplikasi dahulu."
|
|
2048
2138
|
};
|
|
2049
2139
|
|
|
2050
2140
|
// src/locales/pt.json
|
|
@@ -2053,7 +2143,7 @@ var pt_default = {
|
|
|
2053
2143
|
confirm: "Confirme a verifica\xE7\xE3o",
|
|
2054
2144
|
scan: "Escaneie com o AuthLink",
|
|
2055
2145
|
code: "C\xF3digo de compara\xE7\xE3o",
|
|
2056
|
-
help: "
|
|
2146
|
+
help: "Aprove no app e digite aqui o c\xF3digo de 6 d\xEDgitos.",
|
|
2057
2147
|
waiting: "Aguardando confirma\xE7\xE3o no celular",
|
|
2058
2148
|
loading: "Conectando",
|
|
2059
2149
|
confirmed: "Confirmado",
|
|
@@ -2066,7 +2156,16 @@ var pt_default = {
|
|
|
2066
2156
|
close: "Fechar",
|
|
2067
2157
|
cancel: "Cancelar",
|
|
2068
2158
|
autoUpdate: "O c\xF3digo \xE9 atualizado automaticamente a cada 30 segundos",
|
|
2069
|
-
expiring: "A solicita\xE7\xE3o est\xE1 prestes a expirar"
|
|
2159
|
+
expiring: "A solicita\xE7\xE3o est\xE1 prestes a expirar",
|
|
2160
|
+
confirmationCode: "C\xF3digo de confirma\xE7\xE3o do app",
|
|
2161
|
+
submitCode: "Verificar",
|
|
2162
|
+
codeError: "N\xE3o foi poss\xEDvel verificar. Confira o c\xF3digo e a aprova\xE7\xE3o.",
|
|
2163
|
+
codeLocked: "Muitos c\xF3digos incorretos. Feche a janela e inicie uma nova solicita\xE7\xE3o.",
|
|
2164
|
+
otpCode: "C\xF3digo do aplicativo",
|
|
2165
|
+
otpHelp: "Abra o AuthLink e digite o c\xF3digo atual de seis d\xEDgitos desta conta. N\xE3o \xE9 necess\xE1rio aprovar uma solicita\xE7\xE3o.",
|
|
2166
|
+
otpWaiting: "Digite o c\xF3digo atual",
|
|
2167
|
+
otpError: "Falha na verifica\xE7\xE3o. Confira a conta e aguarde um novo c\xF3digo se j\xE1 o usou. Ap\xF3s v\xE1rias falhas, tente mais tarde.",
|
|
2168
|
+
otpSetup: "Ative primeiro os c\xF3digos no cart\xE3o desta conta no aplicativo."
|
|
2070
2169
|
};
|
|
2071
2170
|
|
|
2072
2171
|
// src/locales/th.json
|
|
@@ -2075,7 +2174,7 @@ var th_default = {
|
|
|
2075
2174
|
confirm: "\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E01\u0E32\u0E23\u0E15\u0E23\u0E27\u0E08\u0E2A\u0E2D\u0E1A",
|
|
2076
2175
|
scan: "\u0E2A\u0E41\u0E01\u0E19\u0E14\u0E49\u0E27\u0E22 AuthLink",
|
|
2077
2176
|
code: "\u0E23\u0E2B\u0E31\u0E2A\u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A\u0E40\u0E1B\u0E23\u0E35\u0E22\u0E1A\u0E40\u0E17\u0E35\u0E22\u0E1A",
|
|
2078
|
-
help: "\
|
|
2177
|
+
help: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E43\u0E19\u0E41\u0E2D\u0E1B \u0E41\u0E25\u0E49\u0E27\u0E01\u0E23\u0E2D\u0E01\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19 6 \u0E2B\u0E25\u0E31\u0E01\u0E17\u0E35\u0E48\u0E19\u0E35\u0E48",
|
|
2079
2178
|
waiting: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E08\u0E32\u0E01\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C",
|
|
2080
2179
|
loading: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E40\u0E0A\u0E37\u0E48\u0E2D\u0E21\u0E15\u0E48\u0E2D",
|
|
2081
2180
|
confirmed: "\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E41\u0E25\u0E49\u0E27",
|
|
@@ -2088,7 +2187,16 @@ var th_default = {
|
|
|
2088
2187
|
close: "\u0E1B\u0E34\u0E14",
|
|
2089
2188
|
cancel: "\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",
|
|
2090
2189
|
autoUpdate: "\u0E23\u0E2B\u0E31\u0E2A\u0E08\u0E30\u0E2D\u0E31\u0E1B\u0E40\u0E14\u0E15\u0E2D\u0E31\u0E15\u0E42\u0E19\u0E21\u0E31\u0E15\u0E34\u0E17\u0E38\u0E01 30 \u0E27\u0E34\u0E19\u0E32\u0E17\u0E35",
|
|
2091
|
-
expiring: "\u0E04\u0E33\u0E02\u0E2D\u0E43\u0E01\u0E25\u0E49\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38"
|
|
2190
|
+
expiring: "\u0E04\u0E33\u0E02\u0E2D\u0E43\u0E01\u0E25\u0E49\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38",
|
|
2191
|
+
confirmationCode: "\u0E23\u0E2B\u0E31\u0E2A\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E08\u0E32\u0E01\u0E41\u0E2D\u0E1B",
|
|
2192
|
+
submitCode: "\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19",
|
|
2193
|
+
codeError: "\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08 \u0E15\u0E23\u0E27\u0E08\u0E2A\u0E2D\u0E1A\u0E23\u0E2B\u0E31\u0E2A\u0E41\u0E25\u0E30\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E41\u0E25\u0E49\u0E27\u0E25\u0E2D\u0E07\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07",
|
|
2194
|
+
codeLocked: "\u0E01\u0E23\u0E2D\u0E01\u0E23\u0E2B\u0E31\u0E2A\u0E1C\u0E34\u0E14\u0E2B\u0E25\u0E32\u0E22\u0E04\u0E23\u0E31\u0E49\u0E07\u0E40\u0E01\u0E34\u0E19\u0E44\u0E1B \u0E42\u0E1B\u0E23\u0E14\u0E1B\u0E34\u0E14\u0E2B\u0E19\u0E49\u0E32\u0E15\u0E48\u0E32\u0E07\u0E41\u0E25\u0E49\u0E27\u0E40\u0E23\u0E34\u0E48\u0E21\u0E04\u0E33\u0E02\u0E2D\u0E43\u0E2B\u0E21\u0E48",
|
|
2195
|
+
otpCode: "\u0E23\u0E2B\u0E31\u0E2A\u0E08\u0E32\u0E01\u0E41\u0E2D\u0E1B",
|
|
2196
|
+
otpHelp: "\u0E40\u0E1B\u0E34\u0E14 AuthLink \u0E41\u0E25\u0E30\u0E01\u0E23\u0E2D\u0E01\u0E23\u0E2B\u0E31\u0E2A\u0E2B\u0E01\u0E2B\u0E25\u0E31\u0E01\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19\u0E02\u0E2D\u0E07\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E19\u0E35\u0E49 \u0E44\u0E21\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E04\u0E33\u0E02\u0E2D",
|
|
2197
|
+
otpWaiting: "\u0E01\u0E23\u0E2D\u0E01\u0E23\u0E2B\u0E31\u0E2A\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19",
|
|
2198
|
+
otpError: "\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08 \u0E42\u0E1B\u0E23\u0E14\u0E15\u0E23\u0E27\u0E08\u0E2A\u0E2D\u0E1A\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E41\u0E25\u0E30\u0E23\u0E2D\u0E23\u0E2B\u0E31\u0E2A\u0E43\u0E2B\u0E21\u0E48\u0E2B\u0E32\u0E01\u0E43\u0E0A\u0E49\u0E44\u0E1B\u0E41\u0E25\u0E49\u0E27 \u0E2B\u0E32\u0E01\u0E1C\u0E34\u0E14\u0E2B\u0E25\u0E32\u0E22\u0E04\u0E23\u0E31\u0E49\u0E07\u0E43\u0E2B\u0E49\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48\u0E20\u0E32\u0E22\u0E2B\u0E25\u0E31\u0E07",
|
|
2199
|
+
otpSetup: "\u0E40\u0E1B\u0E34\u0E14\u0E43\u0E0A\u0E49\u0E23\u0E2B\u0E31\u0E2A\u0E1A\u0E19\u0E01\u0E32\u0E23\u0E4C\u0E14\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E19\u0E35\u0E49\u0E43\u0E19\u0E41\u0E2D\u0E1B\u0E01\u0E48\u0E2D\u0E19"
|
|
2092
2200
|
};
|
|
2093
2201
|
|
|
2094
2202
|
// src/locales/vi.json
|
|
@@ -2097,7 +2205,7 @@ var vi_default = {
|
|
|
2097
2205
|
confirm: "X\xE1c nh\u1EADn x\xE1c th\u1EF1c",
|
|
2098
2206
|
scan: "Qu\xE9t b\u1EB1ng AuthLink",
|
|
2099
2207
|
code: "M\xE3 \u0111\u1ED1i chi\u1EBFu",
|
|
2100
|
-
help: "
|
|
2208
|
+
help: "Ph\xEA duy\u1EC7t trong \u1EE9ng d\u1EE5ng r\u1ED3i nh\u1EADp m\xE3 x\xE1c nh\u1EADn 6 ch\u1EEF s\u1ED1 t\u1EA1i \u0111\xE2y.",
|
|
2101
2209
|
waiting: "\u0110ang ch\u1EDD x\xE1c nh\u1EADn t\u1EEB \u0111i\u1EC7n tho\u1EA1i",
|
|
2102
2210
|
loading: "\u0110ang k\u1EBFt n\u1ED1i",
|
|
2103
2211
|
confirmed: "\u0110\xE3 x\xE1c nh\u1EADn",
|
|
@@ -2110,7 +2218,16 @@ var vi_default = {
|
|
|
2110
2218
|
close: "\u0110\xF3ng",
|
|
2111
2219
|
cancel: "H\u1EE7y",
|
|
2112
2220
|
autoUpdate: "M\xE3 t\u1EF1 \u0111\u1ED9ng c\u1EADp nh\u1EADt m\u1ED7i 30 gi\xE2y",
|
|
2113
|
-
expiring: "Y\xEAu c\u1EA7u s\u1EAFp h\u1EBFt h\u1EA1n"
|
|
2221
|
+
expiring: "Y\xEAu c\u1EA7u s\u1EAFp h\u1EBFt h\u1EA1n",
|
|
2222
|
+
confirmationCode: "M\xE3 x\xE1c nh\u1EADn trong \u1EE9ng d\u1EE5ng",
|
|
2223
|
+
submitCode: "X\xE1c minh",
|
|
2224
|
+
codeError: "Kh\xF4ng th\u1EC3 x\xE1c minh. Ki\u1EC3m tra m\xE3 v\xE0 tr\u1EA1ng th\xE1i ph\xEA duy\u1EC7t r\u1ED3i th\u1EED l\u1EA1i.",
|
|
2225
|
+
codeLocked: "Nh\u1EADp sai m\xE3 qu\xE1 nhi\u1EC1u l\u1EA7n. \u0110\xF3ng c\u1EEDa s\u1ED5 v\xE0 t\u1EA1o y\xEAu c\u1EA7u m\u1EDBi.",
|
|
2226
|
+
otpCode: "M\xE3 \u1EE9ng d\u1EE5ng",
|
|
2227
|
+
otpHelp: "M\u1EDF AuthLink v\xE0 nh\u1EADp m\xE3 s\xE1u ch\u1EEF s\u1ED1 hi\u1EC7n t\u1EA1i c\u1EE7a t\xE0i kho\u1EA3n n\xE0y. Kh\xF4ng c\u1EA7n ph\xEA duy\u1EC7t y\xEAu c\u1EA7u.",
|
|
2228
|
+
otpWaiting: "Nh\u1EADp m\xE3 hi\u1EC7n t\u1EA1i",
|
|
2229
|
+
otpError: "X\xE1c minh th\u1EA5t b\u1EA1i. Ki\u1EC3m tra t\xE0i kho\u1EA3n v\xE0 ch\u1EDD m\xE3 m\u1EDBi n\u1EBFu \u0111\xE3 d\xF9ng. N\u1EBFu sai nhi\u1EC1u l\u1EA7n, h\xE3y th\u1EED l\u1EA1i sau.",
|
|
2230
|
+
otpSetup: "Tr\u01B0\u1EDBc ti\xEAn h\xE3y b\u1EADt m\xE3 tr\xEAn th\u1EBB t\xE0i kho\u1EA3n n\xE0y trong \u1EE9ng d\u1EE5ng."
|
|
2114
2231
|
};
|
|
2115
2232
|
|
|
2116
2233
|
// src/i18n.ts
|
|
@@ -2139,15 +2256,12 @@ function getMessages(locale) {
|
|
|
2139
2256
|
|
|
2140
2257
|
// src/view.ts
|
|
2141
2258
|
var node = (tag, props, ...children) => ({ tag, props, children });
|
|
2142
|
-
function resolveVariant(variant) {
|
|
2143
|
-
return variant === "B" || variant === "C" ? variant : "A";
|
|
2144
|
-
}
|
|
2145
2259
|
function widgetView(options) {
|
|
2146
2260
|
const { snapshot: s, mode, retry, refresh } = options;
|
|
2147
|
-
const locale = resolveLocale(options.locale)
|
|
2261
|
+
const locale = resolveLocale(options.locale);
|
|
2148
2262
|
const l = getMessages(locale);
|
|
2149
2263
|
const pending = s.status === "pending", hasQr = pending && (mode === "bind" || Boolean(options.showQr)) && Boolean(options.qr);
|
|
2150
|
-
const status = { idle: l.loading, pending: l.waiting, confirmed: l.confirmed, rejected: l.rejected, expired: l.expired, error: l.error }[s.status];
|
|
2264
|
+
const status = { idle: l.loading, pending: options.passcodeMode ? l.otpWaiting : l.waiting, confirmed: l.confirmed, rejected: l.rejected, expired: l.expired, error: l.error }[s.status];
|
|
2151
2265
|
const expiring = pending && s.secondsRemaining <= 30;
|
|
2152
2266
|
const expiryTime = `00:${String(Math.max(0, Math.ceil(s.secondsRemaining))).padStart(2, "0")}`;
|
|
2153
2267
|
const statusNode = () => node(
|
|
@@ -2161,12 +2275,6 @@ function widgetView(options) {
|
|
|
2161
2275
|
expiring ? l.expiring : status,
|
|
2162
2276
|
...expiring ? [node("span", { class: "authlink-expiry", "aria-hidden": "true" }, ` \xB7 ${expiryTime}`)] : []
|
|
2163
2277
|
);
|
|
2164
|
-
const cancel = () => options.close ? [node("button", {
|
|
2165
|
-
type: "button",
|
|
2166
|
-
class: "authlink-cancel",
|
|
2167
|
-
"data-authlink-focus": "cancel",
|
|
2168
|
-
onClick: options.close
|
|
2169
|
-
}, l.cancel)] : [];
|
|
2170
2278
|
const children = [node("h3", { class: "authlink-title" }, l[mode])];
|
|
2171
2279
|
if (hasQr) children.push(node("p", { class: "authlink-subtitle" }, l.scan));
|
|
2172
2280
|
if (pending) {
|
|
@@ -2176,50 +2284,50 @@ function widgetView(options) {
|
|
|
2176
2284
|
node("img", { class: "authlink-qr", src: options.qr, alt: l.scan, width: 240, height: 240 }),
|
|
2177
2285
|
node("figcaption", { class: "authlink-qr-caption" }, l.scan)
|
|
2178
2286
|
)] : [];
|
|
2179
|
-
const
|
|
2180
|
-
|
|
2181
|
-
"output",
|
|
2182
|
-
{
|
|
2183
|
-
class: "authlink-code",
|
|
2184
|
-
"aria-label": s.code ? `${l.code}: ${s.code.split("").join(" ")}` : l.updating,
|
|
2185
|
-
"aria-live": "polite",
|
|
2186
|
-
"data-testid": "authlink-code"
|
|
2187
|
-
},
|
|
2188
|
-
node("span", { class: "authlink-code-group" }, s.code?.slice(0, 3) ?? "---"),
|
|
2189
|
-
node("span", { class: "authlink-code-group" }, s.code?.slice(3) ?? "---")
|
|
2190
|
-
);
|
|
2191
|
-
const panel = node(
|
|
2192
|
-
"div",
|
|
2193
|
-
{ class: "authlink-code-panel" },
|
|
2194
|
-
node("div", { class: "authlink-code-values" }, node("div", { class: "authlink-code-label" }, l.code), code),
|
|
2287
|
+
const detail = [
|
|
2288
|
+
node("p", { class: "authlink-help" }, options.passcodeMode ? l.otpHelp : l.help),
|
|
2195
2289
|
node(
|
|
2196
|
-
"
|
|
2197
|
-
{
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2290
|
+
"form",
|
|
2291
|
+
{ class: "authlink-code-form", onSubmit: (event) => {
|
|
2292
|
+
event.preventDefault();
|
|
2293
|
+
const input = event.currentTarget.querySelector("input");
|
|
2294
|
+
if (input) void options.submitCode?.(input.value);
|
|
2295
|
+
} },
|
|
2296
|
+
node("label", { for: "authlink-confirmation-code" }, options.passcodeMode ? l.otpCode : l.confirmationCode),
|
|
2297
|
+
node("input", {
|
|
2298
|
+
id: "authlink-confirmation-code",
|
|
2299
|
+
name: options.passcodeMode ? "passcode" : "confirmationCode",
|
|
2300
|
+
type: "text",
|
|
2301
|
+
inputmode: "numeric",
|
|
2302
|
+
autocomplete: "one-time-code",
|
|
2303
|
+
pattern: "[0-9]{6}",
|
|
2304
|
+
maxlength: 6,
|
|
2305
|
+
minlength: 6,
|
|
2306
|
+
required: true,
|
|
2307
|
+
"data-authlink-focus": "confirmation-code",
|
|
2308
|
+
value: options.inputCode ?? "",
|
|
2309
|
+
onInput: (event) => options.setCode?.(event.target.value)
|
|
2310
|
+
}),
|
|
2311
|
+
node(
|
|
2312
|
+
"button",
|
|
2313
|
+
{ type: "submit", class: "authlink-button", ...s.submitting ? { disabled: true } : {} },
|
|
2314
|
+
s.submitting ? l.loading : l.submitCode
|
|
2315
|
+
)
|
|
2206
2316
|
),
|
|
2207
|
-
node("p", { class: "authlink-
|
|
2208
|
-
|
|
2209
|
-
const detail = [panel, node("p", { class: "authlink-help" }, l.help)];
|
|
2317
|
+
...s.error ? [node("p", { class: "authlink-input-error", role: "alert" }, options.passcodeMode ? s.error.message === "OTP_NOT_CONFIGURED" ? l.otpSetup : l.otpError : l.codeError)] : []
|
|
2318
|
+
];
|
|
2210
2319
|
children.push(node("div", { class: "authlink-body" }, ...qr, node("div", { class: "authlink-details" }, ...detail)));
|
|
2211
|
-
|
|
2212
|
-
if (variant === "B") children.push(node("div", { class: "authlink-footer" }, statusNode(), ...cancel()));
|
|
2213
|
-
if (variant === "C") children.push(node("div", { class: "authlink-footer" }, statusNode(), ...cancel()));
|
|
2320
|
+
children.push(node("div", { class: "authlink-footer" }, statusNode()));
|
|
2214
2321
|
} else {
|
|
2215
2322
|
children.push(statusNode());
|
|
2216
|
-
if (s.
|
|
2323
|
+
if (s.error?.message === "CONFIRMATION_CODE_LOCKED") children.push(node("p", { class: "authlink-input-error", role: "alert" }, l.codeLocked));
|
|
2324
|
+
if (s.status === "error" && s.error?.message !== "CONFIRMATION_CODE_LOCKED") children.push(node("button", {
|
|
2217
2325
|
type: "button",
|
|
2218
2326
|
class: "authlink-button",
|
|
2219
2327
|
"data-authlink-focus": "retry",
|
|
2220
2328
|
onClick: retry
|
|
2221
2329
|
}, l.retry));
|
|
2222
|
-
if (refresh && ["expired", "rejected"].includes(s.status)) children.push(node("button", {
|
|
2330
|
+
if (refresh && ["expired", "rejected", "error"].includes(s.status)) children.push(node("button", {
|
|
2223
2331
|
type: "button",
|
|
2224
2332
|
class: "authlink-button",
|
|
2225
2333
|
"data-authlink-focus": "refresh",
|
|
@@ -2230,7 +2338,6 @@ function widgetView(options) {
|
|
|
2230
2338
|
lang: locale,
|
|
2231
2339
|
class: `authlink-widget ${options.className ?? ""}`.trim(),
|
|
2232
2340
|
"data-status": s.status,
|
|
2233
|
-
"data-variant": variant,
|
|
2234
2341
|
"data-has-qr": String(hasQr),
|
|
2235
2342
|
"aria-label": l[mode]
|
|
2236
2343
|
}, ...children);
|
|
@@ -2242,7 +2349,7 @@ function element(value, svg = false) {
|
|
|
2242
2349
|
svg ||= value.tag === "svg";
|
|
2243
2350
|
const result = svg ? document.createElementNS("http://www.w3.org/2000/svg", value.tag) : document.createElement(value.tag);
|
|
2244
2351
|
for (const [key, v] of Object.entries(value.props)) {
|
|
2245
|
-
if (key
|
|
2352
|
+
if (key.startsWith("on") && typeof v === "function") result.addEventListener(key.slice(2).toLowerCase(), v);
|
|
2246
2353
|
else if (v !== void 0 && v !== null) result.setAttribute(key, String(v));
|
|
2247
2354
|
}
|
|
2248
2355
|
result.append(...value.children.map((child) => element(child, svg)));
|
|
@@ -2274,8 +2381,10 @@ function openAuthLink(options) {
|
|
|
2274
2381
|
content.className = "authlink-modal-content";
|
|
2275
2382
|
header.append(brand, closeButton);
|
|
2276
2383
|
dialog.append(header, content);
|
|
2277
|
-
let locale = options.locale,
|
|
2384
|
+
let locale = options.locale, snapshot = initialSnapshot(), closed = false;
|
|
2278
2385
|
let abort;
|
|
2386
|
+
let inputCode = "";
|
|
2387
|
+
let submitCode;
|
|
2279
2388
|
const image = qrImage(ticket);
|
|
2280
2389
|
let progressFill, progressFrame, progressDeadline = 0;
|
|
2281
2390
|
const motion = window.matchMedia?.("(prefers-reduced-motion: reduce)");
|
|
@@ -2302,7 +2411,6 @@ function openAuthLink(options) {
|
|
|
2302
2411
|
const language = resolveLocale(locale), messages2 = getMessages(language);
|
|
2303
2412
|
dialog.lang = language;
|
|
2304
2413
|
dialog.setAttribute("aria-label", messages2[mode]);
|
|
2305
|
-
dialog.dataset.variant = variant;
|
|
2306
2414
|
dialog.dataset.mode = mode;
|
|
2307
2415
|
dialog.dataset.hasQr = String(snapshot.status === "pending" && (mode === "bind" || Boolean(options.showQr)));
|
|
2308
2416
|
closeButton.setAttribute("aria-label", messages2.close);
|
|
@@ -2311,13 +2419,16 @@ function openAuthLink(options) {
|
|
|
2311
2419
|
const next = element(widgetView({
|
|
2312
2420
|
mode,
|
|
2313
2421
|
locale,
|
|
2314
|
-
variant,
|
|
2315
2422
|
snapshot,
|
|
2316
2423
|
qr: image,
|
|
2317
2424
|
showQr: options.showQr,
|
|
2425
|
+
inputCode,
|
|
2426
|
+
setCode: (code) => {
|
|
2427
|
+
inputCode = code;
|
|
2428
|
+
},
|
|
2429
|
+
submitCode: (code) => submitCode?.(code) ?? Promise.resolve(),
|
|
2318
2430
|
retry,
|
|
2319
|
-
refresh: options.onRefresh
|
|
2320
|
-
close: () => dispose(true)
|
|
2431
|
+
refresh: options.onRefresh
|
|
2321
2432
|
}));
|
|
2322
2433
|
const oldCode = content.querySelector(".authlink-code");
|
|
2323
2434
|
const nextCode = next.querySelector(".authlink-code");
|
|
@@ -2333,6 +2444,9 @@ function openAuthLink(options) {
|
|
|
2333
2444
|
oldProgress.setAttribute("aria-label", nextProgress.getAttribute("aria-label"));
|
|
2334
2445
|
nextProgress.replaceWith(oldProgress);
|
|
2335
2446
|
}
|
|
2447
|
+
const oldInput = content.querySelector("input[name=confirmationCode]");
|
|
2448
|
+
const nextInput = next.querySelector("input[name=confirmationCode]");
|
|
2449
|
+
if (oldInput && nextInput) nextInput.replaceWith(oldInput);
|
|
2336
2450
|
content.replaceChildren(next);
|
|
2337
2451
|
progressFill = content.querySelector(".authlink-progress-fill") ?? void 0;
|
|
2338
2452
|
drawProgress();
|
|
@@ -2374,6 +2488,9 @@ function openAuthLink(options) {
|
|
|
2374
2488
|
intervalMs: options.intervalMs,
|
|
2375
2489
|
expectedMode: mode,
|
|
2376
2490
|
signal: abort.signal,
|
|
2491
|
+
onReady: (submit) => {
|
|
2492
|
+
submitCode = submit;
|
|
2493
|
+
},
|
|
2377
2494
|
onCodeTiming: syncProgress,
|
|
2378
2495
|
onUpdate: (value) => {
|
|
2379
2496
|
snapshot = value;
|
|
@@ -2424,17 +2541,201 @@ function openAuthLink(options) {
|
|
|
2424
2541
|
locale = value;
|
|
2425
2542
|
render();
|
|
2426
2543
|
},
|
|
2427
|
-
|
|
2428
|
-
|
|
2544
|
+
retry
|
|
2545
|
+
};
|
|
2546
|
+
}
|
|
2547
|
+
|
|
2548
|
+
// src/passcode.ts
|
|
2549
|
+
function validateOTPResult(value) {
|
|
2550
|
+
if (!value || typeof value !== "object") throw new AuthLinkError("INVALID_RESPONSE");
|
|
2551
|
+
const result = value;
|
|
2552
|
+
const expiry = typeof result.expiresAt === "string" ? Date.parse(result.expiresAt) : NaN;
|
|
2553
|
+
if (result.status !== "confirmed" || result.authenticationPolicy !== "device-totp.v1" || typeof result.verificationId !== "string" || !/^[A-Za-z0-9_-]{43}$/.test(result.verificationId) || !Number.isFinite(expiry) || expiry <= Date.now() || expiry > Date.now() + 9e4 || "requestId" in result || "state" in result || "businessId" in result) throw new AuthLinkError("INVALID_CONFIRMATION");
|
|
2554
|
+
return result;
|
|
2555
|
+
}
|
|
2556
|
+
function openPasscode(options) {
|
|
2557
|
+
if (typeof document === "undefined" || !document.body) throw new AuthLinkError("BROWSER_REQUIRED");
|
|
2558
|
+
const deadline = Date.parse(options.expiresAt);
|
|
2559
|
+
if (!Number.isFinite(deadline) || deadline <= Date.now() || deadline > Date.now() + 3e5) throw new AuthLinkError("INVALID_EXPIRY");
|
|
2560
|
+
const previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
2561
|
+
const dialog = document.createElement("dialog");
|
|
2562
|
+
if (typeof dialog.showModal !== "function") throw new AuthLinkError("DIALOG_UNSUPPORTED");
|
|
2563
|
+
dialog.className = "authlink-dialog";
|
|
2564
|
+
dialog.setAttribute("aria-modal", "true");
|
|
2565
|
+
const header = document.createElement("div");
|
|
2566
|
+
header.className = "authlink-header";
|
|
2567
|
+
const brand = document.createElement("span");
|
|
2568
|
+
brand.className = "authlink-brand";
|
|
2569
|
+
brand.textContent = "AuthLink";
|
|
2570
|
+
const close = document.createElement("button");
|
|
2571
|
+
close.type = "button";
|
|
2572
|
+
close.className = "authlink-close";
|
|
2573
|
+
const icon = document.createElement("span");
|
|
2574
|
+
icon.className = "authlink-close-icon";
|
|
2575
|
+
icon.setAttribute("aria-hidden", "true");
|
|
2576
|
+
close.append(icon);
|
|
2577
|
+
const content = document.createElement("div");
|
|
2578
|
+
content.className = "authlink-modal-content";
|
|
2579
|
+
header.append(brand, close);
|
|
2580
|
+
dialog.append(header, content);
|
|
2581
|
+
let locale = options.locale, closed = false, busy = false, code = "", error;
|
|
2582
|
+
const mode = options.bindingQr ? "bind" : "confirm";
|
|
2583
|
+
let image;
|
|
2584
|
+
if (options.bindingQr) {
|
|
2585
|
+
let payload;
|
|
2586
|
+
try {
|
|
2587
|
+
payload = JSON.parse(options.bindingQr);
|
|
2588
|
+
} catch {
|
|
2589
|
+
throw new AuthLinkError("INVALID_TICKET");
|
|
2590
|
+
}
|
|
2591
|
+
image = qrImage(validateTicket({ requestId: payload.requestId, purpose: "bind", qr: options.bindingQr, pairingCode: "000000", expiresAt: options.expiresAt }, "bind", options.authLinkOrigin));
|
|
2592
|
+
}
|
|
2593
|
+
const abort = new AbortController();
|
|
2594
|
+
let timer;
|
|
2595
|
+
const dispose = (notify) => {
|
|
2596
|
+
if (closed) return;
|
|
2597
|
+
closed = true;
|
|
2598
|
+
abort.abort();
|
|
2599
|
+
clearInterval(timer);
|
|
2600
|
+
dialog.remove();
|
|
2601
|
+
previousFocus?.focus();
|
|
2602
|
+
if (notify) options.onClose?.();
|
|
2603
|
+
};
|
|
2604
|
+
const render = () => {
|
|
2605
|
+
if (closed) return;
|
|
2606
|
+
const l = getMessages(locale);
|
|
2607
|
+
dialog.lang = resolveLocale(locale);
|
|
2608
|
+
dialog.dataset.mode = mode;
|
|
2609
|
+
dialog.dataset.hasQr = String(Boolean(image));
|
|
2610
|
+
dialog.setAttribute("aria-label", l[mode]);
|
|
2611
|
+
close.setAttribute("aria-label", l.close);
|
|
2612
|
+
const focused = content.contains(document.activeElement);
|
|
2613
|
+
const remaining = Math.max(0, Math.ceil((deadline - Date.now()) / 1e3));
|
|
2614
|
+
const snapshot = { status: remaining ? "pending" : "expired", code: null, secondsRemaining: remaining, codeSecondsRemaining: remaining, submitting: busy, error: error ?? null };
|
|
2615
|
+
content.replaceChildren(element(widgetView({
|
|
2616
|
+
mode,
|
|
2617
|
+
locale,
|
|
2618
|
+
passcodeMode: true,
|
|
2619
|
+
snapshot,
|
|
2620
|
+
qr: image,
|
|
2621
|
+
showQr: Boolean(image),
|
|
2622
|
+
inputCode: code,
|
|
2623
|
+
setCode: (value) => {
|
|
2624
|
+
code = value;
|
|
2625
|
+
},
|
|
2626
|
+
submitCode: submit,
|
|
2627
|
+
retry: () => {
|
|
2628
|
+
error = void 0;
|
|
2629
|
+
render();
|
|
2630
|
+
}
|
|
2631
|
+
})));
|
|
2632
|
+
if (focused) content.querySelector("input")?.focus();
|
|
2633
|
+
};
|
|
2634
|
+
const submit = async (value) => {
|
|
2635
|
+
if (closed || busy) return;
|
|
2636
|
+
if (Date.now() >= deadline) {
|
|
2637
|
+
render();
|
|
2638
|
+
return;
|
|
2639
|
+
}
|
|
2640
|
+
if (!/^[0-9]{6}$/.test(value)) {
|
|
2641
|
+
error = new AuthLinkError("PASSCODE_INVALID");
|
|
2642
|
+
render();
|
|
2643
|
+
return;
|
|
2644
|
+
}
|
|
2645
|
+
code = value;
|
|
2646
|
+
busy = true;
|
|
2647
|
+
error = void 0;
|
|
2648
|
+
render();
|
|
2649
|
+
try {
|
|
2650
|
+
const result = validateOTPResult(await options.client.verify(value, abort.signal));
|
|
2651
|
+
if (closed || abort.signal.aborted || Date.now() >= deadline) return;
|
|
2652
|
+
try {
|
|
2653
|
+
await options.onVerified?.(result);
|
|
2654
|
+
} catch {
|
|
2655
|
+
options.onError?.(new AuthLinkError("CALLBACK_FAILED"));
|
|
2656
|
+
}
|
|
2657
|
+
dispose(false);
|
|
2658
|
+
} catch (cause) {
|
|
2659
|
+
if (!closed && !abort.signal.aborted) {
|
|
2660
|
+
error = cause instanceof Error ? cause : new AuthLinkError("NETWORK_ERROR");
|
|
2661
|
+
options.onError?.(error);
|
|
2662
|
+
}
|
|
2663
|
+
} finally {
|
|
2664
|
+
busy = false;
|
|
2665
|
+
render();
|
|
2666
|
+
}
|
|
2667
|
+
};
|
|
2668
|
+
close.addEventListener("click", () => dispose(true));
|
|
2669
|
+
dialog.addEventListener("cancel", (event) => {
|
|
2670
|
+
event.preventDefault();
|
|
2671
|
+
dispose(true);
|
|
2672
|
+
});
|
|
2673
|
+
document.body.append(dialog);
|
|
2674
|
+
render();
|
|
2675
|
+
dialog.showModal();
|
|
2676
|
+
content.querySelector("input")?.focus();
|
|
2677
|
+
timer = setInterval(() => {
|
|
2678
|
+
if (closed) return;
|
|
2679
|
+
if (Date.now() >= deadline) {
|
|
2680
|
+
render();
|
|
2681
|
+
clearInterval(timer);
|
|
2682
|
+
void Promise.resolve(options.onExpired?.()).catch(() => options.onError?.(new AuthLinkError("CALLBACK_FAILED")));
|
|
2683
|
+
}
|
|
2684
|
+
}, 1e3);
|
|
2685
|
+
return {
|
|
2686
|
+
close: () => dispose(true),
|
|
2687
|
+
destroy: () => dispose(false),
|
|
2688
|
+
setLocale: (value) => {
|
|
2689
|
+
locale = value;
|
|
2429
2690
|
render();
|
|
2430
2691
|
},
|
|
2431
|
-
retry
|
|
2692
|
+
retry: () => {
|
|
2693
|
+
error = void 0;
|
|
2694
|
+
render();
|
|
2695
|
+
}
|
|
2432
2696
|
};
|
|
2433
2697
|
}
|
|
2434
2698
|
|
|
2435
2699
|
// src/vue.ts
|
|
2700
|
+
var AuthLinkPasscode = defineComponent({
|
|
2701
|
+
name: "AuthLinkPasscode",
|
|
2702
|
+
props: {
|
|
2703
|
+
client: { type: Object, required: true },
|
|
2704
|
+
expiresAt: { type: String, required: true },
|
|
2705
|
+
bindingQr: String,
|
|
2706
|
+
authLinkOrigin: String,
|
|
2707
|
+
locale: String
|
|
2708
|
+
},
|
|
2709
|
+
emits: ["verified", "expired", "error", "close"],
|
|
2710
|
+
setup(props, { emit }) {
|
|
2711
|
+
let modal, mounted = false;
|
|
2712
|
+
const open = () => {
|
|
2713
|
+
if (!mounted) return;
|
|
2714
|
+
modal?.destroy();
|
|
2715
|
+
modal = openPasscode({
|
|
2716
|
+
...props,
|
|
2717
|
+
onVerified: (value) => emit("verified", value),
|
|
2718
|
+
onExpired: () => emit("expired"),
|
|
2719
|
+
onError: (value) => emit("error", value),
|
|
2720
|
+
onClose: () => emit("close")
|
|
2721
|
+
});
|
|
2722
|
+
};
|
|
2723
|
+
onMounted(() => {
|
|
2724
|
+
mounted = true;
|
|
2725
|
+
open();
|
|
2726
|
+
});
|
|
2727
|
+
watch([() => props.client, () => props.expiresAt, () => props.bindingQr, () => props.authLinkOrigin], open);
|
|
2728
|
+
watch(() => props.locale, (value) => modal?.setLocale(value));
|
|
2729
|
+
onBeforeUnmount(() => {
|
|
2730
|
+
mounted = false;
|
|
2731
|
+
modal?.destroy();
|
|
2732
|
+
});
|
|
2733
|
+
return () => null;
|
|
2734
|
+
}
|
|
2735
|
+
});
|
|
2436
2736
|
function useAuthLink(getOptions) {
|
|
2437
2737
|
const snapshot = shallowRef(initialSnapshot());
|
|
2738
|
+
let submit;
|
|
2438
2739
|
const delivered = /* @__PURE__ */ new Set();
|
|
2439
2740
|
let mounted = false, abort;
|
|
2440
2741
|
const retry = () => {
|
|
@@ -2454,6 +2755,9 @@ function useAuthLink(getOptions) {
|
|
|
2454
2755
|
intervalMs: options.intervalMs,
|
|
2455
2756
|
expectedMode: options.mode,
|
|
2456
2757
|
signal: abort.signal,
|
|
2758
|
+
onReady: (fn) => {
|
|
2759
|
+
submit = fn;
|
|
2760
|
+
},
|
|
2457
2761
|
onUpdate: (value) => {
|
|
2458
2762
|
snapshot.value = value;
|
|
2459
2763
|
},
|
|
@@ -2477,7 +2781,7 @@ function useAuthLink(getOptions) {
|
|
|
2477
2781
|
mounted = false;
|
|
2478
2782
|
abort?.abort();
|
|
2479
2783
|
});
|
|
2480
|
-
return { snapshot, retry };
|
|
2784
|
+
return { snapshot, retry, submitCode: (code) => submit?.(code) ?? Promise.resolve() };
|
|
2481
2785
|
}
|
|
2482
2786
|
function widget(mode) {
|
|
2483
2787
|
return defineComponent({
|
|
@@ -2487,7 +2791,6 @@ function widget(mode) {
|
|
|
2487
2791
|
ticket: { type: Object, required: true },
|
|
2488
2792
|
client: { type: Object, required: true },
|
|
2489
2793
|
locale: { type: String, default: defaultLocale },
|
|
2490
|
-
variant: { type: String, default: "A" },
|
|
2491
2794
|
intervalMs: Number,
|
|
2492
2795
|
showQr: Boolean,
|
|
2493
2796
|
className: String,
|
|
@@ -2531,7 +2834,6 @@ function widget(mode) {
|
|
|
2531
2834
|
() => Boolean(props.onRefresh)
|
|
2532
2835
|
], open);
|
|
2533
2836
|
watch(() => props.locale, (value) => modal?.setLocale(value));
|
|
2534
|
-
watch(() => props.variant, (value) => modal?.setVariant(value));
|
|
2535
2837
|
onBeforeUnmount(() => {
|
|
2536
2838
|
mounted = false;
|
|
2537
2839
|
modal?.destroy();
|
|
@@ -2545,6 +2847,7 @@ var AuthLinkConfirm = widget("confirm");
|
|
|
2545
2847
|
export {
|
|
2546
2848
|
AuthLinkBind,
|
|
2547
2849
|
AuthLinkConfirm,
|
|
2850
|
+
AuthLinkPasscode,
|
|
2548
2851
|
useAuthLink
|
|
2549
2852
|
};
|
|
2550
2853
|
//# sourceMappingURL=vue.js.map
|