Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Nova Text Currency Laravel Package

lathanhvien/nova-text-currency

A Laravel Nova field for entering and displaying monetary values as formatted text, making currency input simple in your admin panels. Add it to Nova resources for a lightweight text-based currency field.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

What the release actually is: v1.0.0 is the package's first stable cut, and the only documented capability is presentation-layer number formatting inside an input field — thousands separators and a currency symbol. There is no indication of server-side formatting, locale negotiation, validation rules, persistence, or API surface beyond the input widget. The assessment must therefore treat this as a UI/input-masking component, not a money-handling or accounting library. That distinction drives everything below.

Architecture fit: Low-risk, low-coupling. A formatted-input widget sits at the Blade/view or form-component layer and does not need to touch domain models, persistence, or service boundaries. It is compatible with the Laravel shape most teams already run (Blade, Livewire, Filament, Inertia/Vue/React with a Blade shim) without demanding an architectural change. It is not a fit if the intent was to standardise currency representation across the backend — that would be a misread of scope and should be rejected at intake.

Integration feasibility: Straightforward for a single team in a single sprint. The work is: install, publish/register the component, wire it into one or two forms, and reconcile the boundary between the formatted display value and the raw value that gets validated and persisted. The only meaningful engineering decision is where the canonical value lives — the formatted string must never be the thing that reaches the validator or the database.

Technical risk — where this bites:

  • Validation mismatch. "1,234.56" fails Laravel's numeric and decimal rules. If the component does not emit a normalised raw value alongside the display value, every consuming form needs bespoke cleaning, and that cleaning will get written slightly differently each time. This is the single highest-probability defect source.
  • Float precision. Formatting on the client encourages treating money as a JS number. Any amount crossing a float boundary is a correctness bug waiting for a finance review. Confirm the package is display-only and that the wire format stays integer minor units or a decimal string.
  • Locale and grouping ambiguity. 1.234,56 and 1,234.56 are the same digits and different amounts. "Thousand separators" with no stated locale strategy means the component's behaviour is undefined for any non-US user, and copy-paste from an international customer is a live parsing hazard.
  • Server/client authority. If the client formats and the server echoes back a differently-formatted value, Livewire/Alpine re-render cycles will fight each other and the cursor will jump. Worth an explicit smoke test on the exact stack in use.
  • v1.0.0 semantics. First stable release plus a feature-list-style changelog ("Dynamic Input…", "Support currency symbol") with no breaking-change or deprecation notes suggests the package is young and the changelog is marketing-shaped rather than maintenance-shaped. Treat the version number as nominal, not as evidence of maturity.

Key questions for the maintainer / vendor:

  1. Is the raw unformatted value exposed as a discrete property/event, and is it suitable for direct use in a FormRequest?
  2. What is the locale strategy — hardcoded, per-instance config, or Intl.NumberFormat driven? Can it be pinned per tenant?
  3. Does currency support include symbol placement, negative/parenthetical formatting, and zero-decimal currencies (JPY, KRW)?
  4. How does it behave on paste, type=number fallback, mobile numeric keyboards, and screen readers? (Accessibility and mobile are the usual casualties in masked inputs.)
  5. Server-side rendering story: does it degrade gracefully with JS disabled, or is the field blank/unusable?
  6. Is it a hard dependency on Alpine/Livewire/jQuery, and what is the peer-dependency and version-pin policy?
  7. What is the security posture — is the repo public, are there advisories, is there a stated support window?

Integration Approach

Stack fit: Best fit is Blade + Alpine or Livewire, where the component can own its own state and emit a raw value on change. Acceptable fit for Filament via a custom field wrapper. Weakest fit for Inertia/Vue/React, where you would be wrapping or reimplementing the behaviour rather than consuming it — in that case, evaluate Intl.NumberFormat plus a controlled input directly and expect comparable effort.

Migration path: There is nothing to migrate from if the prior approach was unstyled text inputs, so this is additive. Where an existing form already formats server-side via a Blade helper or accessor, pick one authority and delete the other. Running both is how you get double-formatted output like $1,234,567.00 rendered as $1,234,567.00,00.

Compatibility checks to run before committing:

  • Laravel and PHP version against the package's constraints — v1.0.0 constraints are frequently ^10|^11 only, which matters if the estate is mixed.
  • Livewire major version (v2 vs v3 differ materially in lifecycle hooks).
  • Any existing global JS that touches currency fields — mask libraries do not coexist quietly.

Sequencing (recommended, roughly two to three weeks elapsed with one engineer part-time):

  1. Spike, 1–2 days. One form, one currency, one locale. Prove the raw-value boundary and the Livewire/mask interaction. Kill the initiative here if the raw value isn't cleanly accessible.
  2. Write the house wrapper. One internal component that owns formatting config, exposes raw value, and pairs with a shared FormRequest rule for currency normalisation. Consumers must never touch the vendor API directly — this is what makes a later swap a one-file change.
  3. Pilot one real screen with a support-visible flow (e.g., invoice or expense entry) behind a feature flag, for one release cycle.
  4. Widen to remaining forms only after the pilot produces no normalisation defects in production.
  5. Pin the version. Do not float ^1.0 given a single-release track record; pin exact and upgrade deliberately.

Explicitly out of scope: using this to format values in exports, emails, PDFs, or API responses. Those are server-side rendering paths and should use a single server-side formatter so that the two cannot diverge.

Operational Impact

Maintenance: The package itself is small, so the maintenance load is mostly your wrapper and the shared normalisation rule — budget ongoing ownership there rather than in dependency upgrades. Watch for the package being a low-traffic single-maintainer project, which is the common shape for input-mask packages; the failure mode is abandonment rather than catastrophe. Mitigation is cheap: keep the wrapper thin and the vendor surface to one or two files.

Support: Expect a modest but non-zero support tail, concentrated in three tickets: "it won't accept my paste", "the decimals disappeared", and "the number changed when I saved and reopened". Pre-empt these with a short internal note and a fixture set of adversarial inputs (1,234.56, 1.234,56, -0.005, 1e3, $ 1,234, empty string, 0). Those fixtures should live in the test suite, not a wiki.

Scaling: Negligible infrastructure impact — it is client-side formatting and adds no request, query, or payload weight. The scaling concern is entirely organisational: every additional form that adopts the package by copy-paste multiplies the normalisation surface. Enforce the wrapper component via code review; that, not the package, is what keeps this linear.

Failure modes, ranked by expected damage:

  • Silent value corruption (formatted string persisted, or float rounding on large amounts) — highest severity, low frequency, and it will surface in finance reconciliation rather than in QA. Mitigate with a database-level type check and a test asserting round-trip fidelity.
  • Locale misparse on paste — high severity in multi-region deployments, moderate frequency. Mitigate by pinning locale per tenant and rejecting ambiguous input rather than guessing.
  • Validation drift across forms as different engineers clean the string differently — moderate severity, high frequency, and the most likely reason this assessment gets revisited.
  • JS dependency breakage on a Laravel or Livewire major upgrade — moderate severity, predictable timing, cheap to detect in staging.
  • Abandonment — low severity given the wrapper, provided the wrapper exists.

Ramp-up: A day for a Laravel-fluent engineer, most of it spent understanding the raw-value boundary and the Livewire lifecycle rather than the package API. The cost that gets underestimated is reviewer ramp-up: whoever approves PRs touching money fields must understand why the formatted value never reaches the validator. Put that in the wrapper's docblock, not in a document people stop reading.

Recommendation: Proceed to a time-boxed spike and a single-screen pilot. Approve the release for production money-input use only if the spike confirms a clean raw-value boundary and a configurable locale. Otherwise adopt Intl.NumberFormat behind the same wrapper — the wrapper is the durable asset here, and v1.0.0's two-line changelog does not yet justify treating this package as infrastructure.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
diephp/sequences
users-au/socialite-provider
twidpay/twid-logger
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator
itstructure/laravel-multilingual-tools
pdustdar/elasticsearch
markupai/php-sdk
rlacerda83/lumem-microservice-shipment
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle