Commit 449e9de
Updates to lightspark-cli, lightspark-sdk, crypto-wasm, oauth, core, ui (#497)
* Upgrade libphonenumber-js to 1.12.4 (#23790)
## Reason
closes PX-1307
when testing, we found out that **Benin** updated its phone number length from 8 to 10 in **Nov 2025** Since our libphonenumber-js hasn't been updated since may of that year, we weren't getting the updated benin information
Update the libphonenumber-js dependency to the latest version to benefit from bug fixes, performance improvements, and any new features provided in the 1.12.4 release.
## Overview
Upgraded libphonenumber-js from version 1.11.1 to 1.12.4 in the uma-bridge package dependencies.
## Test Plan
Existing tests pass. The upgrade is a patch/minor version bump with no breaking changes expected, so no additional testing is required beyond standard CI validation.
https://claude.ai/code/session_01XVarofPM6V7mJs8Tp9BnK2
GitOrigin-RevId: a4dfb2b6b4833dfb368cbdaa8830bff409965e5f
* Retheme Ops app with origin/Nage design system (#23775)
## Summary
- Migrate Ops from default Lightspark theme to the origin/Nage design
system with SuisseIntl font family, updated color palette, and
consistent styling
- Add local ops-specific Select, TextInput, Dropdown, DataManagerTable,
and OpsCommandCenter (⌘K) components with Nage-consistent styling
- Make ops Select support caller-provided style overrides (merged on top
of defaults) and use compact 12px/32px styling in the header to match
the command center trigger button
- Migrate all ~40 ops pages from `@lightsparkdev/ui` Select to the local
ops Select
## Test Plan
- [ ] Verify Ops app loads with new Nage theme (SuisseIntl fonts,
updated colors)
- [ ] Verify header CoreService select visually matches OpsCommandCenter
trigger button height
- [ ] Verify all ops pages render correctly with the local Select
component
- [ ] Verify OpsCommandCenter opens with ⌘K and functions correctly
- [ ] Verify theme toggle (Light/Dark/Hardcore) still works
- [ ] `yarn workspace @lightsparkdev/ops tsc --noEmit` passes
<img width="1293" height="541" alt="Screenshot 2026-02-13 at 7 11 10 PM"
src="https://github.com/user-attachments/assets/3ed30972-934e-40e3-a087-c36011d167d2"
/>
<img width="904" height="395" alt="Screenshot 2026-02-13 at 7 12 01 PM"
src="https://github.com/user-attachments/assets/cfb514b6-dbb3-4dbc-8f0e-16fa5f701a57"
/>
<img width="1358" height="557" alt="Screenshot 2026-02-13 at 7 12 32 PM"
src="https://github.com/user-attachments/assets/3d1ef6aa-ebc6-4c1d-a3e4-d123b52a87aa"
/>
<img width="1287" height="554" alt="Screenshot 2026-02-13 at 7 12 57 PM"
src="https://github.com/user-attachments/assets/1231a16d-70ab-4972-b168-445a739a4259"
/>
<img width="513" height="433" alt="Screenshot 2026-02-13 at 6 32 10 PM"
src="https://github.com/user-attachments/assets/9cef811b-34ca-4a00-a6da-1f0e8d14aa66"
/>
<img width="499" height="427" alt="Screenshot 2026-02-13 at 6 32 22 PM"
src="https://github.com/user-attachments/assets/c8c2ddbb-e8a0-4ace-9f84-2ae497e46bd4"
/>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
GitOrigin-RevId: 54b3c84110731cc615218c1249da505abe077367
* CI update lock file for PR
* Confine account numbers and sort codes for gbp, myr, sgd and thb to be digits only (#23867)
## Reason
Add validation to ensure bank account numbers and related fields contain only digits for Tazapay integrations. This prevents users from entering invalid characters that would cause payment failures. Previously, users were able to enter information that would immediately fail on the server. This brings the validation more in line with the backend
## Overview
- Added a new `digitsOnly` validator in `useFields.tsx` to check if input contains only digits
- Applied this validator to account numbers, sort codes, bank codes, and branch codes for various Tazapay currency accounts (GBP, CAD, HKD, MYR, SGD, THB)
- Updated backend validation in Python to explicitly check that account numbers contain only digits for MYR, SGD, and THB accounts
## Test Plan
- Verified the new validator rejects inputs with non-digit characters
- Tested form validation for each affected currency type
- Confirmed backend validation correctly identifies and rejects non-digit account numbers with appropriate error messages
GitOrigin-RevId: 3e8ce54fdb8ec2143b935c8a3ac5a5fd9a1b2bf2
* [ops] Convert all ops tables to DataManagerTable (#23871)
## Summary
Converts all 25 remaining `Table`/`CN1Table` usages in the ops app to
`DataManagerTable`, adding cursor-based pagination, URL-persisted
filters, and consistent table styling across all ops pages.
## Changed Tables
### Simple Table → DataManagerTable (pagination only, no filters)
| File | Changes/Caveats |
|------|----------------|
| **BakeryTable.tsx** | Renamed `$size` → `$first`, added cursor
pagination. Preserves modal for approve/deny/consume baking requests. |
| **BobbyTable.tsx** | Standard conversion. Uses
`useCoreServiceSchema()` for dynamic schema. |
| **CeleryTable.tsx** | Has `@ts-expect-error` on columns prop —
pre-existing mismatch where "sql" column key doesn't exist in row data
type. |
| **Pasta.tsx** | Renamed `$size` → `$first`, added cursor pagination.
Keeps "Cook some pasta!" button and CardPage wrapper. |
| **OpsBridgeZeroHashReceiveOperations.tsx** | `PAGE_SIZES = [50, 100]`.
Replaced custom `Empty` styled component with DataManagerTable's
`emptyState` prop. |
| **OpsBridgeReservedUmas.tsx** | Keeps "Reserve an UMA" form and
"Release" action links below/in table. |
| **OpsBridgeBannedClabes.tsx** | Keeps "Ban Form" above table and
"Unban/Release" action links. |
| **LedgerAccounts.tsx** | `PAGE_SIZES = [30, 50, 100]`. Complex
`onClickRow` with `getAccountId` lookup to navigate to account details.
|
| **CrossRiverWebhooks.tsx** | No cursor pagination — query returns flat
array (not a connection type). Uses `pageSizes={[100]}` with
`resultCount={rows.length}`. |
| **ManagePaycoreUmaaasPlatformCurrency.tsx** | Was importing `Table`
from public `@lightsparkdev/ui`. Query already had `$after`; added
`page_info`. |
### Fragment-Based Tables (styling swap only, no query/pagination)
| File | Changes/Caveats |
|------|----------------|
| **OpsManualReviewTicketSenderTransactions.tsx** |
`showHeader={false}`, `pageSizes={[100]}`. Receives data as props. |
| **OpsManualReviewTicketSenderTickets.tsx** | Keeps `onClickRow` for
navigation. Receives data as props. |
| **OpsGkListTable.tsx** | CN1Table → DataManagerTable. Keeps
`onClickRow` navigation and `.fragments` static property. |
| **WebhookTesterListTable.tsx** | CN1Table → DataManagerTable. Keeps
TrashCan delete action column with mutation. Keeps `.fragments` static
property. |
### Filter Migration (existing filters → DataManagerTable built-in
filters)
| File | Filter Changes | Caveats |
|------|---------------|---------|
| **OpsSparkSspTransactions.tsx** | 3 `Select` dropdowns → 3 ENUM
filters (Status, Network, Type) | Removed `Settings`/`Label` styled
components. Custom enum mapping via `statusMap`/`networkMap`/`typeMap`.
|
| **OpsManualReview.tsx** | `ButtonRow` toggle → ENUM filter
(Open/Closed) | `PAYOPS_tickets` does **not** support `after` argument —
removed `$after` from query while keeping `end_cursor` in `page_info`. |
| **OpsOnboarding.tsx** | Multi-select `ButtonRow` → ENUM filter with
`isMulti: true` | Default filter value:
`[AccountGoLiveStatus.Requested]`. |
| **OpsBridgeBitsoReceiveOperations.tsx** | UMA `TextInput` + Button →
STRING filter | Keeps `Toggle` for CREATED status as separate
client-side post-fetch filter (not migrated into DataManagerTable). |
| **OpsCompliance.tsx** | CN1Table + `Select` dropdown → ENUM filter |
Custom status mapping: "Manual Review" → `[VerificationPending,
ReVerificationPending]`, "Verified" → `[VerificationSucceeded]`,
"Declined" → `[VerificationFailed]`. |
| **OpsBillingInvoices.tsx** | CN1Table + `Select` + `TextInput` → ENUM
filter + STRING filter | Status filter wraps single selection in array
for `$statuses` variable. Account ID uses `isStringFilterState`. |
| **OpsBillingPlans.tsx** | CN1Table + Radio buttons → 2 BOOLEAN filters
(Is Public, Is Enabled) | Uses `FilterType.BOOLEAN` with
`isBooleanFilterState`. Keeps the "Create Billing Plan" form below the
table. |
### Client-Side Filtering (kept external, DataManagerTable for styling
only)
| File | Changes/Caveats |
|------|----------------|
| **OpsBridgeUsers.tsx** | Keeps `Select` dropdowns above table for
client-side status/VASP filtering. GraphQL query doesn't support filter
variables. |
| **OpsPerms.tsx** | Keeps `TextInput` search above table. Two queries
combined client-side. `showHeader={false}`, `pageSizes={[100]}`. |
| **Knobs.tsx** | Keeps `TextInput` search + "Create Knob" button above
table. `pageSizes={[1000]}`. Keeps modal for CRUD operations. |
| **SofiViewReports.tsx** | Multiple tables inside `.map()` loop — both
inner tables converted. Keeps lazy query search UI and all styled
components. |
## GraphQL Changes
- Added `$after: String` variable and `after: $after` argument to 17
queries for cursor-based pagination
- Added `page_info { has_next_page end_cursor }` to all connection
queries
- Exception: `PAYOPS_tickets` does not support `after` — kept without it
- Exception: `CrossRiverWebhooks` returns a flat array, not a connection
type — no pagination changes
- Auto-generated `graphql.tsx` updated via `yarn gql-codegen`
## What's NOT converted (out of scope)
- `OpsBillingInvoice.tsx` — single invoice detail page (uses CN1Table
for layout, not a data listing)
- `OpsInspectorDetailsBridgeZeroHashSendOperation.tsx` — inspector
detail view (layout, not a table)
## Test plan
- [ ] Verify each converted table page loads correctly in the ops app
- [ ] Verify pagination works (page size selector, next/previous pages)
- [ ] Verify filters work for tables that had them (SSP transactions,
Manual Review, Onboarding, Bitso, Compliance, Billing)
- [ ] Verify client-side filtering still works (Bridge Users, Perms,
Knobs)
- [ ] Verify row click navigation works where applicable
- [ ] Verify modals/forms still work (Bakery approve/deny, Knobs CRUD,
Billing Plans create)
- [ ] Verify action columns work (BannedClabes unban, ReservedUmas
release, WebhookTester delete)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
GitOrigin-RevId: a15f179b80a0cc680502e9c463ea2342756b13c4
* Add Tazapay currencies to cent-based currency formatting (#23949)
## Reason
Tazapay standardizes all fiat currencies to 2 decimal places in their API responses. This means currency amounts from Tazapay are stored in smallest units (1/100 of base unit) even for currencies that don't naturally have sub-units (e.g., IDR, VND). These currencies need to be treated the same as traditional cent-based currencies for proper display formatting.
## Overview
Added 9 Tazapay-supported currencies to the `centCurrencies` array in the `formatCurrencyStr` function:
- IDR (Indonesian Rupiah)
- VND (Vietnamese Dong)
- THB (Thai Baht)
- MYR (Malaysian Ringgit)
- CAD (Canadian Dollar)
- DKK (Danish Krone)
- AED (United Arab Emirates Dirham)
- HKD (Hong Kong Dollar)
- SGD (Singapore Dollar)
These currencies will now be correctly divided by 100 when formatting for display, matching Tazapay's standardized decimal representation.
## Test Plan
Existing currency formatting tests should continue to pass. The change is additive and follows the established pattern for cent-based currencies in the codebase.
https://claude.ai/code/session_01AAn8DK9DjTuW7HQXjidhB6
GitOrigin-RevId: e315e8a632f8b5838624d5a9f65943bf394fc684
* fix: use unique keys for Dropdown list items (#24202)
## Summary
- The `Dropdown` component used `dropdownItem.to` as the React list key,
causing duplicate key warnings when multiple items share the same route
(e.g. `AccountDropdown` where Account, Profile, Team, Security, and
Billing all navigate to `/account` with different hash fragments)
- Changed the key to a composite of `to`, `hash`, and index to ensure
uniqueness across all dropdown items
## Root cause
`Dropdown.tsx:420` rendered `<li key={dropdownItem.to}>`, but
`AccountDropdown` passes 5-6 items all with `to: Routes.Account`,
differentiated only by `hash`. React warned about duplicate `/account`
keys on every render.
## Test plan
- [ ] Open the site app locally, navigate to any page with the account
dropdown
- [ ] Verify no "duplicate key" warnings in the browser console
- [ ] Verify dropdown items still render and navigate correctly
(Account, Profile, Team, Security, Billing, Log out)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
GitOrigin-RevId: c7a2095f7748e96835e998fec11a2b4d4983640e
* Update currency formatting for African currencies (#24427)
## Reason
<img width="231" height="181" alt="Screenshot 2026-03-03 at 5 44 02 PM" src="https://github.com/user-attachments/assets/a264a8bd-a394-45b0-a75f-33433afe35e8" />
Reorganize the currency formatting logic to properly categorize African currencies by their decimal place handling. This change separates Yellowcard's 2-decimal African currencies (MWK, ZMW) from other African currencies, ensuring correct formatting based on how each payment provider stores currency amounts.
## Overview
- Moved `CurrencyUnit.TZS` and `CurrencyUnit.UGX` out of the 2-decimal African currencies section
- Added `CurrencyUnit.MWK` and `CurrencyUnit.ZMW` as Yellowcard 2-decimal African currencies with a clarifying comment
- Reordered `CurrencyUnit.BWP` for better logical grouping
This change ensures that currency amounts are formatted correctly based on whether they're stored in smallest units (1/100 of base unit) by Yellowcard or use standard formatting.
## Test Plan
N/A - This is a configuration change to currency formatting logic. Existing currency formatting tests will validate the behavior.
https://claude.ai/code/session_01NdmcE1QoMxNwDK9zTCbPfA
GitOrigin-RevId: 743ad2e3a323393c554c3f4aa474e99887f269a3
* [core] Improve Logger: add levels, timestamps, options API, and tests (#24478)
## Summary
- Moves `Logger` from a single file (`Logger.ts`) to a `logger/`
directory with barrel export
- Adds `Debug`, `Warn`, and `Error` logging levels (previously only
`Trace` and `Info`)
- Adds timestamp formatting to log messages (configurable)
- Adds `setOptions` API accepting string-based level names (e.g.,
`"DEBUG"`, `"info"`, `"Warn"`)
- Adds new `warn()` and `error()` methods that use
`console.warn`/`console.error` respectively
- Adds unit tests for level name parsing, casing validation, and debug
level filtering
- Also fixes pre-existing prettier formatting in `SendWire.tsx`
## Backwards Compatibility
These changes are **fully backwards compatible**:
- `Logger`, `LoggingLevel`, and `logger` are still exported from
`shared.ts` (the public API surface)
- No external consumers import `Logger.ts` directly — they all go
through `@lightsparkdev/core` barrel exports
- The `Logger` constructor signature changed from `(context,
getLoggingEnabled?)` to `(context, options?)`, but the default behavior
(no second arg) is preserved
- `setLevel()` and `setEnabled()` methods are preserved with identical
signatures
- `trace()` and `info()` methods behave identically
- New exports (`LoggerOptions`, `LoggerOptionsArg`, `LoggingLevelArg`,
`LoggingLevelName`) are additive only
- New enum values (`Debug`, `Warn`, `Error`) are additive — existing
`Trace` (0) and `Info` (2, was 1) numeric values shifted, but no
external code should depend on the numeric values
1 parent 188e713 commit 449e9de
File tree
90 files changed
+2859
-1713
lines changed- .changeset
- .github/workflows
- apps/examples
- nodejs-scripts
- src/lightspark-sdk
- oauth-app
- remote-signing-server
- src
- ui-test-app
- uma-vasp-cli
- src
- uma-vasp
- packages
- core
- src
- logger
- tests
- requester
- tests
- utils
- eslint-config
- lightspark-cli
- src
- lightspark-sdk
- src
- objects
- tests
- oauth
- src/auth
- tsconfig
- ui
- src
- components
- DataManagerTable
- QRReader
- documentation
- hooks
- styles
- utils
- toReactNodes
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
90 files changed
+2859
-1713
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
| 33 | + | |
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | | - | |
| 38 | + | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| |||
121 | 121 | | |
122 | 122 | | |
123 | 123 | | |
124 | | - | |
| 124 | + | |
125 | 125 | | |
126 | 126 | | |
127 | 127 | | |
| |||
277 | 277 | | |
278 | 278 | | |
279 | 279 | | |
280 | | - | |
281 | | - | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
282 | 284 | | |
283 | 285 | | |
284 | 286 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | | - | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | | - | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
Lines changed: 3 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
266 | 266 | | |
267 | 267 | | |
268 | 268 | | |
269 | | - | |
270 | | - | |
271 | | - | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
272 | 272 | | |
273 | 273 | | |
274 | 274 | | |
| |||
Lines changed: 3 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
267 | 267 | | |
268 | 268 | | |
269 | 269 | | |
270 | | - | |
271 | | - | |
272 | | - | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
273 | 273 | | |
274 | 274 | | |
275 | 275 | | |
| |||
0 commit comments