From 6fb051c3548f12ebdc311bf1b595103b08fff33f Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Wed, 30 Jan 2019 01:14:19 -0600 Subject: [PATCH 01/18] added deepProp, deepTheme, and deepPalette --- src/deepPalette.js | 46 +++++++++++++++++++++++++++++++ src/deepProp.js | 26 ++++++++++++++++++ src/deepTheme.js | 14 ++++++++++ src/index.js | 3 ++ src/palette.js | 34 +++++++---------------- src/prop.js | 17 +++--------- src/utils.js | 59 ++++++++++++++++++++++++++++++++++++++++ test/deepPalette.test.js | 48 ++++++++++++++++++++++++++++++++ test/deepProps.test.js | 19 +++++++++++++ test/deepTheme.test.js | 32 ++++++++++++++++++++++ types/index.d.ts | 30 +++++++++++++------- 11 files changed, 281 insertions(+), 47 deletions(-) create mode 100644 src/deepPalette.js create mode 100644 src/deepProp.js create mode 100644 src/deepTheme.js create mode 100644 src/utils.js create mode 100644 test/deepPalette.test.js create mode 100644 test/deepProps.test.js create mode 100644 test/deepTheme.test.js diff --git a/src/deepPalette.js b/src/deepPalette.js new file mode 100644 index 0000000..554d0b6 --- /dev/null +++ b/src/deepPalette.js @@ -0,0 +1,46 @@ +// @flow +import { + getKey, + getTone, + getFinalDefaultValue, + toArray, + clamp, + resolveValue +} from "./utils"; +import type { PaletteProps } from "./utils"; + +/** + * Returns `props.theme.palette[key || props.palette][tone || props.tone || 0]` or `defaultValue`. + * Supports deep resolving. + * @see {@link #palette palette} + */ +const deepPalette = ( + keyOrTone?: string | number, + toneOrDefaultValue?: any, + defaultValue?: any +) => (props: PaletteProps) => { + const key = getKey(keyOrTone, props); + const tone = getTone(keyOrTone, toneOrDefaultValue, props); + const finalDefaultValue = getFinalDefaultValue( + toneOrDefaultValue, + tone, + defaultValue + ); + + if (!props.theme.palette || !props.theme.palette[key]) { + return finalDefaultValue; + } + + const tones = toArray(resolveValue(props.theme.palette[key], props)); + + if (tone < 0) { + return resolveValue( + tones[clamp(tones.length + tone, 0, tones.length - 1)], + props + ); + } + + return resolveValue(tones[clamp(tone, 0, tones.length - 1)], props); +}; + +export default deepPalette; diff --git a/src/deepProp.js b/src/deepProp.js new file mode 100644 index 0000000..e5640f6 --- /dev/null +++ b/src/deepProp.js @@ -0,0 +1,26 @@ +// @flow +import { get, resolveValue } from "./utils"; +import type { PropsFn } from "."; + +/** + * Returns the value of `props[path]` or `defaultValue`. Supports deep + * resolving. + * @see {@link #prop prop} + */ +const deepProp = (path: string, defaultValue?: any): PropsFn => ( + props = {} +) => { + if (typeof props[path] !== "undefined") { + return resolveValue(props[path], props); + } + + const object = get(props, path); + + if (typeof object !== "undefined") { + return resolveValue(object, props); + } + + return defaultValue; +}; + +export default deepProp; diff --git a/src/deepTheme.js b/src/deepTheme.js new file mode 100644 index 0000000..ed98638 --- /dev/null +++ b/src/deepTheme.js @@ -0,0 +1,14 @@ +// @flow +import deepProp from "./deepProp"; +import type { PropsWithTheme } from "."; + +/** + * Same as `deepProp`, except that it returns `props.theme[path]` instead of + * `props[path]`. + * @see {@link #theme theme} + */ +const deepTheme = (path: string, defaultValue?: any) => ( + props: PropsWithTheme +) => deepProp(`theme.${path}`, defaultValue)(props); + +export default deepTheme; diff --git a/src/index.js b/src/index.js index 26f5582..5cb4beb 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,6 @@ +export deepPalette from "./deepPalette"; +export deepProp from "./deepProp"; +export deepTheme from "./deepTheme"; export ifNotProp from "./ifNotProp"; export ifProp from "./ifProp"; export prop from "./prop"; diff --git a/src/palette.js b/src/palette.js index 2ccd727..b4e699f 100644 --- a/src/palette.js +++ b/src/palette.js @@ -1,18 +1,6 @@ // @flow -import type { PropsWithTheme } from "."; - -type Props = PropsWithTheme & { - palette?: string, - tone?: number -}; - -const toArray = (arg: any) => (Array.isArray(arg) ? arg : [arg]); - -const clamp = (number: number, min: number, max: number) => { - if (number < min) return min; - if (number > max) return max; - return number; -}; +import { getKey, getTone, getFinalDefaultValue, toArray, clamp } from "./utils"; +import type { PaletteProps } from "./utils"; /** * Returns `props.theme.palette[key || props.palette][tone || props.tone || 0]` or `defaultValue`. @@ -45,16 +33,14 @@ const palette = ( keyOrTone?: string | number, toneOrDefaultValue?: any, defaultValue?: any -) => (props: Props) => { - const key = typeof keyOrTone === "string" ? keyOrTone : props.palette; - const tone = - typeof keyOrTone === "number" - ? keyOrTone - : typeof toneOrDefaultValue === "number" - ? toneOrDefaultValue - : props.tone || 0; - const finalDefaultValue = - toneOrDefaultValue !== tone ? toneOrDefaultValue : defaultValue; +) => (props: PaletteProps) => { + const key = getKey(keyOrTone, props); + const tone = getTone(keyOrTone, toneOrDefaultValue, props); + const finalDefaultValue = getFinalDefaultValue( + toneOrDefaultValue, + tone, + defaultValue + ); if (!props.theme.palette || !props.theme.palette[key]) { return finalDefaultValue; diff --git a/src/prop.js b/src/prop.js index c275962..2e1e7dc 100644 --- a/src/prop.js +++ b/src/prop.js @@ -1,4 +1,5 @@ // @flow +import { get } from "./utils"; import type { PropsFn } from "."; /** @@ -16,20 +17,10 @@ const prop = (path: string, defaultValue?: any): PropsFn => (props = {}) => { return props[path]; } - if (path && path.indexOf(".") > 0) { - const paths = path.split("."); - const { length } = paths; - let object = props[paths[0]]; - let index = 1; + const object = get(props, path); - while (object != null && index < length) { - object = object[paths[index]]; - index += 1; - } - - if (typeof object !== "undefined") { - return object; - } + if (typeof object !== "undefined") { + return object; } return defaultValue; diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 0000000..80f5a2c --- /dev/null +++ b/src/utils.js @@ -0,0 +1,59 @@ +// @flow +import type { PropsWithTheme } from "."; + +export type PaletteProps = PropsWithTheme & { + palette?: string, + tone?: number +}; + +export function get(props: {}, path: string) { + if (path && path.indexOf(".") > 0) { + const paths = path.split("."); + const { length } = paths; + let object = props[paths[0]]; + let index = 1; + + while (object != null && index < length) { + object = object[paths[index]]; + index += 1; + } + + return object; + } + return undefined; +} + +export function resolveValue(value: any, props: Object) { + if (typeof value === "function") { + return resolveValue(value(props), props); + } + return value; +} + +export const toArray = (arg: any) => (Array.isArray(arg) ? arg : [arg]); + +export const clamp = (number: number, min: number, max: number) => { + if (number < min) return min; + if (number > max) return max; + return number; +}; + +export const getKey = (keyOrTone?: string | number, props: PaletteProps) => + typeof keyOrTone === "string" ? keyOrTone : props.palette; + +export const getTone = ( + keyOrTone?: string | number, + toneOrDefaultValue?: any, + props: PaletteProps +) => + typeof keyOrTone === "number" + ? keyOrTone + : typeof toneOrDefaultValue === "number" + ? toneOrDefaultValue + : props.tone || 0; + +export const getFinalDefaultValue = ( + toneOrDefaultValue?: any, + tone: number, + defaultValue?: any +) => (toneOrDefaultValue !== tone ? toneOrDefaultValue : defaultValue); diff --git a/test/deepPalette.test.js b/test/deepPalette.test.js new file mode 100644 index 0000000..9bcb556 --- /dev/null +++ b/test/deepPalette.test.js @@ -0,0 +1,48 @@ +import deepPalette from "../src/deepPalette"; + +const theme = { + palette: { + primary: [() => "primary0", () => "primary1", () => "primary2"], + secondary: () => "secondary0" + } +}; + +test("deep only tone", () => { + expect(deepPalette()({ theme })).toBeUndefined(); + expect(deepPalette(0)({ theme })).toBeUndefined(); + expect(deepPalette()({ theme, palette: "primary" })).toBe("primary0"); + expect(deepPalette()({ theme, palette: "primary", tone: 2 })).toBe( + "primary2" + ); + expect(deepPalette(0)({ theme, palette: "primary" })).toBe("primary0"); + expect(deepPalette(1)({ theme, palette: "primary" })).toBe("primary1"); + expect(deepPalette(-1)({ theme, palette: "primary" })).toBe("primary2"); + expect(deepPalette(-5)({ theme, palette: "primary" })).toBe("primary0"); + expect(deepPalette(5)({ theme, palette: "primary" })).toBe("primary2"); + expect(deepPalette(0)({ theme, palette: "secondary" })).toBe("secondary0"); + expect(deepPalette(1)({ theme, palette: "secondary" })).toBe("secondary0"); + expect(deepPalette(0)({ theme, palette: "other" })).toBeUndefined(); + expect(deepPalette(1, "foo")({ theme })).toBe("foo"); + expect(deepPalette(1, "foo")({ theme, palette: "other" })).toBe("foo"); +}); + +test("deep palette and tone", () => { + expect(deepPalette("primary")({ theme })).toBe("primary0"); + expect(deepPalette("primary")({ theme, tone: 2 })).toBe("primary2"); + expect(deepPalette("primary", 0)({ theme })).toBe("primary0"); + expect(deepPalette("primary", 5)({ theme })).toBe("primary2"); + expect(deepPalette("primary", -1)({ theme })).toBe("primary2"); + expect(deepPalette("primary", -5)({ theme })).toBe("primary0"); + expect(deepPalette("secondary", 0)({ theme })).toBe("secondary0"); + expect(deepPalette("secondary", 1)({ theme })).toBe("secondary0"); + expect(deepPalette("secondary", 1, "foo")({ theme })).toBe("secondary0"); + expect(deepPalette("other", 1)({ theme })).toBeUndefined(); + expect(deepPalette("other", "foo")({ theme })).toBe("foo"); + expect(deepPalette("other", 1, "foo")({ theme })).toBe("foo"); + expect( + deepPalette("other", 1)({ theme, palette: "primary" }) + ).toBeUndefined(); + expect(deepPalette("other", 1, "foo")({ theme, palette: "primary" })).toBe( + "foo" + ); +}); diff --git a/test/deepProps.test.js b/test/deepProps.test.js new file mode 100644 index 0000000..58edc37 --- /dev/null +++ b/test/deepProps.test.js @@ -0,0 +1,19 @@ +import deepProp from "../src/deepProp"; + +test("string argument", () => { + expect(deepProp("color")({ color: () => "red" })).toBe("red"); + expect(deepProp("color")({ color: props => props.bg, bg: "red" })).toBe( + "red" + ); +}); + +test("deep string argument", () => { + expect(deepProp("color.primary")({ color: { primary: () => "red" } })).toBe( + "red" + ); + expect( + deepProp("color.primary")({ + color: { primary: deepProp("color.secondary"), secondary: "blue" } + }) + ).toBe("blue"); +}); diff --git a/test/deepTheme.test.js b/test/deepTheme.test.js new file mode 100644 index 0000000..0387bd5 --- /dev/null +++ b/test/deepTheme.test.js @@ -0,0 +1,32 @@ +import deepTheme from "../src/deepTheme"; + +test("string argument", () => { + expect(deepTheme("color")({ theme: { color: () => "red" } })).toBe("red"); + expect( + deepTheme("color")({ + theme: { color: props => props.theme.bg, bg: "blue" } + }) + ).toBe("blue"); + expect( + deepTheme("color")({ theme: { color: deepTheme("bg"), bg: "blue" } }) + ).toBe("blue"); + expect( + deepTheme("linkColor")({ + theme: { + blue: "#007bff", + primary: deepTheme("blue"), + linkColor: deepTheme("primary") + } + }) + ).toBe("#007bff"); +}); + +test("deep string argument", () => { + expect( + deepTheme("color.primary")({ + theme: { + color: { primary: deepTheme("color.secondary"), secondary: "blue" } + } + }) + ).toBe("blue"); +}); diff --git a/types/index.d.ts b/types/index.d.ts index fa1e078..9acb81e 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,16 +1,25 @@ type Needle = string | ((props?: Props) => any); -export function prop( - path: string, - defaultValue?: T -): (props?: Props) => Props[keyof Props] | T; +interface PropFunction { + (path: string, defaultValue?: T): ( + props?: Props + ) => Props[keyof Props] | T; +} + +export const prop: PropFunction; +export const deepProp: PropFunction; + +interface ThemeFunction { + (path: string, defaultValue?: T): < + Props, + Theme extends { [key: string]: any } + >( + props: Props & { theme: Theme } + ) => Theme[keyof Theme] | T; +} -export function theme( - path: string, - defaultValue?: T -): ( - props: Props & { theme: Theme } -) => Theme[keyof Theme] | T; +export const theme: ThemeFunction; +export const deepTheme: ThemeFunction; type ThemeWithPalette = { palette?: { [key: string]: any }; @@ -49,6 +58,7 @@ interface Palette { } export const palette: Palette; +export const deepPalette: Palette; export function ifProp( test: Needle | Needle[] | { [key: string]: any }, From 5e7d3d3854382130a9ecf8d546101a479cedc3f9 Mon Sep 17 00:00:00 2001 From: Haz Date: Wed, 30 Jan 2019 13:56:21 -0200 Subject: [PATCH 02/18] Rename deepProps.test.js to deepProp.test.js --- test/{deepProps.test.js => deepProp.test.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{deepProps.test.js => deepProp.test.js} (100%) diff --git a/test/deepProps.test.js b/test/deepProp.test.js similarity index 100% rename from test/deepProps.test.js rename to test/deepProp.test.js From ee10c893f68375e2b5ee0257c356bb1c6fe9194a Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:26:29 -0500 Subject: [PATCH 03/18] Update src/deepPalette.js Co-Authored-By: Haz --- src/deepPalette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deepPalette.js b/src/deepPalette.js index 554d0b6..88b9848 100644 --- a/src/deepPalette.js +++ b/src/deepPalette.js @@ -1,6 +1,6 @@ // @flow import { - getKey, + resolvePaletteKey, getTone, getFinalDefaultValue, toArray, From 99e7f3e9f483ede1189b81dfe7ebba7e68516651 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:26:36 -0500 Subject: [PATCH 04/18] Update src/deepPalette.js Co-Authored-By: Haz --- src/deepPalette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deepPalette.js b/src/deepPalette.js index 88b9848..f061afe 100644 --- a/src/deepPalette.js +++ b/src/deepPalette.js @@ -1,7 +1,7 @@ // @flow import { resolvePaletteKey, - getTone, + resolvePaletteTone, getFinalDefaultValue, toArray, clamp, From 106b19b4df0a1d71d35b759075ae294bdee5f8f8 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:26:42 -0500 Subject: [PATCH 05/18] Update src/deepPalette.js Co-Authored-By: Haz --- src/deepPalette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deepPalette.js b/src/deepPalette.js index f061afe..c5ddd27 100644 --- a/src/deepPalette.js +++ b/src/deepPalette.js @@ -19,7 +19,7 @@ const deepPalette = ( toneOrDefaultValue?: any, defaultValue?: any ) => (props: PaletteProps) => { - const key = getKey(keyOrTone, props); + const key = resolvePaletteKey(keyOrTone, props); const tone = getTone(keyOrTone, toneOrDefaultValue, props); const finalDefaultValue = getFinalDefaultValue( toneOrDefaultValue, From 24921c9cc91d34ddad381f33ce5c6edd6c84fbbc Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:26:51 -0500 Subject: [PATCH 06/18] Update src/deepPalette.js Co-Authored-By: Haz --- src/deepPalette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deepPalette.js b/src/deepPalette.js index c5ddd27..d3180c1 100644 --- a/src/deepPalette.js +++ b/src/deepPalette.js @@ -21,7 +21,7 @@ const deepPalette = ( ) => (props: PaletteProps) => { const key = resolvePaletteKey(keyOrTone, props); const tone = getTone(keyOrTone, toneOrDefaultValue, props); - const finalDefaultValue = getFinalDefaultValue( + const finalDefaultValue = resolvePaletteDefaultValue( toneOrDefaultValue, tone, defaultValue From ab3715c6fa551c9cfcda0355acd7051bbd4f82b2 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:26:57 -0500 Subject: [PATCH 07/18] Update src/deepPalette.js Co-Authored-By: Haz --- src/deepPalette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deepPalette.js b/src/deepPalette.js index d3180c1..39e2711 100644 --- a/src/deepPalette.js +++ b/src/deepPalette.js @@ -20,7 +20,7 @@ const deepPalette = ( defaultValue?: any ) => (props: PaletteProps) => { const key = resolvePaletteKey(keyOrTone, props); - const tone = getTone(keyOrTone, toneOrDefaultValue, props); + const tone = resolvePaletteTone(keyOrTone, toneOrDefaultValue, props); const finalDefaultValue = resolvePaletteDefaultValue( toneOrDefaultValue, tone, From 0ad0982f580a014d880e9ebb84778ea7a2f5ef46 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:27:03 -0500 Subject: [PATCH 08/18] Update src/deepPalette.js Co-Authored-By: Haz --- src/deepPalette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deepPalette.js b/src/deepPalette.js index 39e2711..cf8b80b 100644 --- a/src/deepPalette.js +++ b/src/deepPalette.js @@ -2,7 +2,7 @@ import { resolvePaletteKey, resolvePaletteTone, - getFinalDefaultValue, + resolvePaletteDefaultValue, toArray, clamp, resolveValue From a033f3c9697cd4f1959bd698b84be7081ba3d0e6 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:27:13 -0500 Subject: [PATCH 09/18] Update src/palette.js Co-Authored-By: Haz --- src/palette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/palette.js b/src/palette.js index b4e699f..46a47ee 100644 --- a/src/palette.js +++ b/src/palette.js @@ -1,6 +1,6 @@ // @flow import { getKey, getTone, getFinalDefaultValue, toArray, clamp } from "./utils"; -import type { PaletteProps } from "./utils"; +import type { PaletteProps } from "."; /** * Returns `props.theme.palette[key || props.palette][tone || props.tone || 0]` or `defaultValue`. From 26c4b1a5b1926c94e89457f02941996b1d34f998 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:27:19 -0500 Subject: [PATCH 10/18] Update src/utils.js Co-Authored-By: Haz --- src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.js b/src/utils.js index 80f5a2c..b734cb5 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,5 +1,5 @@ // @flow -import type { PropsWithTheme } from "."; +import type { PaletteProps } from "."; export type PaletteProps = PropsWithTheme & { palette?: string, From 591da77a08305b2c9f529489f4e78bb9d869adb5 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:27:29 -0500 Subject: [PATCH 11/18] Update src/palette.js Co-Authored-By: Haz --- src/palette.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/palette.js b/src/palette.js index 46a47ee..784e80d 100644 --- a/src/palette.js +++ b/src/palette.js @@ -1,5 +1,11 @@ // @flow -import { getKey, getTone, getFinalDefaultValue, toArray, clamp } from "./utils"; +import { + resolvePaletteKey, + resolvePaletteTone, + resolvePaletteDefaultValue, + toArray, + clamp +} from "./utils"; import type { PaletteProps } from "."; /** From 6f1ba2eaab74abd426fef511f8a648113f1f7cec Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:27:35 -0500 Subject: [PATCH 12/18] Update src/utils.js Co-Authored-By: Haz --- src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.js b/src/utils.js index b734cb5..1a1f965 100644 --- a/src/utils.js +++ b/src/utils.js @@ -38,7 +38,7 @@ export const clamp = (number: number, min: number, max: number) => { return number; }; -export const getKey = (keyOrTone?: string | number, props: PaletteProps) => +export const resolvePaletteKey = (keyOrTone?: string | number, props: PaletteProps) => typeof keyOrTone === "string" ? keyOrTone : props.palette; export const getTone = ( From 7a2f588cbedbf90c249074bfeb598799cb2b70df Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:27:41 -0500 Subject: [PATCH 13/18] Update src/utils.js Co-Authored-By: Haz --- src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.js b/src/utils.js index 1a1f965..d7537af 100644 --- a/src/utils.js +++ b/src/utils.js @@ -52,7 +52,7 @@ export const getTone = ( ? toneOrDefaultValue : props.tone || 0; -export const getFinalDefaultValue = ( +export const resolvePaletteDefaultValue = ( toneOrDefaultValue?: any, tone: number, defaultValue?: any From 8dda81170937aedebf3077b826efa3a5a9854225 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:27:47 -0500 Subject: [PATCH 14/18] Update src/utils.js Co-Authored-By: Haz --- src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.js b/src/utils.js index d7537af..ff1f6d8 100644 --- a/src/utils.js +++ b/src/utils.js @@ -41,7 +41,7 @@ export const clamp = (number: number, min: number, max: number) => { export const resolvePaletteKey = (keyOrTone?: string | number, props: PaletteProps) => typeof keyOrTone === "string" ? keyOrTone : props.palette; -export const getTone = ( +export const resolvePaletteTone = ( keyOrTone?: string | number, toneOrDefaultValue?: any, props: PaletteProps From 3cc2e9f9cce6b78933caae0528e1746f59f52386 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:28:05 -0500 Subject: [PATCH 15/18] Update src/palette.js Co-Authored-By: Haz --- src/palette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/palette.js b/src/palette.js index 784e80d..16aa897 100644 --- a/src/palette.js +++ b/src/palette.js @@ -40,7 +40,7 @@ const palette = ( toneOrDefaultValue?: any, defaultValue?: any ) => (props: PaletteProps) => { - const key = getKey(keyOrTone, props); + const key = resolvePaletteKey(keyOrTone, props); const tone = getTone(keyOrTone, toneOrDefaultValue, props); const finalDefaultValue = getFinalDefaultValue( toneOrDefaultValue, From 2fd5211416468411c729a224e775f9fea7e20cc7 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:28:14 -0500 Subject: [PATCH 16/18] Update src/palette.js Co-Authored-By: Haz --- src/palette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/palette.js b/src/palette.js index 16aa897..1ee0b17 100644 --- a/src/palette.js +++ b/src/palette.js @@ -41,7 +41,7 @@ const palette = ( defaultValue?: any ) => (props: PaletteProps) => { const key = resolvePaletteKey(keyOrTone, props); - const tone = getTone(keyOrTone, toneOrDefaultValue, props); + const tone = resolvePaletteTone(keyOrTone, toneOrDefaultValue, props); const finalDefaultValue = getFinalDefaultValue( toneOrDefaultValue, tone, From f4313ac72bd92d5c9016373272493d1c4f105fdf Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 11:28:23 -0500 Subject: [PATCH 17/18] Update src/palette.js Co-Authored-By: Haz --- src/palette.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/palette.js b/src/palette.js index 1ee0b17..bb70e76 100644 --- a/src/palette.js +++ b/src/palette.js @@ -42,7 +42,7 @@ const palette = ( ) => (props: PaletteProps) => { const key = resolvePaletteKey(keyOrTone, props); const tone = resolvePaletteTone(keyOrTone, toneOrDefaultValue, props); - const finalDefaultValue = getFinalDefaultValue( + const finalDefaultValue = resolvePaletteDefaultValue( toneOrDefaultValue, tone, defaultValue From d9dd344672a2021f6d852fa1673453d49eb2a3c4 Mon Sep 17 00:00:00 2001 From: Jack Moore Date: Sat, 25 Apr 2020 12:28:44 -0500 Subject: [PATCH 18/18] suggestions & test coverage --- src/deepPalette.js | 2 +- src/index.js.flow | 5 +++++ src/utils.js | 11 ++++------- test/deepProp.test.js | 11 +++++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/deepPalette.js b/src/deepPalette.js index cf8b80b..5694890 100644 --- a/src/deepPalette.js +++ b/src/deepPalette.js @@ -7,7 +7,7 @@ import { clamp, resolveValue } from "./utils"; -import type { PaletteProps } from "./utils"; +import type { PaletteProps } from "."; /** * Returns `props.theme.palette[key || props.palette][tone || props.tone || 0]` or `defaultValue`. diff --git a/src/index.js.flow b/src/index.js.flow index 01dd043..850ccd3 100644 --- a/src/index.js.flow +++ b/src/index.js.flow @@ -13,3 +13,8 @@ export type Needle = string | Function; export type PropsFn = (props?: Object) => any; export type PropsWithTheme = { theme: { [x: string]: any } }; + +export type PaletteProps = PropsWithTheme & { + palette?: string, + tone?: number +}; diff --git a/src/utils.js b/src/utils.js index ff1f6d8..993de61 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,11 +1,6 @@ // @flow import type { PaletteProps } from "."; -export type PaletteProps = PropsWithTheme & { - palette?: string, - tone?: number -}; - export function get(props: {}, path: string) { if (path && path.indexOf(".") > 0) { const paths = path.split("."); @@ -38,8 +33,10 @@ export const clamp = (number: number, min: number, max: number) => { return number; }; -export const resolvePaletteKey = (keyOrTone?: string | number, props: PaletteProps) => - typeof keyOrTone === "string" ? keyOrTone : props.palette; +export const resolvePaletteKey = ( + keyOrTone?: string | number, + props: PaletteProps +) => (typeof keyOrTone === "string" ? keyOrTone : props.palette); export const resolvePaletteTone = ( keyOrTone?: string | number, diff --git a/test/deepProp.test.js b/test/deepProp.test.js index 58edc37..c2fcc02 100644 --- a/test/deepProp.test.js +++ b/test/deepProp.test.js @@ -1,6 +1,8 @@ import deepProp from "../src/deepProp"; test("string argument", () => { + expect(deepProp("color")()).toBeUndefined(); + expect(deepProp("color")({})).toBeUndefined(); expect(deepProp("color")({ color: () => "red" })).toBe("red"); expect(deepProp("color")({ color: props => props.bg, bg: "red" })).toBe( "red" @@ -8,6 +10,8 @@ test("string argument", () => { }); test("deep string argument", () => { + expect(deepProp("color.primary")()).toBeUndefined(); + expect(deepProp("color.primary")({})).toBeUndefined(); expect(deepProp("color.primary")({ color: { primary: () => "red" } })).toBe( "red" ); @@ -17,3 +21,10 @@ test("deep string argument", () => { }) ).toBe("blue"); }); + +test("defaultValue", () => { + expect(deepProp("color", "red")()).toBe("red"); + expect(deepProp("color", "red")({})).toBe("red"); + expect(deepProp("color", "red")({ color: () => "blue" })).toBe("blue"); + expect(deepProp("color.primary", "red")({})).toBe("red"); +});