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:
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(