taler-typescript-core

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

commit 7524980ecc59b0b2a8f101e342aaa1897d6f7fc2
parent 50e99b62e03e828d60b724f307b2b5bf97468e49
Author: Florian Dold <dold@taler.net>
Date:   Tue, 21 Jul 2026 02:39:16 +0200

util: build the sample transaction data lazily to avoid import cycle

Diffstat:
Mpackages/taler-util/src/codec-object-fields.test.ts | 8++------
Mpackages/taler-util/src/transaction-test-data.ts | 168+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mpackages/taler-wallet-cli/src/index.ts | 6++++--
Mpackages/taler-wallet-core/src/requests.ts | 2+-
4 files changed, 94 insertions(+), 90 deletions(-)

diff --git a/packages/taler-util/src/codec-object-fields.test.ts b/packages/taler-util/src/codec-object-fields.test.ts @@ -16,12 +16,8 @@ import { test } from "node:test"; import assert from "node:assert"; -// Imported through the package barrel: types-taler-wallet-transactions.js pulls -// in a circular dependency that only resolves when index.js is the entry point. -import { - codecForPurseDepositConflict, - codecForTransactionsRequest, -} from "./index.js"; +import { codecForPurseDepositConflict } from "./types-taler-exchange.js"; +import { codecForTransactionsRequest } from "./types-taler-wallet-transactions.js"; test("codecForPurseDepositConflict decodes coin_sig", (t) => { const decoded = codecForPurseDepositConflict().decode({ diff --git a/packages/taler-util/src/transaction-test-data.ts b/packages/taler-util/src/transaction-test-data.ts @@ -23,91 +23,97 @@ import { RefreshReason } from "./types-taler-wallet.js"; /** * Sample transaction list entries. + * + * Built lazily: this module is dragged into the package barrel, which forms an + * import cycle back to the enums used below. Reading them at module-load time + * throws when this file happens to run before those enums are initialized. */ -export const sampleWalletCoreTransactions = [ - { - type: TransactionType.Payment, - txState: { - major: TransactionMajorState.Done, - }, - amountRaw: "KUDOS:10", - amountEffective: "KUDOS:10", - totalRefundRaw: "KUDOS:0", - totalRefundEffective: "KUDOS:0", - status: PaymentStatus.Paid, - refundPending: undefined, - posConfirmation: undefined, - pending: false, - refunds: [], - timestamp: { - t_s: 1677166045, - }, - transactionId: - "txn:payment:NRRD9KJ8970P5HDAGPW1MBA6HZHB1XMFKF5M3CNR6WA0GT98DHY0", - proposalId: "NRRD9KJ8970P5HDAGPW1MBA6HZHB1XMFKF5M3CNR6WA0GT98DHY0", - info: { - merchant: { - name: "woocommerce", - website: "woocommerce.demo.taler.net", - email: "foo@example.com", - address: {}, - jurisdiction: {}, +export function getSampleWalletCoreTransactions() { + return [ + { + type: TransactionType.Payment, + txState: { + major: TransactionMajorState.Done, + }, + amountRaw: "KUDOS:10", + amountEffective: "KUDOS:10", + totalRefundRaw: "KUDOS:0", + totalRefundEffective: "KUDOS:0", + status: PaymentStatus.Paid, + refundPending: undefined, + posConfirmation: undefined, + pending: false, + refunds: [], + timestamp: { + t_s: 1677166045, }, - orderId: "wc_order_KQCRldghIgDRB-100", - products: [ - { - description: "Using GCC", - quantity: 1, - price: "KUDOS:10", - product_id: "28", + transactionId: + "txn:payment:NRRD9KJ8970P5HDAGPW1MBA6HZHB1XMFKF5M3CNR6WA0GT98DHY0", + proposalId: "NRRD9KJ8970P5HDAGPW1MBA6HZHB1XMFKF5M3CNR6WA0GT98DHY0", + info: { + merchant: { + name: "woocommerce", + website: "woocommerce.demo.taler.net", + email: "foo@example.com", + address: {}, + jurisdiction: {}, }, - ], - summary: "WooTalerShop #100", - contractTermsHash: - "A02E1M6ARWKBJ87K2TV4S6WQ4X5YH7BRVR6MYCHCTVAED8MBXTFD6PZ5Q50Y7Z5K18PYBTDA14NQ56XPC1VCQW1EVRWTSB7ZYT65B5G", - fulfillmentUrl: - "https://woocommerce.demo.taler.net/?wc-api=wc_gnutaler_gateway&order_id=wc_order_KQCRldghIgDRB-100", - }, - refundQueryActive: false, - frozen: false, - }, - { - type: TransactionType.Refresh, - txState: { - major: TransactionMajorState.Pending, - }, - refreshReason: RefreshReason.PayMerchant, - amountEffective: "KUDOS:0", - amountRaw: "KUDOS:0", - refreshInputAmount: "KUDOS:1.5", - refreshOutputAmount: "KUDOS:1.4", - originatingTransactionId: - "txn:proposal:ZCGBZFE8KZ1CBYYGSC3ZC8E40KVJWV16VYCTHGC8FFSVZ5HD24BG", - pending: true, - timestamp: { - t_s: 1681376214, + orderId: "wc_order_KQCRldghIgDRB-100", + products: [ + { + description: "Using GCC", + quantity: 1, + price: "KUDOS:10", + product_id: "28", + }, + ], + summary: "WooTalerShop #100", + contractTermsHash: + "A02E1M6ARWKBJ87K2TV4S6WQ4X5YH7BRVR6MYCHCTVAED8MBXTFD6PZ5Q50Y7Z5K18PYBTDA14NQ56XPC1VCQW1EVRWTSB7ZYT65B5G", + fulfillmentUrl: + "https://woocommerce.demo.taler.net/?wc-api=wc_gnutaler_gateway&order_id=wc_order_KQCRldghIgDRB-100", + }, + refundQueryActive: false, + frozen: false, }, - transactionId: - "txn:refresh:QQSWHHXCRQ269G0E3RW14JMC6F7NFDYDW26NSFHRTXSKDS6CMCZ0", - frozen: false, - error: { - code: 7029, - when: { - t_ms: 1681376473665, + { + type: TransactionType.Refresh, + txState: { + major: TransactionMajorState.Pending, }, - hint: "Error (WALLET_REFRESH_GROUP_INCOMPLETE)", - numErrors: 1, - errors: [ - { - code: 7001, - when: { - t_ms: 1681376473189, - }, - hint: "unexpected exception (message: exchange wire fee signature invalid)", - stack: - " at validateWireInfo (../taler-wallet-core-qjs.mjs:23166)\n", + refreshReason: RefreshReason.PayMerchant, + amountEffective: "KUDOS:0", + amountRaw: "KUDOS:0", + refreshInputAmount: "KUDOS:1.5", + refreshOutputAmount: "KUDOS:1.4", + originatingTransactionId: + "txn:proposal:ZCGBZFE8KZ1CBYYGSC3ZC8E40KVJWV16VYCTHGC8FFSVZ5HD24BG", + pending: true, + timestamp: { + t_s: 1681376214, + }, + transactionId: + "txn:refresh:QQSWHHXCRQ269G0E3RW14JMC6F7NFDYDW26NSFHRTXSKDS6CMCZ0", + frozen: false, + error: { + code: 7029, + when: { + t_ms: 1681376473665, }, - ], + hint: "Error (WALLET_REFRESH_GROUP_INCOMPLETE)", + numErrors: 1, + errors: [ + { + code: 7001, + when: { + t_ms: 1681376473189, + }, + hint: "unexpected exception (message: exchange wire fee signature invalid)", + stack: + " at validateWireInfo (../taler-wallet-core-qjs.mjs:23166)\n", + }, + ], + }, }, - }, -]; + ]; +} diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts @@ -41,7 +41,7 @@ import { Paytos, PreparePayResultType, Result, - sampleWalletCoreTransactions, + getSampleWalletCoreTransactions, setDangerousTimetravel, setGlobalLogLevelFromString, summarizeTalerErrorDetail, @@ -1729,7 +1729,9 @@ advancedCli help: "Print sample wallet-core transactions", }) .action(async (args) => { - console.log(JSON.stringify(sampleWalletCoreTransactions, undefined, 2)); + console.log( + JSON.stringify(getSampleWalletCoreTransactions(), undefined, 2), + ); }); advancedCli diff --git a/packages/taler-wallet-core/src/requests.ts b/packages/taler-wallet-core/src/requests.ts @@ -1259,7 +1259,7 @@ async function handleTestingGetSampleTransactions( // FIXME! return { transactions: [] }; // These are out of date! - //return { transactions: sampleWalletCoreTransactions }; + //return { transactions: getSampleWalletCoreTransactions() }; } async function handleStartRefundQuery(