From f0272cf5eb3a969f879ab1c538c633bd729aa976 Mon Sep 17 00:00:00 2001
From: Kristiyan Kostadinov <crisbeto@users.noreply.github.com>
Date: Thu, 13 Jan 2022 22:13:19 +0100
Subject: [PATCH] fix(material/core): throw error if hue does not exist
 (#23612)

Currently if an invalid hue is passed into `define-palette`, we silently emit nothing which can lead to confusion. These changes add an error to make it easier to debug.

Related to #23605.

(cherry picked from commit 65bc9feedcb223a62d92b2b799392cbb9238a6b7)
---
 src/material/core/theming/_theming.scss | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/material/core/theming/_theming.scss b/src/material/core/theming/_theming.scss
index 0773c7f966fc..eca5a6819091 100644
--- a/src/material/core/theming/_theming.scss
+++ b/src/material/core/theming/_theming.scss
@@ -20,6 +20,17 @@ $_emitted-color: () !default;
 $_emitted-typography: () !default;
 $_emitted-density: () !default;
 
+/// Extracts a color from a palette or throws an error if it doesn't exist.
+/// @param {Map} $palette The palette from which to extract a color.
+/// @param {String | Number} $hue The hue for which to get the color.
+@function _get-color-from-palette($palette, $hue) {
+  @if map.has-key($palette, $hue) {
+    @return map.get($palette, $hue);
+  }
+
+  @error 'Hue "' + $hue + '" does not exist in palette. Available hues are: ' + map.keys($palette);
+}
+
 /// For a given hue in a palette, return the contrast color from the map of contrast palettes.
 /// @param {Map} $palette The palette from which to extract a color.
 /// @param {String | Number} $hue The hue for which to get a contrast color.
@@ -40,10 +51,10 @@ $_emitted-density: () !default;
 @function define-palette($base-palette, $default: 500, $lighter: 100, $darker: 700,
   $text: $default) {
   $result: map.merge($base-palette, (
-    default: map.get($base-palette, $default),
-    lighter: map.get($base-palette, $lighter),
-    darker: map.get($base-palette, $darker),
-    text: map.get($base-palette, $text),
+    default: _get-color-from-palette($base-palette, $default),
+    lighter: _get-color-from-palette($base-palette, $lighter),
+    darker: _get-color-from-palette($base-palette, $darker),
+    text: _get-color-from-palette($base-palette, $text),
 
     default-contrast: get-contrast-color-from-palette($base-palette, $default),
     lighter-contrast: get-contrast-color-from-palette($base-palette, $lighter),