ghost 3.42.4 → 3.42.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/built/assets/{ghost.min-4afc9844644b2b1c1f0461f106592e9c.js → ghost.min-c2286c1da1671730ae28b70205449d2f.js} +39 -31
- package/core/frontend/helpers/ghost_head.js +1 -1
- package/core/frontend/helpers/url.js +6 -1
- package/core/server/api/canary/config.js +2 -1
- package/core/server/api/canary/settings.js +9 -3
- package/core/server/api/v2/settings.js +9 -2
- package/core/server/api/v3/config.js +2 -1
- package/core/server/api/v3/settings.js +9 -3
- package/core/server/services/oembed.js +6 -0
- package/core/server/services/settings/index.js +21 -1
- package/core/server/web/admin/controller.js +11 -0
- package/core/server/web/admin/views/default-prod.html +1 -1
- package/core/server/web/admin/views/default.html +1 -1
- package/core/server/web/members/app.js +1 -0
- package/core/server/web/site/middleware/handle-image-sizes.js +8 -1
- package/package.json +2 -2
- package/yarn.lock +4 -4
|
@@ -90,10 +90,17 @@ super(...arguments),e=this,t="dropdown",s=this,(n=a)&&Object.defineProperty(e,t,
|
|
|
90
90
|
var l,d,u,m,c,p,h=Ember._setComponentTemplate(i,o)
|
|
91
91
|
e.default=h})),define("ghost-admin/components/gh-billing-iframe",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
92
92
|
const t=Ember.HTMLBars.template({id:"cEwCQjwt",block:'{"symbols":[],"statements":[[10,"iframe"],[14,1,"billing-frame"],[14,0,"billing-frame"],[14,"frameborder","0"],[12],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-billing-iframe.hbs"}})
|
|
93
|
-
var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),didInsertElement(){
|
|
94
|
-
|
|
95
|
-
this.
|
|
96
|
-
|
|
93
|
+
var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),ajax:Ember.inject.service(),notifications:Ember.inject.service(),isOwner:null,didInsertElement(){this._super(...arguments)
|
|
94
|
+
let e=!1
|
|
95
|
+
this.billing.getBillingIframe().src=this.billing.getIframeURL(),window.addEventListener("message",(t=>{let n
|
|
96
|
+
if(t&&t.data&&"token"===t.data.request){const t=this.get("ghostPaths.url").api("identities")
|
|
97
|
+
this.ajax.request(t).then((e=>{n=e&&e.identities&&e.identities[0]&&e.identities[0].token,this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:n},"*"),this.set("isOwner",!0)})).catch((e=>{var t,n
|
|
98
|
+
if(null===(t=e.payload)||void 0===t||!t.errors||"NoPermissionError"!==(null===(n=e.payload.errors[0])||void 0===n?void 0:n.type))throw e
|
|
99
|
+
this.set("isOwner",!1),this.billing.getBillingIframe().contentWindow.postMessage({request:"token",response:null},"*")})),e||this.billing.get("subscription")||!n||(e=!0,this.billing.getBillingIframe().contentWindow.postMessage({query:"getSubscription",response:"subscription"},"*"))}if(t&&t.data&&"forceUpgradeInfo"===t.data.request){let e=null
|
|
100
|
+
const t=this.billing.get("ownerUser")
|
|
101
|
+
t&&(e={name:t.get("name"),email:t.get("email")}),this.billing.getBillingIframe().contentWindow.postMessage({request:"forceUpgradeInfo",response:{forceUpgrade:this.config.get("forceUpgrade"),isOwner:this.get("isOwner"),ownerUser:e}},"*")}var s,a,r,i,o
|
|
102
|
+
if(t&&t.data&&t.data.subscription)if(this.billing.set("subscription",t.data.subscription),this.billing.set("checkoutRoute",(null===(s=t.data)||void 0===s?void 0:s.checkoutRoute)||"/plans"),"active"===t.data.subscription.status&&this.config.get("forceUpgrade")&&this.config.set("forceUpgrade",!1),"past_due"===t.data.subscription.status||"unpaid"===t.data.subscription.status?this.notifications.showAlert("Billing error: This site is queued for suspension. The owner of this site must update payment information.",{type:"error",key:"billing.overdue"}):this.notifications.closeAlerts("billing.overdue"),null!==(a=t.data)&&void 0!==a&&a.exceededLimits&&null!==(r=t.data)&&void 0!==r&&r.exceededLimits.length&&(null===(i=t.data)||void 0===i?void 0:i.exceededLimits.indexOf("members"))>=0&&null!==(o=t.data)&&void 0!==o&&o.checkoutRoute){const e=this.billing.get("billingRouteRoot")+"?action=checkout"
|
|
103
|
+
this.notifications.showAlert(Ember.String.htmlSafe(`Your audience has grown! To continue publishing, the site owner must confirm pricing for this number of members <a href="${e}">here</a>`),{type:"warn",key:"billing.exceeded"})}else this.notifications.closeAlerts("billing.exceeded")}))}}))
|
|
97
104
|
e.default=n})),define("ghost-admin/components/gh-billing-modal",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
98
105
|
const t=Ember.HTMLBars.template({id:"UTF+FkW9",block:'{"symbols":[],"statements":[[10,"div"],[15,0,[31,[[32,0,["visibilityClass"]]]]],[12],[2,"\\n "],[10,"div"],[14,0,"gh-billing-container"],[12],[2,"\\n\\n "],[8,"gh-billing-iframe",[],[[],[]],[["default"],[{"statements":[],"parameters":[]}]]],[2,"\\n "],[13],[2,"\\n"],[13]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-billing-modal.hbs"}})
|
|
99
106
|
var n=Ember._setComponentTemplate(t,Ember.Component.extend({billing:Ember.inject.service(),visibilityClass:Ember.computed("billing.billingWindowOpen",(function(){return this.billing.get("billingWindowOpen")?"gh-billing":"gh-billing closed"})),didInsertElement(){this._super(...arguments),this._setupShortcuts()},willDestroyElement(){this._super(...arguments),this._removeShortcuts()},_setupShortcuts(){Ember.run((function(){document.activeElement.blur()})),this._previousKeymasterScope=key.getScope(),key("enter","modal",(()=>{this.send("confirm")})),key.setScope("modal")},_removeShortcuts(){key.unbind("enter","modal"),key.setScope(this._previousKeymasterScope)}}))
|
|
@@ -676,8 +683,8 @@ return this.get("clock.second"),e?(0,t.default)().tz(e).format("HH:mm:ss"):(0,t.
|
|
|
676
683
|
e.default=s})),define("ghost-admin/components/gh-token-input",["exports","ghost-admin/utils/computed-fallback-if-undefined","ember-power-select/utils/group-utils","@ember-decorators/component","ember-concurrency"],(function(e,t,n,s,a){var r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A
|
|
677
684
|
function D(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function I(e,t,n,s,a){var r={}
|
|
678
685
|
return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
679
|
-
const
|
|
680
|
-
let
|
|
686
|
+
const U=Ember.HTMLBars.template({id:"DRFngbBr",block:'{"symbols":["option","@class","@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matchTriggerWidth","@noMatchesMessage","@onClose","@onInput","@onOpen","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerId","@verticalPosition","@tabindex"],"statements":[[8,"gh-token-input/select-multiple",[[16,0,[30,[36,1],["gh-token-input ",[32,2]],null]]],[["@triggerRole","@ariaDescribedBy","@ariaInvalid","@ariaLabel","@ariaLabelledBy","@afterOptionsComponent","@allowClear","@beforeOptionsComponent","@buildSelection","@calculatePosition","@closeOnSelect","@defaultHighlighted","@destination","@disabled","@dropdownClass","@extra","@groupComponent","@horizontalPosition","@initiallyOpened","@loadingMessage","@matcher","@matchTriggerWidth","@noMatchesMessage","@onBlur","@onChange","@onClose","@onFocus","@onInput","@onKeydown","@onOpen","@options","@optionsComponent","@placeholder","@placeholderComponent","@preventScroll","@registerAPI","@renderInPlace","@required","@scrollTo","@search","@searchEnabled","@searchField","@searchMessage","@searchPlaceholder","@selected","@selectedItemComponent","@eventType","@title","@triggerClass","@triggerComponent","@triggerId","@verticalPosition","@tabindex"],[[32,3],[32,4],[32,5],[32,6],[32,7],[32,8],[32,9],[32,10],[32,11],[32,12],[32,0,["closeOnSelect"]],[32,0,["defaultHighlighted"]],[32,13],[32,14],[32,15],[32,16],[32,17],[32,18],[32,19],[32,20],[32,0,["matcher"]],[32,21],[32,22],[32,0,["handleBlur"]],[32,0,["selectOrCreate"]],[32,23],[32,0,["handleFocus"]],[32,24],[32,0,["handleKeydown"]],[32,25],[32,0,["optionsWithoutSelected"]],[32,0,["optionsComponent"]],[32,26],[32,27],[32,28],[32,29],[32,30],[32,31],[32,32],[32,0,["searchAndSuggest"]],true,[32,0,["searchField"]],[32,33],[32,34],[32,35],[32,36],[32,37],[32,38],[32,39],[32,0,["triggerComponent"]],[32,40],[32,41],[32,42]]],[["default"],[{"statements":[[2,"\\n"],[6,[37,2],[[32,1,["__isSuggestion__"]]],null,[["default","else"],[{"statements":[[2," "],[8,"gh-token-input/suggested-option",[],[["@option"],[[32,1]]],null],[2,"\\n"]],"parameters":[]},{"statements":[[2," "],[1,[30,[36,0],[[32,1],[32,0,["labelField"]]],null]],[2,"\\n"]],"parameters":[]}]]]],"parameters":[1]}]]]],"hasEval":false,"upvars":["get","concat","if"]}',meta:{moduleName:"ghost-admin/components/gh-token-input.hbs"}}),{Handlebars:N}=Ember
|
|
687
|
+
let R=(r=(0,s.tagName)(""),i=(0,t.default)(!0),o=(0,t.default)(!1),l=(0,t.default)("name"),d=(0,t.default)(n.defaultMatcher),u=(0,t.default)("name"),m=(0,t.default)("gh-token-input/trigger"),c=(0,t.default)("power-select-vertical-collection-options"),p=Ember.computed("options.[]","selected.[]"),h=Ember._action,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=(0,a.task)((function*(){let e=yield this.options,t=yield this.selected
|
|
681
688
|
return e.filter((e=>!t.includes(e)))})),w=(0,a.task)((function*(e,t){let n=(yield this.optionsWithoutSelected).toArray()
|
|
682
689
|
if(0===e.length)return n
|
|
683
690
|
let s=this.search
|
|
@@ -690,9 +697,9 @@ let s=e.find((e=>e.__isSuggestion__))
|
|
|
690
697
|
s?this.onCreate(s.__value__,t):this.onChange(e,t),t.actions.search("")}defaultHighlighted(e){let{results:t}=e,s=(0,n.advanceSelectableOption)(t,void 0,1)
|
|
691
698
|
return t.length>1&&s.__isSuggestion__&&(s=(0,n.advanceSelectableOption)(t,s,1)),s}_addCreateOption(e,t){this._shouldShowCreateOption(e,t)&&t.unshift(this._buildSuggestionForTerm(e))}_shouldShowCreateOption(e,t){return!!this.allowCreation&&(this.showCreateWhen?this.showCreateWhen(e,t):this._hideCreateOptionOnSameTerm(e,t))}_buildSuggestionForTerm(e){return{__isSuggestion__:!0,__value__:e,text:this._buildSuggestionLabel(e)}}_hideCreateOptionOnSameTerm(e,t){let n=this.searchField
|
|
692
699
|
return!t.findBy(n,e)}_filter(e,t){let s
|
|
693
|
-
return s=this.searchField?(e,t)=>this.matcher(Ember.get(e,this.searchField),t):(e,t)=>this.matcher(e,t),(0,n.filterOptions)(e||[],t,s)}_buildSuggestionLabel(e){return this.buildSuggestion?this.buildSuggestion(e):Ember.String.htmlSafe(`Add <strong>"${
|
|
694
|
-
var
|
|
695
|
-
e.default=
|
|
700
|
+
return s=this.searchField?(e,t)=>this.matcher(Ember.get(e,this.searchField),t):(e,t)=>this.matcher(e,t),(0,n.filterOptions)(e||[],t,s)}_buildSuggestionLabel(e){return this.buildSuggestion?this.buildSuggestion(e):Ember.String.htmlSafe(`Add <strong>"${N.Utils.escapeExpression(e)}"...</strong>`)}},k=I((_=A).prototype,"allowCreation",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),x=I(_.prototype,"closeOnSelect",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=I(_.prototype,"labelField",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=I(_.prototype,"matcher",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=I(_.prototype,"searchField",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=I(_.prototype,"triggerComponent",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=I(_.prototype,"optionsComponent",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),I(_.prototype,"optionsWithoutSelected",[p],Object.getOwnPropertyDescriptor(_.prototype,"optionsWithoutSelected"),_.prototype),I(_.prototype,"handleKeydown",[h],Object.getOwnPropertyDescriptor(_.prototype,"handleKeydown"),_.prototype),I(_.prototype,"handleFocus",[g],Object.getOwnPropertyDescriptor(_.prototype,"handleFocus"),_.prototype),I(_.prototype,"handleBlur",[f],Object.getOwnPropertyDescriptor(_.prototype,"handleBlur"),_.prototype),I(_.prototype,"searchAndSuggest",[b],Object.getOwnPropertyDescriptor(_.prototype,"searchAndSuggest"),_.prototype),I(_.prototype,"selectOrCreate",[v],Object.getOwnPropertyDescriptor(_.prototype,"selectOrCreate"),_.prototype),O=I(_.prototype,"optionsWithoutSelectedTask",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=I(_.prototype,"searchAndSuggestTask",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),E=_))||E)
|
|
701
|
+
var z=Ember._setComponentTemplate(U,R)
|
|
702
|
+
e.default=z})),define("ghost-admin/components/gh-token-input/label-token",["exports","ember-drag-drop/components/draggable-object"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
696
703
|
const n=Ember.HTMLBars.template({id:"PKCFtPBX",block:'{"symbols":["&default"],"statements":[[18,1,null],[2,"\\n"]],"hasEval":false,"upvars":[]}',meta:{moduleName:"ghost-admin/components/gh-token-input/label-token.hbs"}})
|
|
697
704
|
var s=Ember._setComponentTemplate(n,t.default.extend({attributeBindings:["title"],classNames:["label-token"],title:"Label"}))
|
|
698
705
|
e.default=s})),define("ghost-admin/components/gh-token-input/select-multiple",["exports","jquery","ember-power-select/components/power-select-multiple","@ember-decorators/component"],(function(e,t,n,s){var a,r,i,o,l,d
|
|
@@ -1120,25 +1127,25 @@ var t=Ember.Controller.extend({ui:Ember.inject.service()})
|
|
|
1120
1127
|
e.default=t})),define("ghost-admin/controllers/error",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1121
1128
|
var t=Ember.Controller.extend({stack:!1,error:Ember.computed.readOnly("model"),code:Ember.computed("error.status",(function(){return this.get("error.status")>200?this.get("error.status"):500})),message:Ember.computed("error.statusText",(function(){return 404===this.code?"Page not found":"error"!==this.get("error.statusText")?this.get("error.statusText"):"Internal Server Error"}))})
|
|
1122
1129
|
e.default=t}))
|
|
1123
|
-
define("ghost-admin/controllers/member",["exports","ghost-admin/utils/bound-one-way","moment","ember-concurrency-decorators"],(function(e,t,n,s){var a,r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,
|
|
1124
|
-
function
|
|
1130
|
+
define("ghost-admin/controllers/member",["exports","ghost-admin/utils/bound-one-way","moment","ember-concurrency-decorators"],(function(e,t,n,s){var a,r,i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,U
|
|
1131
|
+
function N(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function R(e,t,n,s,a){var r={}
|
|
1125
1132
|
return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1126
|
-
const
|
|
1127
|
-
let L=(a=Ember.inject.controller,r=Ember.inject.service,i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember._tracked,c=Ember._tracked,p=Ember._tracked,h=Ember._tracked,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=Ember._action,w=Ember._action,E=Ember._action,_=(0,s.task)({drop:!0}),
|
|
1128
|
-
return
|
|
1133
|
+
const z=["name","email","note"]
|
|
1134
|
+
let L=(a=Ember.inject.controller,r=Ember.inject.service,i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember._tracked,c=Ember._tracked,p=Ember._tracked,h=Ember._tracked,g=Ember._action,f=Ember._action,b=Ember._action,v=Ember._action,y=Ember._action,w=Ember._action,E=Ember._action,_=(0,s.task)({drop:!0}),U=class extends Ember.Controller{constructor(...e){super(...e),N(this,"members",x,this),N(this,"session",P,this),N(this,"dropdown",j,this),N(this,"membersStats",T,this),N(this,"notifications",M,this),N(this,"router",S,this),N(this,"store",O,this),N(this,"isLoading",C,this),N(this,"showDeleteMemberModal",A,this),N(this,"showImpersonateMemberModal",D,this),N(this,"showUnsavedChangesModal",I,this),function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"leaveScreenTransition",null)}get member(){return this.model}set member(e){this.model=e}get scratchMember(){let e=Ember.Object.create({member:this.member})
|
|
1135
|
+
return z.forEach((n=>Ember.defineProperty(e,n,(0,t.default)(`member.${n}`)))),e}get subscribedAt(){let e=(0,n.default)(this.member.get("createdAtUTC")).from((0,n.default)())
|
|
1129
1136
|
return`${(0,n.default)(this.member.get("createdAtUTC")).format("D MMM YYYY")} (${e})`}setProperty(e,t){this._saveMemberProperty(e,t)}toggleDeleteMemberModal(){this.showDeleteMemberModal=!this.showDeleteMemberModal}toggleImpersonateMemberModal(){this.showImpersonateMemberModal=!this.showImpersonateMemberModal}save(){return this.saveTask.perform()}deleteMember(e=!1){let t={adapterOptions:{cancel:e}}
|
|
1130
1137
|
return this.member.destroyRecord(t).then((()=>(this.members.refreshData(),this.transitionToRoute("members"))),(e=>this.notifications.showAPIError(e,{key:"member.delete"})))}toggleUnsavedChangesModal(e){let t=this.leaveScreenTransition
|
|
1131
1138
|
if(!e&&this.showUnsavedChangesModal)return this.leaveScreenTransition=null,void(this.showUnsavedChangesModal=!1)
|
|
1132
1139
|
if(!t||e.targetName===t.targetName){if(this.leaveScreenTransition=e,this.save.isRunning)return this.save.last.then((()=>{e.retry()}))
|
|
1133
|
-
this.showUnsavedChangesModal=!0}}leaveScreen(){return this.member.rollbackAttributes(),this.leaveScreenTransition.retry()}*saveTask(){let{member:e,scratchMember:t}=this,n=t.getProperties(
|
|
1140
|
+
this.showUnsavedChangesModal=!0}}leaveScreen(){return this.member.rollbackAttributes(),this.leaveScreenTransition.retry()}*saveTask(){let{member:e,scratchMember:t}=this,n=t.getProperties(z)
|
|
1134
1141
|
e.setProperties(n)
|
|
1135
1142
|
try{return yield e.save(),e.updateLabels(),this.members.refreshData(),this.replaceRoute("member",e),e}catch(s){s&&this.notifications.showAPIError(s,{key:"member.save"})}}*fetchMemberTask(e){this.isLoading=!0,this.member=yield this.store.findRecord("member",e,{reload:!0}),this.isLoading=!1}_saveMemberProperty(e,t){let n=this.member.get(e)
|
|
1136
|
-
t&&(t=t.trim()),(!1===t||t||n)&&this.member.set(e,t)}},x=
|
|
1137
|
-
e.default=L})),define("ghost-admin/controllers/members",["exports","ghost-admin/utils/ghost-paths","moment","ghost-admin/helpers/gh-pluralize","ember-concurrency-decorators","ember-concurrency"],(function(e,t,n,s,a,r){var i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,N,
|
|
1143
|
+
t&&(t=t.trim()),(!1===t||t||n)&&this.member.set(e,t)}},x=R((k=U).prototype,"members",[a],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),P=R(k.prototype,"session",[r],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),j=R(k.prototype,"dropdown",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),T=R(k.prototype,"membersStats",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),M=R(k.prototype,"notifications",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),S=R(k.prototype,"router",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),O=R(k.prototype,"store",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),C=R(k.prototype,"isLoading",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),A=R(k.prototype,"showDeleteMemberModal",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),D=R(k.prototype,"showImpersonateMemberModal",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),I=R(k.prototype,"showUnsavedChangesModal",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),R(k.prototype,"setProperty",[g],Object.getOwnPropertyDescriptor(k.prototype,"setProperty"),k.prototype),R(k.prototype,"toggleDeleteMemberModal",[f],Object.getOwnPropertyDescriptor(k.prototype,"toggleDeleteMemberModal"),k.prototype),R(k.prototype,"toggleImpersonateMemberModal",[b],Object.getOwnPropertyDescriptor(k.prototype,"toggleImpersonateMemberModal"),k.prototype),R(k.prototype,"save",[v],Object.getOwnPropertyDescriptor(k.prototype,"save"),k.prototype),R(k.prototype,"deleteMember",[y],Object.getOwnPropertyDescriptor(k.prototype,"deleteMember"),k.prototype),R(k.prototype,"toggleUnsavedChangesModal",[w],Object.getOwnPropertyDescriptor(k.prototype,"toggleUnsavedChangesModal"),k.prototype),R(k.prototype,"leaveScreen",[E],Object.getOwnPropertyDescriptor(k.prototype,"leaveScreen"),k.prototype),R(k.prototype,"saveTask",[_],Object.getOwnPropertyDescriptor(k.prototype,"saveTask"),k.prototype),R(k.prototype,"fetchMemberTask",[s.task],Object.getOwnPropertyDescriptor(k.prototype,"fetchMemberTask"),k.prototype),k)
|
|
1144
|
+
e.default=L})),define("ghost-admin/controllers/members",["exports","ghost-admin/utils/ghost-paths","moment","ghost-admin/helpers/gh-pluralize","ember-concurrency-decorators","ember-concurrency"],(function(e,t,n,s,a,r){var i,o,l,d,u,m,c,p,h,g,f,b,v,y,w,E,_,k,x,P,j,T,M,S,O,C,A,D,I,U,N,R,z,L,B,V,F,H,q,$,W,K,Y,G,J,Z,Q,X,ee,te
|
|
1138
1145
|
function ne(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function se(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ae(e,t,n,s,a){var r={}
|
|
1139
1146
|
return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1140
1147
|
const re=[{name:"All members",value:null},{name:"Free members",value:"false"},{name:"Paid members",value:"true"}]
|
|
1141
|
-
let ie=(i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember.inject.service,c=Ember.inject.service,p=Ember._tracked,h=Ember._tracked,g=Ember._tracked,f=Ember._tracked,b=Ember._tracked,v=Ember._tracked,y=Ember._tracked,w=Ember._tracked,E=Ember._tracked,_=Ember._tracked,k=Ember._action,x=Ember._action,P=Ember._action,j=Ember._action,T=Ember._action,M=Ember._action,S=Ember._action,O=Ember._action,C=Ember._action,A=Ember._action,D=Ember._action,I=(0,a.task)({restartable:!0}),
|
|
1148
|
+
let ie=(i=Ember.inject.service,o=Ember.inject.service,l=Ember.inject.service,d=Ember.inject.service,u=Ember.inject.service,m=Ember.inject.service,c=Ember.inject.service,p=Ember._tracked,h=Ember._tracked,g=Ember._tracked,f=Ember._tracked,b=Ember._tracked,v=Ember._tracked,y=Ember._tracked,w=Ember._tracked,E=Ember._tracked,_=Ember._tracked,k=Ember._action,x=Ember._action,P=Ember._action,j=Ember._action,T=Ember._action,M=Ember._action,S=Ember._action,O=Ember._action,C=Ember._action,A=Ember._action,D=Ember._action,I=(0,a.task)({restartable:!0}),U=(0,a.task)({restartable:!0}),N=(0,a.task)({drop:!0}),te=class extends Ember.Controller{constructor(){super(...arguments),ne(this,"ajax",z,this),ne(this,"config",L,this),ne(this,"ellaSparse",B,this),ne(this,"feature",V,this),ne(this,"ghostPaths",F,this),ne(this,"membersStats",H,this),ne(this,"store",q,this),se(this,"queryParams",["label",{paidParam:"paid"},{searchParam:"search"},{orderParam:"order"}]),ne(this,"members",$,this),ne(this,"searchText",W,this),ne(this,"searchParam",K,this),ne(this,"paidParam",Y,this),ne(this,"label",G,this),ne(this,"orderParam",J,this),ne(this,"modalLabel",Z,this),ne(this,"showLabelModal",Q,this),ne(this,"showDeleteMembersModal",X,this),ne(this,"_availableLabels",ee,this),se(this,"paidParams",re),this._availableLabels=this.store.peekAll("label")}get listHeader(){let{searchText:e,selectedLabel:t,members:n}=this
|
|
1142
1149
|
if(n.loading)return"Loading..."
|
|
1143
1150
|
if(e)return"Search result"
|
|
1144
1151
|
let a=(0,s.ghPluralize)(n.length,"member")
|
|
@@ -1157,7 +1164,7 @@ let i=new Date,o=!e||t!==this._lastLabel||s!==this._lastPaidParam||a!==this._las
|
|
|
1157
1164
|
if(this._lastLabel=t,this._lastPaidParam=s,this._lastSearchParam=a,this._lastOrderParam=r,!o&&this._startDate&&!(this._startDate-i>6e4))return this.members
|
|
1158
1165
|
this._startDate=i,this.members=yield this.ellaSparse.array(((e={},i={})=>{const o=t?`label:'${t}'+`:"",l=s?{paid:s}:{},d=a?{search:a}:{},u=r?`${r} desc`:"created_at desc"
|
|
1159
1166
|
return i=Object.assign({order:u,limit:e.length,page:e.page,filter:`${o}created_at:<='${n.default.utc(this._startDate).format("YYYY-MM-DD HH:mm:ss")}'`},l,d,i),this.store.query("member",i).then((e=>({data:e,total:e.meta.pagination.total})))}),{limit:50})}*deleteMembersTask(){let{label:e,paidParam:t,searchParam:n}=this,s=e?`label:${e}`:"",a=t?{paid:t}:{},r=n?{search:n}:{},i=e||t||n?{}:{all:!0},o=new URLSearchParams(Object.assign({},{filter:s},a,r,i)),l=`${this.ghostPaths.url.api("members")}?${o}`,d=yield this.ajax.del(l)
|
|
1160
|
-
return this.store.unloadAll("member"),this.reload(),d.meta.stats}resetSearch(){this.searchText=""}reload(){this.membersStats.invalidate(),this.membersStats.fetch(),this.fetchMembersTask.perform()}},
|
|
1167
|
+
return this.store.unloadAll("member"),this.reload(),d.meta.stats}resetSearch(){this.searchText=""}reload(){this.membersStats.invalidate(),this.membersStats.fetch(),this.fetchMembersTask.perform()}},z=ae((R=te).prototype,"ajax",[i],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),L=ae(R.prototype,"config",[o],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),B=ae(R.prototype,"ellaSparse",[l],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),V=ae(R.prototype,"feature",[d],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),F=ae(R.prototype,"ghostPaths",[u],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),H=ae(R.prototype,"membersStats",[m],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),q=ae(R.prototype,"store",[c],{configurable:!0,enumerable:!0,writable:!0,initializer:null}),$=ae(R.prototype,"members",[p],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),W=ae(R.prototype,"searchText",[h],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),K=ae(R.prototype,"searchParam",[g],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return""}}),Y=ae(R.prototype,"paidParam",[f],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),G=ae(R.prototype,"label",[b],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),J=ae(R.prototype,"orderParam",[v],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Z=ae(R.prototype,"modalLabel",[y],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return null}}),Q=ae(R.prototype,"showLabelModal",[w],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),X=ae(R.prototype,"showDeleteMembersModal",[E],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return!1}}),ee=ae(R.prototype,"_availableLabels",[_],{configurable:!0,enumerable:!0,writable:!0,initializer:function(){return Ember.A([])}}),ae(R.prototype,"refreshData",[k],Object.getOwnPropertyDescriptor(R.prototype,"refreshData"),R.prototype),ae(R.prototype,"changeOrder",[x],Object.getOwnPropertyDescriptor(R.prototype,"changeOrder"),R.prototype),ae(R.prototype,"search",[P],Object.getOwnPropertyDescriptor(R.prototype,"search"),R.prototype),ae(R.prototype,"exportData",[j],Object.getOwnPropertyDescriptor(R.prototype,"exportData"),R.prototype),ae(R.prototype,"changeLabel",[T],Object.getOwnPropertyDescriptor(R.prototype,"changeLabel"),R.prototype),ae(R.prototype,"addLabel",[M],Object.getOwnPropertyDescriptor(R.prototype,"addLabel"),R.prototype),ae(R.prototype,"editLabel",[S],Object.getOwnPropertyDescriptor(R.prototype,"editLabel"),R.prototype),ae(R.prototype,"toggleLabelModal",[O],Object.getOwnPropertyDescriptor(R.prototype,"toggleLabelModal"),R.prototype),ae(R.prototype,"changePaidParam",[C],Object.getOwnPropertyDescriptor(R.prototype,"changePaidParam"),R.prototype),ae(R.prototype,"toggleDeleteMembersModal",[A],Object.getOwnPropertyDescriptor(R.prototype,"toggleDeleteMembersModal"),R.prototype),ae(R.prototype,"deleteMembers",[D],Object.getOwnPropertyDescriptor(R.prototype,"deleteMembers"),R.prototype),ae(R.prototype,"searchTask",[I],Object.getOwnPropertyDescriptor(R.prototype,"searchTask"),R.prototype),ae(R.prototype,"fetchLabelsTask",[a.task],Object.getOwnPropertyDescriptor(R.prototype,"fetchLabelsTask"),R.prototype),ae(R.prototype,"fetchMembersTask",[U],Object.getOwnPropertyDescriptor(R.prototype,"fetchMembersTask"),R.prototype),ae(R.prototype,"deleteMembersTask",[N],Object.getOwnPropertyDescriptor(R.prototype,"deleteMembersTask"),R.prototype),R)
|
|
1161
1168
|
e.default=ie})),define("ghost-admin/controllers/members/import",["exports","ghost-admin/helpers/reset-query-params"],(function(e,t){var n,s,a,r,i,o,l,d
|
|
1162
1169
|
function u(e,t,n,s){n&&Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:n.configurable,writable:n.writable,value:n.initializer?n.initializer.call(s):void 0})}function m(e,t,n,s,a){var r={}
|
|
1163
1170
|
return Object.keys(s).forEach((function(e){r[e]=s[e]})),r.enumerable=!!r.enumerable,r.configurable=!!r.configurable,("value"in r||r.initializer)&&(r.writable=!0),r=n.slice().reverse().reduce((function(n,s){return s(e,t,n)||n}),r),a&&void 0!==r.initializer&&(r.value=r.initializer?r.initializer.call(a):void 0,r.initializer=void 0),void 0===r.initializer&&(Object.defineProperty(e,t,r),r=null),r}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
@@ -1693,14 +1700,14 @@ var n=t.default.extend({buildRouteInfoMetadata:()=>({titleToken:"About"})})
|
|
|
1693
1700
|
e.default=n})),define("ghost-admin/routes/application",["exports","ember-simple-auth/mixins/application-route-mixin","ember-simple-auth/configuration","ghost-admin/mixins/shortcuts-route","ghost-admin/utils/ctrl-or-cmd","ghost-admin/utils/window-proxy","ember-ajax/errors","ghost-admin/services/ajax"],(function(e,t,n,s,a,r,i,o){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1694
1701
|
let l={esc:{action:"closeMenus",scope:"default"}}
|
|
1695
1702
|
l[`${a.default}+s`]={action:"save",scope:"all"}
|
|
1696
|
-
var d=Ember.Route.extend(t.default,s.default,{ajax:Ember.inject.service(),config:Ember.inject.service(),feature:Ember.inject.service(),ghostPaths:Ember.inject.service(),notifications:Ember.inject.service(),router:Ember.inject.service(),settings:Ember.inject.service(),tour:Ember.inject.service(),ui:Ember.inject.service(),whatsNew:Ember.inject.service(),shortcuts:l,routeAfterAuthentication:"home",init(){this._super(...arguments),this.router.on("routeDidChange",(()=>{this.notifications.displayDelayed()}))},beforeModel(){return this.config.fetchUnauthenticated()},afterModel(e,t){if(this._super(...arguments),this.get("session.isAuthenticated"))return this.set("appLoadTransition",t),t.send("loadServerNotifications"),Ember.RSVP.all([this.config.fetchAuthenticated(),this.feature.fetch(),this.settings.fetch(),this.tour.fetchViewed()]).then((e=>(this._appLoaded=!0,this.whatsNew.fetchLatest.perform(),e)))
|
|
1703
|
+
var d=Ember.Route.extend(t.default,s.default,{ajax:Ember.inject.service(),config:Ember.inject.service(),feature:Ember.inject.service(),ghostPaths:Ember.inject.service(),notifications:Ember.inject.service(),router:Ember.inject.service(),settings:Ember.inject.service(),tour:Ember.inject.service(),ui:Ember.inject.service(),whatsNew:Ember.inject.service(),billing:Ember.inject.service(),shortcuts:l,routeAfterAuthentication:"home",init(){this._super(...arguments),this.router.on("routeDidChange",(()=>{this.notifications.displayDelayed()}))},beforeModel(){return this.config.fetchUnauthenticated()},afterModel(e,t){if(this._super(...arguments),this.get("session.isAuthenticated"))return this.set("appLoadTransition",t),t.send("loadServerNotifications"),Ember.RSVP.all([this.config.fetchAuthenticated(),this.feature.fetch(),this.settings.fetch(),this.tour.fetchViewed()]).then((e=>(this._appLoaded=!0,this.whatsNew.fetchLatest.perform(),e)))
|
|
1697
1704
|
this._appLoaded=!0},actions:{closeMenus(){this.ui.closeMenus()},didTransition(){this.set("appLoadTransition",null),this.send("closeMenus")},signedIn(){this.notifications.clearAll(),this.send("loadServerNotifications",!0)},authorizationFailed(){r.default.replaceLocation(n.default.rootURL)},loadServerNotifications(e){this.get("session.isAuthenticated")&&this.get("session.user").then((t=>{t.get("isAuthorOrContributor")||this.store.findAll("notification",{reload:!0}).then((t=>{t.forEach((t=>{t.get("top")||t.get("custom")?this.notifications.handleNotification(t,e):this.upgradeStatus.handleUpgradeNotification(t)}))}))}))},save:function(){return this},error(e,t){if((0,i.isUnauthorizedError)(e))return!1
|
|
1698
1705
|
if((0,i.isNotFoundError)(e)){t&&t.abort()
|
|
1699
1706
|
let e=t.to,n=this.router,s=[]
|
|
1700
1707
|
for(let t of Object.keys(e.params))s.push(e.params[t])
|
|
1701
1708
|
let a=n.urlFor(e.name,...s).replace(/^#\//,"").replace(/^\//,"").replace(/^ghost\//,"")
|
|
1702
1709
|
return this.replaceWith("error404",a)}return(!(0,o.isVersionMismatchError)(e)||(t&&t.abort(),this.upgradeStatus.requireUpgrade(),!this._appLoaded))&&((!(0,o.isMaintenanceError)(e)||(t&&t.abort(),this.upgradeStatus.maintenanceAlert(),!this._appLoaded))&&!(((0,i.isAjaxError)(e)||e&&e.payload&&Ember.isArray(e.payload.errors))&&(this.notifications.showAPIError(e),!t)))}},sessionAuthenticated(){this.get("session.skipAuthSuccessHandler")||(this._super(...arguments),this.get("session.user").then((e=>{this.send("signedIn",e)})))},sessionInvalidated(){let e=this.appLoadTransition
|
|
1703
|
-
e?e.send("authorizationFailed"):Ember.run.scheduleOnce("routerTransitions",this,"send","authorizationFailed")}})
|
|
1710
|
+
e?e.send("authorizationFailed"):Ember.run.scheduleOnce("routerTransitions",this,"send","authorizationFailed"),this.config.get("forceUpgrade")&&this.billing.openBillingWindow(this.router.currentURL,"/pro")}})
|
|
1704
1711
|
e.default=d})),define("ghost-admin/routes/authenticated",["exports","ember-simple-auth/mixins/authenticated-route-mixin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1705
1712
|
var n=Ember.Route.extend(t.default,{authenticationRoute:"signin"})
|
|
1706
1713
|
e.default=n})),define("ghost-admin/routes/editor",["exports","jquery","ghost-admin/routes/authenticated","ghost-admin/mixins/shortcuts-route","ghost-admin/utils/ctrl-or-cmd"],(function(e,t,n,s,a){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
@@ -1756,10 +1763,10 @@ break
|
|
|
1756
1763
|
case"scheduled":t="scheduled"}return{status:t}},_filterString:e=>Object.keys(e).map((t=>{let n=e[t]
|
|
1757
1764
|
if(!Ember.isBlank(n))return`${t}:${e[t]}`})).compact().join("+")})
|
|
1758
1765
|
e.default=n})),define("ghost-admin/routes/pro",["exports","ghost-admin/routes/authenticated"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1759
|
-
var n=t.default.extend({billing:Ember.inject.service(),ui:Ember.inject.service(),queryParams:{action:{refreshModel:!0}},beforeModel(e){return this._super(...arguments),this.session.user.then((t=>{if(!t.isOwner)return this.transitionTo("home")
|
|
1760
|
-
this.billing.set("previousTransition",e)}))},model(e){e.action&&this.billing.set("action",e.action),this.billing.
|
|
1766
|
+
var n=t.default.extend({billing:Ember.inject.service(),ui:Ember.inject.service(),session:Ember.inject.service(),config:Ember.inject.service(),queryParams:{action:{refreshModel:!0}},beforeModel(e){return this._super(...arguments),this.session.user.then((t=>{if(!t.get("isOwner")&&!this.config.get("forceUpgrade"))return this.transitionTo("home")
|
|
1767
|
+
this.billing.set("previousTransition",e)}))},model(e){e.action&&this.billing.set("action",e.action),this.billing.toggleProWindow(!0)},activate(){this.ui.set("showTour",!1)},deactivate(){this.ui.set("showTour",!0)},actions:{willTransition(e){let t=!1
|
|
1761
1768
|
if(e){let n="string"==typeof e.to?e.to:e.intent?e.intent.url:""
|
|
1762
|
-
null!=n&&n.includes("/pro")&&(t=!0)}this.billing.
|
|
1769
|
+
null!=n&&n.includes("/pro")&&(t=!0)}this.billing.toggleProWindow(t)}},buildRouteInfoMetadata:()=>({titleToken:"Ghost(Pro)"})})
|
|
1763
1770
|
e.default=n})),define("ghost-admin/routes/reset",["exports","ghost-admin/mixins/unauthenticated-route-mixin"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1764
1771
|
var n=Ember.Route.extend(t.default,{notifications:Ember.inject.service(),session:Ember.inject.service(),beforeModel(){this.get("session.isAuthenticated")&&this.notifications.showAlert("You can't reset your password while you're signed in.",{type:"warn",delayed:!0,key:"password.reset.signed-in"}),this._super(...arguments)},setupController(e,t){e.token=t.token},deactivate(){this._super(...arguments),this.controller.clearData()},buildRouteInfoMetadata:()=>({bodyClasses:["unauthenticated-route"]})})
|
|
1765
1772
|
e.default=n})),define("ghost-admin/routes/settings/code-injection",["exports","ghost-admin/routes/authenticated","ghost-admin/mixins/current-user-settings"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
@@ -1934,13 +1941,13 @@ e&&(Ember.isArray(e)||(e=[e]),n.errors=e.map((function(e){return"string"==typeof
|
|
|
1934
1941
|
k.reopen({contentType:"application/json; charset=UTF-8"})
|
|
1935
1942
|
var x=k
|
|
1936
1943
|
e.default=x})),define("ghost-admin/services/billing",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1937
|
-
var t=Ember.Service.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),billingRouteRoot:"#/pro",billingWindowOpen:!1,subscription:null,previousRoute:null,init(){this._super(...arguments),this.config.get("billingUrl")&&window.addEventListener("message",(e=>{e&&e.data&&e.data.route&&this.handleRouteChangeInIframe(e.data.route)}))},handleRouteChangeInIframe(e){if(this.get("billingWindowOpen")){let t=this.get("billingRouteRoot")
|
|
1938
|
-
"/"!==e&&(t+=e),window.location.hash!==t&&window.history.replaceState(window.history.state,"",t)}},getIframeURL(){
|
|
1944
|
+
var t=Ember.Service.extend({router:Ember.inject.service(),config:Ember.inject.service(),ghostPaths:Ember.inject.service(),store:Ember.inject.service(),billingRouteRoot:"#/pro",billingWindowOpen:!1,subscription:null,previousRoute:null,action:null,ownerUser:null,init(){this._super(...arguments),this.config.get("billingUrl")&&window.addEventListener("message",(e=>{e&&e.data&&e.data.route&&this.handleRouteChangeInIframe(e.data.route)}))},handleRouteChangeInIframe(e){if(this.get("billingWindowOpen")){let t=this.get("billingRouteRoot")
|
|
1945
|
+
"/"!==e&&(t+=e),window.location.hash!==t&&window.history.replaceState(window.history.state,"",t)}},getIframeURL(){this.getOwnerUser()
|
|
1946
|
+
let e=this.config.get("billingUrl")
|
|
1939
1947
|
if(window.location.hash&&window.location.hash.includes(this.get("billingRouteRoot"))){let t=window.location.hash.replace(this.get("billingRouteRoot"),"")
|
|
1940
|
-
t&&(e+=t)}return e},
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
this.router.transitionTo(e)},getBillingIframe:()=>document.getElementById("billing-frame")})
|
|
1948
|
+
t&&(e+=t)}return e},async getOwnerUser(){if(!this.get("ownerUser")){let e=this.store.peekAll("user").findBy("isOwner",!0)
|
|
1949
|
+
e||(await this.store.findAll("user",{reload:!0}),e=this.store.peekAll("user").findBy("isOwner",!0)),this.set("ownerUser",e)}return this.get("ownerUser")},sendRouteUpdate(){const e=this.get("action")
|
|
1950
|
+
e&&("checkout"===e&&this.getBillingIframe().contentWindow.postMessage({query:"routeUpdate",response:this.get("checkoutRoute")},"*"),this.set("action",null))},toggleProWindow(e){this.get("billingWindowOpen")&&e&&!this.get("action")||(this.sendRouteUpdate(),this.set("billingWindowOpen",e))},openBillingWindow(e,t){this.getOwnerUser(),this.get("billingWindowOpen")||(this.set("previousRoute",e),window.location.hash=t||"/pro",this.sendRouteUpdate(),this.router.transitionTo(t||"/pro"))},getBillingIframe(){return this.getOwnerUser(),document.getElementById("billing-frame")}})
|
|
1944
1951
|
e.default=t})),define("ghost-admin/services/clock",["exports","ghost-admin/config/environment","moment"],(function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
1945
1952
|
var s=Ember.Service.extend({second:null,minute:null,hour:null,init(){this._super(...arguments),this.tick()},tick(){let e=(0,n.default)().utc()
|
|
1946
1953
|
this.setProperties({second:e.seconds(),minute:e.minutes(),hour:e.hours()}),"test"!==t.default.environment&&Ember.run.later((()=>{this.tick()}),1e3)}})
|
|
@@ -2311,7 +2318,8 @@ return i}
|
|
|
2311
2318
|
const t=/[aeiou]$/i,n=/[bcdfghjklmnpqrstvwxyz]$/i
|
|
2312
2319
|
function s(e,t){var n,a,r,i=new Uint8Array(t)
|
|
2313
2320
|
for(n in r=i,window.crypto.getRandomValues(r),i)if(Object.prototype.hasOwnProperty.call(i,n)&&(a=i[n])>e&&a<t)return a
|
|
2314
|
-
return s(e,t)}})),define("ghost-admin/utils/route",[],(function(){Ember.Route.reopen({actions:{willTransition(e){return
|
|
2321
|
+
return s(e,t)}})),define("ghost-admin/utils/route",[],(function(){Ember.Route.reopen({config:Ember.inject.service(),billing:Ember.inject.service(),router:Ember.inject.service(),actions:{willTransition(e){return this.get("upgradeStatus.isRequired")?(e.abort(),this.upgradeStatus.requireUpgrade(),!1):!this.config.get("forceUpgrade")||("pro.index"===(null===(t=e.to)||void 0===t?void 0:t.name)||"signout"===(null===(n=e.to)||void 0===n?void 0:n.name)||(e.abort(),this.billing.openBillingWindow(this.router.currentURL,"/pro"),!1))
|
|
2322
|
+
var t,n}}})})),define("ghost-admin/utils/titleize",["exports","ember-cli-string-helpers/utils/titleize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ghost-admin/utils/window-proxy",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
2315
2323
|
var t={changeLocation(e){window.location=e},replaceLocation(e){window.location.replace(e)},replaceState(e,t,n){window.history.replaceState(e,t,n)}}
|
|
2316
2324
|
e.default=t})),define("ghost-admin/validators/base",["exports"],(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
|
|
2317
2325
|
var t=Ember.Object.extend({passed:!1,init(){this._super(...arguments),this.properties=this.properties||[]},check(e,t){return this.set("passed",!0),t&&this[t]?this[t](e):this.properties.forEach((t=>{this[t]&&this[t](e)})),this.passed},invalidate(){this.set("passed",!1)}})
|
|
@@ -41,7 +41,7 @@ function getMembersHelper() {
|
|
|
41
41
|
const stripeDirectPublishableKey = settingsCache.get('stripe_publishable_key');
|
|
42
42
|
const stripeConnectAccountId = settingsCache.get('stripe_connect_account_id');
|
|
43
43
|
|
|
44
|
-
let membersHelper = `<script defer src="https://unpkg.com/@tryghost/portal@~0.
|
|
44
|
+
let membersHelper = `<script defer src="https://unpkg.com/@tryghost/portal@~0.16.0/umd/portal.min.js" data-ghost="${urlUtils.getSiteUrl()}"></script>`;
|
|
45
45
|
membersHelper += (`<style> ${templateStyles}</style>`);
|
|
46
46
|
if ((!!stripeDirectSecretKey && !!stripeDirectPublishableKey) || !!stripeConnectAccountId) {
|
|
47
47
|
membersHelper += '<script async src="https://js.stripe.com/v3/"></script>';
|
|
@@ -11,7 +11,12 @@ module.exports = function url(options) {
|
|
|
11
11
|
const absolute = options && options.hash.absolute && options.hash.absolute !== 'false';
|
|
12
12
|
let outputUrl = getMetaDataUrl(this, absolute);
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
try {
|
|
15
|
+
outputUrl = encodeURI(decodeURI(outputUrl));
|
|
16
|
+
} catch (err) {
|
|
17
|
+
// Happens when the outputURL contains an invalid URI character like "%%" or "%80"
|
|
18
|
+
return new SafeString('');
|
|
19
|
+
}
|
|
15
20
|
|
|
16
21
|
return new SafeString(outputUrl);
|
|
17
22
|
};
|
|
@@ -23,7 +23,8 @@ module.exports = {
|
|
|
23
23
|
enableDeveloperExperiments: config.get('enableDeveloperExperiments') || false,
|
|
24
24
|
stripeDirect: config.get('stripeDirect'),
|
|
25
25
|
mailgunIsConfigured: config.get('bulkEmail') && config.get('bulkEmail').mailgun,
|
|
26
|
-
emailAnalytics: config.get('emailAnalytics')
|
|
26
|
+
emailAnalytics: config.get('emailAnalytics'),
|
|
27
|
+
forceUpgrade: config.get('host_settings:forceUpgrade') || false
|
|
27
28
|
};
|
|
28
29
|
if (billingUrl) {
|
|
29
30
|
response.billingUrl = billingUrl;
|
|
@@ -26,12 +26,14 @@ module.exports = {
|
|
|
26
26
|
}));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
// CASE: omit core settings unless internal request
|
|
30
29
|
if (!frame.options.context.internal) {
|
|
30
|
+
// CASE: omit core settings unless internal request
|
|
31
31
|
settings = _.filter(settings, (setting) => {
|
|
32
32
|
const isCore = setting.group === 'core';
|
|
33
33
|
return !isCore;
|
|
34
34
|
});
|
|
35
|
+
// CASE: omit secret settings unless internal request
|
|
36
|
+
settings = settings.map(settingsService.hideValueIfSecret);
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
return settings;
|
|
@@ -70,6 +72,8 @@ module.exports = {
|
|
|
70
72
|
}));
|
|
71
73
|
}
|
|
72
74
|
|
|
75
|
+
setting = settingsService.hideValueIfSecret(setting);
|
|
76
|
+
|
|
73
77
|
return {
|
|
74
78
|
[frame.options.key]: setting
|
|
75
79
|
};
|
|
@@ -217,8 +221,8 @@ module.exports = {
|
|
|
217
221
|
async query(frame) {
|
|
218
222
|
const stripeConnectIntegrationToken = frame.data.settings.find(setting => setting.key === 'stripe_connect_integration_token');
|
|
219
223
|
|
|
220
|
-
// The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
|
|
221
224
|
const settings = frame.data.settings.filter((setting) => {
|
|
225
|
+
// The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
|
|
222
226
|
return ![
|
|
223
227
|
'stripe_connect_integration_token',
|
|
224
228
|
'stripe_connect_publishable_key',
|
|
@@ -226,7 +230,9 @@ module.exports = {
|
|
|
226
230
|
'stripe_connect_livemode',
|
|
227
231
|
'stripe_connect_account_id',
|
|
228
232
|
'stripe_connect_display_name'
|
|
229
|
-
].includes(setting.key)
|
|
233
|
+
].includes(setting.key)
|
|
234
|
+
// Remove obfuscated settings
|
|
235
|
+
&& !(setting.value === settingsService.obfuscatedSetting && settingsService.isSecretSetting(setting));
|
|
230
236
|
});
|
|
231
237
|
|
|
232
238
|
const getSetting = setting => settingsCache.get(setting.key, {resolve: false});
|
|
@@ -24,12 +24,14 @@ module.exports = {
|
|
|
24
24
|
}));
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
// CASE: omit core settings unless internal request
|
|
28
27
|
if (!frame.options.context.internal) {
|
|
28
|
+
// CASE: omit core settings unless internal request
|
|
29
29
|
settings = _.filter(settings, (setting) => {
|
|
30
30
|
const isCore = setting.group === 'core';
|
|
31
31
|
return !isCore;
|
|
32
32
|
});
|
|
33
|
+
// CASE: omit secret settings unless internal request
|
|
34
|
+
settings = settings.map(settingsService.hideValueIfSecret);
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
return settings;
|
|
@@ -68,6 +70,8 @@ module.exports = {
|
|
|
68
70
|
}));
|
|
69
71
|
}
|
|
70
72
|
|
|
73
|
+
setting = settingsService.hideValueIfSecret(setting);
|
|
74
|
+
|
|
71
75
|
return {
|
|
72
76
|
[frame.options.key]: setting
|
|
73
77
|
};
|
|
@@ -108,7 +112,10 @@ module.exports = {
|
|
|
108
112
|
}
|
|
109
113
|
|
|
110
114
|
frame.data.settings = _.reject(frame.data.settings, (setting) => {
|
|
111
|
-
return setting.key === 'type'
|
|
115
|
+
return setting.key === 'type'
|
|
116
|
+
// Remove obfuscated settings
|
|
117
|
+
|| (setting.value === settingsService.obfuscatedSetting
|
|
118
|
+
&& settingsService.isSecretSetting(setting));
|
|
112
119
|
});
|
|
113
120
|
|
|
114
121
|
const errors = [];
|
|
@@ -23,7 +23,8 @@ module.exports = {
|
|
|
23
23
|
enableDeveloperExperiments: config.get('enableDeveloperExperiments') || false,
|
|
24
24
|
stripeDirect: config.get('stripeDirect'),
|
|
25
25
|
mailgunIsConfigured: config.get('bulkEmail') && config.get('bulkEmail').mailgun,
|
|
26
|
-
emailAnalytics: config.get('emailAnalytics')
|
|
26
|
+
emailAnalytics: config.get('emailAnalytics'),
|
|
27
|
+
forceUpgrade: config.get('host_settings:forceUpgrade') || false
|
|
27
28
|
};
|
|
28
29
|
if (billingUrl) {
|
|
29
30
|
response.billingUrl = billingUrl;
|
|
@@ -26,12 +26,14 @@ module.exports = {
|
|
|
26
26
|
}));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
// CASE: omit core settings unless internal request
|
|
30
29
|
if (!frame.options.context.internal) {
|
|
30
|
+
// CASE: omit core settings unless internal request
|
|
31
31
|
settings = _.filter(settings, (setting) => {
|
|
32
32
|
const isCore = setting.group === 'core';
|
|
33
33
|
return !isCore;
|
|
34
34
|
});
|
|
35
|
+
// CASE: omit secret settings unless internal request
|
|
36
|
+
settings = settings.map(settingsService.hideValueIfSecret);
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
return settings;
|
|
@@ -70,6 +72,8 @@ module.exports = {
|
|
|
70
72
|
}));
|
|
71
73
|
}
|
|
72
74
|
|
|
75
|
+
setting = settingsService.hideValueIfSecret(setting);
|
|
76
|
+
|
|
73
77
|
return {
|
|
74
78
|
[frame.options.key]: setting
|
|
75
79
|
};
|
|
@@ -217,8 +221,8 @@ module.exports = {
|
|
|
217
221
|
async query(frame) {
|
|
218
222
|
const stripeConnectIntegrationToken = frame.data.settings.find(setting => setting.key === 'stripe_connect_integration_token');
|
|
219
223
|
|
|
220
|
-
// The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
|
|
221
224
|
const settings = frame.data.settings.filter((setting) => {
|
|
225
|
+
// The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings.
|
|
222
226
|
return ![
|
|
223
227
|
'stripe_connect_integration_token',
|
|
224
228
|
'stripe_connect_publishable_key',
|
|
@@ -226,7 +230,9 @@ module.exports = {
|
|
|
226
230
|
'stripe_connect_livemode',
|
|
227
231
|
'stripe_connect_account_id',
|
|
228
232
|
'stripe_connect_display_name'
|
|
229
|
-
].includes(setting.key)
|
|
233
|
+
].includes(setting.key)
|
|
234
|
+
// Remove obfuscated settings
|
|
235
|
+
&& !(setting.value === settingsService.obfuscatedSetting && settingsService.isSecretSetting(setting));
|
|
230
236
|
});
|
|
231
237
|
|
|
232
238
|
const getSetting = setting => settingsCache.get(setting.key, {resolve: false});
|
|
@@ -85,6 +85,8 @@ class OEmbed {
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
async fetchBookmarkData(url) {
|
|
88
|
+
// Metascraper doesn't handle leading/trailing whitespace
|
|
89
|
+
url = url.trim();
|
|
88
90
|
const metascraper = require('metascraper')([
|
|
89
91
|
require('metascraper-url')(),
|
|
90
92
|
require('metascraper-title')(),
|
|
@@ -154,6 +156,10 @@ class OEmbed {
|
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
fetchOembedData(_url, cardType) {
|
|
159
|
+
// Trimming solves the difference of url validation between `new URL(url)`
|
|
160
|
+
// and metascraper.
|
|
161
|
+
_url = _url.trim();
|
|
162
|
+
|
|
157
163
|
// parse the url then validate the protocol and host to make sure it's
|
|
158
164
|
// http(s) and not an IP address or localhost to avoid potential access to
|
|
159
165
|
// internal network endpoints
|
|
@@ -5,6 +5,22 @@
|
|
|
5
5
|
const models = require('../../models');
|
|
6
6
|
const SettingsCache = require('./cache');
|
|
7
7
|
|
|
8
|
+
// The string returned when a setting is set as write-only
|
|
9
|
+
const obfuscatedSetting = '••••••••';
|
|
10
|
+
|
|
11
|
+
// The function used to decide whether a setting is write-only
|
|
12
|
+
function isSecretSetting(setting) {
|
|
13
|
+
return /secret/.test(setting.key);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// The function that obfuscates a write-only setting
|
|
17
|
+
function hideValueIfSecret(setting) {
|
|
18
|
+
if (setting.value && isSecretSetting(setting)) {
|
|
19
|
+
return {...setting, value: obfuscatedSetting};
|
|
20
|
+
}
|
|
21
|
+
return setting;
|
|
22
|
+
}
|
|
23
|
+
|
|
8
24
|
module.exports = {
|
|
9
25
|
async init() {
|
|
10
26
|
const settingsCollection = await models.Settings.populateDefaults();
|
|
@@ -44,5 +60,9 @@ module.exports = {
|
|
|
44
60
|
value: currentRoutesHash
|
|
45
61
|
}], {context: {internal: true}});
|
|
46
62
|
}
|
|
47
|
-
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
obfuscatedSetting,
|
|
66
|
+
isSecretSetting,
|
|
67
|
+
hideValueIfSecret
|
|
48
68
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const debug = require('ghost-ignition').debug('web:admin:controller');
|
|
2
2
|
const path = require('path');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const crypto = require('crypto');
|
|
3
5
|
const config = require('../../../shared/config');
|
|
4
6
|
const updateCheck = require('../../update-check');
|
|
5
7
|
const logging = require('../../../shared/logging');
|
|
@@ -25,6 +27,15 @@ module.exports = function adminController(req, res) {
|
|
|
25
27
|
const templatePath = path.resolve(config.get('paths').adminViews, defaultTemplate);
|
|
26
28
|
const headers = {};
|
|
27
29
|
|
|
30
|
+
// Generate our own ETag header
|
|
31
|
+
// `sendFile` by default uses filesize+lastmod date to generate an etag.
|
|
32
|
+
// That doesn't work for admin templates because the filesize doesn't change between versions
|
|
33
|
+
// and `npm pack` sets a fixed lastmod date for every file meaning the default etag never changes
|
|
34
|
+
const fileBuffer = fs.readFileSync(templatePath);
|
|
35
|
+
const hashSum = crypto.createHash('md5');
|
|
36
|
+
hashSum.update(fileBuffer);
|
|
37
|
+
headers.ETag = hashSum.digest('hex');
|
|
38
|
+
|
|
28
39
|
if (config.get('adminFrameProtection')) {
|
|
29
40
|
headers['X-Frame-Options'] = 'sameorigin';
|
|
30
41
|
}
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
<script src="assets/vendor.min-1ea21c7abed44258b1662cf1b103c007.js"></script>
|
|
56
|
-
<script src="assets/ghost.min-
|
|
56
|
+
<script src="assets/ghost.min-c2286c1da1671730ae28b70205449d2f.js"></script>
|
|
57
57
|
|
|
58
58
|
</body>
|
|
59
59
|
</html>
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
<script src="assets/vendor.min-1ea21c7abed44258b1662cf1b103c007.js"></script>
|
|
56
|
-
<script src="assets/ghost.min-
|
|
56
|
+
<script src="assets/ghost.min-c2286c1da1671730ae28b70205449d2f.js"></script>
|
|
57
57
|
|
|
58
58
|
</body>
|
|
59
59
|
</html>
|
|
@@ -34,6 +34,7 @@ module.exports = function setupMembersApp() {
|
|
|
34
34
|
// We don't want to add global bodyParser middleware as that interfers with stripe webhook requests on - `/webhooks`.
|
|
35
35
|
membersApp.get('/api/member', middleware.getMemberData);
|
|
36
36
|
membersApp.put('/api/member', bodyParser.json({limit: '1mb'}), middleware.updateMemberData);
|
|
37
|
+
membersApp.post('/api/member/email', bodyParser.json({limit: '1mb'}), (req, res) => membersService.api.middleware.updateEmailAddress(req, res));
|
|
37
38
|
membersApp.get('/api/session', middleware.getIdentityToken);
|
|
38
39
|
membersApp.delete('/api/session', middleware.deleteSession);
|
|
39
40
|
membersApp.get('/api/site', middleware.getMemberSiteData);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const _ = require('lodash');
|
|
2
2
|
const path = require('path');
|
|
3
|
+
const {GhostError} = require('@tryghost/errors');
|
|
3
4
|
const imageTransform = require('@tryghost/image-transform');
|
|
4
5
|
const storage = require('../../../adapters/storage');
|
|
5
6
|
const activeTheme = require('../../../../frontend/services/themes/active');
|
|
@@ -100,6 +101,12 @@ module.exports = function (req, res, next) {
|
|
|
100
101
|
return storageInstance.read({path: storagePath});
|
|
101
102
|
})
|
|
102
103
|
.then((originalImageBuffer) => {
|
|
104
|
+
if (originalImageBuffer.length <= 0) {
|
|
105
|
+
throw new GhostError({
|
|
106
|
+
errorType: 'NoContentError',
|
|
107
|
+
statusCode: 204
|
|
108
|
+
});
|
|
109
|
+
}
|
|
103
110
|
return imageTransform.resizeFromBuffer(originalImageBuffer, imageDimensionConfig);
|
|
104
111
|
})
|
|
105
112
|
.then((resizedImageBuffer) => {
|
|
@@ -108,7 +115,7 @@ module.exports = function (req, res, next) {
|
|
|
108
115
|
}).then(() => {
|
|
109
116
|
next();
|
|
110
117
|
}).catch(function (err) {
|
|
111
|
-
if (err.code === 'SHARP_INSTALLATION') {
|
|
118
|
+
if (err.code === 'SHARP_INSTALLATION' || err.code === 'IMAGE_PROCESSING' || err.errorType === 'NoContentError') {
|
|
112
119
|
return redirectToOriginal();
|
|
113
120
|
}
|
|
114
121
|
next(err);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ghost",
|
|
3
|
-
"version": "3.42.
|
|
3
|
+
"version": "3.42.8",
|
|
4
4
|
"description": "The professional publishing platform",
|
|
5
5
|
"author": "Ghost Foundation",
|
|
6
6
|
"homepage": "https://ghost.org",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"@tryghost/kg-markdown-html-renderer": "3.0.0",
|
|
57
57
|
"@tryghost/kg-mobiledoc-html-renderer": "3.0.1",
|
|
58
58
|
"@tryghost/magic-link": "0.6.4",
|
|
59
|
-
"@tryghost/members-api": "0.37.
|
|
59
|
+
"@tryghost/members-api": "0.37.13",
|
|
60
60
|
"@tryghost/members-csv": "0.4.2",
|
|
61
61
|
"@tryghost/members-ssr": "0.8.8",
|
|
62
62
|
"@tryghost/mw-session-from-token": "0.1.14",
|
package/yarn.lock
CHANGED
|
@@ -553,10 +553,10 @@
|
|
|
553
553
|
jsonwebtoken "^8.5.1"
|
|
554
554
|
lodash "^4.17.15"
|
|
555
555
|
|
|
556
|
-
"@tryghost/members-api@0.37.
|
|
557
|
-
version "0.37.
|
|
558
|
-
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-0.37.
|
|
559
|
-
integrity sha512-
|
|
556
|
+
"@tryghost/members-api@0.37.13":
|
|
557
|
+
version "0.37.13"
|
|
558
|
+
resolved "https://registry.yarnpkg.com/@tryghost/members-api/-/members-api-0.37.13.tgz#fa43449b64ceab645195649066b1fdb748d89f23"
|
|
559
|
+
integrity sha512-6d3QDbXaRW4eTnoX5FOqb7JlSiVmm99QHlaygsb3dNYcrT3/q75Ro0TA5KgoTp9x3vde1Gtwr+U76plwGExapQ==
|
|
560
560
|
dependencies:
|
|
561
561
|
"@tryghost/magic-link" "^0.6.7"
|
|
562
562
|
bluebird "^3.5.4"
|