From bf0500cfb9b8119cd522f395c2e83ba87330cf73 Mon Sep 17 00:00:00 2001 From: Pavel Linkesch Date: Thu, 10 Mar 2016 13:00:00 +0100 Subject: [PATCH] add support for objects passed to link.rel --- lib/__tests__/dom.basic.test.js | 17 ++++++++++++++--- lib/index.js | 30 +++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/lib/__tests__/dom.basic.test.js b/lib/__tests__/dom.basic.test.js index 1166d19..9ff6fb5 100644 --- a/lib/__tests__/dom.basic.test.js +++ b/lib/__tests__/dom.basic.test.js @@ -24,6 +24,10 @@ describe('DocumentMeta - DOM basic', () => { stylesheet: [ 'http://domain.tld/css/vendor.css', 'http://domain.tld/css/styles.css' + ], + alternate: [ + { href: '/alternate/us', hreflang: 'en-us' }, + { href: '/alternate/gb', hreflang: 'en-gb' } ] } } @@ -58,11 +62,18 @@ describe('DocumentMeta - DOM basic', () => { }); it('should render normal link tags, eg. ', () => { - Object.keys( DOC_META.link.rel ).reduce(( rel ) => { + Object.keys( DOC_META.link.rel ).forEach(( rel ) => { const values = Array.isArray(DOC_META.link.rel[rel]) ? DOC_META.link.rel[rel] : [ DOC_META.link.rel[rel] ]; const elements = getElements( `link[rel=${ rel }]` ); - elements.forEach(( element, idx ) => { - assert.strictEqual( element.getAttribute('content'), values[idx], ` has not been rendered correctly` ); + Object.keys(elements).forEach(( idx ) => { + const element = elements[idx]; + if (typeof values[idx] === 'string') { + assert.strictEqual( element.getAttribute('href'), values[idx], ` has not been rendered correctly` ); + } else { + Object.keys(values[idx]).forEach(( attr ) => { + assert.strictEqual( element.getAttribute(attr), values[idx][attr], ` has not been rendered correctly` ); + }); + } }); }); }); diff --git a/lib/index.js b/lib/index.js index bf2f4af..0e5f46a 100644 --- a/lib/index.js +++ b/lib/index.js @@ -91,11 +91,22 @@ function parseTags ( tagName, props = {} ) { if (value === null ) { return; } - tags.push({ - tagName, - [ groupKey ]: key, - [ contentKey ]: value - }); + if (typeof value === 'string') { + tags.push({ + tagName, + [ groupKey ]: key, + [ contentKey ]: value + }); + } else { + const attrs = { + tagName, + [ groupKey ]: key + }; + Object.keys( value ).forEach(( attr) => { + attrs[attr] = value[attr]; + }); + tags.push(attrs); + } }); }); }); @@ -141,7 +152,7 @@ function render ( meta = {}, opts ) { let i = 0; const tags = []; - function renderTag ( entry ) { + function renderTag ( entry ) { const { tagName, ...attr } = entry; if ( tagName === 'meta' ) { @@ -191,7 +202,12 @@ const DocumentMeta = React.createClass({ React.PropTypes.objectOf( React.PropTypes.oneOfType([ React.PropTypes.string, - React.PropTypes.arrayOf(React.PropTypes.string) + React.PropTypes.arrayOf( + React.PropTypes.oneOfType([ + React.PropTypes.string, + React.PropTypes.objectOf(React.PropTypes.string) + ]) + ) ]) ) ),