From 258bcc71bf39eeea48bef00a431b026138cbc9af Mon Sep 17 00:00:00 2001 From: Nazar Gargol Date: Wed, 26 Feb 2020 14:08:10 +0800 Subject: [PATCH] Added minified members.js file handling refs 91984b54cabac50d25cb7b6b3ffb356adcc59945 - For request effieciency we should be using a minified file just like we did previously with `ghost-sdk.js` - Modified 'max-age' caching header to 1 year for both minified and non-minified files as thay won't affect dev environment and should be beneficial for self-hosting instances that don't use minification - Along the way corrected an extra 301 redirect because `/public/member.js` path wasn't using a bakslach in the end. --- Gruntfile.js | 13 ++++++++++++- core/frontend/helpers/ghost_head.js | 2 +- core/server/public/members.js | 4 ++-- core/server/public/members.min.js | 2 +- core/server/services/members/middleware.js | 10 +++++++++- core/server/web/site/app.js | 2 ++ 6 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index fdd6f7b51c..da46bd1447 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -264,6 +264,17 @@ const configureGrunt = function (grunt) { } }, + uglify: { + prod: { + options: { + sourceMap: false + }, + files: { + 'core/server/public/members.min.js': 'core/server/public/members.js' + } + } + }, + cssnano: { prod: { options: { @@ -530,7 +541,7 @@ const configureGrunt = function (grunt) { // // It is otherwise the same as running `grunt`, but is only used when running Ghost in the `production` env. grunt.registerTask('prod', 'Build JS & templates for production', - ['subgrunt:prod', 'cssnano:prod', 'master-warn']); + ['subgrunt:prod', 'uglify:prod', 'cssnano:prod', 'master-warn']); // ### Live reload // `grunt dev` - build assets on the fly whilst developing diff --git a/core/frontend/helpers/ghost_head.js b/core/frontend/helpers/ghost_head.js index 531ec5b6d6..6dfdf6692a 100644 --- a/core/frontend/helpers/ghost_head.js +++ b/core/frontend/helpers/ghost_head.js @@ -50,7 +50,7 @@ function getMembersHelper() { const stripeSecretToken = stripePaymentProcessor.config.secret_token; const stripePublicToken = stripePaymentProcessor.config.public_token; - let membersHelper = ``; + let membersHelper = ``; if (!!stripeSecretToken && stripeSecretToken !== '' && !!stripePublicToken && stripePublicToken !== '') { membersHelper += ''; } diff --git a/core/server/public/members.js b/core/server/public/members.js index 17f8fb5571..79ebe49e1f 100644 --- a/core/server/public/members.js +++ b/core/server/public/members.js @@ -232,7 +232,7 @@ Array.prototype.forEach.call(document.querySelectorAll('[data-members-cancel-sub return res.text(); }).then(function (identity) { - return fetch(`{{admin-url}}/api/canary/members/subscriptions/${subscriptionId}/`, { + return fetch('{{admin-url}}/api/canary/members/subscriptions/' + subscriptionId + '/', { method: 'PUT', headers: { 'Content-Type': 'application/json' @@ -282,7 +282,7 @@ Array.prototype.forEach.call(document.querySelectorAll('[data-members-continue-s return res.text(); }).then(function (identity) { - return fetch(`{{admin-url}}/api/canary/members/subscriptions/${subscriptionId}/`, { + return fetch('{{admin-url}}/api/canary/members/subscriptions/' + subscriptionId + '/', { method: 'PUT', headers: { 'Content-Type': 'application/json' diff --git a/core/server/public/members.min.js b/core/server/public/members.min.js index beb17e89b3..915751dbbb 100644 --- a/core/server/public/members.min.js +++ b/core/server/public/members.min.js @@ -1 +1 @@ -Array.prototype.forEach.call(document.querySelectorAll("form[data-members-form]"),function(form){var errorEl=form.querySelector("[data-members-error]");function submitHandler(event){form.removeEventListener("submit",submitHandler);event.preventDefault();if(errorEl){errorEl.innerText=""}form.classList.remove("success","invalid","error");var input=event.target.querySelector("input[data-members-email]");var email=input.value;if(!email.includes("@")){form.classList.add("invalid");form.addEventListener("submit",submitHandler);return}form.classList.add("loading");fetch("{{admin-url}}/api/canary/members/send-magic-link/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:email})}).then(function(res){form.addEventListener("submit",submitHandler);form.classList.remove("loading");if(res.ok){form.classList.add("success")}else{if(errorEl){errorEl.innerText="There was an error sending the email, please try again"}form.classList.add("error")}})}form.addEventListener("submit",submitHandler)});Array.prototype.forEach.call(document.querySelectorAll("[data-members-plan]"),function(el){var errorEl=el.querySelector("[data-members-error]");function clickHandler(event){el.removeEventListener("click",clickHandler);event.preventDefault();var plan=el.dataset.membersPlan;if(errorEl){errorEl.innerText=""}el.classList.add("loading");fetch("{{blog-url}}/members/ssr",{credentials:"same-origin"}).then(function(res){if(!res.ok){throw new Error("Could not get identity token")}return res.text()}).then(function(identity){return fetch("{{admin-url}}/api/canary/members/create-stripe-checkout-session/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({plan:plan,identity:identity})}).then(function(res){if(!res.ok){throw new Error("Could not create stripe checkout session")}return res.json()})}).then(function(result){var stripe=Stripe(result.publicKey);return stripe.redirectToCheckout({sessionId:result.sessionId})}).then(function(result){if(result.error){throw new Error(result.error.message)}}).catch(function(err){console.error(err);el.addEventListener("click",clickHandler);el.classList.remove("loading");if(errorEl){errorEl.innerText=err.message}el.classList.add("error")})}el.addEventListener("click",clickHandler)});Array.prototype.forEach.call(document.querySelectorAll("[data-members-signout]"),function(el){function clickHandler(event){el.removeEventListener("click",clickHandler);event.preventDefault();el.classList.remove("error");el.classList.add("loading");fetch("{{blog-url}}/members/ssr",{method:"DELETE"}).then(function(res){if(res.ok){window.location.reload()}else{el.addEventListener("click",clickHandler);el.classList.remove("loading");el.classList.add("error")}})}el.addEventListener("click",clickHandler)});var magicLinkRegEx=/token=([a-zA-Z0-9_\-]+\.[a-zA-Z0-9_\-]+\.[a-zA-Z0-9_\-]+)/;var match=location.search.match(magicLinkRegEx);var isMagicLink=!!match;var token=match&&match[1];if(isMagicLink){fetch("{{blog-url}}/members/ssr",{method:"POST",body:token}).then(function(res){if(res.ok){window.location.search=window.location.search.replace(magicLinkRegEx,"")}})} +Array.prototype.forEach.call(document.querySelectorAll("form[data-members-form]"),function(i){var c=i.querySelector("[data-members-error]");i.addEventListener("submit",function r(e){i.removeEventListener("submit",r),e.preventDefault(),c&&(c.innerText=""),i.classList.remove("success","invalid","error");for(var t=e.target.querySelector("input[data-members-email]").value,n=void 0,a=[],o=e.target.querySelectorAll("input[data-members-label]")||[],s=0;s