taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit bdb8d5f57c553b37eef32681e20f04b56c2dd82e
parent 3475efa90cbf28e59929611008764bebf204fbce
Author: Florian Dold <florian@dold.me>
Date:   Thu, 18 Jun 2026 11:17:56 +0200

wallet-util: rename taler URI helpers

fromString -> parse: We're not creating a taler URI from a string (a
taler URI already *is* a string). Instead we're parsing it into a
structured representation.

toString -> stringify: Calling the helper toString is a bad idea due to
the naming conflict with the JS .toString() method of Object.

Diffstat:
Mpackages/libeufin-bank-webui/src/context/wallet-integration.ts | 2+-
Mpackages/libeufin-bank-webui/src/pages/OperationState/state.ts | 2+-
Mpackages/libeufin-bank-webui/src/pages/OperationState/views.tsx | 2+-
Mpackages/libeufin-bank-webui/src/pages/QrCodeSection.tsx | 2+-
Mpackages/libeufin-bank-webui/src/pages/WalletWithdrawForm.tsx | 2+-
Mpackages/libeufin-bank-webui/src/pages/WithdrawalOperationPage.tsx | 2+-
Mpackages/libeufin-bank-webui/src/pages/WithdrawalQRCode.tsx | 2+-
Mpackages/taler-harness/src/integrationtests/test-paivana-repurchase.ts | 4++--
Mpackages/taler-harness/src/integrationtests/test-paivana.ts | 4++--
Mpackages/taler-merchant-webui/src/paths/instance/orders/details/DetailPage.tsx | 4++--
Mpackages/taler-merchant-webui/src/paths/instance/templates/qr/QrPage.tsx | 2+-
Mpackages/taler-util/src/taleruri.ts | 7+++++--
Mpackages/taler-util/src/taleruris.test.ts | 98++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mpackages/taler-wallet-core/src/mailbox.ts | 2+-
Mpackages/taler-wallet-core/src/wallet.ts | 2+-
Mpackages/taler-wallet-webextension/src/components/PaymentButtons.tsx | 2+-
Mpackages/taler-wallet-webextension/src/cta/Withdraw/views.tsx | 4++--
Mpackages/taler-wallet-webextension/src/wallet/Mailbox.tsx | 2+-
Mpackages/taler-wallet-webextension/src/wallet/QrReader.tsx | 6+++---
Mpackages/taler-wallet-webextension/src/wallet/Transaction.tsx | 6+++---
Mpackages/web-util/src/components/QR.tsx | 2+-
21 files changed, 81 insertions(+), 78 deletions(-)

diff --git a/packages/libeufin-bank-webui/src/context/wallet-integration.ts b/packages/libeufin-bank-webui/src/context/wallet-integration.ts @@ -27,7 +27,7 @@ import { useContext } from "preact/hooks"; function createHeadMetaTag(uri: TalerUri, onNotFound?: () => void) { const meta = document.createElement("meta"); meta.setAttribute("name", "taler-uri"); - meta.setAttribute("content", TalerUris.toString(uri)); + meta.setAttribute("content", TalerUris.stringify(uri)); document.head.appendChild(meta); diff --git a/packages/libeufin-bank-webui/src/pages/OperationState/state.ts b/packages/libeufin-bank-webui/src/pages/OperationState/state.ts @@ -100,7 +100,7 @@ export function useComponentState({ bank.getIntegrationAPI().href as HostPortPath, withdrawalOperationId, ); - const uri = TalerUris.toString(parsedUri); + const uri = TalerUris.stringify(parsedUri); if (!parsedUri) { return { status: "invalid-withdrawal", diff --git a/packages/libeufin-bank-webui/src/pages/OperationState/views.tsx b/packages/libeufin-bank-webui/src/pages/OperationState/views.tsx @@ -561,7 +561,7 @@ export function ReadyView({ uri.bankIntegrationApiBaseUrl, uri.withdrawalOperationId, ); - const talerWithdrawUri = TalerUris.toString(parsedUri); + const talerWithdrawUri = TalerUris.stringify(parsedUri); useEffect(() => { walletInegrationApi.publishTalerAction(uri); }, []); diff --git a/packages/libeufin-bank-webui/src/pages/QrCodeSection.tsx b/packages/libeufin-bank-webui/src/pages/QrCodeSection.tsx @@ -44,7 +44,7 @@ export function QrCodeSection({ }): VNode { const { i18n } = useTranslationContext(); const walletInegrationApi = useTalerWalletIntegrationAPI(); - const talerWithdrawUri = TalerUris.toString(withdrawUri); + const talerWithdrawUri = TalerUris.stringify(withdrawUri); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? undefined : credentials; diff --git a/packages/libeufin-bank-webui/src/pages/WalletWithdrawForm.tsx b/packages/libeufin-bank-webui/src/pages/WalletWithdrawForm.tsx @@ -113,7 +113,7 @@ function OldWithdrawalForm({ ); start.onSuccess = (success) => { - const uri = TalerUris.fromString(success.taler_withdraw_uri); + const uri = TalerUris.parse(success.taler_withdraw_uri); if (uri.tag === "error" || uri.value.type !== TalerUriAction.Withdraw) { return ; // notifyError( diff --git a/packages/libeufin-bank-webui/src/pages/WithdrawalOperationPage.tsx b/packages/libeufin-bank-webui/src/pages/WithdrawalOperationPage.tsx @@ -43,7 +43,7 @@ export function WithdrawalOperationPage({ api.getIntegrationAPI().href as HostPortPath, operationId, ); - const uri = TalerUris.toString(parsedUri); + const uri = TalerUris.stringify(parsedUri); const { i18n } = useTranslationContext(); const [, updateBankState] = useBankState(); diff --git a/packages/libeufin-bank-webui/src/pages/WithdrawalQRCode.tsx b/packages/libeufin-bank-webui/src/pages/WithdrawalQRCode.tsx @@ -128,7 +128,7 @@ export function WithdrawalQRCode({ </div> ); } - const talerWithdrawUri = TalerUris.toString(withdrawUri); + const talerWithdrawUri = TalerUris.stringify(withdrawUri); if (data.status === "confirmed") { return ( diff --git a/packages/taler-harness/src/integrationtests/test-paivana-repurchase.ts b/packages/taler-harness/src/integrationtests/test-paivana-repurchase.ts @@ -104,7 +104,7 @@ export async function runPaivanaRepurchaseTest(t: GlobalTestState) { const templateURI = firstRequest.headers.get("paivana"); t.assertTrue(!!templateURI); - const uri = Result.unpack(TalerUris.fromString(templateURI)); + const uri = Result.unpack(TalerUris.parse(templateURI)); t.assertTrue(uri.type === TalerUriAction.PayTemplate); const merchantClient = new TalerMerchantInstanceHttpClient( @@ -132,7 +132,7 @@ export async function runPaivanaRepurchaseTest(t: GlobalTestState) { sessionId: session.paivanaId, }, ); - const talerPayTemplateUri = TalerUris.toString(newTemplate); + const talerPayTemplateUri = TalerUris.stringify(newTemplate); logger.info("3) pay template", newTemplate, talerPayTemplateUri); const templateStatus = await walletClient.call( diff --git a/packages/taler-harness/src/integrationtests/test-paivana.ts b/packages/taler-harness/src/integrationtests/test-paivana.ts @@ -78,7 +78,7 @@ export async function runPaivanaTest(t: GlobalTestState) { const templateURI = firstRequest.headers.get("paivana"); t.assertTrue(!!templateURI); - const uri = Result.unpack(TalerUris.fromString(templateURI)); + const uri = Result.unpack(TalerUris.parse(templateURI)); t.assertTrue(uri.type === TalerUriAction.PayTemplate); const merchantClient = new TalerMerchantInstanceHttpClient( @@ -105,7 +105,7 @@ export async function runPaivanaTest(t: GlobalTestState) { sessionId: session.paivanaId, }, ); - const talerPayTemplateUri = TalerUris.toString(newTemplate); + const talerPayTemplateUri = TalerUris.stringify(newTemplate); logger.info("3) pay template", newTemplate, talerPayTemplateUri); const templateStatus = await walletClient.call( diff --git a/packages/taler-merchant-webui/src/paths/instance/orders/details/DetailPage.tsx b/packages/taler-merchant-webui/src/paths/instance/orders/details/DetailPage.tsx @@ -869,7 +869,7 @@ function PaidPage({ }} > <QR_Taler - uri={Result.unpack(TalerUris.fromString(refundURI))} + uri={Result.unpack(TalerUris.parse(refundURI))} /> </div> </section> @@ -1042,7 +1042,7 @@ function UnpaidPage({ style={{ width: "100%", display: "flex", justifyContent: "center" }} > <QR_Taler - uri={Result.unpack(TalerUris.fromString(value.taler_pay_uri!))} + uri={Result.unpack(TalerUris.parse(value.taler_pay_uri!))} /> </div> </section> diff --git a/packages/taler-merchant-webui/src/paths/instance/templates/qr/QrPage.tsx b/packages/taler-merchant-webui/src/paths/instance/templates/qr/QrPage.tsx @@ -45,7 +45,7 @@ export function QrPage({ id: templateId, onBack }: Props): VNode { const merchantBaseUrl = state.backendUrl.href as HostPortPath; const uri = TalerUris.createTalerPayTemplate(merchantBaseUrl, templateId); - const stringUri = TalerUris.toString(uri); + const stringUri = TalerUris.stringify(uri); const printThis = useRef<HTMLElement>(null); return ( diff --git a/packages/taler-util/src/taleruri.ts b/packages/taler-util/src/taleruri.ts @@ -385,7 +385,7 @@ export namespace TalerUris { } } - export function toString(p: URI): TalerUriString { + export function stringify(p: URI): TalerUriString { const prefix = getTalerPrefix(p); const path = getTalerPath(p); const paramList = getTalerParamList(p); @@ -451,7 +451,10 @@ export namespace TalerUris { pos: 0; }; - export function fromString( + /** + * Parse a taler:// URI. + */ + export function parse( s: string, opts: PaytoParseOptions = {}, ): diff --git a/packages/taler-util/src/taleruris.test.ts b/packages/taler-util/src/taleruris.test.ts @@ -36,7 +36,7 @@ function failOrThrow<T>(r: Result<any, any>, e: T): void { test("taler-new withdraw uri parsing", (t) => { const url1 = "taler://withdraw/bank.example.com/12345"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Withdraw) { assert.fail(); return; @@ -51,7 +51,7 @@ test("taler-new withdraw uri parsing", (t) => { test("taler-new withdraw uri parsing with external confirmation", (t) => { const url1 = "taler://withdraw/bank.example.com/12345?external-confirmation=1"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Withdraw) { assert.fail(); return; @@ -66,7 +66,7 @@ test("taler-new withdraw uri parsing with external confirmation", (t) => { test("taler-new withdraw uri parsing (http)", (t) => { const url1 = "taler+http://withdraw/bank.example.com/12345"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Withdraw) { assert.fail(); return; @@ -79,7 +79,7 @@ test("taler-new withdraw uri parsing (http)", (t) => { }); test("taler-new withdraw URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.Withdraw, bankIntegrationApiBaseUrl: "https://bank.taler.test/integration-api/" as HostPortPath, @@ -96,7 +96,7 @@ test("taler-new withdraw URI (stringify)", (t) => { */ test("taler-new pay url parsing: defaults", (t) => { const url1 = "taler://pay/example.com/myorder/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Pay) { assert.fail(); return; @@ -108,7 +108,7 @@ test("taler-new pay url parsing: defaults", (t) => { assert.strictEqual(r1.sessionId, ""); const url2 = "taler://pay/example.com/myorder/mysession"; - const r2 = Result.unpack(TalerUris.fromString(url2)); + const r2 = Result.unpack(TalerUris.parse(url2)); if (r2.type !== TalerUriAction.Pay) { assert.fail(); return; @@ -122,7 +122,7 @@ test("taler-new pay url parsing: defaults", (t) => { test("taler-new pay url parsing: instance", (t) => { const url1 = "taler://pay/example.com/instances/myinst/myorder/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Pay) { assert.fail(); return; @@ -136,7 +136,7 @@ test("taler-new pay url parsing: instance", (t) => { test("taler-new pay url parsing (claim token)", (t) => { const url1 = "taler://pay/example.com/instances/myinst/myorder/?c=ASDF"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Pay) { assert.fail(); return; @@ -151,7 +151,7 @@ test("taler-new pay url parsing (claim token)", (t) => { test("taler-new pay uri parsing: non-https", (t) => { const url1 = "taler+http://pay/example.com/myorder/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Pay) { assert.fail(); return; @@ -162,11 +162,11 @@ test("taler-new pay uri parsing: non-https", (t) => { test("taler-new pay uri parsing: missing session component", (t) => { const url1 = "taler+http://pay/example.com/myorder"; - failOrThrow(TalerUris.fromString(url1), TalerUriParseError.COMPONENTS_LENGTH); + failOrThrow(TalerUris.parse(url1), TalerUriParseError.COMPONENTS_LENGTH); }); test("taler-new pay URI (stringify)", (t) => { - const url1 = TalerUris.toString({ + const url1 = TalerUris.stringify({ type: TalerUriAction.Pay, merchantBaseUrl: "http://localhost:123/" as HostPortPath, orderId: "foo", @@ -174,7 +174,7 @@ test("taler-new pay URI (stringify)", (t) => { }); assert.deepStrictEqual(url1, "taler+http://pay/localhost:123/foo/"); - const url2 = TalerUris.toString({ + const url2 = TalerUris.stringify({ type: TalerUriAction.Pay, merchantBaseUrl: "http://localhost:123/" as HostPortPath, orderId: "foo", @@ -184,7 +184,7 @@ test("taler-new pay URI (stringify)", (t) => { }); test("taler-new pay URI (stringify with https)", (t) => { - const url1 = TalerUris.toString({ + const url1 = TalerUris.stringify({ type: TalerUriAction.Pay, merchantBaseUrl: "https://localhost:123/" as HostPortPath, orderId: "foo", @@ -192,7 +192,7 @@ test("taler-new pay URI (stringify with https)", (t) => { }); assert.deepStrictEqual(url1, "taler://pay/localhost:123/foo/"); - const url2 = TalerUris.toString({ + const url2 = TalerUris.stringify({ type: TalerUriAction.Pay, merchantBaseUrl: "https://localhost/" as HostPortPath, orderId: "foo", @@ -209,7 +209,7 @@ test("taler-new pay URI (stringify with https)", (t) => { test("taler-new refund uri parsing: non-https #1", (t) => { const url1 = "taler+http://refund/example.com/myorder/"; // const r1 = parseRefundUri(url1); - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Refund) { assert.fail(); return; @@ -220,7 +220,7 @@ test("taler-new refund uri parsing: non-https #1", (t) => { test("taler-new refund uri parsing", (t) => { const url1 = "taler://refund/merchant.example.com/1234/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Refund) { assert.fail(); return; @@ -234,7 +234,7 @@ test("taler-new refund uri parsing", (t) => { test("taler-new refund uri parsing with instance", (t) => { const url1 = "taler://refund/merchant.example.com/instances/myinst/1234/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Refund) { assert.fail(); return; @@ -247,7 +247,7 @@ test("taler-new refund uri parsing with instance", (t) => { }); test("taler-new refund URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.Refund, merchantBaseUrl: "https://merchant.test/instance/pepe/" as HostPortPath, orderId: "123", @@ -265,7 +265,7 @@ test("taler-new refund URI (stringify)", (t) => { test("taler-new peer to peer push URI", (t) => { const url1 = "taler://pay-push/exch.example.com/foo"; // const r1 = parsePayPushUri(url1); - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayPush) { assert.fail(); return; @@ -279,7 +279,7 @@ test("taler-new peer to peer push URI", (t) => { test("taler-new peer to peer push URI (path)", (t) => { const url1 = "taler://pay-push/exch.example.com:123/bla/foo"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayPush) { assert.fail(); return; @@ -293,7 +293,7 @@ test("taler-new peer to peer push URI (path)", (t) => { test("taler-new peer to peer push URI (http)", (t) => { const url1 = "taler+http://pay-push/exch.example.com:123/bla/foo"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayPush) { assert.fail(); return; @@ -306,7 +306,7 @@ test("taler-new peer to peer push URI (http)", (t) => { }); test("taler-new peer to peer push URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.PayPush, exchangeBaseUrl: "https://foo.example.com/bla/" as HostPortPath, contractPriv: "123", @@ -321,7 +321,7 @@ test("taler-new peer to peer push URI (stringify)", (t) => { test("taler-new peer to peer pull URI", (t) => { const url1 = "taler://pay-pull/exch.example.com/foo"; // const r1 = parsePayPullUri(url1); - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayPull) { assert.fail(); @@ -336,7 +336,7 @@ test("taler-new peer to peer pull URI", (t) => { test("taler-new peer to peer pull URI (path)", (t) => { const url1 = "taler://pay-pull/exch.example.com:123/bla/foo"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayPull) { assert.fail(); return; @@ -350,7 +350,7 @@ test("taler-new peer to peer pull URI (path)", (t) => { test("taler-new peer to peer pull URI (http)", (t) => { const url1 = "taler+http://pay-pull/exch.example.com:123/bla/foo"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayPull) { assert.fail(); return; @@ -363,7 +363,7 @@ test("taler-new peer to peer pull URI (http)", (t) => { }); test("taler-new peer to peer pull URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.PayPull, exchangeBaseUrl: "https://foo.example.com/bla/" as HostPortPath, contractPriv: "123", @@ -379,7 +379,7 @@ test("taler-new pay template URI (parsing)", (t) => { const url1 = "taler://pay-template/merchant.example.com/FEGHYJY48FEGU6WETYIOIDEDE2QW3OCZVY"; // const r1 = parsePayTemplateUri(url1); - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayTemplate) { assert.fail(); @@ -396,7 +396,7 @@ test("taler-new pay template URI (parsing, case-sensitive)", (t) => { const url1 = "taler://pay-template/merchant.example.com/InstaceName/FEGHYJY48FEGU6WETYIOIDEDE2QW3OCZVY"; // const r1 = parsePayTemplateUri(url1); - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayTemplate) { assert.fail(); @@ -412,7 +412,7 @@ test("taler-new pay template URI (parsing, case-sensitive)", (t) => { test("taler-new pay template URI (parsing, http with port)", (t) => { const url1 = "taler+http://pay-template/merchant.example.com:1234/FEGHYJY48FEGU6WETYIOIDEDE2QW3OCZVY"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.PayTemplate) { assert.fail(); return; @@ -425,7 +425,7 @@ test("taler-new pay template URI (parsing, http with port)", (t) => { }); test("taler-new pay template URI (stringify)", (t) => { - const url1 = TalerUris.toString({ + const url1 = TalerUris.stringify({ type: TalerUriAction.PayTemplate, merchantBaseUrl: "http://merchant.example.com:1234/" as HostPortPath, templateId: "FEGHYJY48FEGU6WETYIOIDEDE2QW3OCZVY", @@ -437,7 +437,7 @@ test("taler-new pay template URI (stringify)", (t) => { }); test("taler-new pay template URI (stringify, case-sensitive)", (t) => { - const url1 = TalerUris.toString({ + const url1 = TalerUris.stringify({ type: TalerUriAction.PayTemplate, merchantBaseUrl: "http://merchant.example.com:1234/InstanceName/" as HostPortPath, @@ -455,7 +455,7 @@ test("taler-new pay template URI (stringify, case-sensitive)", (t) => { test("taler-new restore URI (parsing, http with port)", (t) => { const url1 = "taler+http://restore/GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0/prov1.example.com,prov2.example.com:123"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); // const r1 = parseRestoreUri( // , // ); @@ -473,7 +473,7 @@ test("taler-new restore URI (parsing, http with port)", (t) => { test("taler-new restore URI (parsing, https with port)", (t) => { const url1 = "taler://restore/GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0/prov1.example.com,prov2.example.com:234,https%3A%2F%2Fprov1.example.com%2F"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.Restore) { assert.fail(); @@ -488,7 +488,7 @@ test("taler-new restore URI (parsing, https with port)", (t) => { }); test("taler-new restore URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.Restore, walletRootPriv: "GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0", providers: [ @@ -509,7 +509,7 @@ test("taler-new restore URI (stringify)", (t) => { test("taler-new dev exp URI (parsing)", (t) => { const url1 = "taler://dev-experiment/123"; // const r1 = parseDevExperimentUri(url1); - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.DevExperiment) { assert.fail(); @@ -519,7 +519,7 @@ test("taler-new dev exp URI (parsing)", (t) => { }); test("taler-new dev exp URI (stringify)", (t) => { - const url1 = TalerUris.toString({ + const url1 = TalerUris.stringify({ type: TalerUriAction.DevExperiment, devExperimentId: "123", }); @@ -536,7 +536,7 @@ test("taler-new withdraw exchange URI (parse)", (t) => { const url1 = "taler://withdraw-exchange/exchange.demo.taler.net/someroot/GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0?a=KUDOS%3A2"; failOrThrow( - TalerUris.fromString(url1), + TalerUris.parse(url1), TalerUriParseError.INVALID_TARGET_PATH, ); @@ -549,7 +549,7 @@ test("taler-new withdraw exchange URI (parse)", (t) => { const url1 = "taler://withdraw-exchange/exchange.demo.taler.net/GJKG23V4ZBHEH45YRK7TWQE8ZTY7JWTY5094TQJSRZN5DSDBX8E0"; failOrThrow( - TalerUris.fromString(url1), + TalerUris.parse(url1), TalerUriParseError.INVALID_TARGET_PATH, ); } @@ -557,7 +557,7 @@ test("taler-new withdraw exchange URI (parse)", (t) => { // Now test well-formed URIs { const url1 = "taler://withdraw-exchange/exchange.demo.taler.net/someroot/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.WithdrawExchange) { assert.fail(); return; @@ -571,7 +571,7 @@ test("taler-new withdraw exchange URI (parse)", (t) => { { const url1 = "taler://withdraw-exchange/exchange.demo.taler.net/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.WithdrawExchange) { assert.fail(); return; @@ -586,7 +586,7 @@ test("taler-new withdraw exchange URI (parse)", (t) => { { const url1 = "taler://withdraw-exchange/exchange.demo.taler.net"; // No trailing slash, no path component - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.WithdrawExchange) { assert.fail(); return; @@ -600,7 +600,7 @@ test("taler-new withdraw exchange URI (parse)", (t) => { }); test("taler-new withdraw exchange URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.WithdrawExchange, exchangeBaseUrl: "https://exchange.demo.taler.net" as HostPortPath, }); @@ -611,7 +611,7 @@ test("taler-new withdraw exchange URI (stringify)", (t) => { }); test("taler-new withdraw exchange URI with amount (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.WithdrawExchange, exchangeBaseUrl: "https://exchange.demo.taler.net" as HostPortPath, amount: "KUDOS:19" as AmountString, @@ -629,7 +629,7 @@ test("taler-new withdraw exchange URI with amount (stringify)", (t) => { test("taler-new add exchange URI (parse)", (t) => { { const url1 = "taler://add-exchange/exchange.example.com/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.AddExchange) { assert.fail(); return; @@ -641,7 +641,7 @@ test("taler-new add exchange URI (parse)", (t) => { } { const url1 = "taler://add-exchange/exchanges.example.com/api/"; - const r1 = Result.unpack(TalerUris.fromString(url1)); + const r1 = Result.unpack(TalerUris.parse(url1)); if (r1.type !== TalerUriAction.AddExchange) { assert.fail(); return; @@ -654,7 +654,7 @@ test("taler-new add exchange URI (parse)", (t) => { }); test("taler-new add exchange URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.AddExchange, exchangeBaseUrl: "https://exchange.demo.taler.net" as HostPortPath, }); @@ -662,7 +662,7 @@ test("taler-new add exchange URI (stringify)", (t) => { }); test("taler-new add contact URI (stringify)", (t) => { - const url = TalerUris.toString({ + const url = TalerUris.stringify({ type: TalerUriAction.AddContact, alias: "bob@example.com", aliasType: "email", @@ -682,7 +682,7 @@ test("taler-new add contact URI (stringify)", (t) => { test("taler-new pay url parsing: wrong scheme", (t) => { const url1 = "talerfoo://"; const r1 = failOrThrow( - TalerUris.fromString(url1), + TalerUris.parse(url1), TalerUriParseError.WRONG_PREFIX, ); // const r1 = parsePayUri(url1); @@ -690,7 +690,7 @@ test("taler-new pay url parsing: wrong scheme", (t) => { const url2 = "taler://refund/a/b/c/d/e/f"; const r2 = failOrThrow( - TalerUris.fromString(url2), + TalerUris.parse(url2), TalerUriParseError.INVALID_TARGET_PATH, ); // const r2 = parsePayUri(url2); diff --git a/packages/taler-wallet-core/src/mailbox.ts b/packages/taler-wallet-core/src/mailbox.ts @@ -214,7 +214,7 @@ export async function createNewMailbox( ); } mailboxConf.payUri = Result.orElse( - TalerUris.fromString(resp.talerUri), + TalerUris.parse(resp.talerUri), undefined, ); } diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts @@ -1983,7 +1983,7 @@ export async function handleGetDefaultExchanges( defaultExchanges.push({ currency: exch.currency, currencySpec: exch.currencySpec, - talerUri: TalerUris.toString( + talerUri: TalerUris.stringify( TalerUris.createTalerWithdrawExchange( exch.exchangeBaseUrl as HostPortPath, ), diff --git a/packages/taler-wallet-webextension/src/components/PaymentButtons.tsx b/packages/taler-wallet-webextension/src/components/PaymentButtons.tsx @@ -175,7 +175,7 @@ function PayWithMobile({ uri }: { uri: string }): VNode { const { i18n } = useTranslationContext(); const api = useBackendContext(); - const payUri = Result.orUndefined(TalerUris.fromString(uri)); + const payUri = Result.orUndefined(TalerUris.parse(uri)); const [showQR, setShowQR] = useState<string | undefined>(undefined); async function sharePrivatePaymentURI() { diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx b/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx @@ -248,7 +248,7 @@ export function SuccessView(state: State.Success): VNode { {state.talerWithdrawUri ? ( <WithdrawWithMobile talerWithdrawUri={Result.unpack( - TalerUris.fromString(state.talerWithdrawUri), + TalerUris.parse(state.talerWithdrawUri), )} /> ) : undefined} @@ -274,7 +274,7 @@ function WithdrawWithMobile({ <QR_Taler uri={talerWithdrawUri} /> <i18n.Translate> Scan the QR code or &nbsp; - <a href={TalerUris.toString(talerWithdrawUri)}> + <a href={TalerUris.stringify(talerWithdrawUri)}> <i18n.Translate>click here</i18n.Translate> </a> </i18n.Translate> diff --git a/packages/taler-wallet-webextension/src/wallet/Mailbox.tsx b/packages/taler-wallet-webextension/src/wallet/Mailbox.tsx @@ -198,7 +198,7 @@ interface MessageProps { function MailboxMessageLayout(props: MessageProps): VNode { const { i18n } = useTranslationContext(); const uri = Result.orElse( - TalerUris.fromString(props.message.talerUri), + TalerUris.parse(props.message.talerUri), undefined, ); function toDateString(t: TalerProtocolTimestamp): string { diff --git a/packages/taler-wallet-webextension/src/wallet/QrReader.tsx b/packages/taler-wallet-webextension/src/wallet/QrReader.tsx @@ -231,7 +231,7 @@ type FailCasesOf<T extends (...args: any) => any> = Exclude< // FIXME: This belongs into some util library, should be tested. function translateTalerUriError( - result: FailCasesOf<typeof TalerUris.fromString>, + result: FailCasesOf<typeof TalerUris.parse>, i18n: InternationalizationAPI, ): TranslatedString { switch (result.error) { @@ -344,7 +344,7 @@ export function QrReaderPage({ onDetected }: Props): VNode { async function onChangeDetect(str: string) { setValue(str); if (str) { - const uriResp = TalerUris.fromString(str, { ignoreUppercase: true }); + const uriResp = TalerUris.parse(str, { ignoreUppercase: true }); if (uriResp.tag === "error") { setError(translateTalerUriError(uriResp, i18n)); @@ -368,7 +368,7 @@ export function QrReaderPage({ onDetected }: Props): VNode { function onChange(str: string) { setValue(str); if (str) { - const uriResp = TalerUris.fromString(str, { ignoreUppercase: true }); + const uriResp = TalerUris.parse(str, { ignoreUppercase: true }); if (uriResp.tag === "error") { setError(translateTalerUriError(uriResp, i18n)); return; diff --git a/packages/taler-wallet-webextension/src/wallet/Transaction.tsx b/packages/taler-wallet-webextension/src/wallet/Transaction.tsx @@ -980,7 +980,7 @@ export function TransactionView({ text={ <ShowQrWithCopy uri={Result.unpack( - TalerUris.fromString(transaction.talerUri), + TalerUris.parse(transaction.talerUri), )} startOpen onForwardToContact={() => { @@ -1086,7 +1086,7 @@ export function TransactionView({ title={i18n.str`URI`} text={ <ShowQrWithCopy - uri={Result.unpack(TalerUris.fromString(transaction.talerUri))} + uri={Result.unpack(TalerUris.parse(transaction.talerUri))} startOpen onForwardToContact={() => { onForwardToContact && @@ -2041,7 +2041,7 @@ function ShowQrWithCopy({ const [copied, setCopied] = useState(false); async function copyToClipboard(): Promise<void> { - await navigator.clipboard.writeText(TalerUris.toString(uri)); + await navigator.clipboard.writeText(TalerUris.stringify(uri)); setCopied(true); setTimeout(() => setCopied(false), 2000); } diff --git a/packages/web-util/src/components/QR.tsx b/packages/web-util/src/components/QR.tsx @@ -41,7 +41,7 @@ function generate_qr( } export function QR_Taler({ uri }: { uri: TalerUri }): VNode { - const stringUri = TalerUris.toString(uri); + const stringUri = TalerUris.stringify(uri); return ( <div style={{