From 2836216ba59ede71f62a607293e3c3320e0c3728 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=AA=E3=81=A4=E3=81=8D?= <i@ntk.me>
Date: Fri, 21 Jul 2023 15:08:08 -0700
Subject: [PATCH] Fix deprotofy SassCalculation.clamp (#2043)

---
 CHANGELOG.md                     |  7 +++++++
 lib/src/embedded/protofier.dart  | 12 ++++++++----
 pkg/sass_api/pubspec.yaml        |  2 +-
 pubspec.yaml                     |  2 +-
 test/embedded/function_test.dart | 12 +++---------
 5 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8ddedb98f..6e74c00ab 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 1.64.1
+
+### Embedded Sass
+
+* Fix a bug where a valid `SassCalculation.clamp()` with less than 3 arguments
+  would throw an error.
+
 ## 1.64.0
 
 * Comments that appear before or between `@use` and `@forward` rules are now
diff --git a/lib/src/embedded/protofier.dart b/lib/src/embedded/protofier.dart
index 9096c8b9b..3f7c499a1 100644
--- a/lib/src/embedded/protofier.dart
+++ b/lib/src/embedded/protofier.dart
@@ -350,16 +350,20 @@ class Protofier {
       return SassCalculation.calc(
           _deprotofyCalculationValue(calculation.arguments[0]));
     } else if (calculation.name == "clamp") {
-      if (calculation.arguments.length != 3) {
+      if (calculation.arguments.isEmpty || calculation.arguments.length > 3) {
         throw paramsError(
-            "Value.Calculation.arguments must have exactly 3 arguments for "
+            "Value.Calculation.arguments must have 1 to 3 arguments for "
             "clamp().");
       }
 
       return SassCalculation.clamp(
           _deprotofyCalculationValue(calculation.arguments[0]),
-          _deprotofyCalculationValue(calculation.arguments[1]),
-          _deprotofyCalculationValue(calculation.arguments[2]));
+          calculation.arguments.length > 1
+              ? _deprotofyCalculationValue(calculation.arguments[1])
+              : null,
+          calculation.arguments.length > 2
+              ? _deprotofyCalculationValue(calculation.arguments[2])
+              : null);
     } else if (calculation.name == "min") {
       if (calculation.arguments.isEmpty) {
         throw paramsError(
diff --git a/pkg/sass_api/pubspec.yaml b/pkg/sass_api/pubspec.yaml
index fdbdd5c25..fad538aad 100644
--- a/pkg/sass_api/pubspec.yaml
+++ b/pkg/sass_api/pubspec.yaml
@@ -10,7 +10,7 @@ environment:
   sdk: ">=3.0.0 <4.0.0"
 
 dependencies:
-  sass: 1.64.0
+  sass: 1.64.1
 
 dev_dependencies:
   dartdoc: ^5.0.0
diff --git a/pubspec.yaml b/pubspec.yaml
index d386e6beb..9cb551b01 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: sass
-version: 1.64.0
+version: 1.64.1
 description: A Sass implementation in Dart.
 homepage: https://github.com/sass/dart-sass
 
diff --git a/test/embedded/function_test.dart b/test/embedded/function_test.dart
index a8cb01512..af4bd62db 100644
--- a/test/embedded/function_test.dart
+++ b/test/embedded/function_test.dart
@@ -1699,7 +1699,7 @@ void main() {
                       ..number = (Value_Number()..value = 3.0))
                     ..arguments.add(Value_Calculation_CalculationValue()
                       ..number = (Value_Number()..value = 4.0))),
-                equals("Value.Calculation.arguments must have exactly 3 "
+                equals("Value.Calculation.arguments must have 1 to 3 "
                     "arguments for clamp()."));
           });
         });
@@ -1714,14 +1714,8 @@ void main() {
 
           test("for clamp", () async {
             await _expectDeprotofyError(
-                Value()
-                  ..calculation = (Value_Calculation()
-                    ..name = "clamp"
-                    ..arguments.add(Value_Calculation_CalculationValue()
-                      ..number = (Value_Number()..value = 1.0))
-                    ..arguments.add(Value_Calculation_CalculationValue()
-                      ..number = (Value_Number()..value = 2.0))),
-                equals("Value.Calculation.arguments must have exactly 3 "
+                Value()..calculation = (Value_Calculation()..name = "clamp"),
+                equals("Value.Calculation.arguments must have 1 to 3 "
                     "arguments for clamp()."));
           });