From c10059c33012b706b2527cd365486f5d0e6102dd Mon Sep 17 00:00:00 2001 From: scottmas Date: Fri, 21 Dec 2018 14:57:26 -0700 Subject: [PATCH 1/2] Make "default" optional if no activeNames For those of us coming from a React Native background, having to specify a "default" property on every single style declaration is a little like nails on chalkboard. If the user is not specifying any activeNames, it's also completely redundant. Without it, the syntax is almost identical to React Native: ```javascript import { StyleSheet } from 'react-native' // Basically the sames as `import reactcss from "reactcss"` const styles = StyleSheet.create({ // Basically the same as `reactcss({...})` card: { backgroundColor: 'red' } }) ``` This is admittedly a syntactic nicety, but it completely backwards compatible and would just be an optional function signature. --- src/mergeClasses.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mergeClasses.js b/src/mergeClasses.js index 4e275ac..cba8979 100644 --- a/src/mergeClasses.js +++ b/src/mergeClasses.js @@ -1,7 +1,13 @@ import _ from 'lodash' export const mergeClasses = (classes, activeNames = []) => { + + if(!classes.default && activeNames.length === 0){ + classes = { default: classes } + } + const styles = (classes.default && _.cloneDeep(classes.default)) || {} + activeNames.map((name) => { const toMerge = classes[name] if (toMerge) { From 2ea7b07144f258ea44ade72e4ace0f2c8306ae38 Mon Sep 17 00:00:00 2001 From: Scott Ashton Date: Fri, 21 Dec 2018 15:17:17 -0700 Subject: [PATCH 2/2] Add some tests --- test/mergeClasses.test.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/test/mergeClasses.test.js b/test/mergeClasses.test.js index 6654f95..1cb11cf 100644 --- a/test/mergeClasses.test.js +++ b/test/mergeClasses.test.js @@ -129,3 +129,41 @@ describe('Combine', () => { expect(mergeClasses(classes, [])).toEqual(after2) }) }) + +describe('Combine with optional default ', () => { + it('should assume all properties are under the default property when "default" is omitted with no activeNames', () => { + const classes = { + header: { + margin: '0px', + }, + logo: { + color: 'blue', + }, + } + const after = { + header: { + margin: '0px', + }, + logo: { + color: 'blue', + }, + } + expect(mergeClasses(classes)).toEqual(after) + }) + + it('should not assume properties are nested under default when "default" is omitted but activeNames are present', () => { + const classes = { + header: { + margin: '0px', + }, + logo: { + color: 'blue', + }, + } + const after = {} + + const names = ['active'] + + expect(mergeClasses(classes, names)).toEqual(after) + }) +})