Skip to content

Commit 60c1f69

Browse files
committed
Stricted config validation.
1 parent afeb266 commit 60c1f69

File tree

10 files changed

+206
-177
lines changed

10 files changed

+206
-177
lines changed

dist/index copy.js

Lines changed: 0 additions & 127 deletions
This file was deleted.

dist/index.js

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ var _linkClass = require('./linkClass');
1818

1919
var _linkClass2 = _interopRequireDefault(_linkClass);
2020

21+
var _makeConfig = require('./makeConfig');
22+
23+
var _makeConfig2 = _interopRequireDefault(_makeConfig);
24+
2125
var functionConstructor = undefined,
2226
decoratorConstructor = undefined;
2327

@@ -44,23 +48,7 @@ functionConstructor = function (Component, styles) {
4448
_createClass(_class, [{
4549
key: 'render',
4650
value: function render() {
47-
if (options.allowMultiple !== false) {
48-
options.allowMultiple = true;
49-
}
50-
51-
if (options.includeOriginal !== false) {
52-
options.includeOriginal = true;
53-
}
54-
55-
if (options.errorNotFound !== true) {
56-
options.errorNotFound = false;
57-
}
58-
59-
if (options.useModuleNames !== true) {
60-
options.useModuleNames = false;
61-
}
62-
63-
return (0, _linkClass2['default'])(_get(Object.getPrototypeOf(_class.prototype), 'render', this).call(this), styles, options);
51+
return (0, _linkClass2['default'])(_get(Object.getPrototypeOf(_class.prototype), 'render', this).call(this), styles, (0, _makeConfig2['default'])(options));
6452
}
6553
}]);
6654

dist/linkClass.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,6 @@ var _react2 = _interopRequireDefault(_react);
1212

1313
var linkClass = undefined;
1414

15-
/**
16-
* @typedef CSSModules~Options
17-
* @property {Boolean} allowMultiple Determines whether `className` can have multiple class names. Throws an error when the constrained is not met. Default: true.
18-
* @property {Boolean} keepOriginal Determines whether the original `className` value is kept in addition to the appended CSS modules styles CSS class name. Default: true.
19-
* @property {Boolean} errorNotFound Determines whether an error is raised if `className` defines a CSS class(es) that is not present in the CSS modules styles. Default: false.
20-
* @property {Boolean} useModuleName When enabled then CSS Modules are loaded using `moduleName` property and `className` is used only for global CSS. Default: false.
21-
*/
22-
2315
/**
2416
* @param {ReactElement} element
2517
* @param {Object} styles CSS modules class map.

dist/makeConfig.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
8+
9+
var _utils = require('./utils');
10+
11+
var _utils2 = _interopRequireDefault(_utils);
12+
13+
/**
14+
* @see {@link https://github.com/gajus/react-css-modules#options}
15+
* @property {Boolean} allowMultiple
16+
* @property {Boolean} keepOriginal
17+
* @property {Boolean} errorNotFound
18+
* @property {Boolean} useModuleNam
19+
*/
20+
21+
exports['default'] = function () {
22+
var userConfig = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
23+
24+
var knownProperties = undefined,
25+
unknownProperties = undefined;
26+
27+
knownProperties = ['allowMultiple', 'includeOriginal', 'errorNotFound', 'useModuleName'];
28+
29+
unknownProperties = _utils2['default'].difference(_utils2['default'].keys(userConfig), knownProperties);
30+
31+
if (unknownProperties.length) {
32+
throw new Error('Unknown config property "' + unknownProperties[0] + '".');
33+
}
34+
35+
_utils2['default'].forEach(userConfig, function (value, name) {
36+
if (typeof value !== 'boolean') {
37+
throw new Error('"' + name + '" property value must be a boolean.');
38+
}
39+
});
40+
41+
if (typeof userConfig.allowMultiple === 'undefined') {
42+
userConfig.allowMultiple = true;
43+
}
44+
45+
if (typeof userConfig.includeOriginal === 'undefined') {
46+
userConfig.includeOriginal = true;
47+
}
48+
49+
if (typeof userConfig.errorNotFound === 'undefined') {
50+
userConfig.errorNotFound = false;
51+
}
52+
53+
if (typeof userConfig.useModuleName === 'undefined') {
54+
userConfig.useModuleName = false;
55+
}
56+
57+
return userConfig;
58+
};
59+
60+
module.exports = exports['default'];

dist/utils.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
8+
9+
var _lodashObjectKeys = require('lodash/object/keys');
10+
11+
var _lodashObjectKeys2 = _interopRequireDefault(_lodashObjectKeys);
12+
13+
var _lodashArrayDifference = require('lodash/array/difference');
14+
15+
var _lodashArrayDifference2 = _interopRequireDefault(_lodashArrayDifference);
16+
17+
var _lodashCollectionForEach = require('lodash/collection/forEach');
18+
19+
var _lodashCollectionForEach2 = _interopRequireDefault(_lodashCollectionForEach);
20+
21+
exports['default'] = {
22+
keys: _lodashObjectKeys2['default'],
23+
difference: _lodashArrayDifference2['default'],
24+
forEach: _lodashCollectionForEach2['default']
25+
};
26+
module.exports = exports['default'];

src/index.js

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import linkClass from './linkClass';
2+
import makeConfig from './makeConfig';
23

34
let functionConstructor,
45
decoratorConstructor;
@@ -14,23 +15,7 @@ let functionConstructor,
1415
functionConstructor = (Component, styles, options = {}) => {
1516
return class extends Component {
1617
render () {
17-
if (options.allowMultiple !== false) {
18-
options.allowMultiple = true;
19-
}
20-
21-
if (options.includeOriginal !== false) {
22-
options.includeOriginal = true;
23-
}
24-
25-
if (options.errorNotFound !== true) {
26-
options.errorNotFound = false;
27-
}
28-
29-
if (options.useModuleNames !== true) {
30-
options.useModuleNames = false;
31-
}
32-
33-
return linkClass(super.render(), styles, options);
18+
return linkClass(super.render(), styles, makeConfig(options));
3419
}
3520
};
3621
};

src/linkClass.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@ import React from 'react';
22

33
let linkClass;
44

5-
/**
6-
* @typedef CSSModules~Options
7-
* @property {Boolean} allowMultiple Determines whether `className` can have multiple class names. Throws an error when the constrained is not met. Default: true.
8-
* @property {Boolean} keepOriginal Determines whether the original `className` value is kept in addition to the appended CSS modules styles CSS class name. Default: true.
9-
* @property {Boolean} errorNotFound Determines whether an error is raised if `className` defines a CSS class(es) that is not present in the CSS modules styles. Default: false.
10-
* @property {Boolean} useModuleName When enabled then CSS Modules are loaded using `moduleName` property and `className` is used only for global CSS. Default: false.
11-
*/
12-
135
/**
146
* @param {ReactElement} element
157
* @param {Object} styles CSS modules class map.

src/makeConfig.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import _ from './utils';
2+
3+
/**
4+
* @see {@link https://github.com/gajus/react-css-modules#options}
5+
* @property {Boolean} allowMultiple
6+
* @property {Boolean} keepOriginal
7+
* @property {Boolean} errorNotFound
8+
* @property {Boolean} useModuleNam
9+
*/
10+
export default (userConfig = {}) => {
11+
let knownProperties,
12+
unknownProperties;
13+
14+
knownProperties = [
15+
'allowMultiple',
16+
'includeOriginal',
17+
'errorNotFound',
18+
'useModuleName'
19+
];
20+
21+
unknownProperties = _.difference(_.keys(userConfig), knownProperties);
22+
23+
if (unknownProperties.length) {
24+
throw new Error(`Unknown config property "${unknownProperties[0]}".`);
25+
}
26+
27+
_.forEach(userConfig, (value, name) => {
28+
if (typeof value !== 'boolean') {
29+
throw new Error(`"${name}" property value must be a boolean.`);
30+
}
31+
});
32+
33+
if (typeof userConfig.allowMultiple === 'undefined') {
34+
userConfig.allowMultiple = true;
35+
}
36+
37+
if (typeof userConfig.includeOriginal === 'undefined') {
38+
userConfig.includeOriginal = true;
39+
}
40+
41+
if (typeof userConfig.errorNotFound === 'undefined') {
42+
userConfig.errorNotFound = false;
43+
}
44+
45+
if (typeof userConfig.useModuleName === 'undefined') {
46+
userConfig.useModuleName = false;
47+
}
48+
49+
return userConfig;
50+
};

src/utils.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import keys from 'lodash/object/keys';
2+
import difference from 'lodash/array/difference';
3+
import forEach from 'lodash/collection/forEach';
4+
5+
export default {
6+
keys,
7+
difference,
8+
forEach
9+
};

0 commit comments

Comments
 (0)