From 115ba56cb53d285e9a05617c4dd04a54cced88ea Mon Sep 17 00:00:00 2001 From: s-yadav <sudhanshuyadav2@gmail.com> Date: Sun, 16 Dec 2018 21:31:50 +0530 Subject: [PATCH] - Merged #26, Added null check for children. - Fixed metatags not updating on client side when MetaTag content updates. Issue produced on 0.7.1. --- dist/react-meta-tags.es.js | 23 +++++++++++++---------- dist/react-meta-tags.js | 23 +++++++++++++---------- dist/react-meta-tags.min.js | 4 ++-- lib/meta_tags.js | 15 ++++++++++++--- lib/utils.js | 8 -------- package.json | 2 +- src/meta_tags.js | 7 +++++-- src/utils.js | 7 ------- 8 files changed, 46 insertions(+), 43 deletions(-) diff --git a/dist/react-meta-tags.es.js b/dist/react-meta-tags.es.js index b368542..232020c 100644 --- a/dist/react-meta-tags.es.js +++ b/dist/react-meta-tags.es.js @@ -1,5 +1,5 @@ /** - * react-meta-tags - 0.7.2 + * react-meta-tags - 0.7.3 * Author : Sudhanshu Yadav * Copyright (c) 2016, 2018 to Sudhanshu Yadav, released under the MIT license. * https://github.com/s-yadav/react-meta-tags @@ -344,12 +344,6 @@ function removeChild(parent, childrens) { for (var i = 0, ln = childrens.length; i < ln; i++) { parent.removeChild(childrens[i]); } -} //get dom as string format - -function getDomAsString(dom) { - var temp = document.createElement('div'); - temp.appendChild(dom); - return temp.innerHTML; } /** An wrapper component to wrap element which need to shifted to head **/ @@ -389,9 +383,14 @@ function (_Component) { key: "extractChildren", value: function extractChildren() { var extract = this.context.extract; + var children = this.props.children; + + if (!children) { + return; + } if (extract) { - extract(this.props.children); + extract(children); } } }, { @@ -401,7 +400,7 @@ function (_Component) { var children = this.props.children; - if (this.context.extract) { + if (this.context.extract || !children) { return; } @@ -421,7 +420,11 @@ function (_Component) { var headHtml = head.innerHTML; //filter children remove if children has not been changed childNodes = childNodes.filter(function (child) { - return headHtml.indexOf(getDomAsString(child)) === -1; + return headHtml.indexOf(child.outerHTML) === -1; + }); //create clone of childNodes + + childNodes = childNodes.map(function (child) { + return child.cloneNode(true); }); //remove duplicate title and meta from head childNodes.forEach(function (child) { diff --git a/dist/react-meta-tags.js b/dist/react-meta-tags.js index 0df3768..697040c 100644 --- a/dist/react-meta-tags.js +++ b/dist/react-meta-tags.js @@ -1,5 +1,5 @@ /** - * react-meta-tags - 0.7.2 + * react-meta-tags - 0.7.3 * Author : Sudhanshu Yadav * Copyright (c) 2016, 2018 to Sudhanshu Yadav, released under the MIT license. * https://github.com/s-yadav/react-meta-tags @@ -350,12 +350,6 @@ for (var i = 0, ln = childrens.length; i < ln; i++) { parent.removeChild(childrens[i]); } - } //get dom as string format - - function getDomAsString(dom) { - var temp = document.createElement('div'); - temp.appendChild(dom); - return temp.innerHTML; } /** An wrapper component to wrap element which need to shifted to head **/ @@ -395,9 +389,14 @@ key: "extractChildren", value: function extractChildren() { var extract = this.context.extract; + var children = this.props.children; + + if (!children) { + return; + } if (extract) { - extract(this.props.children); + extract(children); } } }, { @@ -407,7 +406,7 @@ var children = this.props.children; - if (this.context.extract) { + if (this.context.extract || !children) { return; } @@ -427,7 +426,11 @@ var headHtml = head.innerHTML; //filter children remove if children has not been changed childNodes = childNodes.filter(function (child) { - return headHtml.indexOf(getDomAsString(child)) === -1; + return headHtml.indexOf(child.outerHTML) === -1; + }); //create clone of childNodes + + childNodes = childNodes.map(function (child) { + return child.cloneNode(true); }); //remove duplicate title and meta from head childNodes.forEach(function (child) { diff --git a/dist/react-meta-tags.min.js b/dist/react-meta-tags.min.js index 0788767..29380bb 100644 --- a/dist/react-meta-tags.min.js +++ b/dist/react-meta-tags.min.js @@ -1,8 +1,8 @@ /** - * react-meta-tags - 0.7.2 + * react-meta-tags - 0.7.3 * Author : Sudhanshu Yadav * Copyright (c) 2016, 2018 to Sudhanshu Yadav, released under the MIT license. * https://github.com/s-yadav/react-meta-tags */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","react-dom"],t):t(e.MetaTags={},e.React,e.ReactDOM)}(this,function(e,n,r){"use strict";var o="default"in n?n.default:n;function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function c(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&p(e,t)}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t){return(p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function f(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}r=r&&r.hasOwnProperty("default")?r.default:r;var s=Object.getOwnPropertySymbols,d=Object.prototype.hasOwnProperty,h=Object.prototype.propertyIsEnumerable;(function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}})()&&Object.assign;function y(){}var m,v=(function(e){e.exports=function(){function e(e,t,n,r,o,i){if("SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"!==i){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}var n={array:e.isRequired=e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=y,n.PropTypes=n}()}(m={exports:{}},m.exports),m.exports),b=function(e){function t(){return i(this,t),f(this,l(t).apply(this,arguments))}return u(t,n.Component),c(t,[{key:"getChildContext",value:function(){return{extract:this.props.extract}}},{key:"render",value:function(){return n.Children.only(this.props.children)}}]),t}();t(b,"childContextTypes",{extract:v.func});var O=["property","name","itemprop"];function g(o){var i=document.head,e=o.id;return e?e&&i.querySelector("#".concat(e)):O.reduce(function(e,t){var n,r=o.getAttribute(t);return r?e.concat((n=i.querySelectorAll("[".concat(t,' = "').concat(r,'"]')),(n=Array.prototype.slice.call(n||[])).filter(function(e){return!e.id}))):e},[])}function C(e,t){void 0===t.length&&(t=[t]);for(var n=0,r=t.length;n<r;n++)e.removeChild(t[n])}var j=function(e){function t(){return i(this,t),f(this,l(t).apply(this,arguments))}return u(t,n.Component),c(t,[{key:"componentDidMount",value:function(){this.temporaryElement=document.createElement("div"),this.handleChildrens()}},{key:"componentDidUpdate",value:function(e){e.children!==this.props.children&&this.handleChildrens()}},{key:"componentWillUnmount",value:function(){this.temporaryElement&&r.unmountComponentAtNode(this.temporaryElement)}},{key:"extractChildren",value:function(){var e=this.context.extract;e&&e(this.props.children)}},{key:"handleChildrens",value:function(){var n=this,e=this.props.children;if(!this.context.extract){var t=o.createElement("div",{className:"react-head-temp"},e);r.render(t,this.temporaryElement,function(){var e=n.temporaryElement.innerHTML;if(n.lastChildStr!==e){n.lastChildStr=e;var t=Array.prototype.slice.call(n.temporaryElement.querySelector(".react-head-temp").children),i=document.head,r=i.innerHTML;(t=t.filter(function(e){return-1===r.indexOf((t=e,(n=document.createElement("div")).appendChild(t),n.innerHTML));var t,n})).forEach(function(e){var t=e.tagName.toLowerCase();if("title"===t){var n=document.head.querySelectorAll("title");n&&C(i,n)}else if("meta"===t){var r=g(e);r&&C(i,r)}else if("link"===t&&"canonical"===e.rel){var o=document.head.querySelectorAll('link[rel="canonical"]');o&&C(i,o)}}),function(e,t){void 0===t.length&&(t=[t]);for(var n=document.createDocumentFragment(),r=0,o=t.length;r<o;r++)n.appendChild(t[r]);e.appendChild(n)}(document.head,t)}})}}},{key:"render",value:function(){return this.extractChildren(),null}}]),t}();t(j,"contextTypes",{extract:v.func});var x=function(e){function t(){return i(this,t),f(this,l(t).apply(this,arguments))}return u(t,n.Component),c(t,[{key:"render",value:function(){return o.createElement(j,null,o.createElement("title",null,this.props.title))}}]),t}();t(x,"propTypes",{title:v.string}),e.default=j,e.MetaTags=j,e.MetaTagsContext=b,e.ReactTitle=x,Object.defineProperty(e,"__esModule",{value:!0})}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","react-dom"],t):t(e.MetaTags={},e.React,e.ReactDOM)}(this,function(e,n,o){"use strict";var i="default"in n?n.default:n;function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function c(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&p(e,t)}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function p(e,t){return(p=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function f(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}o=o&&o.hasOwnProperty("default")?o.default:o;var s=Object.getOwnPropertySymbols,d=Object.prototype.hasOwnProperty,h=Object.prototype.propertyIsEnumerable;(function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}})()&&Object.assign;function y(){}var m,v=(function(e){e.exports=function(){function e(e,t,n,r,o,i){if("SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"!==i){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}var n={array:e.isRequired=e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=y,n.PropTypes=n}()}(m={exports:{}},m.exports),m.exports),b=function(e){function t(){return r(this,t),f(this,l(t).apply(this,arguments))}return u(t,n.Component),c(t,[{key:"getChildContext",value:function(){return{extract:this.props.extract}}},{key:"render",value:function(){return n.Children.only(this.props.children)}}]),t}();t(b,"childContextTypes",{extract:v.func});var O=["property","name","itemprop"];function g(o){var i=document.head,e=o.id;return e?e&&i.querySelector("#".concat(e)):O.reduce(function(e,t){var n,r=o.getAttribute(t);return r?e.concat((n=i.querySelectorAll("[".concat(t,' = "').concat(r,'"]')),(n=Array.prototype.slice.call(n||[])).filter(function(e){return!e.id}))):e},[])}function j(e,t){void 0===t.length&&(t=[t]);for(var n=0,r=t.length;n<r;n++)e.removeChild(t[n])}var C=function(e){function t(){return r(this,t),f(this,l(t).apply(this,arguments))}return u(t,n.Component),c(t,[{key:"componentDidMount",value:function(){this.temporaryElement=document.createElement("div"),this.handleChildrens()}},{key:"componentDidUpdate",value:function(e){e.children!==this.props.children&&this.handleChildrens()}},{key:"componentWillUnmount",value:function(){this.temporaryElement&&o.unmountComponentAtNode(this.temporaryElement)}},{key:"extractChildren",value:function(){var e=this.context.extract,t=this.props.children;t&&e&&e(t)}},{key:"handleChildrens",value:function(){var r=this,e=this.props.children;if(!this.context.extract&&e){var t=i.createElement("div",{className:"react-head-temp"},e);o.render(t,this.temporaryElement,function(){var e=r.temporaryElement.innerHTML;if(r.lastChildStr!==e){r.lastChildStr=e;var t=Array.prototype.slice.call(r.temporaryElement.querySelector(".react-head-temp").children),i=document.head,n=i.innerHTML;(t=(t=t.filter(function(e){return-1===n.indexOf(e.outerHTML)})).map(function(e){return e.cloneNode(!0)})).forEach(function(e){var t=e.tagName.toLowerCase();if("title"===t){var n=document.head.querySelectorAll("title");n&&j(i,n)}else if("meta"===t){var r=g(e);r&&j(i,r)}else if("link"===t&&"canonical"===e.rel){var o=document.head.querySelectorAll('link[rel="canonical"]');o&&j(i,o)}}),function(e,t){void 0===t.length&&(t=[t]);for(var n=document.createDocumentFragment(),r=0,o=t.length;r<o;r++)n.appendChild(t[r]);e.appendChild(n)}(document.head,t)}})}}},{key:"render",value:function(){return this.extractChildren(),null}}]),t}();t(C,"contextTypes",{extract:v.func});var x=function(e){function t(){return r(this,t),f(this,l(t).apply(this,arguments))}return u(t,n.Component),c(t,[{key:"render",value:function(){return i.createElement(C,null,i.createElement("title",null,this.props.title))}}]),t}();t(x,"propTypes",{title:v.string}),e.default=C,e.MetaTags=C,e.MetaTagsContext=b,e.ReactTitle=x,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/lib/meta_tags.js b/lib/meta_tags.js index c969606..7aa271e 100644 --- a/lib/meta_tags.js +++ b/lib/meta_tags.js @@ -73,9 +73,14 @@ function (_Component) { key: "extractChildren", value: function extractChildren() { var extract = this.context.extract; + var children = this.props.children; + + if (!children) { + return; + } if (extract) { - extract(this.props.children); + extract(children); } } }, { @@ -85,7 +90,7 @@ function (_Component) { var children = this.props.children; - if (this.context.extract) { + if (this.context.extract || !children) { return; } @@ -106,7 +111,11 @@ function (_Component) { var headHtml = head.innerHTML; //filter children remove if children has not been changed childNodes = childNodes.filter(function (child) { - return headHtml.indexOf((0, _utils.getDomAsString)(child)) === -1; + return headHtml.indexOf(child.outerHTML) === -1; + }); //create clone of childNodes + + childNodes = childNodes.map(function (child) { + return child.cloneNode(true); }); //remove duplicate title and meta from head childNodes.forEach(function (child) { diff --git a/lib/utils.js b/lib/utils.js index 407de80..d0edb72 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -9,7 +9,6 @@ exports.getDuplicateCanonical = getDuplicateCanonical; exports.getDuplicateMeta = getDuplicateMeta; exports.appendChild = appendChild; exports.removeChild = removeChild; -exports.getDomAsString = getDomAsString; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } @@ -141,11 +140,4 @@ function removeChild(parent, childrens) { for (var i = 0, ln = childrens.length; i < ln; i++) { parent.removeChild(childrens[i]); } -} //get dom as string format - - -function getDomAsString(dom) { - var temp = document.createElement('div'); - temp.appendChild(dom); - return temp.innerHTML; } \ No newline at end of file diff --git a/package.json b/package.json index e67ebba..27f0a9e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "react-meta-tags", "description": "Handle document meta/head tags in isomorphic react with ease.", - "version": "0.7.2", + "version": "0.7.3", "main": "lib/index.js", "author": "Sudhanshu Yadav", "license": "MIT", diff --git a/src/meta_tags.js b/src/meta_tags.js index 6e847b5..4d7f008 100644 --- a/src/meta_tags.js +++ b/src/meta_tags.js @@ -1,7 +1,7 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; -import {getDuplicateTitle, getDuplicateCanonical, getDuplicateMeta, appendChild, removeChild, getDomAsString} from './utils'; +import {getDuplicateTitle, getDuplicateCanonical, getDuplicateMeta, appendChild, removeChild} from './utils'; /** An wrapper component to wrap element which need to shifted to head **/ @@ -60,9 +60,12 @@ class MetaTags extends Component { //filter children remove if children has not been changed childNodes = childNodes.filter((child) => { - return headHtml.indexOf(getDomAsString(child)) === -1; + return headHtml.indexOf(child.outerHTML) === -1; }); + //create clone of childNodes + childNodes = childNodes.map((child) => child.cloneNode(true)); + //remove duplicate title and meta from head childNodes.forEach((child) => { const tag = child.tagName.toLowerCase(); diff --git a/src/utils.js b/src/utils.js index 8ee2a24..4ec0148 100644 --- a/src/utils.js +++ b/src/utils.js @@ -127,10 +127,3 @@ export function removeChild(parent, childrens) { parent.removeChild(childrens[i]); } } - -//get dom as string format -export function getDomAsString(dom) { - const temp = document.createElement('div'); - temp.appendChild(dom); - return temp.innerHTML; -} -- GitLab