Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix bugs #47

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
node_modules
lib
41 changes: 41 additions & 0 deletions lib/PropTypes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.styleValidator = undefined;
exports.configStyleValidator = configStyleValidator;

var _propTypes = require('prop-types');

var _propTypes2 = _interopRequireDefault(_propTypes);

var _StyleValidator = require('./StyleValidator');

var _StyleValidator2 = _interopRequireDefault(_StyleValidator);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var styleValidator = exports.styleValidator = new _StyleValidator2.default();

function configStyleValidator(config) {
styleValidator.setConfig(config);
}

exports.default = {
style(props, propName, componentName) {
if (props[propName] == null) {
return undefined;
}

for (var _len = arguments.length, rest = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
rest[_key - 3] = arguments[_key];
}

var objErr = _propTypes2.default.object.apply(_propTypes2.default, [props, propName, componentName].concat(rest));
if (objErr) {
return objErr;
}
return styleValidator.validate(props[propName], componentName);
}
};
148 changes: 148 additions & 0 deletions lib/StyleValidator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _supportMatrix = require('./supportMatrix.json');

var _supportMatrix2 = _interopRequireDefault(_supportMatrix);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var capsRe = /[A-Z]/g;

var StyleValidator = function () {
function StyleValidator(config) {
_classCallCheck(this, StyleValidator);

this.setConfig(config);
}

_createClass(StyleValidator, [{
key: 'setConfig',
value: function setConfig(config) {
this.config = _extends({
strict: true,
warn: true,
platforms: ['gmail', 'gmail-android', 'apple-mail', 'apple-ios', 'yahoo-mail', 'outlook', 'outlook-legacy', 'outlook-web']
}, config);
}
}, {
key: 'validate',
value: function validate(style, componentName) {
var _this = this;

var _loop = function _loop(propNameCamelCase) {
var propName = propNameCamelCase.replace(capsRe, function (match) {
return `-${match[0].toLowerCase()}`;
});

var supportInfo = _supportMatrix2.default[propName];

if (!supportInfo) {
if (_this.config.strict) {
return {
v: new Error(`Unknown style property \`${propName}\` supplied to \`${componentName}\`.`)
};
}
} else {
var unsupported = [];
var messages = new Map();
_this.config.platforms.forEach(function (platform) {
if (typeof supportInfo[platform] === 'string') {
var msg = supportInfo[platform];
if (!messages.has(msg)) {
messages.set(msg, []);
}
messages.get(msg).push(platform);
} else if (supportInfo[platform] === false) {
unsupported.push(platform);
}
});

if (_this.config.warn) {
// eslint-disable-next-line no-restricted-syntax
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;

try {
for (var _iterator2 = messages[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var _ref = _step2.value;

var _ref2 = _slicedToArray(_ref, 2);

var msg = _ref2[0];
var platforms = _ref2[1];

console.warn(`Warning: Style property \`${propName}\` supplied to \`${componentName}\`, in ${platforms.join(', ')}: ${msg.toLowerCase()}`); // eslint-disable-line no-console
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}

if (unsupported.length && _this.config.strict) {
return {
v: new Error(`Style property \`${propName}\` supplied to \`${componentName}\` unsupported in: ${unsupported.join(', ')}.`)
};
}
}
};

// eslint-disable-next-line no-restricted-syntax
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;

try {
for (var _iterator = Object.keys(style)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var propNameCamelCase = _step.value;

var _ret = _loop(propNameCamelCase);

if (typeof _ret === "object") return _ret.v;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}

return undefined;
}
}]);

return StyleValidator;
}();

exports.default = StyleValidator;
61 changes: 61 additions & 0 deletions lib/components/A.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

exports.default = A;

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _propTypes = require('prop-types');

var _propTypes2 = _interopRequireDefault(_propTypes);

var _PropTypes = require('../PropTypes');

var _PropTypes2 = _interopRequireDefault(_PropTypes);

var _includeDataProps = require('../includeDataProps');

var _includeDataProps2 = _interopRequireDefault(_includeDataProps);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function A(props) {
return _react2.default.createElement(
'a',
_extends({}, (0, _includeDataProps2.default)(props), {
download: props.download,
href: props.href,
target: '_blank',
style: _extends({
color: props.color,
textDecoration: props.textDecoration
}, props.style)
}),
props.children
);
}

A.propTypes = {
href: _propTypes2.default.string.isRequired,
download: _propTypes2.default.string,
color: _propTypes2.default.string,
textDecoration: _propTypes2.default.string,
style: _PropTypes2.default.style,
children: _propTypes2.default.node
};

A.defaultProps = {
textDecoration: 'underline',
href: undefined,
download: undefined,
color: undefined,
style: undefined,
children: undefined
};
67 changes: 67 additions & 0 deletions lib/components/Box.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

exports.default = Box;

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _propTypes = require('prop-types');

var _propTypes2 = _interopRequireDefault(_propTypes);

var _PropTypes = require('../PropTypes');

var _PropTypes2 = _interopRequireDefault(_PropTypes);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }

function Box(_ref) {
var children = _ref.children,
props = _objectWithoutProperties(_ref, ['children']);

return _react2.default.createElement(
'table',
_extends({}, props, { className: props.className }),
_react2.default.createElement(
'tbody',
null,
children
)
);
}

Box.propTypes = {
className: _propTypes2.default.string,
cellPadding: _propTypes2.default.number,
cellSpacing: _propTypes2.default.number,
border: _propTypes2.default.string,
bgcolor: _propTypes2.default.string,
width: _propTypes2.default.string,
height: _propTypes2.default.string,
align: _propTypes2.default.oneOf(['left', 'center', 'right']),
valign: _propTypes2.default.oneOf(['top', 'middle', 'bottom']),
style: _PropTypes2.default.style,
children: _propTypes2.default.node
};

Box.defaultProps = {
cellPadding: 0,
cellSpacing: 0,
border: '0',
align: 'left',
valign: 'top',
bgcolor: undefined,
width: undefined,
height: undefined,
style: undefined,
children: undefined
};
Loading