alexa-ssml-jsx
Advanced tools
Comparing version 1.1.0 to 1.1.1
@@ -164,5 +164,5 @@ 'use strict'; | ||
var validate = (function (_ref, props) { | ||
var name = _ref.name; | ||
var _ref$propTypes = _ref.propTypes; | ||
var propTypes = _ref$propTypes === undefined ? {} : _ref$propTypes; | ||
var name = _ref.name, | ||
_ref$propTypes = _ref.propTypes, | ||
propTypes = _ref$propTypes === undefined ? {} : _ref$propTypes; | ||
@@ -481,2 +481,26 @@ Object.keys(propTypes).forEach(function (key) { | ||
if (!node || node.type !== 'speak') { | ||
throw Error('Expected SSML to be surrounded in a <speak> tag.'); | ||
} | ||
return render(node, _extends({}, options, { root: true })); | ||
} | ||
function render(node) { | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
if (!node) { | ||
return ''; | ||
} | ||
if (Array.isArray(node)) { | ||
return node.map(function (child) { | ||
return render(child, _extends({}, options, { root: false })); | ||
}).join(''); | ||
} | ||
if (typeof node.type === 'function') { | ||
return render(node.type(node.props), _extends({}, options, { root: false })); | ||
} | ||
if (typeof node === 'string') { | ||
@@ -486,13 +510,18 @@ return node; | ||
var _ref = node.props || {}; | ||
var _ref = node.props || {}, | ||
_ref$children = _ref.children, | ||
children = _ref$children === undefined ? [] : _ref$children, | ||
rest = objectWithoutProperties(_ref, ['children']); | ||
var _ref$children = _ref.children; | ||
var children = _ref$children === undefined ? [] : _ref$children; | ||
var rest = objectWithoutProperties(_ref, ['children']); | ||
if (node.type === 'speak' && !options.root) { | ||
return children.map(function (child) { | ||
return render(child, _extends({}, options, { root: false })); | ||
}).join(''); | ||
} | ||
var props = entries(rest).reduce(function (state, _ref2) { | ||
var _ref3 = slicedToArray(_ref2, 2); | ||
var _ref3 = slicedToArray(_ref2, 2), | ||
key = _ref3[0], | ||
value = _ref3[1]; | ||
var key = _ref3[0]; | ||
var value = _ref3[1]; | ||
return state + ' ' + key + '="' + value + '"'; | ||
@@ -502,3 +531,3 @@ }, ''); | ||
return children.length ? '<' + node.type + props + '>' + children.map(function (child) { | ||
return renderToString(child, options); | ||
return render(child, _extends({}, options, { root: false })); | ||
}).join('') + '</' + node.type + '>' : '<' + node.type + props + '/>'; | ||
@@ -505,0 +534,0 @@ } |
@@ -1,1 +0,1 @@ | ||
"use strict";function chainable(e){var r=function(r,t,n){return e(r,t,n)};return r.isRequired=function(r,t,n){if(r&&r[t])return e(r,t,n);throw new Error('Missing required prop "'+t+'" on "'+n+'" tag.')},r}function ssml$1(e,r){for(var t=arguments.length,n=Array(t>2?t-2:0),o=2;o<t;o++)n[o-2]=arguments[o];var i=throwIfUndefined(getTagDefinition(e),'Unsupported tag: "'+e+'"'),a=r||i.defaultProps||n.length,u=a&&_extends({},i.defaultProps,r,n.length&&{children:n}),p=validate(i,u);return _extends({type:i.type},p&&{props:p})}function throwIfUndefined(e,r){if(e)return e;throw new Error(r)}function getTagDefinition(e){switch("undefined"==typeof e?"undefined":_typeof(e)){case"string":return schema[e];case"function":return _extends({},e,{type:e});default:return}}function renderToString(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("string"==typeof e)return e;var t=e.props||{},n=t.children,o=void 0===n?[]:n,i=objectWithoutProperties(t,["children"]),a=entries(i).reduce(function(e,r){var t=slicedToArray(r,2),n=t[0],o=t[1];return e+" "+n+'="'+o+'"'},"");return o.length?"<"+e.type+a+">"+o.map(function(e){return renderToString(e,r)}).join("")+"</"+e.type+">":"<"+e.type+a+"/>"}Object.defineProperty(exports,"__esModule",{value:!0});var _oneOf=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return function(r,t,n){var o=r&&r[t];if(o&&e.indexOf(o)<0)throw new Error('Unsupported value "'+o+'" for prop "'+t+'" on "'+n+'" tag. Supported values are: '+e.join(", ")+".")}},_match=function(e){return function(r,t,n){var o=r&&r[t];if(o&&!e.exec(o))throw new Error('Invalid value for prop "'+t+'" on "'+n+'" tag. Expected "'+o+'" to match '+e.toString()+".")}},array=function(e,r,t){var n=e&&e[r];if(!Array.isArray(n))throw new Error('Invalid value for prop "'+r+'" on "'+t+'" tag. Expected an array.')},none=function(e,r,t){if(e&&e[r])throw new Error('Unexpected prop "'+r+'" on "'+t+'" tag. Expected none.')},PropTypes={array:chainable(array),match:function(e){return chainable(_match(e))},none:chainable(none),oneOf:function(e){return chainable(_oneOf(e))}},Strengths=["none","x-weak","weak","medium","strong","x-strong"],breakTag={type:"break",propTypes:{strength:PropTypes.oneOf(Strengths),time:PropTypes.match(/(\d+)(m?s)?/),children:PropTypes.none}},p={type:"p",propTypes:{children:PropTypes.array.isRequired}},s={type:"s",propTypes:{children:PropTypes.array.isRequired}},interpretations=["characters","spell-out","cardinal","number","ordinal","digits","fraction","unit","date","time","telephone","address"],formats=["mdy","dmy","ymd","md","dm","ym","my","d","m","y"],sayAsTag={type:"say-as",propTypes:{children:PropTypes.array.isRequired,"interpret-as":PropTypes.oneOf(interpretations).isRequired,format:function e(r,t,n){if("date"===r["interpret-as"]){var e=PropTypes.oneOf(formats).isRequired;return e(r,t,n)}}}},speak={type:"speak",propTypes:{children:PropTypes.array.isRequired}},schema={break:breakTag,p:p,s:s,"say-as":sayAsTag,speak:speak},validate=function(e,r){var t=e.name,n=e.propTypes,o=void 0===n?{}:n;return Object.keys(o).forEach(function(e){var n=o[e];n&&n(r,e,t)}),r},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},asyncGenerator=function(){function e(e){this.value=e}function r(r){function t(e,r){return new Promise(function(t,o){var u={key:e,arg:r,resolve:t,reject:o,next:null};a?a=a.next=u:(i=a=u,n(e,r))})}function n(t,i){try{var a=r[t](i),u=a.value;u instanceof e?Promise.resolve(u.value).then(function(e){n("next",e)},function(e){n("throw",e)}):o(a.done?"return":"normal",a.value)}catch(e){o("throw",e)}}function o(e,r){switch(e){case"return":i.resolve({value:r,done:!0});break;case"throw":i.reject(r);break;default:i.resolve({value:r,done:!1})}i=i.next,i?n(i.key,i.arg):a=null}var i,a;this._invoke=t,"function"!=typeof r.return&&(this.return=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(r.prototype[Symbol.asyncIterator]=function(){return this}),r.prototype.next=function(e){return this._invoke("next",e)},r.prototype.throw=function(e){return this._invoke("throw",e)},r.prototype.return=function(e){return this._invoke("return",e)},{wrap:function(e){return function(){return new r(e.apply(this,arguments))}},await:function(r){return new e(r)}}}(),_extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},get=function e(r,t,n){null===r&&(r=Function.prototype);var o=Object.getOwnPropertyDescriptor(r,t);if(void 0===o){var i=Object.getPrototypeOf(r);return null===i?void 0:e(i,t,n)}if("value"in o)return o.value;var a=o.get;if(void 0!==a)return a.call(n)},objectWithoutProperties=function(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},set=function e(r,t,n,o){var i=Object.getOwnPropertyDescriptor(r,t);if(void 0===i){var a=Object.getPrototypeOf(r);null!==a&&e(a,t,n,o)}else if("value"in i&&i.writable)i.value=n;else{var u=i.set;void 0!==u&&u.call(o,n)}return n},slicedToArray=function(){function e(e,r){var t=[],n=!0,o=!1,i=void 0;try{for(var a,u=e[Symbol.iterator]();!(n=(a=u.next()).done)&&(t.push(a.value),!r||t.length!==r);n=!0);}catch(e){o=!0,i=e}finally{try{!n&&u.return&&u.return()}finally{if(o)throw i}}return t}return function(r,t){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),entries=function(e){return Object.keys(e).map(function(r){return[r,e[r]]})};exports.default=ssml$1,exports.renderToString=renderToString; | ||
"use strict";function chainable(e){var r=function(r,t,n){return e(r,t,n)};return r.isRequired=function(r,t,n){if(r&&r[t])return e(r,t,n);throw new Error('Missing required prop "'+t+'" on "'+n+'" tag.')},r}function ssml$1(e,r){for(var t=arguments.length,n=Array(t>2?t-2:0),o=2;o<t;o++)n[o-2]=arguments[o];var i=throwIfUndefined(getTagDefinition(e),'Unsupported tag: "'+e+'"'),a=r||i.defaultProps||n.length,u=a&&_extends({},i.defaultProps,r,n.length&&{children:n}),p=validate(i,u);return _extends({type:i.type},p&&{props:p})}function throwIfUndefined(e,r){if(e)return e;throw new Error(r)}function getTagDefinition(e){switch("undefined"==typeof e?"undefined":_typeof(e)){case"string":return schema[e];case"function":return _extends({},e,{type:e});default:return}}function renderToString(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e||"speak"!==e.type)throw Error("Expected SSML to be surrounded in a <speak> tag.");return render(e,_extends({},r,{root:!0}))}function render(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e)return"";if(Array.isArray(e))return e.map(function(e){return render(e,_extends({},r,{root:!1}))}).join("");if("function"==typeof e.type)return render(e.type(e.props),_extends({},r,{root:!1}));if("string"==typeof e)return e;var t=e.props||{},n=t.children,o=void 0===n?[]:n,i=objectWithoutProperties(t,["children"]);if("speak"===e.type&&!r.root)return o.map(function(e){return render(e,_extends({},r,{root:!1}))}).join("");var a=entries(i).reduce(function(e,r){var t=slicedToArray(r,2),n=t[0],o=t[1];return e+" "+n+'="'+o+'"'},"");return o.length?"<"+e.type+a+">"+o.map(function(e){return render(e,_extends({},r,{root:!1}))}).join("")+"</"+e.type+">":"<"+e.type+a+"/>"}Object.defineProperty(exports,"__esModule",{value:!0});var _oneOf=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return function(r,t,n){var o=r&&r[t];if(o&&e.indexOf(o)<0)throw new Error('Unsupported value "'+o+'" for prop "'+t+'" on "'+n+'" tag. Supported values are: '+e.join(", ")+".")}},_match=function(e){return function(r,t,n){var o=r&&r[t];if(o&&!e.exec(o))throw new Error('Invalid value for prop "'+t+'" on "'+n+'" tag. Expected "'+o+'" to match '+e.toString()+".")}},array=function(e,r,t){var n=e&&e[r];if(!Array.isArray(n))throw new Error('Invalid value for prop "'+r+'" on "'+t+'" tag. Expected an array.')},none=function(e,r,t){if(e&&e[r])throw new Error('Unexpected prop "'+r+'" on "'+t+'" tag. Expected none.')},PropTypes={array:chainable(array),match:function(e){return chainable(_match(e))},none:chainable(none),oneOf:function(e){return chainable(_oneOf(e))}},Strengths=["none","x-weak","weak","medium","strong","x-strong"],breakTag={type:"break",propTypes:{strength:PropTypes.oneOf(Strengths),time:PropTypes.match(/(\d+)(m?s)?/),children:PropTypes.none}},p={type:"p",propTypes:{children:PropTypes.array.isRequired}},s={type:"s",propTypes:{children:PropTypes.array.isRequired}},interpretations=["characters","spell-out","cardinal","number","ordinal","digits","fraction","unit","date","time","telephone","address"],formats=["mdy","dmy","ymd","md","dm","ym","my","d","m","y"],sayAsTag={type:"say-as",propTypes:{children:PropTypes.array.isRequired,"interpret-as":PropTypes.oneOf(interpretations).isRequired,format:function e(r,t,n){if("date"===r["interpret-as"]){var e=PropTypes.oneOf(formats).isRequired;return e(r,t,n)}}}},speak={type:"speak",propTypes:{children:PropTypes.array.isRequired}},schema={break:breakTag,p:p,s:s,"say-as":sayAsTag,speak:speak},validate=function(e,r){var t=e.name,n=e.propTypes,o=void 0===n?{}:n;return Object.keys(o).forEach(function(e){var n=o[e];n&&n(r,e,t)}),r},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},asyncGenerator=function(){function e(e){this.value=e}function r(r){function t(e,r){return new Promise(function(t,o){var u={key:e,arg:r,resolve:t,reject:o,next:null};a?a=a.next=u:(i=a=u,n(e,r))})}function n(t,i){try{var a=r[t](i),u=a.value;u instanceof e?Promise.resolve(u.value).then(function(e){n("next",e)},function(e){n("throw",e)}):o(a.done?"return":"normal",a.value)}catch(e){o("throw",e)}}function o(e,r){switch(e){case"return":i.resolve({value:r,done:!0});break;case"throw":i.reject(r);break;default:i.resolve({value:r,done:!1})}i=i.next,i?n(i.key,i.arg):a=null}var i,a;this._invoke=t,"function"!=typeof r.return&&(this.return=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(r.prototype[Symbol.asyncIterator]=function(){return this}),r.prototype.next=function(e){return this._invoke("next",e)},r.prototype.throw=function(e){return this._invoke("throw",e)},r.prototype.return=function(e){return this._invoke("return",e)},{wrap:function(e){return function(){return new r(e.apply(this,arguments))}},await:function(r){return new e(r)}}}(),_extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},get=function e(r,t,n){null===r&&(r=Function.prototype);var o=Object.getOwnPropertyDescriptor(r,t);if(void 0===o){var i=Object.getPrototypeOf(r);return null===i?void 0:e(i,t,n)}if("value"in o)return o.value;var a=o.get;if(void 0!==a)return a.call(n)},objectWithoutProperties=function(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},set=function e(r,t,n,o){var i=Object.getOwnPropertyDescriptor(r,t);if(void 0===i){var a=Object.getPrototypeOf(r);null!==a&&e(a,t,n,o)}else if("value"in i&&i.writable)i.value=n;else{var u=i.set;void 0!==u&&u.call(o,n)}return n},slicedToArray=function(){function e(e,r){var t=[],n=!0,o=!1,i=void 0;try{for(var a,u=e[Symbol.iterator]();!(n=(a=u.next()).done)&&(t.push(a.value),!r||t.length!==r);n=!0);}catch(e){o=!0,i=e}finally{try{!n&&u.return&&u.return()}finally{if(o)throw i}}return t}return function(r,t){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),entries=function(e){return Object.keys(e).map(function(r){return[r,e[r]]})};exports.default=ssml$1,exports.renderToString=renderToString; |
{ | ||
"name": "alexa-ssml-jsx", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"description": "Write SSML inline within javascript files using JSX", | ||
@@ -5,0 +5,0 @@ "main": "build/index.min.js", |
const entries = (object) => Object.keys(object).map(key => [key, object[key]]); | ||
export default function renderToString(node, options = {}) { | ||
if (!node || node.type !== 'speak') { | ||
throw Error('Expected SSML to be surrounded in a <speak> tag.'); | ||
} | ||
return render(node, { ...options, root: true }); | ||
} | ||
function render(node, options = {}) { | ||
if (!node) { | ||
return ''; | ||
} | ||
if (Array.isArray(node)) { | ||
return node.map(child => render(child, { ...options, root: false })).join(''); | ||
} | ||
if (typeof node.type === 'function') { | ||
return render(node.type(node.props), { ...options, root: false }); | ||
} | ||
if (typeof node === 'string') { | ||
@@ -9,5 +29,10 @@ return node; | ||
const { children = [], ...rest } = node.props || {}; | ||
if (node.type === 'speak' && !options.root) { | ||
return children.map(child => render(child, { ...options, root: false })).join(''); | ||
} | ||
const props = entries(rest).reduce((state, [key, value]) => `${state} ${key}="${value}"`, ''); | ||
return children.length ? `<${node.type}${props}>${children.map(child => renderToString(child, options)).join('')}</${node.type}>` : `<${node.type}${props}/>`; | ||
return children.length ? `<${node.type}${props}>${children.map(child => render(child, { ...options, root: false })).join('')}</${node.type}>` : `<${node.type}${props}/>`; | ||
} |
@@ -51,2 +51,30 @@ import test from 'ava'; | ||
test('Only renders outer <speak> tags', t => { | ||
const speech = renderToString( | ||
<speak> | ||
<s>Hello</s> | ||
<speak> | ||
<s>world</s> | ||
</speak> | ||
</speak> | ||
); | ||
t.deepEqual(speech, '<speak><s>Hello</s><s>world</s></speak>'); | ||
}); | ||
test('Renders custom tags', t => { | ||
const Verbose = (props) => props.verbose ? props.children : null; // eslint-disable-line | ||
const speech = renderToString( | ||
<speak> | ||
<s>Hello world</s> | ||
<Verbose verbose={true}> | ||
<s>How are you doing today?</s> | ||
</Verbose> | ||
</speak> | ||
); | ||
t.deepEqual(speech, '<speak><s>Hello world</s><s>How are you doing today?</s></speak>'); | ||
}); | ||
test('Renders deeply', t => { | ||
@@ -53,0 +81,0 @@ const speech = renderToString( |
@@ -38,6 +38,6 @@ import test from 'ava'; | ||
const speech = ( | ||
<speak> | ||
<s>This is a sentence</s> | ||
</speak> | ||
); | ||
<speak> | ||
<s>This is a sentence</s> | ||
</speak> | ||
); | ||
@@ -44,0 +44,0 @@ t.deepEqual(speech, { |
30901
762