2.0.4
August 18th, 2026
Fixed
RegionFieldtypeControllerand thecountries_and_regions:regionstag split a comma-separated country list with no cap on how many entries it could contain and no format check before doing work. A single request with a very long comma list could force the server to loop once per entry, each iteration re-scanning the subdivision dataset — the2.0.1rate limiting only caps requests per minute, not the cost of any one request, so it didn't mitigate this. Added a sharedParsesCountryCodestrait (src/Traits/ParsesCountryCodes.php) that filters to well-formed ISO 3166-1 alpha-2 codes and caps the list to 10 entries before any lookup happens; both call sites now use it.- The public
countries_and_regions/{country}/regionsweb route and the CPcountries/{country}/regionsaction routes shared a single rate-limit bucket keyed only by IP, so heavy front-end traffic could exhaust the budget and 429 CP editors behind the same IP/NAT. Split into two named limiters,kadegray_scarf.options.cpandkadegray_scarf.options.public, same 60/min-per-IP policy, registered independently.
2.0.3
August 18th, 2026
Fixed
statamic/cmswas only ever declared underrequire-dev, neverrequire, going all the way back to when it was constrained to^3.3— meaning Composer never actually enforced or advertised which Statamic version this addon supports for anyone installing it into their own site. Moved"statamic/cms": "^6.0"intorequire, so Composer now correctly refuses to install this addon into a pre-6 Statamic site instead of allowing a broken install.
2.0.2
August 18th, 2026
Added
- Test coverage for the
countries_and_regionsAntlers tag (tests/Tags/CountriesAndRegionsTest.php), coveringcountries()/regions()directly plus oneAntlers::parse()test proving the tag is actually registered and renders correctly through real Antlers parsing — previously untested. - Test coverage in
RegionFieldtypeControllerTestfor the publiccountries_and_regions/{country}/regionsweb route (routes/web.php), verifying both its response shape and that the2.0.1rate limiting is actually wired up on this route specifically, not just the CP action-route equivalent.
2.0.1
August 18th, 2026
Fixed
CountryFieldtypeController/RegionFieldtypeControllerno longer mutate the process's global locale viaputenv()/setlocale(). Both endpoints are public and unauthenticated, and since PHP-FPM/Octane workers are reused across requests, a single request previously leftLC_ALL/LANGUAGEpermanently changed for every unrelated request handled by that worker afterward. Both controllers now resolve locale-aware names throughSymfonyTranslationDriverinstead, matching the pattern already used by thecountries_and_regionstag and the two fieldtype filters.
Added
- Rate limiting (60 requests/minute per IP) on the
countries,{country}/regions, andcountries_and_regions/{country}/regionsendpoints, via a newkadegray_scarf.optionsnamed rate limiter registered inServiceProvider.
2.0.0
August 18th, 2026
Changed
- Ported the control panel frontend from Vue 2 / Laravel Mix (Statamic 3.x) to Vue 3 / Vite, using the
@statamic/cmspackage andComboboxUI component, for compatibility with Statamic 6's rewritten control panel. ServiceProvidernow registers CP assets via$viteinstead of$scripts.
Added
- PHP unit test suite (
tests/) covering each fieldtype'saugment()/process()/defaultValue()behavior, config-driven branches (render_invalid_value,region_is_required), and thecountries/regionsHTTP endpoints, using Statamic'sAddonTestCase. - Playwright browser test suite (
tests/browser/) driving a real control panel to verify each fieldtype renders, is interactive, and correctly implementscountries_field/countries_manuallinking,clearable,max_items, andplaceholder. TESTING.mddocumenting how to run both suites.
1.2.6
November 10th, 2024
Fixed
region_in_country'saugment()now actually honorsregion_is_required: when disabled, a country-only value augments to just the country name instead of being treated as invalid.
1.2.5
November 9th, 2024
Added
region_is_requiredconfig option on theregion_in_countryfieldtype. When disabled, selecting only a country (with no region yet chosen) is accepted as a valid value instead of requiring a full region code.
Fixed
- Renamed an internal
regionsref toregionin theregion_in_countryVue component (it always held a single region, not a collection) and reworked its value-sync watchers, fixing cases where the country and region sub-fields could fall out of sync with the field's actual value.
1.2.4
April 12th, 2024
Fixed
regionfieldtype: same ISO 3166-2 one-character subdivision code fix as 1.2.3, applied here too.