aboutsummaryrefslogtreecommitdiff
path: root/js/src/util.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/util.js')
-rw-r--r--js/src/util.js28
1 files changed, 28 insertions, 0 deletions
diff --git a/js/src/util.js b/js/src/util.js
index c9ffbe555..86bea6578 100644
--- a/js/src/util.js
+++ b/js/src/util.js
@@ -23,6 +23,15 @@ const Util = (($) => {
transition : 'transitionend'
}
+ // shoutout AngusCroll (https://goo.gl/pxwQGp)
+ function toType(obj) {
+ return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
+ }
+
+ function isElement(obj) {
+ return (obj[0] || obj).nodeType;
+ }
+
function getSpecialTransitionEndEvent() {
return {
bindType: transition.end,
@@ -115,6 +124,25 @@ const Util = (($) => {
supportsTransitionEnd() {
return !!transition
+ },
+
+ typeCheckConfig(componentName, config, configTypes) {
+
+ for (let property in configTypes) {
+ let expectedTypes = configTypes[property]
+ let value = config[property]
+ let valueType
+
+ if (value && isElement(value)) valueType = 'element'
+ else valueType = toType(value)
+
+ if (!new RegExp(expectedTypes).test(valueType)) {
+ throw new Error(
+ `${componentName.toUpperCase()}: ` +
+ `Option "${property}" provided type "${valueType}" ` +
+ `but expected type "${expectedTypes}".`)
+ }
+ }
}
}