Commit 93e5cbfa6b for woocommerce

commit 93e5cbfa6b8cc3d75fa1146c16bdd0ad70da42bc
Author: Neil Carlo Sucuangco <succute@yahoo.com>
Date:   Tue Dec 23 03:54:10 2025 +0800

    Allow blank Flat rate cost in admin validation (#61313)

    * Allow blank Flat rate cost in admin validation

    * Add changefile(s) from automation for the following project(s): woocommerce

    ---------

    Co-authored-by: Allie Mims <60988591+allie500@users.noreply.github.com>
    Co-authored-by: github-actions <github-actions@github.com>

diff --git a/plugins/woocommerce/changelog/61313-fix-flat-rate-blank-cost-validation b/plugins/woocommerce/changelog/61313-fix-flat-rate-blank-cost-validation
new file mode 100644
index 0000000000..45f2e046be
--- /dev/null
+++ b/plugins/woocommerce/changelog/61313-fix-flat-rate-blank-cost-validation
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Flat rate: allow empty main cost so class-only rates work again
\ No newline at end of file
diff --git a/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js b/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js
index a429c19dd1..2a0fd21ffc 100644
--- a/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js
+++ b/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js
@@ -12,10 +12,22 @@
  * @returns {boolean} Whether the value is a valid formatted number or formula
  */
 function isValidFormattedNumber( value, config ) {
-	// Check if value is a string and config is provided
-	if ( ! value || typeof value !== 'string' || ! config || typeof config !== 'object' ) {
-		return false;
-	}
+    // Ensure we are dealing with a string; non-strings are invalid.
+    if ( typeof value !== 'string' ) {
+        return false;
+    }
+
+    // Treat empty input as valid so optional fields (e.g. Flat rate main cost)
+    // can be saved as blank to rely on class-only costs.
+    // This preserves 10.0.x behavior where blank values were allowed.
+    if ( value.trim() === '' ) {
+        return true;
+    }
+
+    // For non-empty values, require a config object.
+    if ( ! config || typeof config !== 'object' ) {
+        return false;
+    }

 	var decimalSeparator = config.decimalSeparator || '.';
 	var thousandSeparator = config.thousandSeparator || ',';
diff --git a/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js b/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js
index b2269c1f0a..d26c878802 100644
--- a/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js
+++ b/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js
@@ -18,8 +18,8 @@ describe( 'Number Validation Utils - isValidFormattedNumber', () => {
 			thousandSeparator: ','
 		};

-		test( 'should return false for empty or invalid input', () => {
-			expect( isValidFormattedNumber( '', config ) ).toBe( false );
+		test( 'should treat empty string as valid and reject non-string/invalid inputs', () => {
+			expect( isValidFormattedNumber( '', config ) ).toBe( true );
 			expect( isValidFormattedNumber( null, config ) ).toBe( false );
 			expect( isValidFormattedNumber( undefined, config ) ).toBe( false );
 			expect( isValidFormattedNumber( 123, config ) ).toBe( false ); // not a string